Closed Bug 932276 Opened 6 years ago Closed 6 years ago

Compute static scope extents at compile-time and store them in JSScript

Categories

(Core :: JavaScript Engine, defect)

x86_64
Linux
defect
Not set

Tracking

()

RESOLVED FIXED
mozilla28

People

(Reporter: wingo, Assigned: wingo)

References

Details

(Whiteboard: [qa-])

Attachments

(3 files, 1 obsolete file)

The bytecode emitter should record the extent of block scopes at compile-time and store that in the script object.

This will allow computation of the block chain corresponding to a PC solely based on the PC, without abstract interpretation of the bytecode.  In the case of lexical blocks with unaliased locals, this will remove the need for ENTERBLOCK / LEAVEBLOCK instructions.  It also removes the need for SRC_HIDDEN annotations for nonlocal block exits -- the last use of SRC_HIDDEN after bug 932180.
Assignee: nobody → wingo
Depends on: 932216
Attachment #823984 - Flags: review?(jorendorff)
Attachment #823986 - Flags: review?(jorendorff)
Attachment #823987 - Flags: review?(jorendorff)
Blocks: 932312
Attachment #823984 - Flags: review?(jorendorff) → review+
Comment on attachment 823986 [details] [diff] [review]
Bytecode emitter records static scope extents (2/3)

Review of attachment 823986 [details] [diff] [review]:
-----------------------------------------------------------------

::: js/src/frontend/BytecodeEmitter.cpp
@@ +786,5 @@
>  
>  static bool
> +EmitInternedObjectOp(ExclusiveContext *cx, uint32_t index, JSOp op, BytecodeEmitter *bce)
> +{
> +    JS_ASSERT(JOF_OPTYPE(op) == JOF_OBJECT);

Can this also assert that index is in range?

@@ +1087,5 @@
> +    JS_ASSERT(stmt->isBlockScope);
> +    JS_ASSERT(stmt->blockScopeIndex == bce->blockScopeList.length() - 1);
> +    JS_ASSERT(bce->blockScopeList.list[stmt->blockScopeIndex].length == 0);
> +    uint32_t scopeObjectIndex = bce->blockScopeList.list[stmt->blockScopeIndex].index;
> +    JS_ASSERT(scopeObjectIndex == bce->objectList.length - 1);

These assertions seem to explain the timing of EmitEnterBlock relative to the initialization of all these other bits of the script, which is nice. Can we also assert that pn->pn_objbox and scopeObjectIndex refer to the same thing?
Attachment #823986 - Flags: review?(jorendorff) → review+
Attachment #823987 - Flags: review?(jorendorff) → review+
Attachment #823987 - Attachment is obsolete: true
Comment on attachment 830704 [details] [diff] [review]
Reimplement GetBlockChainAtPC using JSScript::blockScopes() (3/3) v2

Thanks for the review, nits addressed.
Attachment #830704 - Attachment description: Reimplement GetBlockChainAtPC using JSScript::blockScopes() (3/3) → Reimplement GetBlockChainAtPC using JSScript::blockScopes() (3/3) v2
Attachment #830704 - Flags: review+
Keywords: checkin-needed
Whiteboard: [qa-]
You need to log in before you can comment on or make changes to this bug.