是一个枚举数据类型,表示JSVM-API接口返回的状态信息。
每当调用一个JSVM-API函数,都会返回该值,表示操作成功与否的相关信息。
typedef enum {
JSVM_OK,
JSVM_INVALID_ARG,
JSVM_OBJECT_EXPECTED,
JSVM_STRING_EXPECTED,
JSVM_NAME_EXPECTED,
JSVM_FUNCTION_EXPECTED,
JSVM_NUMBER_EXPECTED,
JSVM_BOOL_EXPECTED,
JSVM_ARRAY_EXPECTED,
JSVM_GENERIC_FAILURE,
JSVM_PENDING_EXCEPTION,
JSVM_CENCELLED,
JSVM_ESCAPE_CALLED_TWICE,
JSVM_HANDLE_SCOPE_MISMATCH,
JSVM_CALLBACK_SCOPE_MISMATCH,
JSVM_QUEUE_FULL,
JSVM_CLOSING,
JSVM_BIGINT_EXPECTED,
JSVM_DATA_EXPECTED,
JSVM_CALLBACK_SCOPE_MISMATCH,
JSVM_DETACHABLE_ARRAYBUFFER_EXPECTED,
JSVM_WOULD_DEADLOCK, /* unused */
JSVM_NO_EXTERNAL_BUFFERS_ALLOWED,
JSVM_CANNOT_RUN_JS
} JSVM_Status;
一个结构体,在调用函数不成功时存储了较为详细的错误信息。
typedef struct {
const char* errorMessage;
void* engineReserved;
uint32_t engineErrorCode;
JSVM_Status errorCode;
} JSVM_ExtendedErrorInfo;
在C++代码中,表示一个JavaScript值。
用于表示JSVM-API执行时的上下文,Native侧函数入参,并传递给函数中的JSVM-API接口。
退出Native侧插件时,JSVM_Env将失效,该事件通过回调传递给OH_JSVM_SetInstanceData。
禁止缓存JSVM_Env,禁止在不同Worker中传递JSVM_Env。
在不同线程间共享JSVM_Env时,要保证在线程切换时在前一个线程中关闭env scope并在新的线程中打开新的env scope,以保证threadlocal变量的线程隔离。
JSVM_Value的类型。包含了ECMAScript语言规范中定义的类型,其中JSVM_EXTERNAL表示外部数据类型。
typedef enum {
JSVM_UNDEFINED,
JSVM_NULL,
JSVM_BOOLEAN,
JSVM_NUMBER,
JSVM_STRING,
JSVM_SYMBOL,
JSVM_OBJECT,
JSVM_FUNCTION,
JSVM_EXTERNAL,
JSVM_BIGINT,
} JSVM_ValueType;
TypedArray的基本二进制标量数据类型。
typedef enum {
JSVM_INT8_ARRAY,
JSVM_UINT8_ARRAY,
JSVM_UINT8_CLAMPED_ARRAY,
JSVM_INT16_ARRAY,
JAVM_UINT16_ARRAY,
JSVM_INT32_ARRAY,
JSVM_UINT32_ARRAY,
JSVM_FLOAT32_ARRAY,
JSVM_FLOAT64_ARRAY,
JSVM_BIGINT64_ARRAY,
JSVM_BIGUINT64_ARRAY,
} JSVM_TypedarrayType;
正则表达式标志位。
typedef enum {
JSVM_REGEXP_NONE = 0,
JSVM_REGEXP_GLOBAL = 1 << 0,
JSVM_REGEXP_IGNORE_CASE = 1 << 1,
JSVM_REGEXP_MULTILINE = 1 << 2,
JSVM_REGEXP_STICKY = 1 << 3,
JSVM_REGEXP_UNICODE = 1 << 4,
JSVM_REGEXP_DOT_ALL = 1 << 5,
JSVM_REGEXP_LINEAR = 1 << 6,
JSVM_REGEXP_HAS_INDICES = 1 << 7,
JSVM_REGEXP_UNICODE_SETS = 1 << 8,
} JSVM_RegExpFlags;
JSVM-API包含以下内存管理类型:
JSVM_HandleScope
JSVM_HandleScope数据类型是用来管理JavaScript对象的生命周期的。它允许JavaScript对象在一定范围内保持活动状态,以便在JavaScript代码中使用。在创建JSVM_HandleScope时,所有在该范围内创建的JavaScript对象都会保持活动状态,直到结束。这样可以避免在JavaScript代码中使用已经被释放的对象,从而提高代码的可靠性和性能
JSVM_EscapableHandleScope
由OH_JSVM_OpenEscapableHandleScope接口创建,由OH_JSVM_CloseEscapableHandleScope接口关闭。
表示一种特殊类型的句柄范围,用于将在JSVM_EscapableHandleScope范围内创建的值返回给父scope。
用于OH_JSVM_EscapeHandle接口,将JSVM_EscapableHandleScope提升到JavaScript对象,以便在外部作用域使用。
JSVM_Ref
指向JSVM_Value,允许用户管理JavaScript值的生命周期。
JSVM_TypeTag
该结构体定义了一个包含两个无符号64位整数的类型标签,用于标识一个JSVM-API值的类型信息。
typedef struct {
uint64_t lower;
uint64_t upper;
} JSVM_TypeTag;
存储了两个无符号64位整数的128位值,用它来标记JavaScript对象,确保它们属于某种类型。
比OH_JSVM_Instanceof更强的类型检查,如果对象的原型被操纵,OH_JSVM_Instanceof可能会报告误报。
JSVM_TypeTag 在与 OH_JSVM_Wrap 结合使用时最有用,因为它确保从包装对象检索的指针可以安全地转换为与先前应用于JavaScript对象的类型标记相对应的Native类型。
JSVM-API包含以下回调类型:
JSVM_CallbackInfo
表示用户定义的Native函数,暴露给JavaScript,即JS侧调用的接口;一般不在此Callback中创建Handle或者CallbackScope。
JSVM_CallbackStruct
用户提供的Native函数的回调函数指针和数据,JSVM_CallbackStruct将通过JSVM-API暴露给JavaScript。
typedef struct {
JSVM_Value(*callback)(JSVM_Env env, JSVM_CallbackInfo info);
void* data;
} JSVM_CallbackStruct;
JSVM_Callback
表示用户定义的Native函数,暴露给JavaScript,即JS侧调用的接口;除非在对象生命周期管理中有特殊要求,一般不在此callback中创建handle或者callback scope。
基本用法如下:
typedef JSVM_CallbackStruct* JSVM_Callback;
JSVM_Finalize
函数指针,用于传入OH_JSVM_SetInstanceData、OH_JSVM_CreateExternal、OH_JSVM_Wrap等接口。JSVM_Finalize在对象被回收时会被调用,可用于在JavaScript对象被垃圾回收时释放Native对象。
写法如下:
typedef void (JSVM_Finalize)(JSVM_Env env, void finalizeData, void* finalizeHint);
JSVM_PropertyHandlerConfigurationStruct
当执行对象的getter、setter、deleter和enumerator作时,对应的的回调将会触发。
typedef struct {
JSVM_Value(JSVM_CDECL* genericNamedPropertyGetterCallback)(JSVM_Env env,
JSVM_Value name,
JSVM_Value thisArg,
JSVM_Value namedPropertyData);
JSVM_Value(JSVM_CDECL* genericNamedPropertySetterCallback)(JSVM_Env env,
JSVM_Value name,
JSVM_Value property,
JSVM_Value thisArg,
JSVM_Value namedPropertyData);
JSVM_Value(JSVM_CDECL* genericNamedPropertyDeleterCallback)(JSVM_Env env,
JSVM_Value name,
JSVM_Value thisArg,
JSVM_Value namedPropertyData);
JSVM_Value(JSVM_CDECL* genericNamedPropertyEnumeratorCallback)(JSVM_Env env,
JSVM_Value thisArg,
JSVM_Value namedPropertyData);
JSVM_Value(JSVM_CDECL* genericIndexedPropertyGetterCallback)(JSVM_Env env,
JSVM_Value index,
JSVM_Value thisArg,
JSVM_Value indexedPropertyData);
JSVM_Value(JSVM_CDECL* genericIndexedPropertySetterCallback)(JSVM_Env env,
JSVM_Value index,
JSVM_Value property,
JSVM_Value thisArg,
JSVM_Value indexedPropertyData);
JSVM_Value(JSVM_CDECL* genericIndexedPropertyDeleterCallback)(JSVM_Env env,
JSVM_Value index,
JSVM_Value thisArg,
JSVM_Value indexedPropertyData);
JSVM_Value(JSVM_CDECL* genericIndexedPropertyEnumeratorCallback)(JSVM_Env env,
JSVM_Value thisArg,
JSVM_Value indexedPropertyData);
JSVM_Value namedPropertyData;
JSVM_Value indexedPropertyData;
} JSVM_PropertyHandlerConfigurationStruct;
JSVM_PropertyHandlerCfg
包含属性监听回调的结构的指针类型。
基本用法如下:
typedef JSVM_PropertyHandlerConfigurationStruct* JSVM_PropertyHandlerCfg;