123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138openJs_of_ocamlopenJs_of_ocaml.JsopenJs_of_ocaml.Js.Unsafeletmake_encoder()=new_objglobal##.TextEncoder[||]letencodeencoder(value:string)=meth_callencoder"encode"[|inject(stringvalue)|]letmake_decoder()=new_objglobal##.TextDecoder[||]letdecodedecoderu8a=to_string(meth_calldecoder"decode"[|injectu8a|])(* Uint8Array/Byte utilities *)letu8a_to_bytesu8a=letdecoder=make_decoder()inBytes.of_string(decodedecoderu8a)letbytes_to_u8abyts=letencoder=make_encoder()inencodeencoder(Bytes.to_stringbyts)letstring_to_u8astr=letencoder=make_encoder()inencodeencoderstrtypetletcreate()=new_objglobal##.binaryen##.Module[||]letdisposewasm_mod=ignore(meth_callwasm_mod"dispose"[||])(* TODO: Check the unit8Array conversion *)letadd_custom_sectionwasm_modnamecontents=letcontents=string_to_u8acontentsinignore(meth_callwasm_mod"addCustomSection"[|inject(stringname);injectcontents|])letparsetext=meth_callglobal##.binaryen"parseText"[|inject(stringtext)|]letprintwasm_mod=lettext=meth_callwasm_mod"emitText"[||]inprint_string(to_stringtext)letprint_asmjswasm_mod=letasm=meth_callwasm_mod"emitAsmjs"[||]inprint_string(to_stringasm)letvalidatewasm_mod=meth_callwasm_mod"validate"[||]letoptimizewasm_mod=meth_callwasm_mod"optimize"[||]letset_featureswasm_modfeatures=meth_callwasm_mod"setFeatures"[|inject(List.fold_left(lor)0features)|]letget_optimize_level()=meth_callglobal##.binaryen"getOptimizeLevel"[||]letset_optimize_levellevel=meth_callglobal##.binaryen"setOptimizeLevel"[|injectlevel|]letget_shrink_level()=meth_callglobal##.binaryen"getShrinkLevel"[||]letset_shrink_levellevel=meth_callglobal##.binaryen"setShrinkLevel"[|injectlevel|]letget_debug_info()=meth_callglobal##.binaryen"getDebugInfo"[||]letset_debug_infoon=meth_callglobal##.binaryen"setDebugInfo"[|injecton|]letget_low_memory_unused()=meth_callglobal##.binaryen"getLowMemoryUnused"[||]letset_low_memory_unusedon=meth_callglobal##.binaryen"setLowMemoryUnused"[|injecton|]letget_pass_argumentkey=meth_callglobal##.binaryen"getPassArgument"[|inject(stringkey)|]letset_pass_argumentkeyvalue=meth_callglobal##.binaryen"setPassArgument"[|inject(stringkey);inject(stringvalue)|]letget_always_inline_max_size()=meth_callglobal##.binaryen"getAlwaysInlineMaxSize"[||]letset_always_inline_max_sizesize=meth_callglobal##.binaryen"setAlwaysInlineMaxSize"[|injectsize|]letget_flexible_inline_max_size()=meth_callglobal##.binaryen"getFlexibleInlineMaxSize"[||]letset_flexible_inline_max_sizesize=meth_callglobal##.binaryen"setFlexibleInlineMaxSize"[|injectsize|]letget_one_caller_inline_max_size()=meth_callglobal##.binaryen"getOneCallerInlineMaxSize"[||]letset_one_caller_inline_max_sizesize=meth_callglobal##.binaryen"setOneCallerInlineMaxSize"[|injectsize|]letrun_passeswasm_modpasses=meth_callwasm_mod"runPasses"[|inject(array(Array.of_list(List.mapstringpasses)))|]letauto_dropwasm_mod=meth_callwasm_mod"autoDrop"[||](* TODO: This returns the wrong type, need to convert from `Uint8Array` to `bytes` *)letwritewasm_modsourcemap_url=matchsourcemap_urlwith|Someurl->letobj=meth_callwasm_mod"emitBinary"[|injecturl|]inletbinary=getobj"binary"inletsoucemap=getobj"soureMap"in(u8a_to_bytesbinary,Somesoucemap)|None->letbinary=meth_callwasm_mod"emitBinary"[||]in(u8a_to_bytesbinary,None)letwrite_textwasm_mod=lettext=meth_callwasm_mod"emitText"[||]into_stringtext(* TODO: This doesn't handle `bytes` correctly *)letreadbyts=letdata=bytes_to_u8abytsinmeth_callglobal##.binaryen"readBinary"[|injectdata|]letinterpretwasm_mod=meth_callwasm_mod"interpret"[||]letadd_debug_info_filenamewasm_modfilename=meth_callwasm_mod"addDebugInfoFileName"[|inject(stringfilename)|]letget_debug_info_filenamewasm_modindex=meth_callwasm_mod"getDebugInfoFileName"[|injectindex|]