Create / destroy

// Caller-owned buffer (not freed on destroy)
char mem[8192];
JsEngine* js = JsEngine::create(mem, sizeof(mem));
JsEngine::destroy(js);

// Engine-owned buffer (freed on destroy)
JsEngine* js2 = JsEngine::create(8192);
JsEngine::destroy(js2);

Evaluate JavaScript

JsValue v = js->eval("1+2+3");
const char* s = js->str(v); // "6" or error message

callGlobal — faster than eval call strings

js->eval("function add(a,b){return a+b;};");

JsValue argv[2] = {JsEngine::makeNumber(10), JsEngine::makeNumber(32)};
JsValue r1 = js->callGlobal("add", argv, 2); // 42

JsValue r2 = js->callGlobal("add", {
  JsEngine::makeNumber(1),
  JsEngine::makeNumber(2),
}); // 3

Error cases: bad call, 'name' not found, 'name' not callable.

Inject native C++ functions

JsValue add(JsEngine* js, JsValue* args, int nargs) {
  if (!JsEngine::chkArgs(args, nargs, "dd"))
    return js->makeError("type mismatch");
  return JsEngine::makeNumber(
      JsEngine::getNumber(args[0]) + JsEngine::getNumber(args[1]));
}

js->set(js->glob(), "add", JsEngine::makeFunction(add));

chkArgs format characters

CharType
dnumber
bboolean
sstring
jany JS value

Value factories

Runtime controls

js->setGcThreshold(1024);
js->setMaxCss(5000);
js->gc();

size_t total=0, lwm=0, css=0;
js->stats(&total, &lwm, &css);

Object property access

JsValue obj = js->makeObject();
js->set(obj, "answer", JsEngine::makeNumber(42));
js->set(js->glob(), "cfg", obj);
Bind optional modules (console, Math, etc.) at runtime — see Extensions.