Skip to content
/ jsi Public

JSI is a JavaScript interpreter written in Rust that supports bytecode similar to quickjs. JSI 是一个 JavaScript 解释执行引擎,使用 Rust 编写无任何依赖,同时支持字节码执行。

Notifications You must be signed in to change notification settings

echosoar/jsi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

53 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JSI

JSI is a JavaScript interpreter written in Rust that supports bytecode similar to quickjs.

test262 passed

test262 total


Usage

Basic

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")));
Promise support
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:")));
}

Development

  • git submodule git submodule update --init --recursive
  • test262 RUST_MIN_STACK=8388608 cargo test --package jsi --test test262_test -- test_all_262 --exact --nocapture

Refs

License

MIT


by echosoar

About

JSI is a JavaScript interpreter written in Rust that supports bytecode similar to quickjs. JSI 是一个 JavaScript 解释执行引擎,使用 Rust 编写无任何依赖,同时支持字节码执行。

Topics

Resources

Stars

Watchers

Forks

Languages