Ignore:
Timestamp:
Feb 2, 2016, 11:33:05 AM (10 years ago)
Author:
Yusuke Suzuki
Message:

[JSC] Introduce BytecodeIntrinsic constant rep like @undefined
https://bugs.webkit.org/show_bug.cgi?id=153737

Reviewed by Darin Adler.

Source/JavaScriptCore:

This patch enhances existing BytecodeIntrinsic mechanism to accept @xxx form,
that will be used to represent bytecode intrinsic constants.
After this change, we can use 2 forms for bytecode intrinsics. (1) Function form (like, @toString(value))
and (2) Constant form (like @undefined).

Bytecode intrinsic constants allow us to easily expose constant values from C++ world.
For example, we can expose ArrayIterationKind flags to JS world without using private global variables.
Exposed constant values are loaded from bytecodes directly through constant registers.
While previously we expose them through private global variables, bytecode intrinsic constants
can be loaded directly from CodeBlock. And later, it will become JSConstant in DFG.

And by using this mechanism, we implement several constants. @undefined, @arrayIterationKindKeyValue etc.

  • builtins/ArrayConstructor.js:

(from):

  • builtins/ArrayIteratorPrototype.js:

(next):

  • builtins/ArrayPrototype.js:

(reduce):
(reduceRight):
(every):
(forEach):
(filter):
(map):
(some):
(fill):
(find):
(findIndex):
(includes):
(sort.compactSparse):
(sort.compactSlow):
(sort.compact):
(sort):
(copyWithin):

  • builtins/DatePrototype.js:

(toLocaleString.toDateTimeOptionsAnyAll):
(toLocaleString):
(toLocaleDateString.toDateTimeOptionsDateDate):
(toLocaleDateString):
(toLocaleTimeString.toDateTimeOptionsTimeTime):
(toLocaleTimeString):

  • builtins/GeneratorPrototype.js:

(generatorResume):

  • builtins/GlobalObject.js:

(isDictionary):

  • builtins/InternalPromiseConstructor.js:

(internalAll.newResolveElement):
(internalAll):

  • builtins/IteratorPrototype.js:

(symbolIteratorGetter):
(symbolIterator): Deleted.

  • builtins/MapPrototype.js:

(forEach):

  • builtins/ModuleLoaderObject.js:

(newRegistryEntry):
(forceFulfillPromise):
(commitInstantiated):
(requestFetch):
(requestTranslate):
(requestInstantiate):
(requestLink):
(provide):

  • builtins/PromiseConstructor.js:

(all.newResolveElement):
(all):
(race):
(reject):
(resolve):

  • builtins/PromiseOperations.js:

(newPromiseCapability.executor):
(newPromiseCapability):
(rejectPromise):
(fulfillPromise):
(createResolvingFunctions.resolve):
(createResolvingFunctions.reject):
(createResolvingFunctions):
(promiseReactionJob):
(promiseResolveThenableJob):
(initializePromise):

  • builtins/PromisePrototype.js:

(catch):
(then):

  • builtins/SetPrototype.js:

(forEach):

  • builtins/StringConstructor.js:

(raw):

  • builtins/StringIteratorPrototype.js:

(next):

  • builtins/StringPrototype.js:

(localeCompare):

  • builtins/TypedArrayConstructor.js:

(of):
(from):

  • builtins/TypedArrayPrototype.js:

(every):
(find):
(findIndex):
(forEach):
(some):
(reduce):
(reduceRight):
(map):
(filter):

  • bytecode/BytecodeIntrinsicRegistry.cpp:

(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
(JSC::BytecodeIntrinsicRegistry::lookup):

  • bytecode/BytecodeIntrinsicRegistry.h:
  • bytecompiler/NodesCodegen.cpp:
  • parser/ASTBuilder.h:

(JSC::ASTBuilder::createResolve):
(JSC::ASTBuilder::makeFunctionCallNode):

  • parser/NodeConstructors.h:

(JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):

  • parser/Nodes.h:

(JSC::ExpressionNode::isBytecodeIntrinsicNode):
(JSC::BytecodeIntrinsicNode::type):
(JSC::BytecodeIntrinsicNode::emitter):

  • parser/Parser.cpp:

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

  • parser/SyntaxChecker.h:

(JSC::SyntaxChecker::createResolve):

  • runtime/CommonIdentifiers.cpp:

(JSC::CommonIdentifiers::CommonIdentifiers): Deleted.

  • runtime/CommonIdentifiers.h:

(JSC::CommonIdentifiers::bytecodeIntrinsicRegistry): Deleted.

  • runtime/IteratorPrototype.cpp:

(JSC::IteratorPrototype::finishCreation):

  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::init): Deleted.

  • runtime/VM.cpp:

(JSC::VM::VM):

  • runtime/VM.h:

(JSC::VM::bytecodeIntrinsicRegistry):

Source/WebCore:

  • Modules/fetch/FetchHeaders.js:

(initializeFetchHeaders):

  • Modules/streams/ReadableStream.js:

(initializeReadableStream):
(closeDestination):
(abortDestination):
(pipeTo):

  • Modules/streams/ReadableStreamInternals.js:

(privateInitializeReadableStreamController):
(teeReadableStream):
(isReadableStreamReader):
(errorReadableStream):
(finishClosingReadableStream):
(enqueueInReadableStream):
(readFromReadableStreamReader):

  • Modules/streams/ReadableStreamReader.js:

(releaseLock):

  • Modules/streams/StreamInternals.js:

(shieldingPromiseResolve):
(promiseInvokeOrNoopNoCatch):
(promiseInvokeOrFallbackOrNoop):
(validateAndNormalizeQueuingStrategy):

  • Modules/streams/WritableStream.js:

(initializeWritableStream):
(write):

  • Modules/streams/WritableStreamInternals.js:

(errorWritableStream):

File:
1 edited

Legend:

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

    r195439 r196022  
    174174        virtual bool isSpreadExpression() const { return false; }
    175175        virtual bool isSuperNode() const { return false; }
     176        virtual bool isBytecodeIntrinsicNode() const { return false; }
    176177
    177178        virtual void emitBytecodeInConditionContext(BytecodeGenerator&, Label*, Label*, FallThroughMode);
     
    802803    class BytecodeIntrinsicNode : public ExpressionNode, public ThrowableExpressionData {
    803804    public:
     805        enum class Type {
     806            Constant,
     807            Function
     808        };
     809
    804810        typedef RegisterID* (BytecodeIntrinsicNode::* EmitterType)(BytecodeGenerator&, RegisterID*);
    805811
    806         BytecodeIntrinsicNode(const JSTokenLocation&, EmitterType, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
    807 
     812        BytecodeIntrinsicNode(Type, const JSTokenLocation&, EmitterType, const Identifier&, ArgumentsNode*, const JSTextPosition& divot, const JSTextPosition& divotStart, const JSTextPosition& divotEnd);
     813
     814        virtual bool isBytecodeIntrinsicNode() const override { return true; }
     815
     816        Type type() const { return m_type; }
     817        EmitterType emitter() const { return m_emitter; }
    808818        const Identifier& identifier() const { return m_ident; }
    809819
    810820#define JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS(name) RegisterID* emit_intrinsic_##name(BytecodeGenerator&, RegisterID*);
    811         JSC_COMMON_BYTECODE_INTRINSICS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS)
     821        JSC_COMMON_BYTECODE_INTRINSIC_FUNCTIONS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS)
     822        JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_EACH_NAME(JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS)
    812823#undef JSC_DECLARE_BYTECODE_INTRINSIC_FUNCTIONS
    813824
     
    815826        virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
    816827
     828        Type m_type;
    817829        EmitterType m_emitter;
    818830        const Identifier& m_ident;
Note: See TracChangeset for help on using the changeset viewer.