Changeset 243312 in webkit
- Timestamp:
- Mar 21, 2019, 12:14:12 PM (7 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 14 edited
-
CMakeLists.txt (modified) (1 diff)
-
ChangeLog (modified) (1 diff)
-
JavaScriptCore.xcodeproj/project.pbxproj (modified) (5 diffs)
-
heap/Heap.cpp (modified) (1 diff)
-
jit/ExecutableAllocator.cpp (modified) (14 diffs)
-
jit/ExecutableAllocator.h (modified) (3 diffs)
-
jsc.cpp (modified) (2 diffs)
-
runtime/InitializeThreading.cpp (modified) (3 diffs)
-
runtime/JSGlobalObject.cpp (modified) (2 diffs)
-
runtime/JSLock.cpp (modified) (2 diffs)
-
runtime/Options.cpp (modified) (2 diffs)
-
runtime/VM.cpp (modified) (5 diffs)
-
runtime/VM.h (modified) (1 diff)
-
wasm/WasmCapabilities.h (added)
-
wasm/WasmFaultSignalHandler.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r243279 r243312 978 978 runtime/WriteBarrierInlines.h 979 979 980 wasm/WasmCapabilities.h 980 981 wasm/WasmCodeBlock.h 981 982 wasm/WasmContext.h -
trunk/Source/JavaScriptCore/ChangeLog
r243311 r243312 1 2019-03-21 Yusuke Suzuki <ysuzuki@apple.com> 2 3 [JSC] Do not create JIT related data under non-JIT mode 4 https://bugs.webkit.org/show_bug.cgi?id=195982 5 6 Reviewed by Mark Lam. 7 8 We avoid creations of JIT related data structures under non-JIT mode. 9 This patch removes the following allocations. 10 11 1. JITThunks 12 2. FTLThunks 13 3. FixedVMPoolExecutableAllocator 14 4. noJITValueProfileSingleton since it is no longer used 15 5. ARM disassembler should be initialized when it is used 16 6. Wasm related data structures are accidentally allocated if VM::canUseJIT() == false && 17 Options::useWebAssembly() == true. Add Wasm::isSupported() function to check the both conditions. 18 19 * CMakeLists.txt: 20 * JavaScriptCore.xcodeproj/project.pbxproj: 21 * heap/Heap.cpp: 22 (JSC::Heap::runEndPhase): 23 * jit/ExecutableAllocator.cpp: 24 (JSC::FixedVMPoolExecutableAllocator::~FixedVMPoolExecutableAllocator): 25 (JSC::ExecutableAllocator::initializeUnderlyingAllocator): 26 (JSC::ExecutableAllocator::isValid const): 27 (JSC::ExecutableAllocator::underMemoryPressure): 28 (JSC::ExecutableAllocator::memoryPressureMultiplier): 29 (JSC::ExecutableAllocator::allocate): 30 (JSC::ExecutableAllocator::isValidExecutableMemory): 31 (JSC::ExecutableAllocator::getLock const): 32 (JSC::ExecutableAllocator::committedByteCount): 33 (JSC::ExecutableAllocator::dumpProfile): 34 (JSC::startOfFixedExecutableMemoryPoolImpl): 35 (JSC::endOfFixedExecutableMemoryPoolImpl): 36 (JSC::ExecutableAllocator::initialize): 37 (JSC::ExecutableAllocator::initializeAllocator): Deleted. 38 (JSC::ExecutableAllocator::ExecutableAllocator): Deleted. 39 (JSC::ExecutableAllocator::~ExecutableAllocator): Deleted. 40 * jit/ExecutableAllocator.h: 41 (JSC::ExecutableAllocatorBase::isValid const): 42 (JSC::ExecutableAllocatorBase::underMemoryPressure): 43 (JSC::ExecutableAllocatorBase::memoryPressureMultiplier): 44 (JSC::ExecutableAllocatorBase::dumpProfile): 45 (JSC::ExecutableAllocatorBase::allocate): 46 (JSC::ExecutableAllocatorBase::setJITEnabled): 47 (JSC::ExecutableAllocatorBase::isValidExecutableMemory): 48 (JSC::ExecutableAllocatorBase::committedByteCount): 49 (JSC::ExecutableAllocatorBase::getLock const): 50 (JSC::ExecutableAllocator::isValid const): Deleted. 51 (JSC::ExecutableAllocator::underMemoryPressure): Deleted. 52 (JSC::ExecutableAllocator::memoryPressureMultiplier): Deleted. 53 (JSC::ExecutableAllocator::allocate): Deleted. 54 (JSC::ExecutableAllocator::setJITEnabled): Deleted. 55 (JSC::ExecutableAllocator::isValidExecutableMemory): Deleted. 56 (JSC::ExecutableAllocator::committedByteCount): Deleted. 57 (JSC::ExecutableAllocator::getLock const): Deleted. 58 * jsc.cpp: 59 (functionWebAssemblyMemoryMode): 60 * runtime/InitializeThreading.cpp: 61 (JSC::initializeThreading): 62 * runtime/JSGlobalObject.cpp: 63 (JSC::JSGlobalObject::init): 64 * runtime/JSLock.cpp: 65 (JSC::JSLock::didAcquireLock): 66 * runtime/Options.cpp: 67 (JSC::recomputeDependentOptions): 68 * runtime/VM.cpp: 69 (JSC::enableAssembler): 70 (JSC::VM::canUseAssembler): 71 (JSC::VM::VM): 72 * runtime/VM.h: 73 * wasm/WasmCapabilities.h: Added. 74 (JSC::Wasm::isSupported): 75 * wasm/WasmFaultSignalHandler.cpp: 76 (JSC::Wasm::enableFastMemory): 77 1 78 2019-03-21 Yusuke Suzuki <ysuzuki@apple.com> 2 79 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r243279 r243312 1753 1753 E334CBB521FD96A9000EB178 /* RegExpGlobalData.h in Headers */ = {isa = PBXBuildFile; fileRef = E334CBB321FD96A9000EB178 /* RegExpGlobalData.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1754 1754 E33637A61B63220200EE0840 /* ReflectObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E33637A41B63220200EE0840 /* ReflectObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1755 E337B967224324EA0093A820 /* WasmCapabilities.h in Headers */ = {isa = PBXBuildFile; fileRef = E337B966224324E50093A820 /* WasmCapabilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1755 1756 E33B3E261B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h in Headers */ = {isa = PBXBuildFile; fileRef = E33B3E251B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h */; }; 1756 1757 E33E8D1D1B9013C300346B52 /* JSNativeStdFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = E33E8D1B1B9013C300346B52 /* JSNativeStdFunction.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 4694 4695 E33637A31B63220200EE0840 /* ReflectObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReflectObject.cpp; sourceTree = "<group>"; }; 4695 4696 E33637A41B63220200EE0840 /* ReflectObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReflectObject.h; sourceTree = "<group>"; }; 4697 E337B966224324E50093A820 /* WasmCapabilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WasmCapabilities.h; sourceTree = "<group>"; }; 4696 4698 E33B3E251B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorInstrumentationObject.lut.h; sourceTree = "<group>"; }; 4697 4699 E33E8D1A1B9013C300346B52 /* JSNativeStdFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSNativeStdFunction.cpp; sourceTree = "<group>"; }; … … 5084 5086 14BD59BF0A3E8F9000BAF59C /* testapi */, 5085 5087 0FEC85AD1BDB5CF10080FF74 /* testb3 */, 5088 52CD0F642242F569004A18A5 /* testdfg */, 5086 5089 FE533CAC1F217DB40016A1FE /* testmasm */, 5087 5090 79281BDC20B62B3E002E2A60 /* testmem */, 5088 5091 6511230514046A4C002B101D /* testRegExp */, 5089 5092 932F5BD90822A1C700736975 /* JavaScriptCore.framework */, 5090 52CD0F642242F569004A18A5 /* testdfg */,5091 5093 ); 5092 5094 name = Products; … … 6494 6496 53FD04D11D7AB187003287D3 /* WasmCallingConvention.cpp */, 6495 6497 53FD04D21D7AB187003287D3 /* WasmCallingConvention.h */, 6498 E337B966224324E50093A820 /* WasmCapabilities.h */, 6496 6499 526AC4B41E977C5D003500E1 /* WasmCodeBlock.cpp */, 6497 6500 526AC4B51E977C5D003500E1 /* WasmCodeBlock.h */, … … 9825 9828 525C0DDA1E935847002184CD /* WasmCallee.h in Headers */, 9826 9829 53FD04D41D7AB291003287D3 /* WasmCallingConvention.h in Headers */, 9830 E337B967224324EA0093A820 /* WasmCapabilities.h in Headers */, 9827 9831 526AC4B71E977C5D003500E1 /* WasmCodeBlock.h in Headers */, 9828 9832 AD412B341E7B2E9E008AF157 /* WasmContext.h in Headers */, -
trunk/Source/JavaScriptCore/heap/Heap.cpp
r243086 r243312 1497 1497 vm()->typeProfiler()->invalidateTypeSetCache(); 1498 1498 1499 if (ValueProfile* profile = vm()->noJITValueProfileSingleton.get())1500 *profile = ValueProfile(0);1501 1502 1499 reapWeakHandles(); 1503 1500 pruneStaleEntriesFromWeakGCMaps(); -
trunk/Source/JavaScriptCore/jit/ExecutableAllocator.cpp
r243254 r243312 116 116 class FixedVMPoolExecutableAllocator; 117 117 static FixedVMPoolExecutableAllocator* allocator = nullptr; 118 static ExecutableAllocator* executableAllocator = nullptr;119 118 120 119 static bool s_isJITEnabled = true; … … 405 404 }; 406 405 407 void ExecutableAllocator::initializeAllocator() 406 FixedVMPoolExecutableAllocator::~FixedVMPoolExecutableAllocator() 407 { 408 m_reservation.deallocate(); 409 } 410 411 void ExecutableAllocator::initializeUnderlyingAllocator() 408 412 { 409 413 ASSERT(!allocator); 410 414 allocator = new FixedVMPoolExecutableAllocator(); 411 415 CodeProfiling::notifyAllocator(allocator); 412 413 executableAllocator = new ExecutableAllocator;414 }415 416 ExecutableAllocator& ExecutableAllocator::singleton()417 {418 ASSERT(allocator);419 ASSERT(executableAllocator);420 return *executableAllocator;421 }422 423 ExecutableAllocator::ExecutableAllocator()424 {425 ASSERT(allocator);426 }427 428 ExecutableAllocator::~ExecutableAllocator()429 {430 }431 432 FixedVMPoolExecutableAllocator::~FixedVMPoolExecutableAllocator()433 {434 m_reservation.deallocate();435 416 } 436 417 437 418 bool ExecutableAllocator::isValid() const 438 419 { 420 if (!allocator) 421 return Base::isValid(); 439 422 return !!allocator->bytesReserved(); 440 423 } … … 442 425 bool ExecutableAllocator::underMemoryPressure() 443 426 { 427 if (!allocator) 428 return Base::underMemoryPressure(); 444 429 MetaAllocator::Statistics statistics = allocator->currentStatistics(); 445 430 return statistics.bytesAllocated > statistics.bytesReserved / 2; … … 448 433 double ExecutableAllocator::memoryPressureMultiplier(size_t addedMemoryUsage) 449 434 { 435 if (!allocator) 436 return Base::memoryPressureMultiplier(addedMemoryUsage); 450 437 MetaAllocator::Statistics statistics = allocator->currentStatistics(); 451 438 ASSERT(statistics.bytesAllocated <= statistics.bytesReserved); … … 466 453 RefPtr<ExecutableMemoryHandle> ExecutableAllocator::allocate(size_t sizeInBytes, void* ownerUID, JITCompilationEffort effort) 467 454 { 455 if (!allocator) 456 return Base::allocate(sizeInBytes, ownerUID, effort); 468 457 if (Options::logExecutableAllocation()) { 469 458 MetaAllocator::Statistics stats = allocator->currentStatistics(); … … 515 504 bool ExecutableAllocator::isValidExecutableMemory(const AbstractLocker& locker, void* address) 516 505 { 506 if (!allocator) 507 return Base::isValidExecutableMemory(locker, address); 517 508 return allocator->isInAllocatedMemory(locker, address); 518 509 } … … 520 511 Lock& ExecutableAllocator::getLock() const 521 512 { 513 if (!allocator) 514 return Base::getLock(); 522 515 return allocator->getLock(); 523 516 } … … 525 518 size_t ExecutableAllocator::committedByteCount() 526 519 { 520 if (!allocator) 521 return Base::committedByteCount(); 527 522 return allocator->bytesCommitted(); 528 523 } … … 531 526 void ExecutableAllocator::dumpProfile() 532 527 { 528 if (!allocator) 529 return; 533 530 allocator->dumpProfile(); 534 531 } … … 537 534 void* startOfFixedExecutableMemoryPoolImpl() 538 535 { 536 if (!allocator) 537 return nullptr; 539 538 return allocator->memoryStart(); 540 539 } … … 542 541 void* endOfFixedExecutableMemoryPoolImpl() 543 542 { 543 if (!allocator) 544 return nullptr; 544 545 return allocator->memoryEnd(); 545 546 } … … 552 553 } // namespace JSC 553 554 554 #e lse // !ENABLE(JIT)555 #endif // ENABLE(JIT) 555 556 556 557 namespace JSC { … … 558 559 static ExecutableAllocator* executableAllocator; 559 560 560 void ExecutableAllocator::initialize Allocator()561 void ExecutableAllocator::initialize() 561 562 { 562 563 executableAllocator = new ExecutableAllocator; … … 570 571 571 572 } // namespace JSC 572 573 #endif // ENABLE(JIT) -
trunk/Source/JavaScriptCore/jit/ExecutableAllocator.h
r241923 r243312 60 60 typedef WTF::MetaAllocatorHandle ExecutableMemoryHandle; 61 61 62 class ExecutableAllocatorBase { 63 WTF_MAKE_FAST_ALLOCATED; 64 WTF_MAKE_NONCOPYABLE(ExecutableAllocatorBase); 65 public: 66 bool isValid() const { return false; } 67 68 static bool underMemoryPressure() { return false; } 69 70 static double memoryPressureMultiplier(size_t) { return 1.0; } 71 72 static void dumpProfile() { } 73 74 RefPtr<ExecutableMemoryHandle> allocate(size_t, void*, JITCompilationEffort) { return nullptr; } 75 76 static void setJITEnabled(bool) { }; 77 78 bool isValidExecutableMemory(const AbstractLocker&, void*) { return false; } 79 80 static size_t committedByteCount() { return 0; } 81 82 Lock& getLock() const 83 { 84 return m_lock; 85 } 86 87 protected: 88 ExecutableAllocatorBase() = default; 89 ~ExecutableAllocatorBase() = default; 90 91 private: 92 mutable Lock m_lock; 93 }; 94 62 95 #if ENABLE(JIT) 63 96 … … 123 156 } 124 157 125 class ExecutableAllocator { 126 WTF_MAKE_FAST_ALLOCATED; 127 WTF_MAKE_NONCOPYABLE(ExecutableAllocator); 128 enum ProtectionSetting { Writable, Executable }; 129 158 class ExecutableAllocator : private ExecutableAllocatorBase { 130 159 public: 160 using Base = ExecutableAllocatorBase; 161 131 162 static ExecutableAllocator& singleton(); 132 static void initializeAllocator(); 163 static void initialize(); 164 static void initializeUnderlyingAllocator(); 133 165 134 166 bool isValid() const; … … 153 185 154 186 Lock& getLock() const; 187 155 188 private: 156 157 ExecutableAllocator(); 158 ~ExecutableAllocator(); 189 ExecutableAllocator() = default; 190 ~ExecutableAllocator() = default; 159 191 }; 160 192 161 193 #else 162 194 163 class ExecutableAllocator { 164 enum ProtectionSetting { Writable, Executable }; 165 195 class ExecutableAllocator : public ExecutableAllocatorBase { 166 196 public: 167 197 static ExecutableAllocator& singleton(); 168 static void initializeAllocator(); 169 170 bool isValid() const { return false; } 171 172 static bool underMemoryPressure() { return false; } 173 174 static double memoryPressureMultiplier(size_t) { return 1.0; } 175 176 static void dumpProfile() { } 177 178 RefPtr<ExecutableMemoryHandle> allocate(size_t, void*, JITCompilationEffort) { return nullptr; } 179 180 static void setJITEnabled(bool) { }; 181 182 bool isValidExecutableMemory(const AbstractLocker&, void*) { return false; } 183 184 static size_t committedByteCount() { return 0; } 185 186 Lock& getLock() const 187 { 188 return m_lock; 189 } 198 static void initialize(); 190 199 191 200 private: 192 mutable Lock m_lock; 201 ExecutableAllocator() = default; 202 ~ExecutableAllocator() = default; 193 203 }; 194 204 -
trunk/Source/JavaScriptCore/jsc.cpp
r243086 r243312 70 70 #include "TestRunnerUtils.h" 71 71 #include "TypedArrayInlines.h" 72 #include "WasmCapabilities.h" 72 73 #include "WasmContext.h" 73 74 #include "WasmFaultSignalHandler.h" … … 2308 2309 auto scope = DECLARE_THROW_SCOPE(vm); 2309 2310 2310 if (! Options::useWebAssembly())2311 if (!Wasm::isSupported()) 2311 2312 return throwVMTypeError(exec, scope, "WebAssemblyMemoryMode should only be called if the useWebAssembly option is set"_s); 2312 2313 -
trunk/Source/JavaScriptCore/runtime/InitializeThreading.cpp
r243254 r243312 41 41 #include "MacroAssemblerCodeRef.h" 42 42 #include "Options.h" 43 #include "SigillCrashAnalyzer.h" 43 44 #include "StructureIDTable.h" 44 45 #include "SuperSampler.h" 46 #include "WasmCapabilities.h" 45 47 #include "WasmThunks.h" 46 48 #include "WriteBarrier.h" … … 69 71 #endif 70 72 71 #if ENABLE(ASSEMBLER) 72 ExecutableAllocator::initializeAllocator(); 73 #endif 73 ExecutableAllocator::initialize(); 74 74 VM::computeCanUseJIT(); 75 76 if (VM::canUseJIT() && Options::useSigillCrashAnalyzer()) 77 enableSigillCrashAnalyzer(); 75 78 76 79 LLInt::initialize(); … … 84 87 85 88 #if ENABLE(WEBASSEMBLY) 86 if ( Options::useWebAssembly())89 if (Wasm::isSupported()) 87 90 Wasm::Thunks::initialize(); 88 91 #endif -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp
r243011 r243312 169 169 #include "SymbolPrototype.h" 170 170 #include "VariableWriteFireDetail.h" 171 #include "WasmCapabilities.h" 171 172 #include "WeakGCMapInlines.h" 172 173 #include "WeakMapConstructor.h" … … 1043 1044 1044 1045 #if ENABLE(WEBASSEMBLY) 1045 if ( Options::useWebAssembly()) {1046 if (Wasm::isSupported()) { 1046 1047 auto* webAssemblyPrototype = WebAssemblyPrototype::create(vm, this, WebAssemblyPrototype::createStructure(vm, this, m_objectPrototype.get())); 1047 1048 m_webAssemblyModuleRecordStructure.initLater( -
trunk/Source/JavaScriptCore/runtime/JSLock.cpp
r241630 r243312 29 29 #include "MachineStackMarker.h" 30 30 #include "SamplingProfiler.h" 31 #include "WasmCapabilities.h" 31 32 #include "WasmMachineThreads.h" 32 33 #include <thread> … … 150 151 m_vm->heap.machineThreads().addCurrentThread(); 151 152 #if ENABLE(WEBASSEMBLY) 152 if ( Options::useWebAssembly())153 if (Wasm::isSupported()) 153 154 Wasm::startTrackingCurrentThread(); 154 155 #endif -
trunk/Source/JavaScriptCore/runtime/Options.cpp
r243254 r243312 421 421 #endif 422 422 423 if (!Options::useJIT()) 423 if (!Options::useJIT()) { 424 Options::useSigillCrashAnalyzer() = false; 424 425 Options::useWebAssembly() = false; 426 } 425 427 426 428 if (!Options::useWebAssembly()) … … 510 512 Options::scribbleFreeCells() = true; 511 513 } 512 513 if (Options::useSigillCrashAnalyzer())514 enableSigillCrashAnalyzer();515 514 516 515 if (Options::reservedZoneSize() < minimumReservedZoneSize) -
trunk/Source/JavaScriptCore/runtime/VM.cpp
r243279 r243312 186 186 187 187 #if ENABLE(ASSEMBLER) 188 static bool enableAssembler( ExecutableAllocator& executableAllocator)188 static bool enableAssembler() 189 189 { 190 190 if (!Options::useJIT() && !Options::useRegExpJIT()) 191 191 return false; 192 192 193 if (!executableAllocator.isValid()) { 193 char* canUseJITString = getenv("JavaScriptCoreUseJIT"); 194 if (canUseJITString && !atoi(canUseJITString)) 195 return false; 196 197 ExecutableAllocator::initializeUnderlyingAllocator(); 198 if (!ExecutableAllocator::singleton().isValid()) { 194 199 if (Options::crashIfCantAllocateJITMemory()) 195 200 CRASH(); … … 197 202 } 198 203 199 char* canUseJITString = getenv("JavaScriptCoreUseJIT"); 200 return !canUseJITString || atoi(canUseJITString); 204 return true; 201 205 } 202 206 #endif // ENABLE(!ASSEMBLER) … … 208 212 static bool enabled = false; 209 213 std::call_once(onceKey, [] { 210 enabled = enableAssembler( ExecutableAllocator::singleton());214 enabled = enableAssembler(); 211 215 }); 212 216 return enabled; … … 408 412 409 413 Thread::current().setCurrentAtomicStringTable(existingEntryAtomicStringTable); 410 411 #if ENABLE(JIT)412 jitStubs = std::make_unique<JITThunks>();413 #endif414 415 #if ENABLE(FTL_JIT)416 ftlThunks = std::make_unique<FTL::Thunks>();417 #endif // ENABLE(FTL_JIT)418 414 419 415 #if !ENABLE(C_LOOP) … … 473 469 // Make sure that any stubs that the JIT is going to use are initialized in non-compilation threads. 474 470 if (canUseJIT()) { 471 jitStubs = std::make_unique<JITThunks>(); 472 #if ENABLE(FTL_JIT) 473 ftlThunks = std::make_unique<FTL::Thunks>(); 474 #endif // ENABLE(FTL_JIT) 475 475 getCTIInternalFunctionTrampolineFor(CodeForCall); 476 476 getCTIInternalFunctionTrampolineFor(CodeForConstruct); 477 477 } 478 478 #endif 479 480 if (!canUseJIT())481 noJITValueProfileSingleton = std::make_unique<ValueProfile>(0);482 479 483 480 if (Options::forceDebuggerBytecodeGeneration() || Options::alwaysUseShadowChicken()) -
trunk/Source/JavaScriptCore/runtime/VM.h
r243279 r243312 805 805 #endif 806 806 807 std::unique_ptr<ValueProfile> noJITValueProfileSingleton;808 809 807 JS_EXPORT_PRIVATE void resetDateCache(); 810 808 -
trunk/Source/JavaScriptCore/wasm/WasmFaultSignalHandler.cpp
r237630 r243312 31 31 #include "ExecutableAllocator.h" 32 32 #include "MachineContext.h" 33 #include "WasmCapabilities.h" 33 34 #include "WasmExceptionType.h" 34 35 #include "WasmMemory.h" … … 127 128 static std::once_flag once; 128 129 std::call_once(once, [] { 130 if (!Wasm::isSupported()) 131 return; 132 129 133 if (!Options::useWebAssemblyFastMemory()) 130 134 return;
Note:
See TracChangeset
for help on using the changeset viewer.