diff --git a/moo/lib/bigint.c b/moo/lib/bigint.c index 36ea52e..45c192d 100644 --- a/moo/lib/bigint.c +++ b/moo/lib/bigint.c @@ -476,7 +476,7 @@ int moo_inttoooi (moo_t* moo, moo_oop_t x, moo_ooi_t* i) /* do nothing. required macros are defined in moo.h */ -#elif (MOO_SIZEOF_UINTMAX_T == MOO_SIZEOF_OOW_T * 2) +#elif (MOO_SIZEOF_UINTMAX_T == MOO_SIZEOF_OOW_T * 2) || (MOO_SIZEOF_UINTMAX_T == MOO_SIZEOF_OOW_T * 4) static MOO_INLINE int bigint_to_uintmax_noseterr (moo_t* moo, moo_oop_t num, moo_uintmax_t* w) { MOO_ASSERT (moo, MOO_OOP_IS_POINTER(num)); @@ -492,9 +492,25 @@ static MOO_INLINE int bigint_to_uintmax_noseterr (moo_t* moo, moo_oop_t num, moo goto done; case 2: - *w = ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 0) << MOO_LIW_BITS) | MOO_OBJ_GET_WORD_VAL(num, 1); + *w = ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 0) << MOO_LIW_BITS) | + ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 1)); goto done; + #if (MOO_SIZEOF_UINTMAX_T >= MOO_SIZEOF_OOW_T * 4) + case 3: + *w = ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 0) << (MOO_LIW_BITS * 2)) | + ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 1) << (MOO_LIW_BITS * 1)) | + ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 2)) + goto done; + + case 4: + *w = ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 0) << (MOO_LIW_BITS * 3)) | + ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 1) << (MOO_LIW_BITS * 2)) | + ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 2) << (MOO_LIW_BITS * 1)) | + ((moo_uintmax_t)MOO_OBJ_GET_WORD_VAL(num, 3)) + goto done; + #endif + default: return 0; /* not convertable */ } @@ -504,16 +520,39 @@ static MOO_INLINE int bigint_to_uintmax_noseterr (moo_t* moo, moo_oop_t num, moo switch (MOO_OBJ_GET_SIZE(num)) { case 2: - *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS) | MOO_OBJ_GET_HALFWORD_VAL(num, 1); + *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1)); goto done; case 4: *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 3) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 2) | ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 1) | - MOO_OBJ_GET_HALFWORD_VAL(num, 3); + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3)); goto done; + #if (MOO_SIZEOF_UINTMAX_T >= MOO_SIZEOF_OOW_T * 4) + case 6: + *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 5) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 4) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 3) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << MOO_LIW_BITS * 2) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << MOO_LIW_BITS * 1) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5)); + goto done; + + case 8: + *w = ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 0) << MOO_LIW_BITS * 7) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 1) << MOO_LIW_BITS * 6) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 2) << MOO_LIW_BITS * 5) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 3) << MOO_LIW_BITS * 4) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 4) << MOO_LIW_BITS * 3) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 5) << MOO_LIW_BITS * 2) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 6) << MOO_LIW_BITS * 1) | + ((moo_uintmax_t)MOO_OBJ_GET_HALFWORD_VAL(num, 7)); + goto done; + #endif + default: return 0; /* not convertable */ } diff --git a/moo/lib/moo-std.h b/moo/lib/moo-std.h index caad809..cb4ff03 100644 --- a/moo/lib/moo-std.h +++ b/moo/lib/moo-std.h @@ -115,8 +115,26 @@ MOO_EXPORT int moo_compilestd( const moo_iostd_t* in, moo_oow_t count ); + +MOO_EXPORT int moo_compilefileb ( + moo_t* moo, + const moo_bch_t* path +); + +MOO_EXPORT int moo_compilefileu ( + moo_t* moo, + const moo_uch_t* path +); + #endif +MOO_EXPORT int moo_invokestdb ( + moo_t* moo, + const moo_bch_t* objname, + const moo_bch_t* mthname +); + + MOO_EXPORT void moo_rcvtickstd ( moo_t* moo, int v diff --git a/moo/lib/std.c b/moo/lib/std.c index 68b5537..ff36907 100644 --- a/moo/lib/std.c +++ b/moo/lib/std.c @@ -4241,8 +4241,61 @@ int moo_compilestd (moo_t* moo, const moo_iostd_t* in, moo_oow_t count) return 0; } + +int moo_compilefileb (moo_t* moo, const moo_bch_t* path) +{ + moo_iostd_t in; + + MOO_MEMSET (&in, 0, MOO_SIZEOF(in)); + in.type = MOO_IOSTD_FILEB; + in.u.fileb.path = path; + + return moo_compilestd(moo, &in, 1); +} + +int moo_compilefileu (moo_t* moo, const moo_uch_t* path) +{ + moo_iostd_t in; + + MOO_MEMSET (&in, 0, MOO_SIZEOF(in)); + in.type = MOO_IOSTD_FILEU; + in.u.fileu.path = path; + + return moo_compilestd(moo, &in, 1); +} + #endif +int moo_invokestdb (moo_t* moo, const moo_bch_t* objname, const moo_bch_t* mthname) +{ +#if defined(MOO_OOCH_IS_UCH) + int n = -1; + moo_oocs_t o, m; + + o.ptr = moo_dupbtooocstr(moo, objname, &o.len); + m.ptr = moo_dupbtooocstr(moo, mthname, &m.len); + if (!o.ptr || !m.ptr) goto done; + + n = moo_invoke(moo, &o, &m); + +done: + if (m.ptr) moo_freemem (moo, m.ptr); + if (o.ptr) moo_freemem (moo, o.ptr); + + return n; +#else + moo_oocs_t o, m; + + o.ptr = objname; + o.len = moo_count_bcstr(objname); + + m.ptr = objname; + m.len = moo_count_bcstr(objname); + + return moo_invoke(moo, &o, &m); +#endif +} + void moo_rcvtickstd (moo_t* moo, int v) { xtn_t* xtn = GET_XTN(moo); diff --git a/moo/wasm/emcc.txt b/moo/wasm/emcc.txt index 5573d47..3f57bdc 100644 --- a/moo/wasm/emcc.txt +++ b/moo/wasm/emcc.txt @@ -6,16 +6,33 @@ Temporary notes on how to build libmoo to web assembly with emscripten. #### How to Build mkdir -p bld/emcc cd blc/emcc + +## run configure and make under emconfigure and emmake respectively emconfigure ../../configure --prefix=${HOME}/xxx-emcc --disable-shared --enable-dynamic-module --disable-mod-x11 --disable-mod-con --disable-mod-sck CFLAGS="-Wall -O2 -g" emmake make + +## convert the library to web assembly - the command produces libmoo.js and libmoo.wasm ##emcc lib/.libs/libmoo.a -s WASM=1 -s EXPORT_ALL=1 -s LINKABLE=1 -o libmoo.js #if you have defined MOO_EXPORT as EMSCRIPTEN_KEEPALIVE, the following will do ##emcc lib/.libs/libmoo.a -s WASM=1 -s -s LINKABLE=1 -o libmoo.js - ###emcc lib/.libs/libmoo.a lib/.libs/libmoox.a -s WASM=1 -s -s LINKABLE=1 -o libmoo.js - emcc lib/.libs/libmoo.a lib/.libs/libmoox.a -s WASM=1 -s -s LINKABLE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" -o libmoo.js + ###emcc lib/.libs/libmoo.a lib/.libs/libmoox.a -s WASM=1 -s LINKABLE=1 -o libmoo.js + +## -s ALLOW_MEMORY_GROWTH=1 +emcc lib/.libs/libmoo.a lib/.libs/libmoox.a -s WASM=1 -s LINKABLE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" -o libmoo.js --embed-file ../../kernel/ + ### --embed-file, if given a directory, includes all files under the directory. + ### the result libmoo.js will contain lines like below: + ### Module['FS_createDataFile']('/kernel', 'Apex.moo', fileData35, true, true, false); + ### var fileData36 = []; + ### fileData36.push.apply(fileData36, [35, 105, ... + ### + +## when i executed the command above, some versions of wasm-ld complained like below +## if the library is compiled with -pthread. +## wasm-ld: error: 'atomics' feature is disallowed by atomic_2835fb94.c.o, so --shared-memory must not be used +## a quick work around was to remove -pthread before building with 'emmake make' ## if defined some javascript functions in moo.cb.js... - emcc -Wall -O2 -g lib/.libs/libmoo.a ws.c -DMOO_HAVE_CFG_H -Ilib -I../../lib -s WASM=1 -s -s LINKABLE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" -o libmoo.js --pre-js moo.cb.js + emcc -Wall -O2 -g lib/.libs/libmoo.a ws.c -DMOO_HAVE_CFG_H -Ilib -I../../lib -s WASM=1 -s LINKABLE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS="['ccall','cwrap']" -o libmoo.js --pre-js moo.cb.js #### moo.worker.js diff --git a/moo/wasm/moo.html b/moo/wasm/moo.html index 1ae1c27..7e5322c 100644 --- a/moo/wasm/moo.html +++ b/moo/wasm/moo.html @@ -5,19 +5,23 @@ - diff --git a/moo/wasm/moo.worker.js b/moo/wasm/moo.worker.js index cf1580b..2b246d5 100644 --- a/moo/wasm/moo.worker.js +++ b/moo/wasm/moo.worker.js @@ -8,9 +8,14 @@ Module.onRuntimeInitialized = function() } const libmoo = { - //open: Module.cwrap('moo_openstd', 'number', ['number', 'number', 'number']), - //close: Module.cwrap('moo_close', '', ['number']), - open_moo: Module.cwrap('open_moo', '', ['']) + open: Module.cwrap('moo_openstd', 'number', ['number', 'number', 'number']), + close: Module.cwrap('moo_close', '', ['number']), + ignite: Module.cwrap('moo_ignite', 'number', ['number', 'number']), + initdbgi: Module.cwrap('moo_initdbgi', 'number', ['number', 'number']), + compilefile: Module.cwrap('moo_compilefileb', 'number', ['number', 'string']), + invoke: Module.cwrap('moo_invokestdb', 'number', ['number', 'string', 'string']) + + }; //console.log ("QQ %O\n", self); @@ -27,11 +32,27 @@ self.addEventListener ('message', function (evt) { if (self.__ready) { - //var moo = libmoo.open(0, null, null); - var moo = libmoo.open_moo(); - self.postMessage ('XXXXXXXXXXXXXXXx - ' + moo); + var moo, tmp; + var msg = ""; + + moo = libmoo.open(0, null, null); + msg = msg.concat("open - " + moo); + + tmp = libmoo.ignite(moo, 5000000); + msg = msg.concat(" ignite - " + tmp); + + tmp = libmoo.initdbgi(moo, 102400); + msg = msg.concat(" initdgbi - " + tmp); + + tmp = libmoo.compilefile(moo, "kernel/test-001.moo"); + msg = msg.concat(" compilefile - " + tmp); + + tmp = libmoo.invoke(moo, "MyObject", "main"); + msg = msg.concat(" invoke - " + tmp); + + self.postMessage (msg); - //libmoo.close (moo); + libmoo.close (moo); } } });