Changeset 223866 in webkit


Ignore:
Timestamp:
Oct 23, 2017 5:29:40 PM (6 years ago)
Author:
jfbastien@apple.com
Message:

WebAssembly: topEntryFrame on Wasm::Instance
https://bugs.webkit.org/show_bug.cgi?id=178690

Reviewed by Saam Barati.

topEntryFrame is usually on VM, but for a no-VM WebAssembly we
need to hold topEntryFrame elsewhere, and generated code cannot
hard-code where topEntryFrame live. Do this at creation time of
Wasm::Instance, and then generated code will just load from
wherever Wasm::Instance was told topEntryFrame is. In a JavaScript
embedding this is still from VM, so all of the unwinding machinery
stays the same.

  • dfg/DFGOSREntry.cpp:

(JSC::DFG::prepareOSREntry):

  • dfg/DFGOSRExit.cpp:

(JSC::DFG::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer):
(JSC::DFG::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):

  • ftl/FTLOSRExitCompiler.cpp:

(JSC::FTL::compileStub):

  • interpreter/Interpreter.cpp:

(JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):

  • jit/AssemblyHelpers.cpp:

(JSC::AssemblyHelpers::restoreCalleeSavesFromEntryFrameCalleeSavesBuffer):
(JSC::AssemblyHelpers::copyCalleeSavesToEntryFrameCalleeSavesBufferImpl):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::copyCalleeSavesToEntryFrameCalleeSavesBuffer):
The default parameter was never non-defaulted from any of the
callers. The new version calls the impl directly because it
doesn't have VM and doesn't hard-code the address of
topEntryFrame.

  • jit/RegisterSet.cpp:

(JSC::RegisterSet::vmCalleeSaveRegisterOffsets): This was weird on
VM because it's not really VM-specific.

  • jit/RegisterSet.h:
  • runtime/VM.cpp:

(JSC::VM::getAllCalleeSaveRegisterOffsets): Deleted.

  • runtime/VM.h:

(JSC::VM::getCTIStub):

  • wasm/WasmB3IRGenerator.cpp:

(JSC::Wasm::B3IRGenerator::B3IRGenerator):
(JSC::Wasm::B3IRGenerator::addCall):
(JSC::Wasm::B3IRGenerator::addCallIndirect):

  • wasm/WasmInstance.cpp:

(JSC::Wasm::Instance::Instance):

  • wasm/WasmInstance.h: topEntryFramePointer will eventually live

here for real. Right now it's mirrored in JSWebAssemblyInstance
because that's the acting Context.
(JSC::Wasm::Instance::create):
(JSC::Wasm::Instance::offsetOfTopEntryFramePointer):

  • wasm/WasmThunks.cpp:

(JSC::Wasm::throwExceptionFromWasmThunkGenerator):

  • wasm/js/JSWebAssemblyInstance.cpp:

(JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):

  • wasm/js/JSWebAssemblyInstance.h: Mirror Wasm::Instance temporarily.

(JSC::JSWebAssemblyInstance::offsetOfCallee):
(JSC::JSWebAssemblyInstance::offsetOfTopEntryFramePointer):
(JSC::JSWebAssemblyInstance::offsetOfVM): Deleted.

  • wasm/js/WebAssemblyInstanceConstructor.cpp:

(JSC::constructJSWebAssemblyInstance):

  • wasm/js/WebAssemblyPrototype.cpp:

(JSC::instantiate):

Location:
trunk/Source/JavaScriptCore
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r223856 r223866  
     12017-10-23  JF Bastien  <jfbastien@apple.com>
     2
     3        WebAssembly: topEntryFrame on Wasm::Instance
     4        https://bugs.webkit.org/show_bug.cgi?id=178690
     5
     6        Reviewed by Saam Barati.
     7
     8        topEntryFrame is usually on VM, but for a no-VM WebAssembly we
     9        need to hold topEntryFrame elsewhere, and generated code cannot
     10        hard-code where topEntryFrame live. Do this at creation time of
     11        Wasm::Instance, and then generated code will just load from
     12        wherever Wasm::Instance was told topEntryFrame is. In a JavaScript
     13        embedding this is still from VM, so all of the unwinding machinery
     14        stays the same.
     15
     16        * dfg/DFGOSREntry.cpp:
     17        (JSC::DFG::prepareOSREntry):
     18        * dfg/DFGOSRExit.cpp:
     19        (JSC::DFG::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer):
     20        (JSC::DFG::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
     21        * ftl/FTLOSRExitCompiler.cpp:
     22        (JSC::FTL::compileStub):
     23        * interpreter/Interpreter.cpp:
     24        (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
     25        * jit/AssemblyHelpers.cpp:
     26        (JSC::AssemblyHelpers::restoreCalleeSavesFromEntryFrameCalleeSavesBuffer):
     27        (JSC::AssemblyHelpers::copyCalleeSavesToEntryFrameCalleeSavesBufferImpl):
     28        * jit/AssemblyHelpers.h:
     29        (JSC::AssemblyHelpers::copyCalleeSavesToEntryFrameCalleeSavesBuffer):
     30        The default parameter was never non-defaulted from any of the
     31        callers. The new version calls the impl directly because it
     32        doesn't have VM and doesn't hard-code the address of
     33        topEntryFrame.
     34        * jit/RegisterSet.cpp:
     35        (JSC::RegisterSet::vmCalleeSaveRegisterOffsets): This was weird on
     36        VM because it's not really VM-specific.
     37        * jit/RegisterSet.h:
     38        * runtime/VM.cpp:
     39        (JSC::VM::getAllCalleeSaveRegisterOffsets): Deleted.
     40        * runtime/VM.h:
     41        (JSC::VM::getCTIStub):
     42        * wasm/WasmB3IRGenerator.cpp:
     43        (JSC::Wasm::B3IRGenerator::B3IRGenerator):
     44        (JSC::Wasm::B3IRGenerator::addCall):
     45        (JSC::Wasm::B3IRGenerator::addCallIndirect):
     46        * wasm/WasmInstance.cpp:
     47        (JSC::Wasm::Instance::Instance):
     48        * wasm/WasmInstance.h: topEntryFramePointer will eventually live
     49        here for real. Right now it's mirrored in JSWebAssemblyInstance
     50        because that's the acting Context.
     51        (JSC::Wasm::Instance::create):
     52        (JSC::Wasm::Instance::offsetOfTopEntryFramePointer):
     53        * wasm/WasmThunks.cpp:
     54        (JSC::Wasm::throwExceptionFromWasmThunkGenerator):
     55        * wasm/js/JSWebAssemblyInstance.cpp:
     56        (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
     57        * wasm/js/JSWebAssemblyInstance.h: Mirror Wasm::Instance temporarily.
     58        (JSC::JSWebAssemblyInstance::offsetOfCallee):
     59        (JSC::JSWebAssemblyInstance::offsetOfTopEntryFramePointer):
     60        (JSC::JSWebAssemblyInstance::offsetOfVM): Deleted.
     61        * wasm/js/WebAssemblyInstanceConstructor.cpp:
     62        (JSC::constructJSWebAssemblyInstance):
     63        * wasm/js/WebAssemblyPrototype.cpp:
     64        (JSC::instantiate):
     65
    1662017-10-23  Joseph Pecoraro  <pecoraro@apple.com>
    267
  • trunk/Source/JavaScriptCore/dfg/DFGOSREntry.cpp

    r223738 r223866  
    314314#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
    315315    RegisterAtOffsetList* registerSaveLocations = codeBlock->calleeSaveRegisters();
    316     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     316    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    317317    RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
    318318
  • trunk/Source/JavaScriptCore/dfg/DFGOSRExit.cpp

    r223738 r223866  
    123123    VM& vm = *context.arg<VM*>();
    124124
    125     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     125    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    126126    RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters();
    127127    unsigned registerCount = allCalleeSaves->size();
     
    152152    void* calleeSaveBuffer = entryRecord->calleeSaveRegistersBuffer;
    153153
    154     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     154    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    155155    RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
    156156    unsigned registerCount = allCalleeSaves->size();
  • trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp

    r223738 r223866  
    410410    RegisterSet allFTLCalleeSaves = RegisterSet::ftlCalleeSaveRegisters();
    411411    RegisterAtOffsetList* baselineCalleeSaves = baselineCodeBlock->calleeSaveRegisters();
    412     RegisterAtOffsetList* vmCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     412    RegisterAtOffsetList* vmCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    413413    RegisterSet vmCalleeSavesToSkip = RegisterSet::stackRegisters();
    414414    if (exit.isExceptionHandler()) {
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r223738 r223866  
    672672            return;
    673673
    674         RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     674        RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    675675        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
    676676        intptr_t* frame = reinterpret_cast<intptr_t*>(m_callFrame->registers());
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.cpp

    r223738 r223866  
    586586{
    587587#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
    588     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     588    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    589589    RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters();
    590590    unsigned registerCount = allCalleeSaves->size();
     
    881881    addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), calleeSavesBuffer);
    882882
    883     RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     883    RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    884884    RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
    885885    unsigned registerCount = allCalleeSaves->size();
  • trunk/Source/JavaScriptCore/jit/AssemblyHelpers.h

    r223738 r223866  
    368368    }
    369369
    370     void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame, const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() })
     370    void copyCalleeSavesToEntryFrameCalleeSavesBuffer(EntryFrame*& topEntryFrame)
    371371    {
    372372#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
     373        const TempRegisterSet& usedRegisters = { RegisterSet::stubUnavailableRegisters() };
    373374        GPRReg temp1 = usedRegisters.getFreeGPR(0);
    374375        loadPtr(&topEntryFrame, temp1);
     
    376377#else
    377378        UNUSED_PARAM(topEntryFrame);
    378         UNUSED_PARAM(usedRegisters);
     379#endif
     380    }
     381   
     382    void copyCalleeSavesToEntryFrameCalleeSavesBuffer(GPRReg topEntryFrame)
     383    {
     384#if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
     385        copyCalleeSavesToEntryFrameCalleeSavesBufferImpl(topEntryFrame);
     386#else
     387        UNUSED_PARAM(topEntryFrame);
    379388#endif
    380389    }
     
    396405        addPtr(TrustedImm32(EntryFrame::calleeSaveRegistersBufferOffset()), temp1);
    397406
    398         RegisterAtOffsetList* allCalleeSaves = VM::getAllCalleeSaveRegisterOffsets();
     407        RegisterAtOffsetList* allCalleeSaves = RegisterSet::vmCalleeSaveRegisterOffsets();
    399408        RegisterAtOffsetList* currentCalleeSaves = codeBlock()->calleeSaveRegisters();
    400409        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
  • trunk/Source/JavaScriptCore/jit/RegisterSet.cpp

    r219740 r223866  
    3030
    3131#include "GPRInfo.h"
     32#include "JSCInlines.h"
    3233#include "MacroAssembler.h"
    33 #include "JSCInlines.h"
     34#include "RegisterAtOffsetList.h"
    3435#include <wtf/CommaPrinter.h>
    3536
     
    202203}
    203204
     205RegisterAtOffsetList* RegisterSet::vmCalleeSaveRegisterOffsets()
     206{
     207    static RegisterAtOffsetList* result;
     208    static std::once_flag calleeSavesFlag;
     209    std::call_once(calleeSavesFlag, [] () {
     210        result = new RegisterAtOffsetList(vmCalleeSaveRegisters(), RegisterAtOffsetList::ZeroBased);
     211    });
     212    return result;
     213}
     214
    204215RegisterSet RegisterSet::llintBaselineCalleeSaveRegisters()
    205216{
  • trunk/Source/JavaScriptCore/jit/RegisterSet.h

    r219633 r223866  
    3737
    3838typedef Bitmap<MacroAssembler::numGPRs + MacroAssembler::numFPRs + 1> RegisterBitmap;
     39class RegisterAtOffsetList;
    3940
    4041class RegisterSet {
     
    5253    JS_EXPORT_PRIVATE static RegisterSet calleeSaveRegisters();
    5354    static RegisterSet vmCalleeSaveRegisters(); // Callee save registers that might be saved and used by any tier.
     55    static RegisterAtOffsetList* vmCalleeSaveRegisterOffsets();
    5456    static RegisterSet llintBaselineCalleeSaveRegisters(); // Registers saved and used by the LLInt.
    5557    static RegisterSet dfgCalleeSaveRegisters(); // Registers saved and used by the DFG JIT.
  • trunk/Source/JavaScriptCore/runtime/VM.cpp

    r223738 r223866  
    997997#endif
    998998
    999 #if ENABLE(JIT)
    1000 RegisterAtOffsetList* VM::getAllCalleeSaveRegisterOffsets()
    1001 {
    1002     static RegisterAtOffsetList* result;
    1003 
    1004     static std::once_flag calleeSavesFlag;
    1005     std::call_once(calleeSavesFlag, [] () {
    1006         result = new RegisterAtOffsetList(RegisterSet::vmCalleeSaveRegisters(), RegisterAtOffsetList::ZeroBased);
    1007     });
    1008 
    1009     return result;
    1010 }
    1011 #endif // ENABLE(JIT)
    1012 
    1013999#if USE(CF)
    10141000void VM::registerRunLoopTimer(JSRunLoopTimer* timer)
  • trunk/Source/JavaScriptCore/runtime/VM.h

    r223738 r223866  
    479479        return jitStubs->ctiStub(this, generator);
    480480    }
    481    
    482     static RegisterAtOffsetList* getAllCalleeSaveRegisterOffsets();
    483481
    484482#endif // ENABLE(JIT)
  • trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp

    r223738 r223866  
    407407                // 2. Try to speed things up by skipping stack checks.
    408408                minimumParentCheckSize,
    409                 // This allows us to elide stack checks in the Wasm -> JS call IC stub. Since these will
     409                // This allows us to elide stack checks in the Wasm -> Embedder call IC stub. Since these will
    410410                // spill all arguments to the stack, we ensure that a stack check here covers the
    411411                // stack that such a stub would use.
     
    11101110
    11111111        // FIXME: Let's remove this indirection by creating a PIC friendly IC
    1112         // for calls out to JS. This shouldn't be that hard to do. We could probably
     1112        // for calls out to the embedder. This shouldn't be that hard to do. We could probably
    11131113        // implement the IC to be over Context*.
    11141114        // https://bugs.webkit.org/show_bug.cgi?id=170375
     
    11701170    m_makesCalls = true;
    11711171    // Note: call indirect can call either WebAssemblyFunction or WebAssemblyWrapperFunction. Because
    1172     // WebAssemblyWrapperFunction is like calling into JS, we conservatively assume all call indirects
    1173     // can be to JS for our stack check calculation.
     1172    // WebAssemblyWrapperFunction is like calling into the embedder, we conservatively assume all call indirects
     1173    // can be to the embedder for our stack check calculation.
    11741174    m_maxNumJSCallArguments = std::max(m_maxNumJSCallArguments, static_cast<uint32_t>(args.size()));
    11751175
  • trunk/Source/JavaScriptCore/wasm/WasmInstance.cpp

    r223738 r223866  
    4141}
    4242
    43 Instance::Instance(Ref<Module>&& module)
     43Instance::Instance(Ref<Module>&& module, EntryFrame** topEntryFramePointer)
    4444    : m_module(WTFMove(module))
    4545    , m_globals(MallocPtr<uint64_t>::malloc(globalMemoryByteSize(m_module.get())))
     46    , m_topEntryFramePointer(topEntryFramePointer)
    4647{
    4748}
  • trunk/Source/JavaScriptCore/wasm/WasmInstance.h

    r223738 r223866  
    4141class Instance : public ThreadSafeRefCounted<Instance> {
    4242public:
    43     static Ref<Instance> create(Ref<Module>&& module)
     43    static Ref<Instance> create(Ref<Module>&& module, EntryFrame** topEntryFramePointer)
    4444    {
    45         return adoptRef(*new Instance(WTFMove(module)));
     45        return adoptRef(*new Instance(WTFMove(module), topEntryFramePointer));
    4646    }
    4747
     
    6666    void setGlobal(unsigned i, int64_t bits) { m_globals.get()[i] = bits; }
    6767
     68    static ptrdiff_t offsetOfTopEntryFramePointer() { return OBJECT_OFFSETOF(Instance, m_topEntryFramePointer); }
     69
    6870    static ptrdiff_t offsetOfCachedStackLimit() { return OBJECT_OFFSETOF(Instance, m_cachedStackLimit); }
    6971    void* cachedStackLimit() const { return m_cachedStackLimit; }
     
    7375
    7476private:
    75     Instance(Ref<Module>&&);
     77    Instance(Ref<Module>&&, EntryFrame**);
    7678
    7779    Ref<Module> m_module;
     
    8082    RefPtr<Table> m_table;
    8183    MallocPtr<uint64_t> m_globals;
     84    EntryFrame** m_topEntryFramePointer { nullptr };
    8285    void* m_cachedStackLimit { bitwise_cast<void*>(std::numeric_limits<uintptr_t>::max()) };
    8386};
  • trunk/Source/JavaScriptCore/wasm/WasmThunks.cpp

    r223738 r223866  
    4848    // We're allowed to use temp registers here. We are not allowed to use callee saves.
    4949    jit.loadWasmContextInstance(GPRInfo::argumentGPR2);
    50     jit.loadPtr(CCallHelpers::Address(GPRInfo::argumentGPR2, JSWebAssemblyInstance::offsetOfVM()), GPRInfo::argumentGPR0);
    51     jit.copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(GPRInfo::argumentGPR0);
     50    jit.loadPtr(CCallHelpers::Address(GPRInfo::argumentGPR2, JSWebAssemblyInstance::offsetOfTopEntryFramePointer()), GPRInfo::argumentGPR0);
     51    jit.loadPtr(CCallHelpers::Address(GPRInfo::argumentGPR0), GPRInfo::argumentGPR0);
     52    jit.copyCalleeSavesToEntryFrameCalleeSavesBuffer(GPRInfo::argumentGPR0);
    5253    jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
    5354    CCallHelpers::Call call = jit.call();
  • trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.cpp

    r223738 r223866  
    5757    , m_wasmTable(m_instance->m_table.get())
    5858    , m_globals(m_instance->m_globals.get())
     59    , m_topEntryFramePointer(m_instance->m_topEntryFramePointer)
    5960    , m_numImportFunctions(numImportFunctions)
    6061{
  • trunk/Source/JavaScriptCore/wasm/js/JSWebAssemblyInstance.h

    r223738 r223866  
    9393    static ptrdiff_t offsetOfWasmTable() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_wasmTable); }
    9494    static ptrdiff_t offsetOfCallee() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_callee); }
    95     static ptrdiff_t offsetOfVM() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_vm); }
    9695    static ptrdiff_t offsetOfGlobals() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_globals); }
    9796    static ptrdiff_t offsetOfCodeBlock() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_codeBlock); }
     
    9998    static ptrdiff_t offsetOfCachedStackLimit() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_cachedStackLimit); }
    10099    static ptrdiff_t offsetOfWasmMemory() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_wasmMemory); }
     100    static ptrdiff_t offsetOfTopEntryFramePointer() { return OBJECT_OFFSETOF(JSWebAssemblyInstance, m_topEntryFramePointer); }
    101101    void* cachedStackLimit() const { RELEASE_ASSERT(m_instance->cachedStackLimit() == m_cachedStackLimit); return m_cachedStackLimit; }
    102102    void setCachedStackLimit(void* limit) { m_instance->setCachedStackLimit(limit); m_cachedStackLimit = limit; }
     
    135135    Wasm::Table* m_wasmTable { nullptr };
    136136    uint64_t* m_globals { nullptr };
     137    EntryFrame** m_topEntryFramePointer { nullptr };
    137138
    138139    unsigned m_numImportFunctions;
  • trunk/Source/JavaScriptCore/wasm/js/WebAssemblyInstanceConstructor.cpp

    r223738 r223866  
    7878    RETURN_IF_EXCEPTION(scope, { });
    7979
    80     JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, instanceStructure, Wasm::Instance::create(Ref<Wasm::Module>(module->module())));
     80    JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, instanceStructure, Wasm::Instance::create(Ref<Wasm::Module>(module->module()), &vm.topEntryFrame));
    8181    RETURN_IF_EXCEPTION(scope, { });
    8282
  • trunk/Source/JavaScriptCore/wasm/js/WebAssemblyPrototype.cpp

    r223738 r223866  
    138138    auto scope = DECLARE_CATCH_SCOPE(vm);
    139139    // In order to avoid potentially recompiling a module. We first gather all the import/memory information prior to compiling code.
    140     JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, exec->lexicalGlobalObject()->WebAssemblyInstanceStructure(), Wasm::Instance::create(Ref<Wasm::Module>(module->module())));
     140    JSWebAssemblyInstance* instance = JSWebAssemblyInstance::create(vm, exec, module, importObject, exec->lexicalGlobalObject()->WebAssemblyInstanceStructure(), Wasm::Instance::create(Ref<Wasm::Module>(module->module()), &vm.topEntryFrame));
    141141    RETURN_IF_EXCEPTION(scope, reject(exec, scope, promise));
    142142
Note: See TracChangeset for help on using the changeset viewer.