Skip to content

JSE介绍与集成指南

wuzhun.wz edited this page Jun 12, 2018 · 1 revision

JSE介绍

__名词解释: __

  • JSE: JavaScript Engine的缩写简称

JSE 工作原理

    JSE运行在主任务(main task)中,以单任务方式__顺序解析执行__,事件通知或回调必须在主任务中调用,即C call JavaScript不能多任务中并行调用,只能在主任务中串行调用。

  • 顺序解析执行 以下面sample为例,JSE在执行到var c = add(1,2)时会出错,因为add这个函数在JSE的符号表中找不到(在addon中也找不到该函数,非本地扩展函数)。
var c = add(1,2);
function add(a,b)
{
    return a+b;
}

正确写法如下 JSE在执行到function add(a,b)时把该函数的内容记录在符号表中,执行至var c = add(1,2)时会从符号表中找add函数,找到之后再解析执行add函数,并把返回值赋给c

function add(a,b)
{
    return a+b;
}
var c = add(1,2);
  • 符号表(be_jse_symbol_t) JSE解析JavaScript时把所有JS对象都会记录保持在符号表中,每个符号表的两中重要标识,一个是refs引用计数,与作用域有关,还有一个是locks锁定计数,一般与函数使用有关,在函数中使用时+1,不再使用时-1,只有当引用计数和锁定计数都为0时,回收该对象,释放该符号表。符号表的基本类型主要有: NULL字符串数组对象函数,整数浮点数对象名称本地扩展对象举例var a=5说明, 在符号表数组中,a是对象名称,5一个整数类型的值。

JSE 定制

  • 符号表容量定制 当前支持两种方法:
  1. 固定大小
#undef RESIZABLE_JSE_SYMBOL_TABLE
#define BE_JSE_SYMBOL_TABLE_SIZE 1000
  1. 可动态分配 (推荐) 初始大小BE_JSE_SYMBOL_TABLE_BLOCK_SIZE个符号表,不够时再分配BE_JSE_SYMBOL_TABLE_BLOCK_SIZE
#define RESIZABLE_JSE_SYMBOL_TABLE		    1
#define BE_JSE_SYMBOL_TABLE_BLOCK_SIZE		512
#define BE_JSE_SYMBOL_TABLE_BLOCK_SHIFT		9

特殊限制

  • 声明变量/常量时,表达式命名最长为63个字符 限制地方: #define MAX_TOKEN_LENGTH 64 若token值超过63,词法分析会出错,会打印"Token name is too long"

但是String类型的值的长度并没有限制 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef567899 该常量长度大于64, 不正确 name0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef567899 该变量长度大于64, 不正确

var count = 1;
var name = '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef567899'
var name0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef567899 = 1
  • 定义函数原型时,函数参数名称不要超过8byte 限制地方: #define BE_JSE_SYMBOL_DATA_STRING_LEN 8 函数参数名称 parama , 长度为6Byte, 正常 parambbbb 长度大于8, 不正确
function add(parama, parambbbb)
{
    ...
}

API 介绍

gravity_main.c中使用, 头文件: be_jse_api.h

void bone_engine_init();

BoneEngine初始化

void bone_engine_native_function_register(BE_JSE_FUNCTION_EXECUTE_CB extension);

注册自定义JS对象Native扩展方法及属性的实现函数 必须在bone_engine_init之后调用 建议: 使用该函数扩展全局函数

void be_jse_module_load(const char* moduleName, BE_JSE_FUNCTION_EXECUTE_CB extension);

用户注册自定义JS对象__moduleName__, 注册该对象的扩展方法及属性的实现函数__extension__ 必须在bone_engine_init之后调用 建议: 使用该函数扩展自定义对象

void bone_engine_start(const char* js);

运行JS程序(完整语法块),可以多次调用

void bone_engine_restart(const char* js);

重新运行JS程序, JSE的符号表会重新初始化

void bone_engine_exit();

退出BoneEngine

be_jse_executor_ctx_t* bone_engine_get_executor();

获取当前BoneEngine引擎的executor对象

void bone_engine_loadmodule_register(BE_JSE_LOAD_MODULE_CB func_cb);

注册load module函数,用于js requre操作,根据模块名返回模块内容

Clone this wiki locally