Ignore:
Timestamp:
Mar 29, 2016, 2:04:21 PM (9 years ago)
Author:
[email protected]
Message:

Allow builtin JS functions to be intrinsics
https://bugs.webkit.org/show_bug.cgi?id=155960

Reviewed by Mark Lam.

Source/JavaScriptCore:

Builtin functions can now be recognized as intrinsics inside
the DFG. This gives us the flexibility to either lower a builtin
as an intrinsic in the DFG or as a normal function call.
Because we may decide to not lower it as an intrinsic, the DFG
inliner could still inline the function call.

You can annotate a builtin function like so to make
it be recognized as an intrinsic.
`
[intrinsic=FooIntrinsic] function foo() { ... }
`
where FooIntrinsic is an enum value of the Intrinsic enum.

So in the future if we write RegExp.prototype.test as a builtin, we would do:
` RegExpPrototype.js
[intrinsic=RegExpTestIntrinsic] function test() { ... }
`

  • Scripts/builtins/builtins_generate_combined_implementation.py:

(BuiltinsCombinedImplementationGenerator.generate_secondary_header_includes):

  • Scripts/builtins/builtins_generate_separate_implementation.py:

(BuiltinsSeparateImplementationGenerator.generate_secondary_header_includes):

  • Scripts/builtins/builtins_generator.py:

(BuiltinsGenerator.generate_embedded_code_string_section_for_function):

  • Scripts/builtins/builtins_model.py:

(BuiltinObject.init):
(BuiltinFunction):
(BuiltinFunction.init):
(BuiltinFunction.fromString):
(BuiltinFunction.str):

  • Scripts/builtins/builtins_templates.py:
  • bytecode/UnlinkedFunctionExecutable.cpp:

(JSC::UnlinkedFunctionExecutable::visitChildren):
(JSC::UnlinkedFunctionExecutable::link):

  • bytecode/UnlinkedFunctionExecutable.h:
  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::attemptToInlineCall):

  • runtime/Executable.cpp:

(JSC::ExecutableBase::clearCode):
(JSC::NativeExecutable::destroy):
(JSC::ScriptExecutable::ScriptExecutable):
(JSC::EvalExecutable::create):
(JSC::EvalExecutable::EvalExecutable):
(JSC::ProgramExecutable::ProgramExecutable):
(JSC::ModuleProgramExecutable::ModuleProgramExecutable):
(JSC::FunctionExecutable::FunctionExecutable):
(JSC::ExecutableBase::intrinsic): Deleted.
(JSC::NativeExecutable::intrinsic): Deleted.

  • runtime/Executable.h:

(JSC::ExecutableBase::ExecutableBase):
(JSC::ExecutableBase::hasJITCodeFor):
(JSC::ExecutableBase::intrinsic):
(JSC::ExecutableBase::intrinsicFor):
(JSC::ScriptExecutable::finishCreation):

  • runtime/Intrinsic.h:

Source/WebCore:

  • ForwardingHeaders/runtime/Intrinsic.h: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/Executable.h

    r198364 r198798  
    7676    static const int NUM_PARAMETERS_NOT_COMPILED = -1;
    7777
    78     ExecutableBase(VM& vm, Structure* structure, int numParameters)
     78    ExecutableBase(VM& vm, Structure* structure, int numParameters, Intrinsic intrinsic)
    7979        : JSCell(vm, structure)
    8080        , m_numParametersForCall(numParameters)
    8181        , m_numParametersForConstruct(numParameters)
     82        , m_intrinsic(intrinsic)
    8283    {
    8384    }
     
    232233
    233234    // Intrinsics are only for calls, currently.
    234     Intrinsic intrinsic() const;
     235    Intrinsic intrinsic() const { return m_intrinsic; }
    235236       
    236237    Intrinsic intrinsicFor(CodeSpecializationKind kind) const
     
    244245       
    245246protected:
     247    Intrinsic m_intrinsic;
    246248    RefPtr<JITCode> m_jitCodeForCall;
    247249    RefPtr<JITCode> m_jitCodeForConstruct;
     
    260262    {
    261263        NativeExecutable* executable;
    262         executable = new (NotNull, allocateCell<NativeExecutable>(vm.heap)) NativeExecutable(vm, function, constructor);
    263         executable->finishCreation(vm, callThunk, constructThunk, intrinsic, name);
     264        executable = new (NotNull, allocateCell<NativeExecutable>(vm.heap)) NativeExecutable(vm, function, constructor, intrinsic);
     265        executable->finishCreation(vm, callThunk, constructThunk, name);
    264266        return executable;
    265267    }
     
    297299
    298300protected:
    299     void finishCreation(VM& vm, PassRefPtr<JITCode> callThunk, PassRefPtr<JITCode> constructThunk, Intrinsic intrinsic, const String& name)
     301    void finishCreation(VM& vm, PassRefPtr<JITCode> callThunk, PassRefPtr<JITCode> constructThunk, const String& name)
    300302    {
    301303        Base::finishCreation(vm);
    302304        m_jitCodeForCall = callThunk;
    303305        m_jitCodeForConstruct = constructThunk;
    304         m_intrinsic = intrinsic;
    305306        m_name = name;
    306307    }
     
    309310    friend class ExecutableBase;
    310311
    311     NativeExecutable(VM& vm, NativeFunction function, NativeFunction constructor)
    312         : ExecutableBase(vm, vm.nativeExecutableStructure.get(), NUM_PARAMETERS_IS_HOST)
     312    NativeExecutable(VM& vm, NativeFunction function, NativeFunction constructor, Intrinsic intrinsic)
     313        : ExecutableBase(vm, vm.nativeExecutableStructure.get(), NUM_PARAMETERS_IS_HOST, intrinsic)
    313314        , m_function(function)
    314315        , m_constructor(constructor)
     
    400401
    401402protected:
    402     ScriptExecutable(Structure*, VM&, const SourceCode&, bool isInStrictContext, DerivedContextType, bool isInArrowFunctionContext);
     403    ScriptExecutable(Structure*, VM&, const SourceCode&, bool isInStrictContext, DerivedContextType, bool isInArrowFunctionContext, Intrinsic);
    403404
    404405    void finishCreation(VM& vm)
     
    581582    static FunctionExecutable* create(
    582583        VM& vm, const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable,
    583         unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn)
    584     {
    585         FunctionExecutable* executable = new (NotNull, allocateCell<FunctionExecutable>(vm.heap)) FunctionExecutable(vm, source, unlinkedExecutable, firstLine, lastLine, startColumn, endColumn);
     584        unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn, Intrinsic intrinsic)
     585    {
     586        FunctionExecutable* executable = new (NotNull, allocateCell<FunctionExecutable>(vm.heap)) FunctionExecutable(vm, source, unlinkedExecutable, firstLine, lastLine, startColumn, endColumn, intrinsic);
    586587        executable->finishCreation(vm);
    587588        return executable;
     
    698699    FunctionExecutable(
    699700        VM&, const SourceCode&, UnlinkedFunctionExecutable*, unsigned firstLine,
    700         unsigned lastLine, unsigned startColumn, unsigned endColumn);
     701        unsigned lastLine, unsigned startColumn, unsigned endColumn, Intrinsic);
    701702   
    702703    void finishCreation(VM&);
Note: See TracChangeset for help on using the changeset viewer.