Ignore:
Timestamp:
Apr 13, 2017, 7:10:17 PM (8 years ago)
Author:
[email protected]
Message:

WebAssembly: We should be able to postMessage a JSWebAssemblyModule
https://bugs.webkit.org/show_bug.cgi?id=170573

Reviewed by Filip Pizlo.

Source/JavaScriptCore:

This patch adds a callback to JSRunLoopTimer to notify
clients that a timer has been set. This is used inside
WorkerRunLoop in WebCore so that its RunLoop can perform
an iteration when it sees that a timer got set.

  • JavaScriptCore.xcodeproj/project.pbxproj:
  • runtime/JSRunLoopTimer.cpp:

(JSC::JSRunLoopTimer::scheduleTimer):
(JSC::JSRunLoopTimer::addTimerSetNotification):
(JSC::JSRunLoopTimer::removeTimerSetNotification):

  • runtime/JSRunLoopTimer.h:
  • wasm/WasmCodeBlock.cpp:

(JSC::Wasm::CodeBlock::~CodeBlock):

  • wasm/WasmCodeBlock.h:
  • wasm/WasmModule.cpp:

(JSC::Wasm::Module::~Module):
(JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace):
(JSC::Wasm::makeValidationCallback):
(JSC::Wasm::Module::validateSync):
(JSC::Wasm::Module::validateAsync):
(JSC::Wasm::Module::validateSyncImpl): Deleted.
(JSC::Wasm::Module::makeValidationCallback): Deleted.

  • wasm/WasmModule.h:

(JSC::Wasm::Module::validateSync): Deleted.
(JSC::Wasm::Module::validateAsync): Deleted.
(JSC::Wasm::Module::signatureIndexFromFunctionIndexSpace): Deleted.
(JSC::Wasm::Module::nonNullCodeBlock): Deleted.

  • wasm/js/JSWebAssemblyCodeBlock.cpp:

(JSC::JSWebAssemblyCodeBlock::create):

  • wasm/js/JSWebAssemblyCodeBlock.h:

(JSC::JSWebAssemblyCodeBlock::create): Deleted.

  • wasm/js/JSWebAssemblyModule.cpp:

(JSC::JSWebAssemblyModule::source):

  • wasm/js/JSWebAssemblyModule.h:

(JSC::JSWebAssemblyModule::source): Deleted.

  • wasm/js/WebAssemblyFunction.cpp:

(JSC::callWebAssemblyFunction):

  • wasm/js/WebAssemblyModulePrototype.cpp:

Source/WebCore:

This patch's main purpose is to implement postMessage of JSWebAssemblyModule.
The spec text describing the behavior is: https://github.com/WebAssembly/design/blob/master/JS.md#structured-clone-of-a-webassemblymodule
We only allow for JSWebAssemblyModule to be serialized in the postMessage
context. More work needs to be done to make it valid to store a module in
IndexDB.

All that is needed to serialize a JSWebAssemblyModule is grab a Ref
to its underlying Wasm::Module. So, when doing a postMessage, all we
do is grab this Ref, and then re-create the JSWebAssemblyModule from
the Wasm::Module in the new VM/global object. Because the code for
Wasm::Module is VM-independent, this is all that's needed. This turned
out nicely, because it requires little knowledge from WebCore about
what it means to clone a JSWebAssemblyModule.

The second significant part of this patch is teaching WorkerRunLoop about
the various timers inside JSC. Before, the WorkerRunLoop wouldn't always
wake up to address JSC timers. I noticed this bug when I was writing
tests to make sure that Wasm was running concurrently in different
workers. The bug is that the WorkerRunLoop's message queue has no insight
into a timer being scheduled. This effected the PromiseDeferredTimer that
Wasm uses, as well as the various GC timers that Heap uses. Now, WorkerRunLoop
will set itself up to be notified when timers are set. When a timer is
set, the WorkerRunLoop will perform an iteration to to reset its top
level MessageQueue timeout to be no longer than the next timer fire date.

Tests: storage/indexeddb/wasm-exceptions.html

workers/wasm-hashset-many.html
workers/wasm-hashset.html
workers/wasm-long-compile-many.html
workers/wasm-long-compile.html

  • ForwardingHeaders/heap/GCActivityCallback.h: Added.
  • ForwardingHeaders/runtime/JSRunLoopTimer.h: Added.
  • ForwardingHeaders/runtime/PromiseDeferredTimer.h: Added.
  • ForwardingHeaders/wasm: Added.
  • ForwardingHeaders/wasm/js: Added.
  • ForwardingHeaders/wasm/js/JSWebAssemblyModule.h: Added.
  • bindings/js/SerializedScriptValue.cpp:

(WebCore::CloneSerializer::serialize):
(WebCore::CloneSerializer::CloneSerializer):
(WebCore::CloneSerializer::dumpIfTerminal):
(WebCore::CloneDeserializer::deserialize):
(WebCore::CloneDeserializer::CloneDeserializer):
(WebCore::CloneDeserializer::readTerminal):
(WebCore::SerializedScriptValue::SerializedScriptValue):
(WebCore::SerializedScriptValue::create):
(WebCore::SerializedScriptValue::deserialize):

  • bindings/js/SerializedScriptValue.h:
  • bindings/js/WorkerScriptController.cpp:

(WebCore::WorkerScriptController::addTimerSetNotification):
(WebCore::WorkerScriptController::removeTimerSetNotification):

  • bindings/js/WorkerScriptController.h:
  • workers/WorkerRunLoop.cpp:

(WebCore::WorkerRunLoop::runInMode):

LayoutTests:

  • storage/indexeddb/resources/wasm-exceptions.js: Added.

(const._fail):
(const.isNotA.assert.isNotA):
(const):
(switch.typeof):
(Builder):
(Builder.prototype.setChecked):
(Builder.prototype.setPreamble):
(Builder.prototype._functionIndexSpaceKeyHash):
(Builder.prototype._registerFunctionToIndexSpace):
(Builder.prototype._getFunctionFromIndexSpace):
(Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.case.string_appeared_here.this.section):
(Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.const.codeBuilder.End.switch.case.string_appeared_here.e):
(Builder.prototype._registerSectionBuilders.this.Unknown):
(prepareDatabase):
(testDatabase):

  • storage/indexeddb/wasm-exceptions-expected.txt: Added.
  • storage/indexeddb/wasm-exceptions.html: Added.
  • workers/wasm-hashset: Added.
  • workers/wasm-hashset-expected.txt: Added.
  • workers/wasm-hashset-many-expected.txt: Added.
  • workers/wasm-hashset-many.html: Added.
  • workers/wasm-hashset.html: Added.
  • workers/wasm-hashset/many-test.js: Added.

(reallyDone):
(console.log):
(console.error):
(console.assert):
(i.worker.onmessage):
(Module.print):
(Module.printErr):
(Module.canvas):
(Module.setStatus):
(Module):
(setValue):
(getValue):
(allocate):
(getMemory):
(Pointer_stringify):
(AsciiToString):
(stringToAscii):
(UTF8ArrayToString):
(UTF8ToString):
(stringToUTF8Array):
(stringToUTF8):
(lengthBytesUTF8):
(demangle):
(demangleAll):
(stackTrace):
(alignUp):
(updateGlobalBuffer):
(updateGlobalBufferViews):
(abortOnCannotGrowMemory):
(enlargeMemory):
(getTotalMemory):
(callRuntimeCallbacks):
(preRun):
(ensureInitRuntime):
(preMain):
(exitRuntime):
(postRun):
(addOnPreRun):
(addOnInit):
(addOnPreMain):
(addOnExit):
(addOnPostRun):
(intArrayFromString):
(intArrayToString):
(writeStringToMemory):
(writeArrayToMemory):
(writeAsciiToMemory):
(Math.string_appeared_here):
(addRunDependency):
(removeRunDependency):
(integrateWasmJS.asm2wasmImports.string_appeared_here):
(integrateWasmJS.lookupImport):
(integrateWasmJS.mergeMemory):
(integrateWasmJS.fixImports):
(integrateWasmJS.getBinary):
(integrateWasmJS.doJustAsm):
(integrateWasmJS.receiveInstance):
(integrateWasmJS.):
(integrateWasmJS.doNativeWasm):
(integrateWasmJS.doWasmPolyfill):
(integrateWasmJS.Module.string_appeared_here):
(integrateWasmJS):
(_setErrNo):
(
ZSt18uncaught_exceptionv):
(EXCEPTIONS.deAdjust):
(EXCEPTIONS.addRef):
(EXCEPTIONS.decRef):
(EXCEPTIONS.clearRef):
(_cxa_find_matching_catch):
(
_gxx_personality_v0):
(_lock):
(_emscripten_memcpy_big):
(_gettimeofday):
(_abort):
(SYSCALLS):
(SYSCALLS.get getStr):
(SYSCALLS.get64):
(SYSCALLS.getZero):
(try.
_syscall146.printChar):
(_syscall146):
(
_syscall54):
(_unlock):
(
_syscall6):
(invoke_ii):
(invoke_iiii):
(invoke_v):
(_malloc.Module.string_appeared_here):
(getTempRet0.Module.string_appeared_here):
(_free.Module.string_appeared_here):
(_main.Module.string_appeared_here):
(setTempRet0.Module.string_appeared_here):
(establishStackSpace.Module.string_appeared_here):
(stackSave.Module.string_appeared_here):
(_memset.Module.string_appeared_here):
(_sbrk.Module.string_appeared_here):
(_emscripten_get_global_libc.Module.string_appeared_here):
(_memcpy.Module.string_appeared_here):
(_errno_location.Module.string_appeared_here):
(setThrew.Module.string_appeared_here):
(_fflush.Module.string_appeared_here):
(stackAlloc.Module.string_appeared_here):
(stackRestore.Module.string_appeared_here):
(_llvm_bswap_i32.Module.string_appeared_here):
(runPostSets.Module.string_appeared_here):
(dynCall_ii.Module.string_appeared_here):
(dynCall_iiii.Module.string_appeared_here):
(dynCall_v.Module.string_appeared_here):
(else.applyMemoryInitializer):
(else):
(else.useRequest):
(ExitStatus):
(dependenciesFulfilled):
(Module.string_appeared_here.Module.callMain.callMain.pad):
(Module.string_appeared_here.Module.callMain):
(run.doRun):
(run):
(exit):

  • workers/wasm-hashset/many-worker.js: Added.

(console.log):
(console.error):
(console.assert):
(Module.print):
(Module.printErr):
(Module.canvas):
(Module.setStatus):
(Module):
(setValue):
(getValue):
(allocate):
(getMemory):
(Pointer_stringify):
(AsciiToString):
(stringToAscii):
(UTF8ArrayToString):
(UTF8ToString):
(stringToUTF8Array):
(stringToUTF8):
(lengthBytesUTF8):
(demangle):
(demangleAll):
(stackTrace):
(alignUp):
(updateGlobalBuffer):
(updateGlobalBufferViews):
(abortOnCannotGrowMemory):
(enlargeMemory):
(getTotalMemory):
(callRuntimeCallbacks):
(preRun):
(ensureInitRuntime):
(preMain):
(exitRuntime):
(postRun):
(addOnPreRun):
(addOnInit):
(addOnPreMain):
(addOnExit):
(addOnPostRun):
(intArrayFromString):
(intArrayToString):
(writeStringToMemory):
(writeArrayToMemory):
(writeAsciiToMemory):
(Math.string_appeared_here):
(addRunDependency):
(removeRunDependency):
(integrateWasmJS.asm2wasmImports.string_appeared_here):
(integrateWasmJS.lookupImport):
(integrateWasmJS.mergeMemory):
(integrateWasmJS.fixImports):
(integrateWasmJS.getBinary):
(integrateWasmJS.doJustAsm):
(integrateWasmJS.receiveInstance):
(integrateWasmJS.doNativeWasm):
(integrateWasmJS.doWasmPolyfill):
(integrateWasmJS.Module.string_appeared_here):
(integrateWasmJS):
(_setErrNo):
(
ZSt18uncaught_exceptionv):
(EXCEPTIONS.deAdjust):
(EXCEPTIONS.addRef):
(EXCEPTIONS.decRef):
(EXCEPTIONS.clearRef):
(_cxa_find_matching_catch):
(
_gxx_personality_v0):
(_lock):
(_emscripten_memcpy_big):
(_gettimeofday):
(_abort):
(SYSCALLS):
(SYSCALLS.get getStr):
(SYSCALLS.get64):
(SYSCALLS.getZero):
(try.
_syscall146.printChar):
(_syscall146):
(
_syscall54):
(_unlock):
(
_syscall6):
(invoke_ii):
(invoke_iiii):
(invoke_v):
(_malloc.Module.string_appeared_here):
(getTempRet0.Module.string_appeared_here):
(_free.Module.string_appeared_here):
(_main.Module.string_appeared_here):
(setTempRet0.Module.string_appeared_here):
(establishStackSpace.Module.string_appeared_here):
(stackSave.Module.string_appeared_here):
(_memset.Module.string_appeared_here):
(_sbrk.Module.string_appeared_here):
(_emscripten_get_global_libc.Module.string_appeared_here):
(_memcpy.Module.string_appeared_here):
(_errno_location.Module.string_appeared_here):
(setThrew.Module.string_appeared_here):
(_fflush.Module.string_appeared_here):
(stackAlloc.Module.string_appeared_here):
(stackRestore.Module.string_appeared_here):
(_llvm_bswap_i32.Module.string_appeared_here):
(runPostSets.Module.string_appeared_here):
(dynCall_ii.Module.string_appeared_here):
(dynCall_iiii.Module.string_appeared_here):
(dynCall_v.Module.string_appeared_here):
(else.applyMemoryInitializer):
(else):
(else.useRequest):
(ExitStatus):
(dependenciesFulfilled):
(Module.string_appeared_here.Module.callMain.callMain.pad):
(Module.string_appeared_here.Module.callMain):
(run.doRun):
(run):
(exit):

  • workers/wasm-hashset/test.js: Added.

(reallyDone):
(console.log):
(console.error):
(console.assert):
(Module.print):
(Module.printErr):
(Module.canvas):
(Module.setStatus):
(Module):
(setValue):
(getValue):
(allocate):
(getMemory):
(Pointer_stringify):
(AsciiToString):
(stringToAscii):
(UTF8ArrayToString):
(UTF8ToString):
(stringToUTF8Array):
(stringToUTF8):
(lengthBytesUTF8):
(demangle):
(demangleAll):
(stackTrace):
(alignUp):
(updateGlobalBuffer):
(updateGlobalBufferViews):
(abortOnCannotGrowMemory):
(enlargeMemory):
(getTotalMemory):
(callRuntimeCallbacks):
(preRun):
(ensureInitRuntime):
(preMain):
(exitRuntime):
(postRun):
(addOnPreRun):
(addOnInit):
(addOnPreMain):
(addOnExit):
(addOnPostRun):
(intArrayFromString):
(intArrayToString):
(writeStringToMemory):
(writeArrayToMemory):
(writeAsciiToMemory):
(Math.string_appeared_here):
(addRunDependency):
(removeRunDependency):
(integrateWasmJS.asm2wasmImports.string_appeared_here):
(integrateWasmJS.lookupImport):
(integrateWasmJS.mergeMemory):
(integrateWasmJS.fixImports):
(integrateWasmJS.getBinary):
(integrateWasmJS.doJustAsm):
(integrateWasmJS.receiveInstance):
(integrateWasmJS.doNativeWasm):
(integrateWasmJS.doWasmPolyfill):
(integrateWasmJS.Module.string_appeared_here):
(integrateWasmJS):
(_setErrNo):
(
ZSt18uncaught_exceptionv):
(EXCEPTIONS.deAdjust):
(EXCEPTIONS.addRef):
(EXCEPTIONS.decRef):
(EXCEPTIONS.clearRef):
(_cxa_find_matching_catch):
(
_gxx_personality_v0):
(_lock):
(_emscripten_memcpy_big):
(_gettimeofday):
(_abort):
(SYSCALLS):
(SYSCALLS.get getStr):
(SYSCALLS.get64):
(SYSCALLS.getZero):
(try.
_syscall146.printChar):
(_syscall146):
(
_syscall54):
(_unlock):
(
_syscall6):
(invoke_ii):
(invoke_iiii):
(invoke_v):
(_malloc.Module.string_appeared_here):
(getTempRet0.Module.string_appeared_here):
(_free.Module.string_appeared_here):
(_main.Module.string_appeared_here):
(setTempRet0.Module.string_appeared_here):
(establishStackSpace.Module.string_appeared_here):
(stackSave.Module.string_appeared_here):
(_memset.Module.string_appeared_here):
(_sbrk.Module.string_appeared_here):
(_emscripten_get_global_libc.Module.string_appeared_here):
(_memcpy.Module.string_appeared_here):
(_errno_location.Module.string_appeared_here):
(setThrew.Module.string_appeared_here):
(_fflush.Module.string_appeared_here):
(stackAlloc.Module.string_appeared_here):
(stackRestore.Module.string_appeared_here):
(_llvm_bswap_i32.Module.string_appeared_here):
(runPostSets.Module.string_appeared_here):
(dynCall_ii.Module.string_appeared_here):
(dynCall_iiii.Module.string_appeared_here):
(dynCall_v.Module.string_appeared_here):
(else.applyMemoryInitializer):
(else):
(else.useRequest):
(ExitStatus):
(dependenciesFulfilled):
(Module.string_appeared_here.Module.callMain.callMain.pad):
(Module.string_appeared_here.Module.callMain):
(run.doRun):
(run):
(exit):

  • workers/wasm-hashset/worker.js: Added.

(console.log):
(console.error):
(console.assert):
(Module.print):
(Module.printErr):
(Module.canvas):
(Module.setStatus):
(Module):
(setValue):
(getValue):
(allocate):
(getMemory):
(Pointer_stringify):
(AsciiToString):
(stringToAscii):
(UTF8ArrayToString):
(UTF8ToString):
(stringToUTF8Array):
(stringToUTF8):
(lengthBytesUTF8):
(demangle):
(demangleAll):
(stackTrace):
(alignUp):
(updateGlobalBuffer):
(updateGlobalBufferViews):
(abortOnCannotGrowMemory):
(enlargeMemory):
(getTotalMemory):
(callRuntimeCallbacks):
(preRun):
(ensureInitRuntime):
(preMain):
(exitRuntime):
(postRun):
(addOnPreRun):
(addOnInit):
(addOnPreMain):
(addOnExit):
(addOnPostRun):
(intArrayFromString):
(intArrayToString):
(writeStringToMemory):
(writeArrayToMemory):
(writeAsciiToMemory):
(Math.string_appeared_here):
(addRunDependency):
(removeRunDependency):
(integrateWasmJS.asm2wasmImports.string_appeared_here):
(integrateWasmJS.lookupImport):
(integrateWasmJS.mergeMemory):
(integrateWasmJS.fixImports):
(integrateWasmJS.getBinary):
(integrateWasmJS.doJustAsm):
(integrateWasmJS.receiveInstance):
(integrateWasmJS.):
(integrateWasmJS.doNativeWasm):
(integrateWasmJS.doWasmPolyfill):
(integrateWasmJS.Module.string_appeared_here):
(integrateWasmJS):
(_setErrNo):
(
ZSt18uncaught_exceptionv):
(EXCEPTIONS.deAdjust):
(EXCEPTIONS.addRef):
(EXCEPTIONS.decRef):
(EXCEPTIONS.clearRef):
(_cxa_find_matching_catch):
(
_gxx_personality_v0):
(_lock):
(_emscripten_memcpy_big):
(_gettimeofday):
(_abort):
(SYSCALLS):
(SYSCALLS.get getStr):
(SYSCALLS.get64):
(SYSCALLS.getZero):
(try.
_syscall146.printChar):
(_syscall146):
(
_syscall54):
(_unlock):
(
_syscall6):
(invoke_ii):
(invoke_iiii):
(invoke_v):
(_malloc.Module.string_appeared_here):
(getTempRet0.Module.string_appeared_here):
(_free.Module.string_appeared_here):
(_main.Module.string_appeared_here):
(setTempRet0.Module.string_appeared_here):
(establishStackSpace.Module.string_appeared_here):
(stackSave.Module.string_appeared_here):
(_memset.Module.string_appeared_here):
(_sbrk.Module.string_appeared_here):
(_emscripten_get_global_libc.Module.string_appeared_here):
(_memcpy.Module.string_appeared_here):
(_errno_location.Module.string_appeared_here):
(setThrew.Module.string_appeared_here):
(_fflush.Module.string_appeared_here):
(stackAlloc.Module.string_appeared_here):
(stackRestore.Module.string_appeared_here):
(_llvm_bswap_i32.Module.string_appeared_here):
(runPostSets.Module.string_appeared_here):
(dynCall_ii.Module.string_appeared_here):
(dynCall_iiii.Module.string_appeared_here):
(dynCall_v.Module.string_appeared_here):
(else.applyMemoryInitializer):
(else):
(else.useRequest):
(ExitStatus):
(dependenciesFulfilled):
(Module.string_appeared_here.Module.callMain.callMain.pad):
(Module.string_appeared_here.Module.callMain):
(run.doRun):
(run):
(exit):

  • workers/wasm-long-compile-expected.txt: Added.
  • workers/wasm-long-compile-many-expected.txt: Added.
  • workers/wasm-long-compile-many.html: Added.
  • workers/wasm-long-compile.html: Added.
  • workers/wasm-resources: Added.
  • workers/wasm-resources/long-compile-many.js: Added.

(done):
(i.async.run):
(i.worker.onmessage):

  • workers/wasm-resources/long-compile-worker.js: Added.

(const._fail):
(const.isNotA.assert.isNotA):
(const):
(switch.typeof):
(Builder):
(Builder.prototype.setChecked):
(Builder.prototype.setPreamble):
(Builder.prototype._functionIndexSpaceKeyHash):
(Builder.prototype._registerFunctionToIndexSpace):
(Builder.prototype._getFunctionFromIndexSpace):
(Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.case.string_appeared_here.this.section):
(Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.const.codeBuilder.End.switch.case.string_appeared_here.e):
(Builder.prototype._registerSectionBuilders.this.Unknown):

  • workers/wasm-resources/long-compile.js: Added.

(done):
(async.run):
(worker.onmessage):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSRunLoopTimer.cpp

    r215228 r215353  
    105105    CFRunLoopTimerSetNextFireDate(m_timer.get(), CFAbsoluteTimeGetCurrent() + intervalInSeconds.seconds());
    106106    m_isScheduled = true;
     107    for (auto& task : m_timerSetCallbacks)
     108        task->run();
    107109}
    108110
     
    141143    m_timer.startOneShot(intervalInSeconds);
    142144    m_isScheduled = true;
     145    for (auto& task : m_timerSetCallbacks)
     146        task->run();
    143147}
    144148
     
    151155#endif
    152156
     157void JSRunLoopTimer::addTimerSetNotification(TimerNotificationCallback callback)
     158{
     159    m_timerSetCallbacks.add(callback);
     160}
     161
     162void JSRunLoopTimer::removeTimerSetNotification(TimerNotificationCallback callback)
     163{
     164    m_timerSetCallbacks.remove(callback);
     165}
     166
    153167} // namespace JSC
Note: See TracChangeset for help on using the changeset viewer.