diff options
25 files changed, 1085 insertions, 913 deletions
diff --git a/.gitattributes b/.gitattributes index dfdb8b771..ba181f19d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ *.sh text eol=lf +test/binaryen.js/*.txt text eol=lf diff --git a/CHANGELOG.md b/CHANGELOG.md index d3f9cf4ad..74fe3191e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,10 @@ Current Trunk - Add the ability to create multivalue Types in the C and JS APIs. - Remove named function types. They are replaced by `params` and `results` types local to each function. +- Binaryen.js can now be compiled to Wasm using the `binaryen_wasm` target. + Unlike the JS variant, the Wasm variant requires asynchronously awaiting the + Wasm blob's instantiation and initialization before being usable, using the + `binaryen.ready` promise, e.g. `binaryen.ready.then(() => ...)`. v88 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 118e80ba7..b338943ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -365,22 +365,40 @@ install(TARGETS wasm-reduce DESTINATION ${CMAKE_INSTALL_BINDIR}) # binaryen.js # # Note that we can't emit binaryen.js directly, as there is libbinaryen already -# declared earlier, so we create binaryen_js.js, which must then be copied. +# declared earlier, so we create binaryen_wasm/js.js, which must then be copied. +# Note that SHELL: is needed as otherwise cmake will coalesce -s link flags +# in an incorrect way for emscripten. if(EMSCRIPTEN) - set(binaryen_js_SOURCES + set(binaryen_emscripten_SOURCES src/binaryen-c.cpp ) + + # binaryen.js WebAssembly variant + add_executable(binaryen_wasm + ${binaryen_emscripten_SOURCES}) + target_link_libraries(binaryen_wasm wasm asmjs emscripten-optimizer passes ir cfg support wasm) + target_link_libraries(binaryen_wasm "-s MODULARIZE_INSTANCE=1") + target_link_libraries(binaryen_wasm "-s NO_FILESYSTEM=0") + target_link_libraries(binaryen_wasm "-s NODERAWFS=0") + target_link_libraries(binaryen_wasm "-s EXPORT_NAME=Binaryen") + target_link_libraries(binaryen_wasm "--post-js ${CMAKE_CURRENT_SOURCE_DIR}/src/js/binaryen.js-post.js") + target_link_libraries(binaryen_wasm optimized "--closure 1") + target_link_libraries(binaryen_wasm optimized "--llvm-lto 1") + target_link_libraries(binaryen_wasm debug "--profiling") + set_property(TARGET binaryen_wasm PROPERTY CXX_STANDARD 14) + set_property(TARGET binaryen_wasm PROPERTY CXX_STANDARD_REQUIRED ON) + install(TARGETS binaryen_wasm DESTINATION ${CMAKE_INSTALL_BINDIR}) + + # binaryen.js JavaScript variant add_executable(binaryen_js - ${binaryen_js_SOURCES}) + ${binaryen_emscripten_SOURCES}) target_link_libraries(binaryen_js wasm asmjs emscripten-optimizer passes ir cfg support wasm) - # note that SHELL: is needed as otherwise cmake will coalesce -s link flags - # in an incorrect way for emscripten target_link_libraries(binaryen_js "-s WASM=0") + target_link_libraries(binaryen_js "-s WASM_ASYNC_COMPILATION=0") if(${CMAKE_CXX_COMPILER_VERSION} STREQUAL "6.0.1") # only valid with fastcomp and WASM=0 - target_link_libraries(binaryen_js "-s ELIMINATE_DUPLICATE_FUNCTIONS=1") + target_link_libraries(binaryen_js "-s ELIMINATE_DUPLICATE_FUNCTIONS=1") endif() - target_link_libraries(binaryen_js "-s WASM_ASYNC_COMPILATION=0") target_link_libraries(binaryen_js "-s MODULARIZE_INSTANCE=1") target_link_libraries(binaryen_js "-s NO_FILESYSTEM=0") target_link_libraries(binaryen_js "-s NODERAWFS=0") @@ -393,6 +411,9 @@ if(EMSCRIPTEN) set_property(TARGET binaryen_js PROPERTY CXX_STANDARD 14) set_property(TARGET binaryen_js PROPERTY CXX_STANDARD_REQUIRED ON) install(TARGETS binaryen_js DESTINATION ${CMAKE_INSTALL_BINDIR}) + + # always emit as 'binaryen.js' + set_target_properties(binaryen_wasm binaryen_js PROPERTIES OUTPUT_NAME "binaryen") endif() # Testing diff --git a/scripts/test/shared.py b/scripts/test/shared.py index 1ec42bc59..7bf944097 100644 --- a/scripts/test/shared.py +++ b/scripts/test/shared.py @@ -184,9 +184,7 @@ WASM_REDUCE = [os.path.join(options.binaryen_bin, 'wasm-reduce')] WASM_METADCE = [os.path.join(options.binaryen_bin, 'wasm-metadce')] WASM_EMSCRIPTEN_FINALIZE = [os.path.join(options.binaryen_bin, 'wasm-emscripten-finalize')] -# Due to cmake limitations, we emit binaryen_js.js (see CMakeLists.txt -# for why). -BINARYEN_JS = os.path.join(options.binaryen_bin, 'binaryen_js.js') +BINARYEN_JS = os.path.join(options.binaryen_bin, 'binaryen.js') def wrap_with_valgrind(cmd): diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index fa415ad0d..96562e6e0 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -29,444 +29,435 @@ function i8sToStack(i8s) { return ret; } -// Types -Module['none'] = Module['_BinaryenTypeNone'](); -Module['i32'] = Module['_BinaryenTypeInt32'](); -Module['i64'] = Module['_BinaryenTypeInt64'](); -Module['f32'] = Module['_BinaryenTypeFloat32'](); -Module['f64'] = Module['_BinaryenTypeFloat64'](); -Module['v128'] = Module['_BinaryenTypeVec128'](); -Module['anyref'] = Module['_BinaryenTypeAnyref'](); -Module['exnref'] = Module['_BinaryenTypeExnref'](); -Module['unreachable'] = Module['_BinaryenTypeUnreachable'](); -Module['auto'] = /* deprecated */ Module['undefined'] = Module['_BinaryenTypeAuto'](); +function initializeConstants() { + + // Types + [ ['none', 'None'], + ['i32', 'Int32'], + ['i64', 'Int64'], + ['f32', 'Float32'], + ['f64', 'Float64'], + ['v128', 'Vec128'], + ['anyref', 'Anyref'], + ['exnref', 'Exnref'], + ['unreachable', 'Unreachable'], + ['auto', 'Auto'] + ].forEach(function(entry) { + Module[entry[0]] = Module['_BinaryenType' + entry[1]](); + }); -Module['createType'] = function(types) { - return preserveStack(function() { - var array = i32sToStack(types); - return Module['_BinaryenTypeCreate'](array, types.length); + // Expression ids + Module['ExpressionIds'] = {}; + [ 'Invalid', + 'Block', + 'If', + 'Loop', + 'Break', + 'Switch', + 'Call', + 'CallIndirect', + 'LocalGet', + 'LocalSet', + 'GlobalGet', + 'GlobalSet', + 'Load', + 'Store', + 'Const', + 'Unary', + 'Binary', + 'Select', + 'Drop', + 'Return', + 'Host', + 'Nop', + 'Unreachable', + 'AtomicCmpxchg', + 'AtomicRMW', + 'AtomicWait', + 'AtomicNotify', + 'AtomicFence', + 'SIMDExtract', + 'SIMDReplace', + 'SIMDShuffle', + 'SIMDTernary', + 'SIMDShift', + 'SIMDLoad', + 'MemoryInit', + 'DataDrop', + 'MemoryCopy', + 'MemoryFill', + 'Try', + 'Throw', + 'Rethrow', + 'BrOnExn', + 'Push', + 'Pop' + ].forEach(function(name) { + Module['ExpressionIds'][name] = Module[name + 'Id'] = Module['_Binaryen' + name + 'Id'](); }); -}; -Module['expandType'] = function(ty) { - return preserveStack(function() { - var numTypes = Module['_BinaryenTypeArity'](ty); - var array = stackAlloc(numTypes << 2); - Module['_BinaryenTypeExpand'](ty, array); - var types = []; - for (var i = 0; i < numTypes; i++) { - types.push(HEAPU32[(array >>> 2) + i]); - } - return types; + // External kinds + Module['ExternalKinds'] = {}; + [ 'Function', + 'Table', + 'Memory', + 'Global', + 'Event' + ].forEach(function(name) { + Module['ExternalKinds'][name] = Module['External' + name] = Module['_BinaryenExternal' + name](); }); -}; -// Expression ids -Module['InvalidId'] = Module['_BinaryenInvalidId'](); -Module['BlockId'] = Module['_BinaryenBlockId'](); -Module['IfId'] = Module['_BinaryenIfId'](); -Module['LoopId'] = Module['_BinaryenLoopId'](); -Module['BreakId'] = Module['_BinaryenBreakId'](); -Module['SwitchId'] = Module['_BinaryenSwitchId'](); -Module['CallId'] = Module['_BinaryenCallId'](); -Module['CallIndirectId'] = Module['_BinaryenCallIndirectId'](); -Module['LocalGetId'] = Module['_BinaryenLocalGetId'](); -Module['LocalSetId'] = Module['_BinaryenLocalSetId'](); -Module['GlobalGetId'] = Module['_BinaryenGlobalGetId'](); -Module['GlobalSetId'] = Module['_BinaryenGlobalSetId'](); -Module['LoadId'] = Module['_BinaryenLoadId'](); -Module['StoreId'] = Module['_BinaryenStoreId'](); -Module['ConstId'] = Module['_BinaryenConstId'](); -Module['UnaryId'] = Module['_BinaryenUnaryId'](); -Module['BinaryId'] = Module['_BinaryenBinaryId'](); -Module['SelectId'] = Module['_BinaryenSelectId'](); -Module['DropId'] = Module['_BinaryenDropId'](); -Module['ReturnId'] = Module['_BinaryenReturnId'](); -Module['HostId'] = Module['_BinaryenHostId'](); -Module['NopId'] = Module['_BinaryenNopId'](); -Module['UnreachableId'] = Module['_BinaryenUnreachableId'](); -Module['AtomicCmpxchgId'] = Module['_BinaryenAtomicCmpxchgId'](); -Module['AtomicRMWId'] = Module['_BinaryenAtomicRMWId'](); -Module['AtomicWaitId'] = Module['_BinaryenAtomicWaitId'](); -Module['AtomicNotifyId'] = Module['_BinaryenAtomicNotifyId'](); -Module['AtomicFenceId'] = Module['_BinaryenAtomicFenceId'](); -Module['SIMDExtractId'] = Module['_BinaryenSIMDExtractId'](); -Module['SIMDReplaceId'] = Module['_BinaryenSIMDReplaceId'](); -Module['SIMDShuffleId'] = Module['_BinaryenSIMDShuffleId'](); -Module['SIMDTernaryId'] = Module['_BinaryenSIMDTernaryId'](); -Module['SIMDShiftId'] = Module['_BinaryenSIMDShiftId'](); -Module['SIMDLoadId'] = Module['_BinaryenSIMDLoadId'](); -Module['MemoryInitId'] = Module['_BinaryenMemoryInitId'](); -Module['DataDropId'] = Module['_BinaryenDataDropId'](); -Module['MemoryCopyId'] = Module['_BinaryenMemoryCopyId'](); -Module['MemoryFillId'] = Module['_BinaryenMemoryFillId'](); -Module['TryId'] = Module['_BinaryenTryId'](); -Module['ThrowId'] = Module['_BinaryenThrowId'](); -Module['RethrowId'] = Module['_BinaryenRethrowId'](); -Module['BrOnExnId'] = Module['_BinaryenBrOnExnId'](); -Module['PushId'] = Module['_BinaryenPushId'](); -Module['PopId'] = Module['_BinaryenPopId'](); - -// External kinds -Module['ExternalFunction'] = Module['_BinaryenExternalFunction'](); -Module['ExternalTable'] = Module['_BinaryenExternalTable'](); -Module['ExternalMemory'] = Module['_BinaryenExternalMemory'](); -Module['ExternalGlobal'] = Module['_BinaryenExternalGlobal'](); -Module['ExternalEvent'] = Module['_BinaryenExternalEvent'](); - -// Features -Module['Features'] = { - 'MVP': Module['_BinaryenFeatureMVP'](), - 'Atomics': Module['_BinaryenFeatureAtomics'](), - 'BulkMemory': Module['_BinaryenFeatureBulkMemory'](), - 'MutableGlobals': Module['_BinaryenFeatureMutableGlobals'](), - 'NontrappingFPToInt': Module['_BinaryenFeatureNontrappingFPToInt'](), - 'SignExt': Module['_BinaryenFeatureSignExt'](), - 'SIMD128': Module['_BinaryenFeatureSIMD128'](), - 'ExceptionHandling': Module['_BinaryenFeatureExceptionHandling'](), - 'TailCall': Module['_BinaryenFeatureTailCall'](), - 'ReferenceTypes': Module['_BinaryenFeatureReferenceTypes'](), - 'All': Module['_BinaryenFeatureAll']() -}; + // Features + Module['Features'] = {}; + [ 'MVP', + 'Atomics', + 'BulkMemory', + 'MutableGlobals', + 'NontrappingFPToInt', + 'SignExt', + 'SIMD128', + 'ExceptionHandling', + 'TailCall', + 'ReferenceTypes', + 'All' + ].forEach(function(name) { + Module['Features'][name] = Module['_BinaryenFeature' + name](); + }); -// Operations -Module['ClzInt32'] = Module['_BinaryenClzInt32'](); -Module['CtzInt32'] = Module['_BinaryenCtzInt32'](); -Module['PopcntInt32'] = Module['_BinaryenPopcntInt32'](); -Module['NegFloat32'] = Module['_BinaryenNegFloat32'](); -Module['AbsFloat32'] = Module['_BinaryenAbsFloat32'](); -Module['CeilFloat32'] = Module['_BinaryenCeilFloat32'](); -Module['FloorFloat32'] = Module['_BinaryenFloorFloat32'](); -Module['TruncFloat32'] = Module['_BinaryenTruncFloat32'](); -Module['NearestFloat32'] = Module['_BinaryenNearestFloat32'](); -Module['SqrtFloat32'] = Module['_BinaryenSqrtFloat32'](); -Module['EqZInt32'] = Module['_BinaryenEqZInt32'](); -Module['ClzInt64'] = Module['_BinaryenClzInt64'](); -Module['CtzInt64'] = Module['_BinaryenCtzInt64'](); -Module['PopcntInt64'] = Module['_BinaryenPopcntInt64'](); -Module['NegFloat64'] = Module['_BinaryenNegFloat64'](); -Module['AbsFloat64'] = Module['_BinaryenAbsFloat64'](); -Module['CeilFloat64'] = Module['_BinaryenCeilFloat64'](); -Module['FloorFloat64'] = Module['_BinaryenFloorFloat64'](); -Module['TruncFloat64'] = Module['_BinaryenTruncFloat64'](); -Module['NearestFloat64'] = Module['_BinaryenNearestFloat64'](); -Module['SqrtFloat64'] = Module['_BinaryenSqrtFloat64'](); -Module['EqZInt64'] = Module['_BinaryenEqZInt64'](); -Module['ExtendSInt32'] = Module['_BinaryenExtendSInt32'](); -Module['ExtendUInt32'] = Module['_BinaryenExtendUInt32'](); -Module['WrapInt64'] = Module['_BinaryenWrapInt64'](); -Module['TruncSFloat32ToInt32'] = Module['_BinaryenTruncSFloat32ToInt32'](); -Module['TruncSFloat32ToInt64'] = Module['_BinaryenTruncSFloat32ToInt64'](); -Module['TruncUFloat32ToInt32'] = Module['_BinaryenTruncUFloat32ToInt32'](); -Module['TruncUFloat32ToInt64'] = Module['_BinaryenTruncUFloat32ToInt64'](); -Module['TruncSFloat64ToInt32'] = Module['_BinaryenTruncSFloat64ToInt32'](); -Module['TruncSFloat64ToInt64'] = Module['_BinaryenTruncSFloat64ToInt64'](); -Module['TruncUFloat64ToInt32'] = Module['_BinaryenTruncUFloat64ToInt32'](); -Module['TruncUFloat64ToInt64'] = Module['_BinaryenTruncUFloat64ToInt64'](); -Module['TruncSatSFloat32ToInt32'] = Module['_BinaryenTruncSatSFloat32ToInt32'](); -Module['TruncSatSFloat32ToInt64'] = Module['_BinaryenTruncSatSFloat32ToInt64'](); -Module['TruncSatUFloat32ToInt32'] = Module['_BinaryenTruncSatUFloat32ToInt32'](); -Module['TruncSatUFloat32ToInt64'] = Module['_BinaryenTruncSatUFloat32ToInt64'](); -Module['TruncSatSFloat64ToInt32'] = Module['_BinaryenTruncSatSFloat64ToInt32'](); -Module['TruncSatSFloat64ToInt64'] = Module['_BinaryenTruncSatSFloat64ToInt64'](); -Module['TruncSatUFloat64ToInt32'] = Module['_BinaryenTruncSatUFloat64ToInt32'](); -Module['TruncSatUFloat64ToInt64'] = Module['_BinaryenTruncSatUFloat64ToInt64'](); -Module['ReinterpretFloat32'] = Module['_BinaryenReinterpretFloat32'](); -Module['ReinterpretFloat64'] = Module['_BinaryenReinterpretFloat64'](); -Module['ConvertSInt32ToFloat32'] = Module['_BinaryenConvertSInt32ToFloat32'](); -Module['ConvertSInt32ToFloat64'] = Module['_BinaryenConvertSInt32ToFloat64'](); -Module['ConvertUInt32ToFloat32'] = Module['_BinaryenConvertUInt32ToFloat32'](); -Module['ConvertUInt32ToFloat64'] = Module['_BinaryenConvertUInt32ToFloat64'](); -Module['ConvertSInt64ToFloat32'] = Module['_BinaryenConvertSInt64ToFloat32'](); -Module['ConvertSInt64ToFloat64'] = Module['_BinaryenConvertSInt64ToFloat64'](); -Module['ConvertUInt64ToFloat32'] = Module['_BinaryenConvertUInt64ToFloat32'](); -Module['ConvertUInt64ToFloat64'] = Module['_BinaryenConvertUInt64ToFloat64'](); -Module['PromoteFloat32'] = Module['_BinaryenPromoteFloat32'](); -Module['DemoteFloat64'] = Module['_BinaryenDemoteFloat64'](); -Module['ReinterpretInt32'] = Module['_BinaryenReinterpretInt32'](); -Module['ReinterpretInt64'] = Module['_BinaryenReinterpretInt64'](); -Module['ExtendS8Int32'] = Module['_BinaryenExtendS8Int32'](); -Module['ExtendS16Int32'] = Module['_BinaryenExtendS16Int32'](); -Module['ExtendS8Int64'] = Module['_BinaryenExtendS8Int64'](); -Module['ExtendS16Int64'] = Module['_BinaryenExtendS16Int64'](); -Module['ExtendS32Int64'] = Module['_BinaryenExtendS32Int64'](); -Module['AddInt32'] = Module['_BinaryenAddInt32'](); -Module['SubInt32'] = Module['_BinaryenSubInt32'](); -Module['MulInt32'] = Module['_BinaryenMulInt32'](); -Module['DivSInt32'] = Module['_BinaryenDivSInt32'](); -Module['DivUInt32'] = Module['_BinaryenDivUInt32'](); -Module['RemSInt32'] = Module['_BinaryenRemSInt32'](); -Module['RemUInt32'] = Module['_BinaryenRemUInt32'](); -Module['AndInt32'] = Module['_BinaryenAndInt32'](); -Module['OrInt32'] = Module['_BinaryenOrInt32'](); -Module['XorInt32'] = Module['_BinaryenXorInt32'](); -Module['ShlInt32'] = Module['_BinaryenShlInt32'](); -Module['ShrUInt32'] = Module['_BinaryenShrUInt32'](); -Module['ShrSInt32'] = Module['_BinaryenShrSInt32'](); -Module['RotLInt32'] = Module['_BinaryenRotLInt32'](); -Module['RotRInt32'] = Module['_BinaryenRotRInt32'](); -Module['EqInt32'] = Module['_BinaryenEqInt32'](); -Module['NeInt32'] = Module['_BinaryenNeInt32'](); -Module['LtSInt32'] = Module['_BinaryenLtSInt32'](); -Module['LtUInt32'] = Module['_BinaryenLtUInt32'](); -Module['LeSInt32'] = Module['_BinaryenLeSInt32'](); -Module['LeUInt32'] = Module['_BinaryenLeUInt32'](); -Module['GtSInt32'] = Module['_BinaryenGtSInt32'](); -Module['GtUInt32'] = Module['_BinaryenGtUInt32'](); -Module['GeSInt32'] = Module['_BinaryenGeSInt32'](); -Module['GeUInt32'] = Module['_BinaryenGeUInt32'](); -Module['AddInt64'] = Module['_BinaryenAddInt64'](); -Module['SubInt64'] = Module['_BinaryenSubInt64'](); -Module['MulInt64'] = Module['_BinaryenMulInt64'](); -Module['DivSInt64'] = Module['_BinaryenDivSInt64'](); -Module['DivUInt64'] = Module['_BinaryenDivUInt64'](); -Module['RemSInt64'] = Module['_BinaryenRemSInt64'](); -Module['RemUInt64'] = Module['_BinaryenRemUInt64'](); -Module['AndInt64'] = Module['_BinaryenAndInt64'](); -Module['OrInt64'] = Module['_BinaryenOrInt64'](); -Module['XorInt64'] = Module['_BinaryenXorInt64'](); -Module['ShlInt64'] = Module['_BinaryenShlInt64'](); -Module['ShrUInt64'] = Module['_BinaryenShrUInt64'](); -Module['ShrSInt64'] = Module['_BinaryenShrSInt64'](); -Module['RotLInt64'] = Module['_BinaryenRotLInt64'](); -Module['RotRInt64'] = Module['_BinaryenRotRInt64'](); -Module['EqInt64'] = Module['_BinaryenEqInt64'](); -Module['NeInt64'] = Module['_BinaryenNeInt64'](); -Module['LtSInt64'] = Module['_BinaryenLtSInt64'](); -Module['LtUInt64'] = Module['_BinaryenLtUInt64'](); -Module['LeSInt64'] = Module['_BinaryenLeSInt64'](); -Module['LeUInt64'] = Module['_BinaryenLeUInt64'](); -Module['GtSInt64'] = Module['_BinaryenGtSInt64'](); -Module['GtUInt64'] = Module['_BinaryenGtUInt64'](); -Module['GeSInt64'] = Module['_BinaryenGeSInt64'](); -Module['GeUInt64'] = Module['_BinaryenGeUInt64'](); -Module['AddFloat32'] = Module['_BinaryenAddFloat32'](); -Module['SubFloat32'] = Module['_BinaryenSubFloat32'](); -Module['MulFloat32'] = Module['_BinaryenMulFloat32'](); -Module['DivFloat32'] = Module['_BinaryenDivFloat32'](); -Module['CopySignFloat32'] = Module['_BinaryenCopySignFloat32'](); -Module['MinFloat32'] = Module['_BinaryenMinFloat32'](); -Module['MaxFloat32'] = Module['_BinaryenMaxFloat32'](); -Module['EqFloat32'] = Module['_BinaryenEqFloat32'](); -Module['NeFloat32'] = Module['_BinaryenNeFloat32'](); -Module['LtFloat32'] = Module['_BinaryenLtFloat32'](); -Module['LeFloat32'] = Module['_BinaryenLeFloat32'](); -Module['GtFloat32'] = Module['_BinaryenGtFloat32'](); -Module['GeFloat32'] = Module['_BinaryenGeFloat32'](); -Module['AddFloat64'] = Module['_BinaryenAddFloat64'](); -Module['SubFloat64'] = Module['_BinaryenSubFloat64'](); -Module['MulFloat64'] = Module['_BinaryenMulFloat64'](); -Module['DivFloat64'] = Module['_BinaryenDivFloat64'](); -Module['CopySignFloat64'] = Module['_BinaryenCopySignFloat64'](); -Module['MinFloat64'] = Module['_BinaryenMinFloat64'](); -Module['MaxFloat64'] = Module['_BinaryenMaxFloat64'](); -Module['EqFloat64'] = Module['_BinaryenEqFloat64'](); -Module['NeFloat64'] = Module['_BinaryenNeFloat64'](); -Module['LtFloat64'] = Module['_BinaryenLtFloat64'](); -Module['LeFloat64'] = Module['_BinaryenLeFloat64'](); -Module['GtFloat64'] = Module['_BinaryenGtFloat64'](); -Module['GeFloat64'] = Module['_BinaryenGeFloat64'](); -Module['MemorySize'] = Module['_BinaryenMemorySize'](); -Module['MemoryGrow'] = Module['_BinaryenMemoryGrow'](); -Module['AtomicRMWAdd'] = Module['_BinaryenAtomicRMWAdd'](); -Module['AtomicRMWSub'] = Module['_BinaryenAtomicRMWSub'](); -Module['AtomicRMWAnd'] = Module['_BinaryenAtomicRMWAnd'](); -Module['AtomicRMWOr'] = Module['_BinaryenAtomicRMWOr'](); -Module['AtomicRMWXor'] = Module['_BinaryenAtomicRMWXor'](); -Module['AtomicRMWXchg'] = Module['_BinaryenAtomicRMWXchg'](); -Module['SplatVecI8x16'] = Module['_BinaryenSplatVecI8x16'](); -Module['ExtractLaneSVecI8x16'] = Module['_BinaryenExtractLaneSVecI8x16'](); -Module['ExtractLaneUVecI8x16'] = Module['_BinaryenExtractLaneUVecI8x16'](); -Module['ReplaceLaneVecI8x16'] = Module['_BinaryenReplaceLaneVecI8x16'](); -Module['SplatVecI16x8'] = Module['_BinaryenSplatVecI16x8'](); -Module['ExtractLaneSVecI16x8'] = Module['_BinaryenExtractLaneSVecI16x8'](); -Module['ExtractLaneUVecI16x8'] = Module['_BinaryenExtractLaneUVecI16x8'](); -Module['ReplaceLaneVecI16x8'] = Module['_BinaryenReplaceLaneVecI16x8'](); -Module['SplatVecI32x4'] = Module['_BinaryenSplatVecI32x4'](); -Module['ExtractLaneVecI32x4'] = Module['_BinaryenExtractLaneVecI32x4'](); -Module['ReplaceLaneVecI32x4'] = Module['_BinaryenReplaceLaneVecI32x4'](); -Module['SplatVecI64x2'] = Module['_BinaryenSplatVecI64x2'](); -Module['ExtractLaneVecI64x2'] = Module['_BinaryenExtractLaneVecI64x2'](); -Module['ReplaceLaneVecI64x2'] = Module['_BinaryenReplaceLaneVecI64x2'](); -Module['SplatVecF32x4'] = Module['_BinaryenSplatVecF32x4'](); -Module['ExtractLaneVecF32x4'] = Module['_BinaryenExtractLaneVecF32x4'](); -Module['ReplaceLaneVecF32x4'] = Module['_BinaryenReplaceLaneVecF32x4'](); -Module['SplatVecF64x2'] = Module['_BinaryenSplatVecF64x2'](); -Module['ExtractLaneVecF64x2'] = Module['_BinaryenExtractLaneVecF64x2'](); -Module['ReplaceLaneVecF64x2'] = Module['_BinaryenReplaceLaneVecF64x2'](); -Module['EqVecI8x16'] = Module['_BinaryenEqVecI8x16'](); -Module['NeVecI8x16'] = Module['_BinaryenNeVecI8x16'](); -Module['LtSVecI8x16'] = Module['_BinaryenLtSVecI8x16'](); -Module['LtUVecI8x16'] = Module['_BinaryenLtUVecI8x16'](); -Module['GtSVecI8x16'] = Module['_BinaryenGtSVecI8x16'](); -Module['GtUVecI8x16'] = Module['_BinaryenGtUVecI8x16'](); -Module['LeSVecI8x16'] = Module['_BinaryenLeSVecI8x16'](); -Module['LeUVecI8x16'] = Module['_BinaryenLeUVecI8x16'](); -Module['GeSVecI8x16'] = Module['_BinaryenGeSVecI8x16'](); -Module['GeUVecI8x16'] = Module['_BinaryenGeUVecI8x16'](); -Module['EqVecI16x8'] = Module['_BinaryenEqVecI16x8'](); -Module['NeVecI16x8'] = Module['_BinaryenNeVecI16x8'](); -Module['LtSVecI16x8'] = Module['_BinaryenLtSVecI16x8'](); -Module['LtUVecI16x8'] = Module['_BinaryenLtUVecI16x8'](); -Module['GtSVecI16x8'] = Module['_BinaryenGtSVecI16x8'](); -Module['GtUVecI16x8'] = Module['_BinaryenGtUVecI16x8'](); -Module['LeSVecI16x8'] = Module['_BinaryenLeSVecI16x8'](); -Module['LeUVecI16x8'] = Module['_BinaryenLeUVecI16x8'](); -Module['GeSVecI16x8'] = Module['_BinaryenGeSVecI16x8'](); -Module['GeUVecI16x8'] = Module['_BinaryenGeUVecI16x8'](); -Module['EqVecI32x4'] = Module['_BinaryenEqVecI32x4'](); -Module['NeVecI32x4'] = Module['_BinaryenNeVecI32x4'](); -Module['LtSVecI32x4'] = Module['_BinaryenLtSVecI32x4'](); -Module['LtUVecI32x4'] = Module['_BinaryenLtUVecI32x4'](); -Module['GtSVecI32x4'] = Module['_BinaryenGtSVecI32x4'](); -Module['GtUVecI32x4'] = Module['_BinaryenGtUVecI32x4'](); -Module['LeSVecI32x4'] = Module['_BinaryenLeSVecI32x4'](); -Module['LeUVecI32x4'] = Module['_BinaryenLeUVecI32x4'](); -Module['GeSVecI32x4'] = Module['_BinaryenGeSVecI32x4'](); -Module['GeUVecI32x4'] = Module['_BinaryenGeUVecI32x4'](); -Module['EqVecF32x4'] = Module['_BinaryenEqVecF32x4'](); -Module['NeVecF32x4'] = Module['_BinaryenNeVecF32x4'](); -Module['LtVecF32x4'] = Module['_BinaryenLtVecF32x4'](); -Module['GtVecF32x4'] = Module['_BinaryenGtVecF32x4'](); -Module['LeVecF32x4'] = Module['_BinaryenLeVecF32x4'](); -Module['GeVecF32x4'] = Module['_BinaryenGeVecF32x4'](); -Module['EqVecF64x2'] = Module['_BinaryenGeVecF32x4'](); -Module['NeVecF64x2'] = Module['_BinaryenNeVecF64x2'](); -Module['LtVecF64x2'] = Module['_BinaryenLtVecF64x2'](); -Module['GtVecF64x2'] = Module['_BinaryenGtVecF64x2'](); -Module['LeVecF64x2'] = Module['_BinaryenLeVecF64x2'](); -Module['GeVecF64x2'] = Module['_BinaryenGeVecF64x2'](); -Module['NotVec128'] = Module['_BinaryenNotVec128'](); -Module['AndVec128'] = Module['_BinaryenAndVec128'](); -Module['OrVec128'] = Module['_BinaryenOrVec128'](); -Module['XorVec128'] = Module['_BinaryenXorVec128'](); -Module['AndNotVec128'] = Module['_BinaryenAndNotVec128'](); -Module['BitselectVec128'] = Module['_BinaryenBitselectVec128'](); -Module['NegVecI8x16'] = Module['_BinaryenNegVecI8x16'](); -Module['AnyTrueVecI8x16'] = Module['_BinaryenAnyTrueVecI8x16'](); -Module['AllTrueVecI8x16'] = Module['_BinaryenAllTrueVecI8x16'](); -Module['ShlVecI8x16'] = Module['_BinaryenShlVecI8x16'](); -Module['ShrSVecI8x16'] = Module['_BinaryenShrSVecI8x16'](); -Module['ShrUVecI8x16'] = Module['_BinaryenShrUVecI8x16'](); -Module['AddVecI8x16'] = Module['_BinaryenAddVecI8x16'](); -Module['AddSatSVecI8x16'] = Module['_BinaryenAddSatSVecI8x16'](); -Module['AddSatUVecI8x16'] = Module['_BinaryenAddSatUVecI8x16'](); -Module['SubVecI8x16'] = Module['_BinaryenSubVecI8x16'](); -Module['SubSatSVecI8x16'] = Module['_BinaryenSubSatSVecI8x16'](); -Module['SubSatUVecI8x16'] = Module['_BinaryenSubSatUVecI8x16'](); -Module['MulVecI8x16'] = Module['_BinaryenMulVecI8x16'](); -Module['MinSVecI8x16'] = Module['_BinaryenMinSVecI8x16'](); -Module['MinUVecI8x16'] = Module['_BinaryenMinUVecI8x16'](); -Module['MaxSVecI8x16'] = Module['_BinaryenMaxSVecI8x16'](); -Module['MaxUVecI8x16'] = Module['_BinaryenMaxUVecI8x16'](); -Module['AvgrUVecI8x16'] = Module['_BinaryenAvgrUVecI8x16'](); -Module['NegVecI16x8'] = Module['_BinaryenNegVecI16x8'](); -Module['AnyTrueVecI16x8'] = Module['_BinaryenAnyTrueVecI16x8'](); -Module['AllTrueVecI16x8'] = Module['_BinaryenAllTrueVecI16x8'](); -Module['ShlVecI16x8'] = Module['_BinaryenShlVecI16x8'](); -Module['ShrSVecI16x8'] = Module['_BinaryenShrSVecI16x8'](); -Module['ShrUVecI16x8'] = Module['_BinaryenShrUVecI16x8'](); -Module['AddVecI16x8'] = Module['_BinaryenAddVecI16x8'](); -Module['AddSatSVecI16x8'] = Module['_BinaryenAddSatSVecI16x8'](); -Module['AddSatUVecI16x8'] = Module['_BinaryenAddSatUVecI16x8'](); -Module['SubVecI16x8'] = Module['_BinaryenSubVecI16x8'](); -Module['SubSatSVecI16x8'] = Module['_BinaryenSubSatSVecI16x8'](); -Module['SubSatUVecI16x8'] = Module['_BinaryenSubSatUVecI16x8'](); -Module['MulVecI16x8'] = Module['_BinaryenMulVecI16x8'](); -Module['MinSVecI16x8'] = Module['_BinaryenMinSVecI16x8'](); -Module['MinUVecI16x8'] = Module['_BinaryenMinUVecI16x8'](); -Module['MaxSVecI16x8'] = Module['_BinaryenMaxSVecI16x8'](); -Module['MaxUVecI16x8'] = Module['_BinaryenMaxUVecI16x8'](); -Module['AvgrUVecI16x8'] = Module['_BinaryenAvgrUVecI16x8'](); -Module['DotSVecI16x8ToVecI32x4'] = Module['_BinaryenDotSVecI16x8ToVecI32x4'](); -Module['NegVecI32x4'] = Module['_BinaryenNegVecI32x4'](); -Module['AnyTrueVecI32x4'] = Module['_BinaryenAnyTrueVecI32x4'](); -Module['AllTrueVecI32x4'] = Module['_BinaryenAllTrueVecI32x4'](); -Module['ShlVecI32x4'] = Module['_BinaryenShlVecI32x4'](); -Module['ShrSVecI32x4'] = Module['_BinaryenShrSVecI32x4'](); -Module['ShrUVecI32x4'] = Module['_BinaryenShrUVecI32x4'](); -Module['AddVecI32x4'] = Module['_BinaryenAddVecI32x4'](); -Module['SubVecI32x4'] = Module['_BinaryenSubVecI32x4'](); -Module['MulVecI32x4'] = Module['_BinaryenMulVecI32x4'](); -Module['MinSVecI32x4'] = Module['_BinaryenMinSVecI32x4'](); -Module['MinUVecI32x4'] = Module['_BinaryenMinUVecI32x4'](); -Module['MaxSVecI32x4'] = Module['_BinaryenMaxSVecI32x4'](); -Module['MaxUVecI32x4'] = Module['_BinaryenMaxUVecI32x4'](); -Module['NegVecI64x2'] = Module['_BinaryenNegVecI64x2'](); -Module['AnyTrueVecI64x2'] = Module['_BinaryenAnyTrueVecI64x2'](); -Module['AllTrueVecI64x2'] = Module['_BinaryenAllTrueVecI64x2'](); -Module['ShlVecI64x2'] = Module['_BinaryenShlVecI64x2'](); -Module['ShrSVecI64x2'] = Module['_BinaryenShrSVecI64x2'](); -Module['ShrUVecI64x2'] = Module['_BinaryenShrUVecI64x2'](); -Module['AddVecI64x2'] = Module['_BinaryenAddVecI64x2'](); -Module['SubVecI64x2'] = Module['_BinaryenSubVecI64x2'](); -Module['AbsVecF32x4'] = Module['_BinaryenAbsVecF32x4'](); -Module['NegVecF32x4'] = Module['_BinaryenNegVecF32x4'](); -Module['SqrtVecF32x4'] = Module['_BinaryenSqrtVecF32x4'](); -Module['QFMAVecF32x4'] = Module['_BinaryenQFMAVecF32x4'](); -Module['QFMSVecF32x4'] = Module['_BinaryenQFMSVecF32x4'](); -Module['AddVecF32x4'] = Module['_BinaryenAddVecF32x4'](); -Module['SubVecF32x4'] = Module['_BinaryenSubVecF32x4'](); -Module['MulVecF32x4'] = Module['_BinaryenMulVecF32x4'](); -Module['DivVecF32x4'] = Module['_BinaryenDivVecF32x4'](); -Module['MinVecF32x4'] = Module['_BinaryenMinVecF32x4'](); -Module['MaxVecF32x4'] = Module['_BinaryenMaxVecF32x4'](); -Module['AbsVecF64x2'] = Module['_BinaryenAbsVecF64x2'](); -Module['NegVecF64x2'] = Module['_BinaryenNegVecF64x2'](); -Module['SqrtVecF64x2'] = Module['_BinaryenSqrtVecF64x2'](); -Module['QFMAVecF64x2'] = Module['_BinaryenQFMAVecF64x2'](); -Module['QFMSVecF64x2'] = Module['_BinaryenQFMSVecF64x2'](); -Module['AddVecF64x2'] = Module['_BinaryenAddVecF64x2'](); -Module['SubVecF64x2'] = Module['_BinaryenSubVecF64x2'](); -Module['MulVecF64x2'] = Module['_BinaryenMulVecF64x2'](); -Module['DivVecF64x2'] = Module['_BinaryenDivVecF64x2'](); -Module['MinVecF64x2'] = Module['_BinaryenMinVecF64x2'](); -Module['MaxVecF64x2'] = Module['_BinaryenMaxVecF64x2'](); -Module['TruncSatSVecF32x4ToVecI32x4'] = Module['_BinaryenTruncSatSVecF32x4ToVecI32x4'](); -Module['TruncSatUVecF32x4ToVecI32x4'] = Module['_BinaryenTruncSatUVecF32x4ToVecI32x4'](); -Module['TruncSatSVecF64x2ToVecI64x2'] = Module['_BinaryenTruncSatSVecF64x2ToVecI64x2'](); -Module['TruncSatUVecF64x2ToVecI64x2'] = Module['_BinaryenTruncSatUVecF64x2ToVecI64x2'](); -Module['ConvertSVecI32x4ToVecF32x4'] = Module['_BinaryenConvertSVecI32x4ToVecF32x4'](); -Module['ConvertUVecI32x4ToVecF32x4'] = Module['_BinaryenConvertUVecI32x4ToVecF32x4'](); -Module['ConvertSVecI64x2ToVecF64x2'] = Module['_BinaryenConvertSVecI64x2ToVecF64x2'](); -Module['ConvertUVecI64x2ToVecF64x2'] = Module['_BinaryenConvertUVecI64x2ToVecF64x2'](); -Module['LoadSplatVec8x16'] = Module['_BinaryenLoadSplatVec8x16'](); -Module['LoadSplatVec16x8'] = Module['_BinaryenLoadSplatVec16x8'](); -Module['LoadSplatVec32x4'] = Module['_BinaryenLoadSplatVec32x4'](); -Module['LoadSplatVec64x2'] = Module['_BinaryenLoadSplatVec64x2'](); -Module['LoadExtSVec8x8ToVecI16x8'] = Module['_BinaryenLoadExtSVec8x8ToVecI16x8'](); -Module['LoadExtUVec8x8ToVecI16x8'] = Module['_BinaryenLoadExtUVec8x8ToVecI16x8'](); -Module['LoadExtSVec16x4ToVecI32x4'] = Module['_BinaryenLoadExtSVec16x4ToVecI32x4'](); -Module['LoadExtUVec16x4ToVecI32x4'] = Module['_BinaryenLoadExtUVec16x4ToVecI32x4'](); -Module['LoadExtSVec32x2ToVecI64x2'] = Module['_BinaryenLoadExtSVec32x2ToVecI64x2'](); -Module['LoadExtUVec32x2ToVecI64x2'] = Module['_BinaryenLoadExtUVec32x2ToVecI64x2'](); -Module['NarrowSVecI16x8ToVecI8x16'] = Module['_BinaryenNarrowSVecI16x8ToVecI8x16'](); -Module['NarrowUVecI16x8ToVecI8x16'] = Module['_BinaryenNarrowUVecI16x8ToVecI8x16'](); -Module['NarrowSVecI32x4ToVecI16x8'] = Module['_BinaryenNarrowSVecI32x4ToVecI16x8'](); -Module['NarrowUVecI32x4ToVecI16x8'] = Module['_BinaryenNarrowUVecI32x4ToVecI16x8'](); -Module['WidenLowSVecI8x16ToVecI16x8'] = Module['_BinaryenWidenLowSVecI8x16ToVecI16x8'](); -Module['WidenHighSVecI8x16ToVecI16x8'] = Module['_BinaryenWidenHighSVecI8x16ToVecI16x8'](); -Module['WidenLowUVecI8x16ToVecI16x8'] = Module['_BinaryenWidenLowUVecI8x16ToVecI16x8'](); -Module['WidenHighUVecI8x16ToVecI16x8'] = Module['_BinaryenWidenHighUVecI8x16ToVecI16x8'](); -Module['WidenLowSVecI16x8ToVecI32x4'] = Module['_BinaryenWidenLowSVecI16x8ToVecI32x4'](); -Module['WidenHighSVecI16x8ToVecI32x4'] = Module['_BinaryenWidenHighSVecI16x8ToVecI32x4'](); -Module['WidenLowUVecI16x8ToVecI32x4'] = Module['_BinaryenWidenLowUVecI16x8ToVecI32x4'](); -Module['WidenHighUVecI16x8ToVecI32x4'] = Module['_BinaryenWidenHighUVecI16x8ToVecI32x4'](); -Module['SwizzleVec8x16'] = Module['_BinaryenSwizzleVec8x16'](); - -// The size of a single literal in memory as used in Const creation, -// which is a little different: we don't want users to need to make -// their own Literals, as the C API handles them by value, which means -// we would leak them. Instead, Const creation is fused together with -// an intermediate stack allocation of this size to pass the value. -var sizeOfLiteral = _BinaryenSizeofLiteral(); + // Operations + Module['Operations'] = {}; + [ 'ClzInt32', + 'CtzInt32', + 'PopcntInt32', + 'NegFloat32', + 'AbsFloat32', + 'CeilFloat32', + 'FloorFloat32', + 'TruncFloat32', + 'NearestFloat32', + 'SqrtFloat32', + 'EqZInt32', + 'ClzInt64', + 'CtzInt64', + 'PopcntInt64', + 'NegFloat64', + 'AbsFloat64', + 'CeilFloat64', + 'FloorFloat64', + 'TruncFloat64', + 'NearestFloat64', + 'SqrtFloat64', + 'EqZInt64', + 'ExtendSInt32', + 'ExtendUInt32', + 'WrapInt64', + 'TruncSFloat32ToInt32', + 'TruncSFloat32ToInt64', + 'TruncUFloat32ToInt32', + 'TruncUFloat32ToInt64', + 'TruncSFloat64ToInt32', + 'TruncSFloat64ToInt64', + 'TruncUFloat64ToInt32', + 'TruncUFloat64ToInt64', + 'TruncSatSFloat32ToInt32', + 'TruncSatSFloat32ToInt64', + 'TruncSatUFloat32ToInt32', + 'TruncSatUFloat32ToInt64', + 'TruncSatSFloat64ToInt32', + 'TruncSatSFloat64ToInt64', + 'TruncSatUFloat64ToInt32', + 'TruncSatUFloat64ToInt64', + 'ReinterpretFloat32', + 'ReinterpretFloat64', + 'ConvertSInt32ToFloat32', + 'ConvertSInt32ToFloat64', + 'ConvertUInt32ToFloat32', + 'ConvertUInt32ToFloat64', + 'ConvertSInt64ToFloat32', + 'ConvertSInt64ToFloat64', + 'ConvertUInt64ToFloat32', + 'ConvertUInt64ToFloat64', + 'PromoteFloat32', + 'DemoteFloat64', + 'ReinterpretInt32', + 'ReinterpretInt64', + 'ExtendS8Int32', + 'ExtendS16Int32', + 'ExtendS8Int64', + 'ExtendS16Int64', + 'ExtendS32Int64', + 'AddInt32', + 'SubInt32', + 'MulInt32', + 'DivSInt32', + 'DivUInt32', + 'RemSInt32', + 'RemUInt32', + 'AndInt32', + 'OrInt32', + 'XorInt32', + 'ShlInt32', + 'ShrUInt32', + 'ShrSInt32', + 'RotLInt32', + 'RotRInt32', + 'EqInt32', + 'NeInt32', + 'LtSInt32', + 'LtUInt32', + 'LeSInt32', + 'LeUInt32', + 'GtSInt32', + 'GtUInt32', + 'GeSInt32', + 'GeUInt32', + 'AddInt64', + 'SubInt64', + 'MulInt64', + 'DivSInt64', + 'DivUInt64', + 'RemSInt64', + 'RemUInt64', + 'AndInt64', + 'OrInt64', + 'XorInt64', + 'ShlInt64', + 'ShrUInt64', + 'ShrSInt64', + 'RotLInt64', + 'RotRInt64', + 'EqInt64', + 'NeInt64', + 'LtSInt64', + 'LtUInt64', + 'LeSInt64', + 'LeUInt64', + 'GtSInt64', + 'GtUInt64', + 'GeSInt64', + 'GeUInt64', + 'AddFloat32', + 'SubFloat32', + 'MulFloat32', + 'DivFloat32', + 'CopySignFloat32', + 'MinFloat32', + 'MaxFloat32', + 'EqFloat32', + 'NeFloat32', + 'LtFloat32', + 'LeFloat32', + 'GtFloat32', + 'GeFloat32', + 'AddFloat64', + 'SubFloat64', + 'MulFloat64', + 'DivFloat64', + 'CopySignFloat64', + 'MinFloat64', + 'MaxFloat64', + 'EqFloat64', + 'NeFloat64', + 'LtFloat64', + 'LeFloat64', + 'GtFloat64', + 'GeFloat64', + 'MemorySize', + 'MemoryGrow', + 'AtomicRMWAdd', + 'AtomicRMWSub', + 'AtomicRMWAnd', + 'AtomicRMWOr', + 'AtomicRMWXor', + 'AtomicRMWXchg', + 'SplatVecI8x16', + 'ExtractLaneSVecI8x16', + 'ExtractLaneUVecI8x16', + 'ReplaceLaneVecI8x16', + 'SplatVecI16x8', + 'ExtractLaneSVecI16x8', + 'ExtractLaneUVecI16x8', + 'ReplaceLaneVecI16x8', + 'SplatVecI32x4', + 'ExtractLaneVecI32x4', + 'ReplaceLaneVecI32x4', + 'SplatVecI64x2', + 'ExtractLaneVecI64x2', + 'ReplaceLaneVecI64x2', + 'SplatVecF32x4', + 'ExtractLaneVecF32x4', + 'ReplaceLaneVecF32x4', + 'SplatVecF64x2', + 'ExtractLaneVecF64x2', + 'ReplaceLaneVecF64x2', + 'EqVecI8x16', + 'NeVecI8x16', + 'LtSVecI8x16', + 'LtUVecI8x16', + 'GtSVecI8x16', + 'GtUVecI8x16', + 'LeSVecI8x16', + 'LeUVecI8x16', + 'GeSVecI8x16', + 'GeUVecI8x16', + 'EqVecI16x8', + 'NeVecI16x8', + 'LtSVecI16x8', + 'LtUVecI16x8', + 'GtSVecI16x8', + 'GtUVecI16x8', + 'LeSVecI16x8', + 'LeUVecI16x8', + 'GeSVecI16x8', + 'GeUVecI16x8', + 'EqVecI32x4', + 'NeVecI32x4', + 'LtSVecI32x4', + 'LtUVecI32x4', + 'GtSVecI32x4', + 'GtUVecI32x4', + 'LeSVecI32x4', + 'LeUVecI32x4', + 'GeSVecI32x4', + 'GeUVecI32x4', + 'EqVecF32x4', + 'NeVecF32x4', + 'LtVecF32x4', + 'GtVecF32x4', + 'LeVecF32x4', + 'GeVecF32x4', + 'EqVecF64x2', + 'NeVecF64x2', + 'LtVecF64x2', + 'GtVecF64x2', + 'LeVecF64x2', + 'GeVecF64x2', + 'NotVec128', + 'AndVec128', + 'OrVec128', + 'XorVec128', + 'AndNotVec128', + 'BitselectVec128', + 'NegVecI8x16', + 'AnyTrueVecI8x16', + 'AllTrueVecI8x16', + 'ShlVecI8x16', + 'ShrSVecI8x16', + 'ShrUVecI8x16', + 'AddVecI8x16', + 'AddSatSVecI8x16', + 'AddSatUVecI8x16', + 'SubVecI8x16', + 'SubSatSVecI8x16', + 'SubSatUVecI8x16', + 'MulVecI8x16', + 'MinSVecI8x16', + 'MinUVecI8x16', + 'MaxSVecI8x16', + 'MaxUVecI8x16', + 'AvgrUVecI8x16', + 'NegVecI16x8', + 'AnyTrueVecI16x8', + 'AllTrueVecI16x8', + 'ShlVecI16x8', + 'ShrSVecI16x8', + 'ShrUVecI16x8', + 'AddVecI16x8', + 'AddSatSVecI16x8', + 'AddSatUVecI16x8', + 'SubVecI16x8', + 'SubSatSVecI16x8', + 'SubSatUVecI16x8', + 'MulVecI16x8', + 'MinSVecI16x8', + 'MinUVecI16x8', + 'MaxSVecI16x8', + 'MaxUVecI16x8', + 'AvgrUVecI16x8', + 'DotSVecI16x8ToVecI32x4', + 'NegVecI32x4', + 'AnyTrueVecI32x4', + 'AllTrueVecI32x4', + 'ShlVecI32x4', + 'ShrSVecI32x4', + 'ShrUVecI32x4', + 'AddVecI32x4', + 'SubVecI32x4', + 'MulVecI32x4', + 'MinSVecI32x4', + 'MinUVecI32x4', + 'MaxSVecI32x4', + 'MaxUVecI32x4', + 'NegVecI64x2', + 'AnyTrueVecI64x2', + 'AllTrueVecI64x2', + 'ShlVecI64x2', + 'ShrSVecI64x2', + 'ShrUVecI64x2', + 'AddVecI64x2', + 'SubVecI64x2', + 'AbsVecF32x4', + 'NegVecF32x4', + 'SqrtVecF32x4', + 'QFMAVecF32x4', + 'QFMSVecF32x4', + 'AddVecF32x4', + 'SubVecF32x4', + 'MulVecF32x4', + 'DivVecF32x4', + 'MinVecF32x4', + 'MaxVecF32x4', + 'AbsVecF64x2', + 'NegVecF64x2', + 'SqrtVecF64x2', + 'QFMAVecF64x2', + 'QFMSVecF64x2', + 'AddVecF64x2', + 'SubVecF64x2', + 'MulVecF64x2', + 'DivVecF64x2', + 'MinVecF64x2', + 'MaxVecF64x2', + 'TruncSatSVecF32x4ToVecI32x4', + 'TruncSatUVecF32x4ToVecI32x4', + 'TruncSatSVecF64x2ToVecI64x2', + 'TruncSatUVecF64x2ToVecI64x2', + 'ConvertSVecI32x4ToVecF32x4', + 'ConvertUVecI32x4ToVecF32x4', + 'ConvertSVecI64x2ToVecF64x2', + 'ConvertUVecI64x2ToVecF64x2', + 'LoadSplatVec8x16', + 'LoadSplatVec16x8', + 'LoadSplatVec32x4', + 'LoadSplatVec64x2', + 'LoadExtSVec8x8ToVecI16x8', + 'LoadExtUVec8x8ToVecI16x8', + 'LoadExtSVec16x4ToVecI32x4', + 'LoadExtUVec16x4ToVecI32x4', + 'LoadExtSVec32x2ToVecI64x2', + 'LoadExtUVec32x2ToVecI64x2', + 'NarrowSVecI16x8ToVecI8x16', + 'NarrowUVecI16x8ToVecI8x16', + 'NarrowSVecI32x4ToVecI16x8', + 'NarrowUVecI32x4ToVecI16x8', + 'WidenLowSVecI8x16ToVecI16x8', + 'WidenHighSVecI8x16ToVecI16x8', + 'WidenLowUVecI8x16ToVecI16x8', + 'WidenHighUVecI8x16ToVecI16x8', + 'WidenLowSVecI16x8ToVecI32x4', + 'WidenHighSVecI16x8ToVecI32x4', + 'WidenLowUVecI16x8ToVecI32x4', + 'WidenHighUVecI16x8ToVecI32x4', + 'SwizzleVec8x16', + ].forEach(function(name) { + Module['Operations'][name] = Module[name] = Module['_Binaryen' + name](); + }); +} // 'Module' interface Module['Module'] = function(module) { assert(!module); // guard against incorrect old API usage - var module = Module['_BinaryenModuleCreate'](); - - wrapModule(module, this); + wrapModule(Module['_BinaryenModuleCreate'](), this); }; // Receives a C pointer to a C Module and a JS object, and creates @@ -480,6 +471,13 @@ function wrapModule(module, self) { self['ptr'] = module; + // The size of a single literal in memory as used in Const creation, + // which is a little different: we don't want users to need to make + // their own Literals, as the C API handles them by value, which means + // we would leak them. Instead, Const creation is fused together with + // an intermediate stack allocation of this size to pass the value. + var sizeOfLiteral = _BinaryenSizeofLiteral(); + // 'Expression' creation self['block'] = function(name, children, type) { return preserveStack(function() { @@ -2689,6 +2687,26 @@ Module['getExpressionInfo'] = function(expr) { } }; +Module['createType'] = function(types) { + return preserveStack(function() { + var array = i32sToStack(types); + return Module['_BinaryenTypeCreate'](array, types.length); + }); +}; + +Module['expandType'] = function(ty) { + return preserveStack(function() { + var numTypes = Module['_BinaryenTypeArity'](ty); + var array = stackAlloc(numTypes << 2); + Module['_BinaryenTypeExpand'](ty, array); + var types = []; + for (var i = 0; i < numTypes; i++) { + types.push(HEAPU32[(array >>> 2) + i]); + } + return types; + }); +}; + // Obtains information about a 'Function' Module['getFunctionInfo'] = function(func) { return { @@ -2813,3 +2831,55 @@ Module['exit'] = function(status) { // a stack trace, for debuggability. if (status != 0) throw new Error('exiting due to error: ' + status); }; + +// Indicates if Binaryen has been loaded and is ready +Module['isReady'] = runtimeInitialized; + +// Provide a mechanism to tell when the module is ready +// +// if (!binaryen.isReady) await binaryen.ready; +// ... +// +var pendingPromises = []; +var initializeError = null; +Object.defineProperty(Module, 'ready', { + get: function() { + return new Promise(function(resolve, reject) { + if (initializeError) { + reject(initializeError); + } else if (runtimeInitialized) { + resolve(Module); + } else { + pendingPromises.push({ + resolve: resolve, + reject: reject + }); + } + }); + } +}); + +// Intercept the onRuntimeInitialized hook if necessary +if (runtimeInitialized) { + initializeConstants(); +} else { + Module['onRuntimeInitialized'] = (function(super_) { + return function() { + try { + initializeConstants(); + if (super_) super_(); + Module['isReady'] = true; + pendingPromises.forEach(function(p) { + p.resolve(Module); + }); + } catch (e) { + initializeError = e; + pendingPromises.forEach(function(p) { + p.reject(e); + }); + } finally { + pendingPromises = []; + } + }; + })(Module['onRuntimeInitialized']); +} diff --git a/test/binaryen.js/atomics.js b/test/binaryen.js/atomics.js index d19a8e89d..1374da804 100644 --- a/test/binaryen.js/atomics.js +++ b/test/binaryen.js/atomics.js @@ -2,88 +2,94 @@ function assert(x) { if (!x) throw 'error!'; } -var module = Binaryen.parseText(` +var wast = ` (module (memory $0 (shared 1 1)) ) -`); +`; -// i32/i64.atomic.load/store -module.addFunction("main", Binaryen.none, Binaryen.none, [], module.block("", [ - // i32 - module.i32.atomic.store(0, - module.i32.const(0), - module.i32.atomic.load(0, - module.i32.const(0) - ) - ), - // i32 as u8 - module.i32.atomic.store8(0, - module.i32.const(0), - module.i32.atomic.load8_u(0, - module.i32.const(0) - ) - ), - // i32 as u16 - module.i32.atomic.store16(0, - module.i32.const(0), - module.i32.atomic.load16_u(0, - module.i32.const(0) - ) - ), - // i64 - module.i64.atomic.store(0, - module.i32.const(0), - module.i64.atomic.load(0, - module.i32.const(0) - ) - ), - // i64 as u8 - module.i64.atomic.store8(0, - module.i32.const(0), - module.i64.atomic.load8_u(0, - module.i32.const(0) - ) - ), - // i64 as u16 - module.i64.atomic.store16(0, - module.i32.const(0), - module.i64.atomic.load16_u(0, - module.i32.const(0) - ) - ), - // i64 as u32 - module.i64.atomic.store32(0, - module.i32.const(0), - module.i64.atomic.load32_u(0, - module.i32.const(0) - ) - ), - // wait and notify - module.drop( - module.i32.atomic.wait( +function test() { + var module = Binaryen.parseText(wast); + + // i32/i64.atomic.load/store + module.addFunction("main", Binaryen.none, Binaryen.none, [], module.block("", [ + // i32 + module.i32.atomic.store(0, + module.i32.const(0), + module.i32.atomic.load(0, + module.i32.const(0) + ) + ), + // i32 as u8 + module.i32.atomic.store8(0, + module.i32.const(0), + module.i32.atomic.load8_u(0, + module.i32.const(0) + ) + ), + // i32 as u16 + module.i32.atomic.store16(0, module.i32.const(0), + module.i32.atomic.load16_u(0, + module.i32.const(0) + ) + ), + // i64 + module.i64.atomic.store(0, module.i32.const(0), - module.i64.const(0) - ) - ), - module.drop( - module.i64.atomic.wait( + module.i64.atomic.load(0, + module.i32.const(0) + ) + ), + // i64 as u8 + module.i64.atomic.store8(0, module.i32.const(0), - module.i64.const(0), - module.i64.const(0) - ) - ), - module.drop( - module.atomic.notify( + module.i64.atomic.load8_u(0, + module.i32.const(0) + ) + ), + // i64 as u16 + module.i64.atomic.store16(0, module.i32.const(0), - module.i32.const(0) - ) - ), - // fence - module.atomic.fence() -])); + module.i64.atomic.load16_u(0, + module.i32.const(0) + ) + ), + // i64 as u32 + module.i64.atomic.store32(0, + module.i32.const(0), + module.i64.atomic.load32_u(0, + module.i32.const(0) + ) + ), + // wait and notify + module.drop( + module.i32.atomic.wait( + module.i32.const(0), + module.i32.const(0), + module.i64.const(0) + ) + ), + module.drop( + module.i64.atomic.wait( + module.i32.const(0), + module.i64.const(0), + module.i64.const(0) + ) + ), + module.drop( + module.atomic.notify( + module.i32.const(0), + module.i32.const(0) + ) + ), + // fence + module.atomic.fence() + ])); + + module.setFeatures(Binaryen.Features.Atomics); + assert(module.validate()); + console.log(module.emitText()); +} -module.setFeatures(Binaryen.Features.Atomics); -assert(module.validate()); -console.log(module.emitText()); +Binaryen.ready.then(test); diff --git a/test/binaryen.js/custom-section.js b/test/binaryen.js/custom-section.js index f61af0096..2ecd39025 100644 --- a/test/binaryen.js/custom-section.js +++ b/test/binaryen.js/custom-section.js @@ -2,10 +2,14 @@ function assert(x) { if (!x) throw 'error!'; } -Binaryen.setAPITracing(true); -var module = new Binaryen.Module(); +function test() { + Binaryen.setAPITracing(true); + var module = new Binaryen.Module(); -module.addCustomSection("hello", [119, 111, 114, 108, 100]); + module.addCustomSection("hello", [119, 111, 114, 108, 100]); -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/debug-info.js b/test/binaryen.js/debug-info.js index d1634f10e..a769d8911 100644 --- a/test/binaryen.js/debug-info.js +++ b/test/binaryen.js/debug-info.js @@ -11,37 +11,41 @@ var wast = ` ) `; -// Use defaults (should not emit debug info) -console.log("=== default ==="); -console.log("debugInfo=" + Binaryen.getDebugInfo()); -var module = Binaryen.parseText(wast); -var binary = module.emitBinary(); -module.dispose(); -module = Binaryen.readBinary(binary); -console.log(module.emitText()); -assert(module.validate()); -module.dispose(); +function test() { + // Use defaults (should not emit debug info) + console.log("=== default ==="); + console.log("debugInfo=" + Binaryen.getDebugInfo()); + var module = Binaryen.parseText(wast); + var binary = module.emitBinary(); + module.dispose(); + module = Binaryen.readBinary(binary); + console.log(module.emitText()); + assert(module.validate()); + module.dispose(); -// With debug info -console.log("=== with debug info ==="); -Binaryen.setDebugInfo(true); -console.log("debugInfo=" + Binaryen.getDebugInfo()); -module = Binaryen.parseText(wast); -binary = module.emitBinary(); -module.dispose(); -module = Binaryen.readBinary(binary); -console.log(module.emitText()); -assert(module.validate()); -module.dispose(); + // With debug info + console.log("=== with debug info ==="); + Binaryen.setDebugInfo(true); + console.log("debugInfo=" + Binaryen.getDebugInfo()); + module = Binaryen.parseText(wast); + binary = module.emitBinary(); + module.dispose(); + module = Binaryen.readBinary(binary); + console.log(module.emitText()); + assert(module.validate()); + module.dispose(); -// Without debug info -console.log("=== without debug info ==="); -Binaryen.setDebugInfo(false); -console.log("debugInfo=" + Binaryen.getDebugInfo()); -module = Binaryen.parseText(wast); -binary = module.emitBinary(); -module.dispose(); -module = Binaryen.readBinary(binary); -console.log(module.emitText()); -assert(module.validate()); -module.dispose(); + // Without debug info + console.log("=== without debug info ==="); + Binaryen.setDebugInfo(false); + console.log("debugInfo=" + Binaryen.getDebugInfo()); + module = Binaryen.parseText(wast); + binary = module.emitBinary(); + module.dispose(); + module = Binaryen.readBinary(binary); + console.log(module.emitText()); + assert(module.validate()); + module.dispose(); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/emit_asmjs.js b/test/binaryen.js/emit_asmjs.js index 9d5a3966d..751712592 100644 --- a/test/binaryen.js/emit_asmjs.js +++ b/test/binaryen.js/emit_asmjs.js @@ -2,12 +2,16 @@ function assert(x) { if (!x) throw 'error!'; } -var module = new Binaryen.Module(); +function test() { + var module = new Binaryen.Module(); -module.addFunction("main", Binaryen.i32, Binaryen.i32, [], module.local.get(0, Binaryen.i32)); + module.addFunction("main", Binaryen.i32, Binaryen.i32, [], module.local.get(0, Binaryen.i32)); -module.addFunctionExport("main", "main"); + module.addFunctionExport("main", "main"); -assert(module.validate()); // should validate before calling emitAsmjs + assert(module.validate()); // should validate before calling emitAsmjs -console.log(module.emitAsmjs()); + console.log(module.emitAsmjs()); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/event.js b/test/binaryen.js/event.js index 3931b3440..f728e9228 100644 --- a/test/binaryen.js/event.js +++ b/test/binaryen.js/event.js @@ -10,26 +10,30 @@ function cleanInfo(info) { return ret; } -var module = new Binaryen.Module(); -module.setFeatures(Binaryen.Features.ExceptionHandling); +function test() { + var module = new Binaryen.Module(); + module.setFeatures(Binaryen.Features.ExceptionHandling); -var pairType = Binaryen.createType([Binaryen.i32, Binaryen.f32]); + var pairType = Binaryen.createType([Binaryen.i32, Binaryen.f32]); -var event_ = module.addEvent("a-event", 0, Binaryen.i32, Binaryen.none); + var event_ = module.addEvent("a-event", 0, Binaryen.i32, Binaryen.none); -console.log("GetEvent is equal: " + (event_ === module.getEvent("a-event"))); + console.log("GetEvent is equal: " + (event_ === module.getEvent("a-event"))); -var eventInfo = Binaryen.getEventInfo(event_); -console.log("getEventInfo=" + JSON.stringify(cleanInfo(eventInfo))); + var eventInfo = Binaryen.getEventInfo(event_); + console.log("getEventInfo=" + JSON.stringify(cleanInfo(eventInfo))); -module.addEventExport("a-event", "a-event-exp"); -module.addEventImport("a-event-imp", "module", "base", 0, pairType, Binaryen.none); + module.addEventExport("a-event", "a-event-exp"); + module.addEventImport("a-event-imp", "module", "base", 0, pairType, Binaryen.none); -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); -module.removeExport("a-event-exp"); -module.removeEvent("a-event"); + module.removeExport("a-event-exp"); + module.removeEvent("a-event"); -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/exception-handling.js b/test/binaryen.js/exception-handling.js index 5d84c1365..6a1b32ed7 100644 --- a/test/binaryen.js/exception-handling.js +++ b/test/binaryen.js/exception-handling.js @@ -16,44 +16,48 @@ function stringify(expr) { return JSON.stringify(cleanInfo(Binaryen.getExpressionInfo(expr))); } -var module = new Binaryen.Module(); -module.setFeatures(Binaryen.Features.ExceptionHandling); - -var event_ = module.addEvent("e", 0, Binaryen.i32, Binaryen.none); - -// (try -// (throw $e (i32.const 0)) -// (catch -// ;; We don't support multi-value yet. Use locals instead. -// (local.set 0 (exnref.pop)) -// (drop -// (block $l (result i32) -// (rethrow -// (br_on_exn $l $e (local.get 0)) -// ) -// ) -// ) -// ) -// ) -var throw_ = module.throw("e", [module.i32.const(0)]); -var br_on_exn = module.br_on_exn("l", "e", module.local.get(0, Binaryen.exnref)); -var rethrow = module.rethrow(br_on_exn); -var try_ = module.try( - throw_, - module.block(null, [ - module.local.set(0, module.exnref.pop()), - module.drop( - module.block("l", [rethrow], Binaryen.i32) +function test() { + var module = new Binaryen.Module(); + module.setFeatures(Binaryen.Features.ExceptionHandling); + + var event_ = module.addEvent("e", 0, Binaryen.i32, Binaryen.none); + + // (try + // (throw $e (i32.const 0)) + // (catch + // ;; We don't support multi-value yet. Use locals instead. + // (local.set 0 (exnref.pop)) + // (drop + // (block $l (result i32) + // (rethrow + // (br_on_exn $l $e (local.get 0)) + // ) + // ) + // ) + // ) + // ) + var throw_ = module.throw("e", [module.i32.const(0)]); + var br_on_exn = module.br_on_exn("l", "e", module.local.get(0, Binaryen.exnref)); + var rethrow = module.rethrow(br_on_exn); + var try_ = module.try( + throw_, + module.block(null, [ + module.local.set(0, module.exnref.pop()), + module.drop( + module.block("l", [rethrow], Binaryen.i32) + ) + ] ) - ] - ) -); -var func = module.addFunction("test", Binaryen.none, Binaryen.none, [Binaryen.exnref], try_); - -console.log(module.emitText()); -assert(module.validate()); - -console.log("getExpressionInfo(throw) = " + stringify(throw_)); -console.log("getExpressionInfo(br_on_exn) = " + stringify(br_on_exn)); -console.log("getExpressionInfo(rethrow) = " + stringify(rethrow)); -console.log("getExpressionInfo(try) = " + stringify(try_)); + ); + var func = module.addFunction("test", Binaryen.none, Binaryen.none, [Binaryen.exnref], try_); + + console.log(module.emitText()); + assert(module.validate()); + + console.log("getExpressionInfo(throw) = " + stringify(throw_)); + console.log("getExpressionInfo(br_on_exn) = " + stringify(br_on_exn)); + console.log("getExpressionInfo(rethrow) = " + stringify(rethrow)); + console.log("getExpressionInfo(try) = " + stringify(try_)); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/functions.js b/test/binaryen.js/functions.js index b2172d005..0a3aa2243 100644 --- a/test/binaryen.js/functions.js +++ b/test/binaryen.js/functions.js @@ -12,27 +12,31 @@ function cleanInfo(info) { return ret; } -var module = new Binaryen.Module(); +function test() { + var module = new Binaryen.Module(); -var func = module.addFunction("a-function", Binaryen.none, Binaryen.i32, [], - module.i32.add( - module.i32.const(1), - module.i32.const(2) - ) -); + var func = module.addFunction("a-function", Binaryen.none, Binaryen.i32, [], + module.i32.add( + module.i32.const(1), + module.i32.const(2) + ) + ); -console.log("GetFunction is equal: " + (func === module.getFunction("a-function"))); + console.log("GetFunction is equal: " + (func === module.getFunction("a-function"))); -module.runPassesOnFunction(func, ["precompute"]); + module.runPassesOnFunction(func, ["precompute"]); -var funcInfo = Binaryen.getFunctionInfo(func); -console.log("getFunctionInfo=" + JSON.stringify(cleanInfo(funcInfo))); -var expInfo = Binaryen.getExpressionInfo(funcInfo.body); -console.log("getExpressionInfo(body)=" + JSON.stringify(cleanInfo(expInfo))); -console.log(Binaryen.emitText(funcInfo.body)); + var funcInfo = Binaryen.getFunctionInfo(func); + console.log("getFunctionInfo=" + JSON.stringify(cleanInfo(funcInfo))); + var expInfo = Binaryen.getExpressionInfo(funcInfo.body); + console.log("getExpressionInfo(body)=" + JSON.stringify(cleanInfo(expInfo))); + console.log(Binaryen.emitText(funcInfo.body)); -module.removeFunction("a-function"); + module.removeFunction("a-function"); -assert(module.validate()); + assert(module.validate()); -console.log(module.emitText()); + console.log(module.emitText()); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/global.js b/test/binaryen.js/global.js index 562de7360..48571ef93 100644 --- a/test/binaryen.js/global.js +++ b/test/binaryen.js/global.js @@ -12,30 +12,34 @@ function cleanInfo(info) { return ret; } -var module = new Binaryen.Module(); -module.setFeatures(Binaryen.Features.MVP | Binaryen.Features.MutableGlobals); +function test() { + var module = new Binaryen.Module(); + module.setFeatures(Binaryen.Features.MVP | Binaryen.Features.MutableGlobals); -var initExpr = module.i32.const(1); -var global = module.addGlobal("a-global", Binaryen.i32, false, initExpr); + var initExpr = module.i32.const(1); + var global = module.addGlobal("a-global", Binaryen.i32, false, initExpr); -console.log("GetGlobal is equal: " + (global === module.getGlobal("a-global"))); + console.log("GetGlobal is equal: " + (global === module.getGlobal("a-global"))); -var globalInfo = Binaryen.getGlobalInfo(global); -console.log("getGlobalInfo=" + JSON.stringify(cleanInfo(globalInfo))); + var globalInfo = Binaryen.getGlobalInfo(global); + console.log("getGlobalInfo=" + JSON.stringify(cleanInfo(globalInfo))); -var initExpInfo = Binaryen.getExpressionInfo(globalInfo.init); -console.log("getExpressionInfo(init)=" + JSON.stringify(cleanInfo(initExpInfo))); -console.log(Binaryen.emitText(globalInfo.init)); + var initExpInfo = Binaryen.getExpressionInfo(globalInfo.init); + console.log("getExpressionInfo(init)=" + JSON.stringify(cleanInfo(initExpInfo))); + console.log(Binaryen.emitText(globalInfo.init)); -module.addGlobalExport("a-global", "a-global-exp"); -module.addGlobalImport("a-global-imp", "module", "base", Binaryen.i32, false); -module.addGlobalImport("a-mut-global-imp", "module", "base", Binaryen.i32, true); + module.addGlobalExport("a-global", "a-global-exp"); + module.addGlobalImport("a-global-imp", "module", "base", Binaryen.i32, false); + module.addGlobalImport("a-mut-global-imp", "module", "base", Binaryen.i32, true); -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); -module.removeGlobal("a-global"); -module.removeExport("a-global-exp"); + module.removeGlobal("a-global"); + module.removeExport("a-global-exp"); -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/hello-world.js b/test/binaryen.js/hello-world.js index 414e5bfd1..d14c97912 100644 --- a/test/binaryen.js/hello-world.js +++ b/test/binaryen.js/hello-world.js @@ -5,49 +5,53 @@ function assert(x) { // "hello world" type example: create a function that adds two i32s and // returns the result -// Create a module to work on -var module = new Binaryen.Module(); - -// Start to create the function, starting with the contents: Get the 0 and -// 1 arguments, and add them, then return them -var left = module.local.get(0, Binaryen.i32); -var right = module.local.get(1, Binaryen.i32); -var add = module.i32.add(left, right); -var ret = module.return(add); - -// Create the add function -// Note: no additional local variables (that's the []) -var ii = Binaryen.createType([Binaryen.i32, Binaryen.i32]) -module.addFunction('adder', ii, Binaryen.i32, [], ret); - -// Export the function, so we can call it later (for simplicity we -// export it as the same name as it has internally) -module.addFunctionExport('adder', 'adder'); - -// Print out the text -console.log(module.emitText()); - -// Optimize the module! This removes the 'return', since the -// output of the add can just fall through -module.optimize(); - -// Print out the optimized module's text -console.log('optimized:\n\n' + module.emitText()); - -// Get the binary in typed array form -var binary = module.emitBinary(); -console.log('binary size: ' + binary.length); -console.log(); -assert(module.validate()); - -// We don't need the Binaryen module anymore, so we can tell it to -// clean itself up -module.dispose(); - -// Compile the binary and create an instance -var wasm = new WebAssembly.Instance(new WebAssembly.Module(binary), {}) -console.log("exports: " + Object.keys(wasm.exports).sort().join(",")); -console.log(); - -// Call the code! -console.log('an addition: ' + wasm.exports.adder(40, 2)); +function test() { + // Create a module to work on + var module = new Binaryen.Module(); + + // Start to create the function, starting with the contents: Get the 0 and + // 1 arguments, and add them, then return them + var left = module.local.get(0, Binaryen.i32); + var right = module.local.get(1, Binaryen.i32); + var add = module.i32.add(left, right); + var ret = module.return(add); + + // Create the add function + // Note: no additional local variables (that's the []) + var ii = Binaryen.createType([Binaryen.i32, Binaryen.i32]) + module.addFunction('adder', ii, Binaryen.i32, [], ret); + + // Export the function, so we can call it later (for simplicity we + // export it as the same name as it has internally) + module.addFunctionExport('adder', 'adder'); + + // Print out the text + console.log(module.emitText()); + + // Optimize the module! This removes the 'return', since the + // output of the add can just fall through + module.optimize(); + + // Print out the optimized module's text + console.log('optimized:\n\n' + module.emitText()); + + // Get the binary in typed array form + var binary = module.emitBinary(); + console.log('binary size: ' + binary.length); + console.log(); + assert(module.validate()); + + // We don't need the Binaryen module anymore, so we can tell it to + // clean itself up + module.dispose(); + + // Compile the binary and create an instance + var wasm = new WebAssembly.Instance(new WebAssembly.Module(binary), {}) + console.log("exports: " + Object.keys(wasm.exports).sort().join(",")); + console.log(); + + // Call the code! + console.log('an addition: ' + wasm.exports.adder(40, 2)); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/kitchen-sink.js b/test/binaryen.js/kitchen-sink.js index 630db311f..e8cf3e0f5 100644 --- a/test/binaryen.js/kitchen-sink.js +++ b/test/binaryen.js/kitchen-sink.js @@ -1,5 +1,9 @@ // kitchen sink, tests the full API +function assert(x) { + if (!x) throw 'error!'; +} + function cleanInfo(info) { var ret = {}; for (var x in info) { @@ -16,10 +20,6 @@ var module; var v128_bytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; -function assert(x) { - if (!x) throw 'error!'; -} - function makeInt32(x) { return module.i32.const(x); } @@ -975,7 +975,7 @@ function test_expression_info() { module.dispose(); } -function main() { +function test() { // Tracing must be first so it starts with a fresh set of interned types test_tracing(); test_types(); @@ -992,4 +992,4 @@ function main() { test_expression_info(); } -main(); +Binaryen.ready.then(test); diff --git a/test/binaryen.js/kitchen-sink.js.txt b/test/binaryen.js/kitchen-sink.js.txt index 586834f26..bb6c92f72 100644 --- a/test/binaryen.js/kitchen-sink.js.txt +++ b/test/binaryen.js/kitchen-sink.js.txt @@ -743,7 +743,7 @@ int main() { uint8_t t109[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; expressions[398] = BinaryenConst(the_module, BinaryenLiteralVec128(t109)); } - expressions[399] = BinaryenBinary(the_module, 111, expressions[397], expressions[398]); + expressions[399] = BinaryenBinary(the_module, 112, expressions[397], expressions[398]); { uint8_t t110[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; expressions[400] = BinaryenConst(the_module, BinaryenLiteralVec128(t110)); @@ -2689,7 +2689,7 @@ getExpressionInfo(f64.const)={"id":14,"type":5,"value":9.5} ) ) (drop - (f32x4.ge + (f64x2.eq (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) @@ -4386,7 +4386,7 @@ getExpressionInfo(f64.const)={"id":14,"type":5,"value":9.5} ) ) (drop - (f32x4.ge + (f64x2.eq (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) @@ -7139,7 +7139,7 @@ getExpressionInfo(f64.const)={"id":14,"type":5,"value":9.5} ) ) (drop - (f32x4.ge + (f64x2.eq (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) @@ -8834,7 +8834,7 @@ getExpressionInfo(f64.const)={"id":14,"type":5,"value":9.5} ) ) (drop - (f32x4.ge + (f64x2.eq (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) (v128.const i32x4 0x04030201 0x08070605 0x0c0b0a09 0x100f0e0d) ) diff --git a/test/binaryen.js/optimize-levels.js b/test/binaryen.js/optimize-levels.js index e42bd5409..b3ae66a43 100644 --- a/test/binaryen.js/optimize-levels.js +++ b/test/binaryen.js/optimize-levels.js @@ -18,47 +18,52 @@ var wast = ` ) ) `; -console.log("=== input wast ===" + wast); -function printOptions() { - console.log("optimizeLevel=" + Binaryen.getOptimizeLevel()); - console.log("shrinkLevel=" + Binaryen.getShrinkLevel()); -} +function test() { + console.log("=== input wast ===" + wast); + + function printOptions() { + console.log("optimizeLevel=" + Binaryen.getOptimizeLevel()); + console.log("shrinkLevel=" + Binaryen.getShrinkLevel()); + } -// Use defaults (should be equal to -Os below) -var module = Binaryen.parseText(wast); + // Use defaults (should be equal to -Os below) + var module = Binaryen.parseText(wast); -console.log("=== unoptimized ==="); -assert(module.validate()); -console.log(module.emitText()); + console.log("=== unoptimized ==="); + assert(module.validate()); + console.log(module.emitText()); -module.optimize(); -console.log("=== optimized using defaults ==="); -printOptions(); -assert(module.validate()); -console.log(module.emitText()); -module.dispose(); + module.optimize(); + console.log("=== optimized using defaults ==="); + printOptions(); + assert(module.validate()); + console.log(module.emitText()); + module.dispose(); -// Use -O0 (should remove the block) -module = Binaryen.parseText(wast); + // Use -O0 (should remove the block) + module = Binaryen.parseText(wast); -Binaryen.setOptimizeLevel(0); -Binaryen.setShrinkLevel(0); -module.optimize(); -console.log("=== optimized with -O0 ==="); -printOptions(); -assert(module.validate()); -console.log(module.emitText()); -module.dispose(); + Binaryen.setOptimizeLevel(0); + Binaryen.setShrinkLevel(0); + module.optimize(); + console.log("=== optimized with -O0 ==="); + printOptions(); + assert(module.validate()); + console.log(module.emitText()); + module.dispose(); -// Use -Os (should remove the block and convert to a select) -module = Binaryen.parseText(wast); + // Use -Os (should remove the block and convert to a select) + module = Binaryen.parseText(wast); + + Binaryen.setOptimizeLevel(2); + Binaryen.setShrinkLevel(1); + module.optimize(); + console.log("=== optimized with -Os ==="); + printOptions(); + assert(module.validate()); + console.log(module.emitText()); + module.dispose(); +} -Binaryen.setOptimizeLevel(2); -Binaryen.setShrinkLevel(1); -module.optimize(); -console.log("=== optimized with -Os ==="); -printOptions(); -assert(module.validate()); -console.log(module.emitText()); -module.dispose(); +Binaryen.ready.then(test); diff --git a/test/binaryen.js/push-pop.js b/test/binaryen.js/push-pop.js index 9f1d66719..01d6e76a9 100644 --- a/test/binaryen.js/push-pop.js +++ b/test/binaryen.js/push-pop.js @@ -16,29 +16,33 @@ function stringify(expr) { return JSON.stringify(cleanInfo(Binaryen.getExpressionInfo(expr))); } -var module = new Binaryen.Module(); +function test() { + var module = new Binaryen.Module(); -var func = module.addFunction("func", Binaryen.none, Binaryen.none, [], - module.block(null, [ - module.push(module.i32.pop()), - module.push(module.i64.pop()), - module.push(module.f32.pop()), - module.push(module.f64.pop()), - module.push(module.v128.pop()), - module.push(module.anyref.pop()), - module.push(module.exnref.pop()) - ] - ) -) + var func = module.addFunction("func", Binaryen.none, Binaryen.none, [], + module.block(null, [ + module.push(module.i32.pop()), + module.push(module.i64.pop()), + module.push(module.f32.pop()), + module.push(module.f64.pop()), + module.push(module.v128.pop()), + module.push(module.anyref.pop()), + module.push(module.exnref.pop()) + ] + ) + ) -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); -console.log("getExpressionInfo(i32.pop) = " + stringify(module.i32.pop())); -console.log("getExpressionInfo(i64.pop) = " + stringify(module.i64.pop())); -console.log("getExpressionInfo(f32.pop) = " + stringify(module.f32.pop())); -console.log("getExpressionInfo(f64.pop) = " + stringify(module.f64.pop())); -console.log("getExpressionInfo(v128.pop) = " + stringify(module.v128.pop())); -console.log("getExpressionInfo(anyref.pop) = " + stringify(module.anyref.pop())); -console.log("getExpressionInfo(exnref.pop) = " + stringify(module.exnref.pop())); -console.log("getExpressionInfo(push) = " + stringify(module.push(module.i32.const(0)))); + console.log("getExpressionInfo(i32.pop) = " + stringify(module.i32.pop())); + console.log("getExpressionInfo(i64.pop) = " + stringify(module.i64.pop())); + console.log("getExpressionInfo(f32.pop) = " + stringify(module.f32.pop())); + console.log("getExpressionInfo(f64.pop) = " + stringify(module.f64.pop())); + console.log("getExpressionInfo(v128.pop) = " + stringify(module.v128.pop())); + console.log("getExpressionInfo(anyref.pop) = " + stringify(module.anyref.pop())); + console.log("getExpressionInfo(exnref.pop) = " + stringify(module.exnref.pop())); + console.log("getExpressionInfo(push) = " + stringify(module.push(module.i32.const(0)))); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/reloc.js b/test/binaryen.js/reloc.js index 9666d17fd..e9fdd6012 100644 --- a/test/binaryen.js/reloc.js +++ b/test/binaryen.js/reloc.js @@ -2,24 +2,28 @@ function assert(x) { if (!x) throw 'error!'; } -var module = new Binaryen.Module(); +function test() { + var module = new Binaryen.Module(); -// memory with offset + // memory with offset -module.addGlobalImport("memory_base", "env", "memory_base", Binaryen.i32, false); -module.setMemory(1, -1, null, [ - { - offset: module.global.get("memory_base", Binaryen.i32), - data: "data data".split('').map(function(x) { return x.charCodeAt(0) }) - } -]); + module.addGlobalImport("memory_base", "env", "memory_base", Binaryen.i32, false); + module.setMemory(1, -1, null, [ + { + offset: module.global.get("memory_base", Binaryen.i32), + data: "data data".split('').map(function(x) { return x.charCodeAt(0) }) + } + ]); -// table with offset + // table with offset -var func = module.addFunction("func", Binaryen.none, Binaryen.none, [], module.nop()); + var func = module.addFunction("func", Binaryen.none, Binaryen.none, [], module.nop()); -module.addGlobalImport("table_base", "env", "table_base", Binaryen.i32, false); -module.setFunctionTable(1, -1, [ "func", "func" ], module.global.get("table_base", Binaryen.i32)); + module.addGlobalImport("table_base", "env", "table_base", Binaryen.i32, false); + module.setFunctionTable(1, -1, [ "func", "func" ], module.global.get("table_base", Binaryen.i32)); -assert(module.validate()); -console.log(module.emitText()); + assert(module.validate()); + console.log(module.emitText()); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/sieve.js b/test/binaryen.js/sieve.js index b2c278cbd..ef7c6cca8 100644 --- a/test/binaryen.js/sieve.js +++ b/test/binaryen.js/sieve.js @@ -1,75 +1,79 @@ -// Create a module to work on -var module = new Binaryen.Module(); +function test() { + // Create a module to work on + var module = new Binaryen.Module(); -// Set a memory of initially one page, maximum 100 pages -module.setMemory(1, 100); + // Set a memory of initially one page, maximum 100 pages + module.setMemory(1, 100); -var body = module.block( - null, - [ - // if the current memory size is too small, grow it - module.if( - module.i32.lt_u( - module.i32.mul( - module.memory.size(), - module.i32.const(65536) + var body = module.block( + null, + [ + // if the current memory size is too small, grow it + module.if( + module.i32.lt_u( + module.i32.mul( + module.memory.size(), + module.i32.const(65536) + ), + module.local.get(0, Binaryen.i32) ), - module.local.get(0, Binaryen.i32) - ), - module.drop( - module.memory.grow( - module.i32.sub( - module.i32.div_u( - module.i32.add( - module.local.get(0, Binaryen.i32), - module.i32.const(65535) + module.drop( + module.memory.grow( + module.i32.sub( + module.i32.div_u( + module.i32.add( + module.local.get(0, Binaryen.i32), + module.i32.const(65535) + ), + module.i32.const(65536) ), - module.i32.const(65536) - ), - module.memory.size() + module.memory.size() + ) ) ) - ) - ), - // first, clear memory - module.local.set(1, module.i32.const(0)), - module.loop('clear', module.block(null, [ - module.i32.store8(0, 1, - module.local.get(1, Binaryen.i32), - module.i32.const(0) ), - module.local.set(1, module.i32.add( - module.local.get(1, Binaryen.i32), - module.i32.const(1) - )), - module.br_if('clear', module.i32.eq( - module.local.get(1, Binaryen.i32), - module.local.get(0, Binaryen.i32) - )) - ])), - // perform the sieve TODO - // calculate how many primes there are - module.return(module.local.get(0, Binaryen.i32)) - ], - Binaryen.none -); + // first, clear memory + module.local.set(1, module.i32.const(0)), + module.loop('clear', module.block(null, [ + module.i32.store8(0, 1, + module.local.get(1, Binaryen.i32), + module.i32.const(0) + ), + module.local.set(1, module.i32.add( + module.local.get(1, Binaryen.i32), + module.i32.const(1) + )), + module.br_if('clear', module.i32.eq( + module.local.get(1, Binaryen.i32), + module.local.get(0, Binaryen.i32) + )) + ])), + // perform the sieve TODO + // calculate how many primes there are + module.return(module.local.get(0, Binaryen.i32)) + ], + Binaryen.none + ); + + // Create the add function + // Note: no additional local variables (that's the []) + module.addFunction('sieve', Binaryen.i32, Binaryen.i32, [Binaryen.i32], body); -// Create the add function -// Note: no additional local variables (that's the []) -module.addFunction('sieve', Binaryen.i32, Binaryen.i32, [Binaryen.i32], body); + // Export the function, so we can call it later (for simplicity we + // export it as the same name as it has internally) + module.addFunctionExport('sieve', 'sieve'); -// Export the function, so we can call it later (for simplicity we -// export it as the same name as it has internally) -module.addFunctionExport('sieve', 'sieve'); + if (!module.validate()) throw 'did not validate :('; -if (!module.validate()) throw 'did not validate :('; + // Print out the text + console.log(module.emitText()); -// Print out the text -console.log(module.emitText()); + // Optimize the module! This removes the 'return', since the + // output of the add can just fall through + module.optimize(); -// Optimize the module! This removes the 'return', since the -// output of the add can just fall through -module.optimize(); + // Print out the optimized module's text + console.log('optimized:\n\n' + module.emitText()); +} -// Print out the optimized module's text -console.log('optimized:\n\n' + module.emitText()); +Binaryen.ready.then(test); diff --git a/test/binaryen.js/simd.js b/test/binaryen.js/simd.js index a6055a267..68785f9d7 100644 --- a/test/binaryen.js/simd.js +++ b/test/binaryen.js/simd.js @@ -1,5 +1,9 @@ -var module = new Binaryen.Module(); +function test() { + var module = new Binaryen.Module(); -var expr = module.v128.const([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0]); -var info = Binaryen.getExpressionInfo(expr); -console.log("v128.const i8x16 0x" + info.value.map(b => b.toString(16)).join(" 0x")); + var expr = module.v128.const([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0]); + var info = Binaryen.getExpressionInfo(expr); + console.log("v128.const i8x16 0x" + info.value.map(b => b.toString(16)).join(" 0x")); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/sourcemap.js b/test/binaryen.js/sourcemap.js index 04f188e23..f8deecf3f 100644 --- a/test/binaryen.js/sourcemap.js +++ b/test/binaryen.js/sourcemap.js @@ -2,41 +2,45 @@ function assert(x) { if (!x) throw 'error!'; } -var module = new Binaryen.Module(); - -var fileIndex = module.addDebugInfoFileName("module.c"); - -console.log(module.getDebugInfoFileName(fileIndex)); -console.log(); - -var expr = module.i32.const(1); -var body = module.block("", [ - expr -], Binaryen.i32); - -var func = module.addFunction("main", Binaryen.none, Binaryen.i32, [], body); - -module.setDebugLocation(func, expr, fileIndex, 1, 2); -module.setDebugLocation(func, body, fileIndex, 0, 3); - -var output = module.emitBinary("module.wasm.map"); -assert(module.validate()); - -function dumpBinary(buffer) { - var hex = [], o, b, h; - for (var i = 0; i < buffer.length; ++i) { - o = i.toString(16); - while (o.length < 3) o = "0" + o; - if ((i & 15) === 0) hex.push((i ? "\n" : "") + o + ":"); - if ((b = buffer[i]) >= 0x21 && b <= 0x7e) - h = String.fromCharCode(b) + ' '; - else if ((h = b.toString(16)).length < 2) - h = "0" + h; - hex.push(h); +function test() { + var module = new Binaryen.Module(); + + var fileIndex = module.addDebugInfoFileName("module.c"); + + console.log(module.getDebugInfoFileName(fileIndex)); + console.log(); + + var expr = module.i32.const(1); + var body = module.block("", [ + expr + ], Binaryen.i32); + + var func = module.addFunction("main", Binaryen.none, Binaryen.i32, [], body); + + module.setDebugLocation(func, expr, fileIndex, 1, 2); + module.setDebugLocation(func, body, fileIndex, 0, 3); + + var output = module.emitBinary("module.wasm.map"); + assert(module.validate()); + + function dumpBinary(buffer) { + var hex = [], o, b, h; + for (var i = 0; i < buffer.length; ++i) { + o = i.toString(16); + while (o.length < 3) o = "0" + o; + if ((i & 15) === 0) hex.push((i ? "\n" : "") + o + ":"); + if ((b = buffer[i]) >= 0x21 && b <= 0x7e) + h = String.fromCharCode(b) + ' '; + else if ((h = b.toString(16)).length < 2) + h = "0" + h; + hex.push(h); + } + console.log(hex.join(" ")); } - console.log(hex.join(" ")); + + dumpBinary(output.binary); + console.log(); + console.log(output.sourceMap); } -dumpBinary(output.binary); -console.log(); -console.log(output.sourceMap); +Binaryen.ready.then(test); diff --git a/test/binaryen.js/stackir.js b/test/binaryen.js/stackir.js index 929fbaa0e..324a99abe 100644 --- a/test/binaryen.js/stackir.js +++ b/test/binaryen.js/stackir.js @@ -20,13 +20,18 @@ var wast = ` ) ) `; -console.log("=== input wast ===" + wast); -var module = Binaryen.parseText(wast); -assert(module.validate()); +function test() { + console.log("=== input wast ===" + wast); -console.log("=== default ==="); -console.log(module.emitStackIR()); + var module = Binaryen.parseText(wast); + assert(module.validate()); -console.log("=== optimize ==="); // should omit the second block -console.log(module.emitStackIR(true)); + console.log("=== default ==="); + console.log(module.emitStackIR()); + + console.log("=== optimize ==="); // should omit the second block + console.log(module.emitStackIR(true)); +} + +Binaryen.ready.then(test); diff --git a/test/binaryen.js/validation_errors.js b/test/binaryen.js/validation_errors.js index 16bc6f433..1251d37e6 100644 --- a/test/binaryen.js/validation_errors.js +++ b/test/binaryen.js/validation_errors.js @@ -1,25 +1,29 @@ -(function() { - var mod = new Binaryen.Module(); - var func = mod.addFunction("test", Binaryen.none, Binaryen.none, [], - mod.block("", [ - mod.drop( - mod.global.get("missing", Binaryen.i32) - ) - ]) - ); - mod.addExport("test", func); - console.log(mod.validate()) -})(); +function test() { + (function() { + var mod = new Binaryen.Module(); + var func = mod.addFunction("test", Binaryen.none, Binaryen.none, [], + mod.block("", [ + mod.drop( + mod.global.get("missing", Binaryen.i32) + ) + ]) + ); + mod.addExport("test", func); + console.log(mod.validate()) + })(); -(function() { - var mod = new Binaryen.Module(); - var func = mod.addFunction("test", Binaryen.none, Binaryen.none, [], - mod.block("", [ - mod.drop( - mod.local.get(0, Binaryen.i32) - ) - ]) - ); - mod.addFunctionExport("test", "test", func); - console.log(mod.validate()) -})(); + (function() { + var mod = new Binaryen.Module(); + var func = mod.addFunction("test", Binaryen.none, Binaryen.none, [], + mod.block("", [ + mod.drop( + mod.local.get(0, Binaryen.i32) + ) + ]) + ); + mod.addFunctionExport("test", "test", func); + console.log(mod.validate()) + })(); +} + +Binaryen.ready.then(test); diff --git a/travis-emcc-tests.sh b/travis-emcc-tests.sh index 5dde9d0ed..41a25a205 100755 --- a/travis-emcc-tests.sh +++ b/travis-emcc-tests.sh @@ -1,9 +1,15 @@ #!/usr/bin/env bash set -e -echo "travis-test build" +echo "travis-test build:wasm" emconfigure cmake -DCMAKE_BUILD_TYPE=Release +emmake make -j4 binaryen_wasm +echo "travis-test test:wasm" +python3 -m scripts.test.binaryenjs +echo "travis-test done:wasm" + +echo "travis-test build:js" emmake make -j4 binaryen_js -echo "travis-test test" +echo "travis-test test:js" python3 -m scripts.test.binaryenjs -echo "travis-test yay!" +echo "travis-test done:js" |