Ignore:
Timestamp:
Jul 13, 2017, 12:11:45 AM (8 years ago)
Author:
Caio Lima
Message:

[ESnext] Implement Object Spread
https://bugs.webkit.org/show_bug.cgi?id=167963

Reviewed by Saam Barati.

JSTests:

  • stress/obj-rest-destructuring-order.js: Added.

(assert):
(o.get z):
(o.get a):

  • stress/obj-spread-order.js: Added.

(assert):
(o.get z):
(o.get a):

  • stress/object-spread.js: Added.

(let.assert):
(assert.sameValue):
(let.o.get a):
(let.obj.get c):
(cthulhu.get x):
(let.obj.set c):
(calls.o.get z):
(calls.o.get a):
(try.let.obj.get foo):
(get calls):

Source/JavaScriptCore:

This patch implements ECMA262 stage 3 Object Spread proposal [1].
It's implemented using CopyDataPropertiesNoExclusions to copy
all enumerable keys from object being spreaded. The implementation of
CopyDataPropertiesNoExclusions follows the CopyDataProperties
implementation, however we don't receive excludedNames as parameter.

[1] - https://github.com/tc39/proposal-object-rest-spread

  • builtins/GlobalOperations.js:

(globalPrivate.copyDataPropertiesNoExclusions):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::emitLoad):

  • bytecompiler/NodesCodegen.cpp:

(JSC::PropertyListNode::emitBytecode):
(JSC::ObjectSpreadExpressionNode::emitBytecode):

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createObjectSpreadExpression):
(JSC::ASTBuilder::createProperty):

  • parser/NodeConstructors.h:

(JSC::PropertyNode::PropertyNode):
(JSC::ObjectSpreadExpressionNode::ObjectSpreadExpressionNode):

  • parser/Nodes.h:

(JSC::ObjectSpreadExpressionNode::expression):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseProperty):

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createObjectSpreadExpression):
(JSC::SyntaxChecker::createProperty):

LayoutTests:

  • js/parser-syntax-check-expected.txt:
  • js/script-tests/parser-syntax-check.js:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/ASTBuilder.h

    r218861 r219443  
    276276    }
    277277
     278    ExpressionNode* createObjectSpreadExpression(const JSTokenLocation& location, ExpressionNode* expression, const JSTextPosition& start, const JSTextPosition& divot, const JSTextPosition& end)
     279    {
     280        auto node = new (m_parserArena) ObjectSpreadExpressionNode(location, expression);
     281        setExceptionLocation(node, start, divot, end);
     282        return node;
     283    }
     284
    278285    TemplateStringNode* createTemplateString(const JSTokenLocation& location, const Identifier* cooked, const Identifier* raw)
    279286    {
     
    495502        }
    496503        return new (m_parserArena) PropertyNode(*propertyName, node, type, putType, superBinding, isClassProperty);
     504    }
     505    PropertyNode* createProperty(ExpressionNode* node, PropertyNode::Type type, PropertyNode::PutType putType, bool, SuperBinding superBinding, bool isClassProperty)
     506    {
     507        return new (m_parserArena) PropertyNode(node, type, putType, superBinding, isClassProperty);
    497508    }
    498509    PropertyNode* createProperty(VM* vm, ParserArena& parserArena, double propertyName, ExpressionNode* node, PropertyNode::Type type, PropertyNode::PutType putType, bool, SuperBinding superBinding, bool isClassProperty)
Note: See TracChangeset for help on using the changeset viewer.