JSI is a JavaScript interpreter written in Rust that supports bytecode similar to quickjs.
use jsi::JSI;
let mut jsi = JSI::new();
// Run with ast
let result = jsi.run(String::from("\
let a = [];
let i = 0;
outer:
while(i < 3) {
i ++;
let j = 0;
while(j < 5) {
j ++;
if (j == 1 && i == 1) {
continue outer
}
if (j == 4) break
if (j == 3 && i == 2) {
break outer
}
a.push(i * j);
}
}
a.join(':')")
).unwrap();
assert_eq!(result , Value::String(String::from("2:4")));
// Run with bytecode
let result2 = jsi.run_with_bytecode(String::from("\
let a = '123';
let b = 'abc';
a + b
")).unwrap();
assert_eq!(result , Value::String(String::from("123abc")));use jsi::JSI;
let mut jsi = JSI::new();
let result = jsi.run(String::from("\
let resolveCache;
let resolveCache2;
let promise = new Promise(resolve => {
resolveCache = resolve;
});
let res = promise.then(value1 => {
return new Promise(resolve => {
resolveCache2 = resolve;
}).then(value2 => {
return value1 + 'x:' + value2;
});
}).then(value3 => {
return value3 + '5:';
});
resolveCache('a:');
resolveCache2('b:');
res
")).unwrap();
if let Value::Promise(promise_rc) = &result {
let promise_mut = promise_rc.borrow_mut();
let state = promise_mut.get_inner_property_value(String::from("[[PromiseState]]")).unwrap();
assert_eq!(state , Value::String(String::from("fulfilled")));
let value = promise_mut.get_inner_property_value(String::from("[[PromiseFulfilledValue]]")).unwrap();
assert_eq!(value , Value::String(String::from("a:x:b:5:")));
}- git submodule
git submodule update --init --recursive - test262
RUST_MIN_STACK=8388608 cargo test --package jsi --test test262_test -- test_all_262 --exact --nocapture
- Ecma Standard: https://tc39.es/ecma262/multipage/#sec-intro
- Test262: https://github.com/tc39/test262
MIT
by echosoar