Ignore:
Timestamp:
Sep 8, 2015, 12:43:58 PM (10 years ago)
Author:
Yusuke Suzuki
Message:

[ES6] Implement computed accessors
https://bugs.webkit.org/show_bug.cgi?id=147883

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

Implement the computed accessors functionality for class syntax and object literal syntax.
Added new opcodes, op_put_getter_by_val and op_put_setter_by_val. LLInt and baseline JIT support them.
As the same to the other accessor opcodes (like op_put_getter_by_id etc.), DFG / FTL does not support
them. This is handled here[1].

[1]: https://bugs.webkit.org/show_bug.cgi?id=148860

  • bytecode/BytecodeList.json:
  • bytecode/BytecodeUseDef.h:

(JSC::computeUsesForBytecodeOffset):
(JSC::computeDefsForBytecodeOffset):

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dumpBytecode):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::emitPutGetterByVal):
(JSC::BytecodeGenerator::emitPutSetterByVal):

  • bytecompiler/BytecodeGenerator.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::PropertyListNode::emitBytecode):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileMainPass):

  • jit/JIT.h:
  • jit/JITInlines.h:

(JSC::JIT::callOperation):

  • jit/JITOperations.cpp:
  • jit/JITOperations.h:
  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_getter_by_val):
(JSC::JIT::emit_op_put_setter_by_val):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_put_getter_by_val):
(JSC::JIT::emit_op_put_setter_by_val):

  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • llint/LLIntSlowPaths.h:
  • llint/LowLevelInterpreter.asm:
  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createGetterOrSetterProperty):

  • parser/Parser.cpp:

(JSC::Parser<LexerType>::parseClass):
(JSC::Parser<LexerType>::parseGetterSetter):

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createGetterOrSetterProperty):

  • tests/es6.yaml:
  • tests/stress/computed-accessor-parsing.js: Added.

(testShouldNotThrow):
(testShouldThrow):
(Val.prototype.get string_appeared_here):
(Val):

  • tests/stress/computed-accessor.js: Added.

(shouldBe):
(.):

  • tests/stress/duplicate-computed-accessors.js: Added.

(shouldBe):

LayoutTests:

Updated the existing tests.

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

Legend:

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

    r189336 r189504  
    488488            }
    489489
    490             RegisterID* value = generator.emitNode(node->m_assign);
     490            RefPtr<RegisterID> value = generator.emitNode(node->m_assign);
    491491            bool isClassProperty = node->needsSuperBinding();
    492492            if (isClassProperty)
    493                 emitPutHomeObject(generator, value, dst);
     493                emitPutHomeObject(generator, value.get(), dst);
     494            unsigned attribute = isClassProperty ? (Accessor | DontEnum) : Accessor;
    494495
    495496            ASSERT(node->m_type & (PropertyNode::Getter | PropertyNode::Setter));
     
    497498            // This is a get/set property which may be overridden by a computed property later.
    498499            if (hasComputedProperty) {
     500                // Computed accessors.
     501                if (node->m_type & PropertyNode::Computed) {
     502                    RefPtr<RegisterID> propertyName = generator.emitNode(node->m_expression);
     503                    if (node->m_type & PropertyNode::Getter)
     504                        generator.emitPutGetterByVal(dst, propertyName.get(), attribute, value.get());
     505                    else
     506                        generator.emitPutSetterByVal(dst, propertyName.get(), attribute, value.get());
     507                    continue;
     508                }
     509
    499510                if (node->m_type & PropertyNode::Getter)
    500                     generator.emitPutGetterById(dst, *node->name(), Accessor, value);
     511                    generator.emitPutGetterById(dst, *node->name(), attribute, value.get());
    501512                else
    502                     generator.emitPutSetterById(dst, *node->name(), Accessor, value);
     513                    generator.emitPutSetterById(dst, *node->name(), attribute, value.get());
    503514                continue;
    504515            }
     
    545556                emitPutHomeObject(generator, secondReg, dst);
    546557
    547             generator.emitPutGetterSetter(dst, *node->name(), isClassProperty ? (Accessor | DontEnum) : Accessor, getterReg.get(), setterReg.get());
     558            generator.emitPutGetterSetter(dst, *node->name(), attribute, getterReg.get(), setterReg.get());
    548559        }
    549560    }
Note: See TracChangeset for help on using the changeset viewer.