Closed
Bug 856829
Opened 12 years ago
Closed 12 years ago
BaselineCompiler: Add optimized stubs for GetProp-getter and SetProp-setter calling JSNative targets
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
FIXED
People
(Reporter: djvj, Unassigned)
References
Details
Attachments
(1 file, 1 obsolete file)
38.34 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
Needed for DOM access performance.
Reporter | ||
Updated•12 years ago
|
Blocks: BaselineInlineCaches
Reporter | ||
Updated•12 years ago
|
Summary: BaselineCompiler: Add optimized stub for GetProp-getter calling JSNative targets → BaselineCompiler: Add optimized stubs for GetProp-getter and SetProp-setter calling JSNative targets
Reporter | ||
Comment 1•12 years ago
|
||
Ion didn't handle JSNative setters before this, so this patch adds a new exit frame type for JSNative setters.
The ICGetProp_CallScripted and ICSetProp_CallScripted stubs are refactored out into shared base stubs: ICGetPropCallGetter and ICSetPropCallSetter, which are inherited by both CallScripted and CallNative stubs.
The compilers too uses a shared base class. I didn't use the same compiler for both because the register allocation is different enough, and there wasn't enough common code, to seem to warrant it.
Attachment #732469 -
Flags: review?(jdemooij)
Comment 2•12 years ago
|
||
Comment on attachment 732469 [details] [diff] [review]
Add getter/setter IC stubs for JSNatives
Review of attachment 732469 [details] [diff] [review]:
-----------------------------------------------------------------
Looks great! I think it'd be good to take another look after addressing the frame descriptor comment though.
::: js/src/ion/BaselineIC.cpp
@@ +3083,5 @@
> +
> + if (shape->hasSlot() || shape->hasDefaultGetter())
> + return false;
> +
> + if (!shape->hasGetterValue() || !shape->getterObject()->isFunction())
The Ion IC checks shape->getterValue().isObject(), why is it not necessary here?
@@ +3207,5 @@
> +
> + if (shape->hasSlot() || shape->hasDefaultSetter())
> + return false;
> +
> + if (!shape->hasSetterValue() || !shape->setterObject()->isFunction())
Same here.
@@ +5260,5 @@
> +
> + // The exit frame format will re-use Ion's IonOOLNativeGetterExitFrameLayout,
> + // which expects a pointer to the IonCode for the stub, so that it may be rooted.
> + // Baseline does that implicitly, so we can just store a null here for that.
> + masm.Push(ImmWord((void *) NULL));
Shouldn't the marking code in IonFrames check for a NULL IonCode *?
@@ +5297,5 @@
> + masm.movePtr(BaselineStackReg, vpReg);
> + masm.move32(Imm32(0), argcReg);
> + masm.loadJSContext(contextReg);
> +
> + if (!masm.buildOOLFakeExitFrame(NULL))
This will push an OptimizedJS frame descriptor. I think we want to use EmitCreateStubFrameDescriptor, like the Call_Native stub. It would be good to temporarily add a JS_GC call or StackIter to the JSNative getter in the shell to test the frame iteration code.
::: js/src/ion/arm/BaselineHelpers-arm.h
@@ +122,5 @@
>
> // Size of vales pushed by EmitEnterStubFrame.
> static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void *);
> static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void *);
> +static const uint32_t STUB_FRAME_PUSHED = 2 * sizeof(void *);
Nit: a short comment here would be good (and x86/x64)
Attachment #732469 -
Flags: review?(jdemooij)
Reporter | ||
Comment 3•12 years ago
|
||
> The Ion IC checks shape->getterValue().isObject(), why is it not necessary
> here?
Good point. It's necessary here. Also, I refactored IsCacheableGetterCallScripted and IsCacheableGetterCallNative into a single function (likewise for setters).
> Shouldn't the marking code in IonFrames check for a NULL IonCode *?
>
> This will push an OptimizedJS frame descriptor. I think we want to use
> EmitCreateStubFrameDescriptor, like the Call_Native stub. It would be good
> to temporarily add a JS_GC call or StackIter to the JSNative getter in the
> shell to test the frame iteration code.
Good catch. Fixed this up to use a VMcall instead, no changes to ion code necessary.
> > +static const uint32_t STUB_FRAME_PUSHED = 2 * sizeof(void *);
>
> Nit: a short comment here would be good (and x86/x64)
STUB_FRAME_PUSHED is no longer necessary either.
Attachment #732469 -
Attachment is obsolete: true
Attachment #732654 -
Flags: review?(jdemooij)
Comment 4•12 years ago
|
||
Comment on attachment 732654 [details] [diff] [review]
Add getter/setter IC stubs for JSNatives, try 2
Review of attachment 732654 [details] [diff] [review]:
-----------------------------------------------------------------
Great idea to use CallVM.
Attachment #732654 -
Flags: review?(jdemooij) → review+
Reporter | ||
Comment 5•12 years ago
|
||
Reporter | ||
Updated•12 years ago
|
Status: NEW → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•