some wasm experiments
This commit is contained in:
parent
ef75871a93
commit
09a1cb95ec
@ -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 */
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
||||
|
@ -5,19 +5,23 @@
|
||||
<body>
|
||||
<input type="button" value="Test" onclick="do_test();" />
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var g_WebWorker = new Worker("moo.worker.js");
|
||||
if (typeof(WebAssembly) === 'undefined')
|
||||
{
|
||||
alert ('No web assebly support in this browser');
|
||||
}
|
||||
|
||||
//if (typeof(WebAssembly) === 'undefined')
|
||||
//{
|
||||
// alert ('No web assebly support in this browser');
|
||||
//}
|
||||
g_WebWorker.onerror = function (evt) {
|
||||
console.log(`Error from Web Worker: ${evt.message}`);
|
||||
};
|
||||
|
||||
g_WebWorker.onerror = function (evt) { console.log(`Error from Web Worker: ${evt.message}`); }
|
||||
g_WebWorker.onmessage = function (evt) { console.log(`Message from the Web Worker:\n\n ${evt.data}`); }
|
||||
g_WebWorker.onmessage = function (evt) {
|
||||
console.log(`Message from the Web Worker:\n\n ${evt.data}`);
|
||||
};
|
||||
|
||||
function do_test() {
|
||||
function do_test()
|
||||
{
|
||||
g_WebWorker.postMessage({ "cmd": "test-moo", "data": "nothing as of now.." });
|
||||
}
|
||||
</script>
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user