Ignore:
Timestamp:
Apr 22, 2016, 4:04:55 PM (9 years ago)
Author:
[email protected]
Message:

super should be available in object literals
https://bugs.webkit.org/show_bug.cgi?id=156933

Reviewed by Saam Barati.

Source/JavaScriptCore:

When we originally implemented classes, super seemed to be a class-only
feature. But the final spec says it's available in object literals too.

  • bytecompiler/NodesCodegen.cpp:

(JSC::PropertyListNode::emitBytecode): Having 'super' and being a class
property are no longer synonymous, so we track two separate variables.

(JSC::PropertyListNode::emitPutConstantProperty): Being inside the super
branch no longer guarantees that you're a class property, so we decide
our attributes and our function name dynamically.

  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createArrowFunctionExpr):
(JSC::ASTBuilder::createGetterOrSetterProperty):
(JSC::ASTBuilder::createArguments):
(JSC::ASTBuilder::createArgumentsList):
(JSC::ASTBuilder::createProperty):
(JSC::ASTBuilder::createPropertyList): Pass through state to indicate
whether we're a class property, since we can't infer it from 'super'
anymore.

  • parser/NodeConstructors.h:

(JSC::PropertyNode::PropertyNode): See ASTBuilder.h.

  • parser/Nodes.h:

(JSC::PropertyNode::expressionName):
(JSC::PropertyNode::name):
(JSC::PropertyNode::type):
(JSC::PropertyNode::needsSuperBinding):
(JSC::PropertyNode::isClassProperty):
(JSC::PropertyNode::putType): See ASTBuilder.h.

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseFunctionInfo):
(JSC::Parser<LexerType>::parseClass):
(JSC::Parser<LexerType>::parseProperty):
(JSC::Parser<LexerType>::parsePropertyMethod):
(JSC::Parser<LexerType>::parseGetterSetter):
(JSC::Parser<LexerType>::parseMemberExpression): I made these error
messages generic because it is no longer practical to say concise things
about the list of places you can use super.

  • parser/Parser.h:
  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createArgumentsList):
(JSC::SyntaxChecker::createProperty):
(JSC::SyntaxChecker::appendExportSpecifier):
(JSC::SyntaxChecker::appendConstDecl):
(JSC::SyntaxChecker::createGetterOrSetterProperty): Updated for
interface change.

  • tests/stress/generator-with-super.js:

(test):

  • tests/stress/modules-syntax-error.js:
  • tests/stress/super-in-lexical-scope.js:

(testSyntaxError):
(testSyntaxError.test):

  • tests/stress/tagged-templates-syntax.js: Updated for error message

changes. See Parser.cpp.

LayoutTests:

Updated expected results and added a few new tests.

  • js/arrowfunction-syntax-errors-expected.txt:
  • js/class-syntax-super-expected.txt:
  • js/object-literal-methods-expected.txt:
  • js/script-tests/arrowfunction-syntax-errors.js:
  • js/script-tests/class-syntax-super.js:
  • js/script-tests/object-literal-methods.js:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r199724 r199927  
    499499
    500500            RefPtr<RegisterID> value = generator.emitNode(node->m_assign);
    501             bool isClassProperty = node->needsSuperBinding();
    502             if (isClassProperty)
     501            bool needsSuperBinding = node->needsSuperBinding();
     502            if (needsSuperBinding)
    503503                emitPutHomeObject(generator, value.get(), dst);
    504             unsigned attribute = isClassProperty ? (Accessor | DontEnum) : Accessor;
     504
     505            unsigned attributes = node->isClassProperty() ? (Accessor | DontEnum) : Accessor;
    505506
    506507            ASSERT(node->m_type & (PropertyNode::Getter | PropertyNode::Setter));
     
    513514                    generator.emitSetFunctionNameIfNeeded(node->m_assign, value.get(), propertyName.get());
    514515                    if (node->m_type & PropertyNode::Getter)
    515                         generator.emitPutGetterByVal(dst, propertyName.get(), attribute, value.get());
     516                        generator.emitPutGetterByVal(dst, propertyName.get(), attributes, value.get());
    516517                    else
    517                         generator.emitPutSetterByVal(dst, propertyName.get(), attribute, value.get());
     518                        generator.emitPutSetterByVal(dst, propertyName.get(), attributes, value.get());
    518519                    continue;
    519520                }
    520521
    521522                if (node->m_type & PropertyNode::Getter)
    522                     generator.emitPutGetterById(dst, *node->name(), attribute, value.get());
     523                    generator.emitPutGetterById(dst, *node->name(), attributes, value.get());
    523524                else
    524                     generator.emitPutSetterById(dst, *node->name(), attribute, value.get());
     525                    generator.emitPutSetterById(dst, *node->name(), attributes, value.get());
    525526                continue;
    526527            }
     
    563564            }
    564565
    565             ASSERT(!pair.second || isClassProperty == pair.second->needsSuperBinding());
    566             if (isClassProperty && pair.second)
     566            ASSERT(!pair.second || needsSuperBinding == pair.second->needsSuperBinding());
     567            if (needsSuperBinding && pair.second)
    567568                emitPutHomeObject(generator, secondReg, dst);
    568569
    569             generator.emitPutGetterSetter(dst, *node->name(), attribute, getterReg.get(), setterReg.get());
     570            generator.emitPutGetterSetter(dst, *node->name(), attributes, getterReg.get(), setterReg.get());
    570571        }
    571572    }
     
    586587            propertyNameRegister = generator.emitNode(node.m_expression);
    587588
     589        unsigned attributes = BytecodeGenerator::PropertyConfigurable | BytecodeGenerator::PropertyWritable;
     590        if (!node.isClassProperty())
     591            attributes |= BytecodeGenerator::PropertyEnumerable;
     592        generator.emitSetFunctionNameIfNeeded(node.m_assign, value.get(), propertyNameRegister.get());
    588593        generator.emitCallDefineProperty(newObj, propertyNameRegister.get(),
    589             value.get(), nullptr, nullptr, BytecodeGenerator::PropertyConfigurable | BytecodeGenerator::PropertyWritable, m_position);
     594            value.get(), nullptr, nullptr, attributes, m_position);
    590595        return;
    591596    }
Note: See TracChangeset for help on using the changeset viewer.