mJS: 保密的JavaScript引擎
概述
mJS是为有限资源的microcontroller而设计的。主要设计目标是:占用体积小,简单的C/C++互操作。
任何有效的mJS代码始终是一个有效的ES6代码。
任何有效的ES6代码不必是一个有效的mJS代码。
回调
假定你有一个C函数接受一个回调和用户数据void*指针,这应该在签名中被标记为用户数据:
void timer(int seconds, void (*callback)(int, void *), void *user_data);
下面是如何创建一个mJS回调-注意userdata的用法:
let timer = ffi('void timer(int, void (*)(int, userdata), userdata)');
let callback = function(time, data) {
print('Time now: ', time, ' called: ', data.num_calls, ' times');
};
let callback_data = { num_calls: 0 };
timer(1, callback, callback_data);Complete embedding example
Complete embedding example
我们将C函数foo导入到JS环境中并且从JS中调用它。
#include "strings.h"
#include "mjs.h"
void foo(int x) {
printf("Hello %d!
", x);
}
void *my_dlsym(void *handle, const char *name) {
if (strcmp(name, "foo") == 0) return foo;
return NULL;
}
int main(void) {
struct mjs *mjs = mjs_create();
mjs_set_ffi_resolver(mjs, my_dlsym);
mjs_exec(mjs, "let f = ffi('void foo(int)'); f(1234)", NULL);
return 0;
}
编译&运行:
$ cc main.c mjs.c -o /tmp/x && /tmp/x
Hello 1234!