Literal object creation rework #1734
Open
+80
−44
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR changes a bit the interpreter bytecode when creating a literal object - rhino now generates and uses a slightly more compact bytecode. Furthermore, there is a preliminary change for implementing
super
discussed below.Before this change, this JS fragment:
would generate the following interpreter bytecode:
After this PR, it will generate the following:
The changes are:
LITERAL_KEY_SET
uses the same indexing algorithm asLITERAL_SET
, therefore does not require theREG_IND_xxx
instruction before itLITERAL_NEW
intoLITERAL_NEW_ARRAY
LITERAL_KEYS
and the old behavior ofLITERAL_NEW
for objects into a new opcode calledLITERAL_NEW_OBJECT
LITERAL_NEW_OBJECTS
so that it puts the object on the stack and then callsScriptRuntime.fillObjectLiteral
, instead of callingScriptRuntime.newObjectLiteral
. So, previously the stack would contain[keys, flags, values]
; now it contains[object, keys, flags, values]
. This is a preliminary step for implementingsuper
(see Implementsuper
#1735).Implemented with @0xe