diff --git a/interfaces/inner_api/cjffi/ark_interop/ark_interop_global.cpp b/interfaces/inner_api/cjffi/ark_interop/ark_interop_global.cpp index 49ea15a0fd5e7fb68b780889f1ff14ab8cd2eb16..6c46563b30e246338ef93bd68335649572328d27 100644 --- a/interfaces/inner_api/cjffi/ark_interop/ark_interop_global.cpp +++ b/interfaces/inner_api/cjffi/ark_interop/ark_interop_global.cpp @@ -140,7 +140,7 @@ void GlobalManager::AsyncDisposer(ARKTS_Env env, void* data) { GlobalManager* current = nullptr; managersMutex_.Acquire(); - auto exist = managers_.find(reinterpret_cast(data)); + auto exist = managers_.find(reinterpret_cast(env)); if (exist != managers_.end()) { current = exist->second; } @@ -227,6 +227,7 @@ GlobalManager::~GlobalManager() for (auto p : toDispose) { auto global = reinterpret_cast(p); global->SetDisposed(); + delete global; } } } @@ -235,9 +236,10 @@ GlobalManager::~GlobalManager() ARKTS_Global ARKTS_CreateGlobal(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_P(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_P(ARKTS_IsHeapObject(value), "value is not heap object"); - auto vm = P_CAST(env, EcmaVM*); auto handle = BIT_CAST(value, Local); auto result = new ARKTS_Global_(vm, handle); @@ -292,7 +294,7 @@ ARKTS_Value ARKTS_GlobalToValue(ARKTS_Env env, ARKTS_Global global) ARKTS_ASSERT_P(env, "env is null"); ARKTS_ASSERT_P(global, "global is null"); - auto value = reinterpret_cast(global) & GLOBAL_MASK; + auto value = static_cast(reinterpret_cast(global)) & GLOBAL_MASK; value = value | GLOBAL_TAG; auto dValue = static_cast(value); return ARKTS_CreateF64(dValue); diff --git a/interfaces/inner_api/cjffi/ark_interop/ark_interop_napi.cpp b/interfaces/inner_api/cjffi/ark_interop/ark_interop_napi.cpp index 749b816773a7e68196c9c594dc1ede94adac70fb..2f2eca1c91fe8b251fb36cbb8cf5b70709870176 100644 --- a/interfaces/inner_api/cjffi/ark_interop/ark_interop_napi.cpp +++ b/interfaces/inner_api/cjffi/ark_interop/ark_interop_napi.cpp @@ -84,6 +84,7 @@ void ARKTSInner_ReportNativeError(const char* format, ...) std::string ARKTSInner_FormatJSError(ARKTS_Env env, ARKTS_Value jsError) { auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); auto exception = BIT_CAST(jsError, Local); if (exception->IsString(vm)) { auto errorInsJs = *P_CAST(jsError, StringRef*); @@ -179,9 +180,10 @@ bool ARKTS_StrictEqual(ARKTS_Env env, ARKTS_Value a, ARKTS_Value b) return aValue == bValue; } default: + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); auto aTag = *P_CAST(a, JSValueRef*); auto bTag = BIT_CAST(b, Local); - auto vm = P_CAST(env, EcmaVM*); return aTag.IsStrictEquals(vm, bTag); } } @@ -310,6 +312,7 @@ ARKTS_Value ARKTS_CreateClass(ARKTS_Env env, int64_t lambdaId, ARKTS_Value base) new LambdaData {env, lambdaId}, true); if (ARKTS_IsClass(env, base)) { + panda::JsiFastNativeScope fastNativeScope(vm); auto baseClass = BIT_CAST(base, Local); result->Inherit(vm, baseClass); } @@ -330,10 +333,11 @@ ARKTS_Value ARKTS_GetPrototype(ARKTS_Env env, ARKTS_Value value) bool ARKTS_InstanceOf(ARKTS_Env env, ARKTS_Value object, ARKTS_Value clazz) { ARKTS_ASSERT_F(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_F(ARKTS_IsHeapObject(object), "object is not heap object"); ARKTS_ASSERT_F(ARKTS_IsClass(env, clazz), "clazz is not a class"); - auto vm = P_CAST(env, EcmaVM*); auto targetObject = BIT_CAST(object, Local); auto targetClass = BIT_CAST(clazz, Local); @@ -443,9 +447,10 @@ uint32_t ARKTS_GetArrayLength(ARKTS_Env env, ARKTS_Value array) void ARKTS_SetElement(ARKTS_Env env, ARKTS_Value array, uint32_t index, ARKTS_Value value) { ARKTS_ASSERT_V(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_V(ARKTS_IsArray(env, array), "array is not array"); - auto vm = P_CAST(env, EcmaVM*); auto jArr = BIT_CAST(array, Local); ArrayRef::SetValueAt(vm, jArr, index, ARKTS_ToHandle(value)); @@ -455,8 +460,9 @@ void ARKTS_SetElement(ARKTS_Env env, ARKTS_Value array, uint32_t index, ARKTS_Va ARKTS_Value ARKTS_GetElement(ARKTS_Env env, ARKTS_Value array, uint32_t index) { ARKTS_ASSERT_P(env, "env is null"); - ARKTS_ASSERT_P(ARKTS_IsArray(env, array), "array is not array"); auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); + ARKTS_ASSERT_P(ARKTS_IsArray(env, array), "array is not array"); auto arr = BIT_CAST(array, Local); ARKTS_ASSERT_P(arr->Length(vm) > index, "out of index"); @@ -502,11 +508,12 @@ ARKTS_Value ARKTS_CreateArrayBufferWithData(ARKTS_Env env, void* buffer, int32_t bool ARKTS_IsArrayBuffer(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_F(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); auto tag = BIT_CAST(value, JSValueRef); if (!tag.IsHeapObject()) { return false; } - auto vm = P_CAST(env, EcmaVM*); auto handle = BIT_CAST(value, Local); return handle->IsArrayBuffer(vm) || handle->IsTypedArray(vm) || handle->IsDataView(vm); } @@ -514,9 +521,10 @@ bool ARKTS_IsArrayBuffer(ARKTS_Env env, ARKTS_Value value) int32_t ARKTS_GetArrayBufferLength(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_I(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_I(ARKTS_IsArrayBuffer(env, value), "value is not arrayBuffer"); - auto vm = P_CAST(env, EcmaVM*); auto handle = BIT_CAST(value, Local); if (handle->IsArrayBuffer(vm)) { return BIT_CAST(value, Local)->ByteLength(vm); @@ -532,9 +540,10 @@ int32_t ARKTS_GetArrayBufferLength(ARKTS_Env env, ARKTS_Value value) void* ARKTS_GetArrayBufferRawPtr(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_P(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_P(ARKTS_IsArrayBuffer(env, value), "value is not arrayBuffer"); - auto vm = P_CAST(env, EcmaVM*); auto handle = BIT_CAST(value, Local); if (handle->IsArrayBuffer(vm)) { return BIT_CAST(value, Local)->GetBuffer(vm); @@ -655,10 +664,11 @@ bool ARKTS_IsPromise(ARKTS_Env env, ARKTS_Value value) ARKTS_Value ARKTS_PromiseThen(ARKTS_Env env, ARKTS_Value prom, ARKTS_Value onFulfilled, ARKTS_Value onRejected) { ARKTS_ASSERT_P(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_P(ARKTS_IsPromise(env, prom), "arg is not a JSPromise"); ARKTS_ASSERT_P(ARKTS_IsCallable(env, onFulfilled), "onFulfilled is not callable"); - auto vm = P_CAST(env, EcmaVM*); auto promise = *BIT_CAST(prom, PromiseRef*); auto onFulfilledFunc = BIT_CAST(onFulfilled, Local); Local result; @@ -675,10 +685,11 @@ ARKTS_Value ARKTS_PromiseThen(ARKTS_Env env, ARKTS_Value prom, ARKTS_Value onFul ARKTS_Value ARKTS_PromiseCatch(ARKTS_Env env, ARKTS_Value prom, ARKTS_Value callback) { ARKTS_ASSERT_P(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_P(ARKTS_IsPromise(env, prom), "arg is not a JSPromise"); ARKTS_ASSERT_P(ARKTS_IsCallable(env, callback), "callback is not callable"); - auto vm = P_CAST(env, EcmaVM*); auto promise = BIT_CAST(prom, PromiseRef*); auto callbackFunc = BIT_CAST(callback, Local); auto result = promise->Catch(vm, callbackFunc); @@ -733,6 +744,7 @@ void ARKTS_Throw(ARKTS_Env env, ARKTS_Value error) { ARKTS_ASSERT_V(env, "env is null"); auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); if (JSNApi::HasPendingException(vm)) { LOGE("ARKTS_Throw failed, vm has uncaught exception"); diff --git a/interfaces/inner_api/cjffi/ark_interop/ark_interop_object.cpp b/interfaces/inner_api/cjffi/ark_interop/ark_interop_object.cpp index 50c3e9a10ad7622f1f58552a130f5f67d2be794d..a92afe708272301e81504634a4ce47ff98c81360 100644 --- a/interfaces/inner_api/cjffi/ark_interop/ark_interop_object.cpp +++ b/interfaces/inner_api/cjffi/ark_interop/ark_interop_object.cpp @@ -53,22 +53,24 @@ bool ARKTS_IsHeapObject(ARKTS_Value value) bool ARKTS_IsObject(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_F(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); auto v = BIT_CAST(value, JSValueRef); if (!v.IsHeapObject()) { return false; } auto handle = BIT_CAST(value, Local); - auto vm = P_CAST(env, EcmaVM*); return handle->IsObject(vm); } bool ARKTS_HasOwnProperty(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey) { ARKTS_ASSERT_F(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_F(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_F(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); return object->Has(vm, key); @@ -77,9 +79,10 @@ bool ARKTS_HasOwnProperty(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey) ARKTS_Value ARKTS_EnumOwnProperties(ARKTS_Env env, ARKTS_Value jobj) { ARKTS_ASSERT_P(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_P(ARKTS_IsHeapObject(jobj), "object is not heap object"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto result = object->GetOwnEnumerablePropertyNames(vm); @@ -90,10 +93,11 @@ void ARKTS_DefineOwnProperty(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, ARKTS_PropertyFlag attrs) { ARKTS_ASSERT_V(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_V(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_V(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); auto value = ARKTS_ToHandle(jvalue); @@ -106,10 +110,11 @@ bool ARKTS_DefineOwnPropertyV2(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey ARKTS_PropertyFlag attrs) { ARKTS_ASSERT_F(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_F(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_F(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); auto value = ARKTS_ToHandle(jvalue); @@ -123,6 +128,9 @@ bool ARKTS_DefineOwnPropertyV2(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey void ARKTS_DefineAccessors(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, ARKTS_Accessor accessor) { ARKTS_ASSERT_V(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); + ARKTS_ASSERT_V(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_V(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); @@ -132,7 +140,6 @@ void ARKTS_DefineAccessors(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, AR ARKTS_ASSERT_V(accessor.getter == undefined || ARKTS_IsCallable(env, accessor.getter), "getter not callable"); ARKTS_ASSERT_V(accessor.getter != undefined || accessor.setter != undefined, "getter and setter is undefined"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); auto handledUndef = ARKTS_ToHandle(undefined); @@ -149,6 +156,9 @@ void ARKTS_DefineAccessors(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, AR bool ARKTS_DefineAccessorsV2(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, ARKTS_Accessor accessor) { ARKTS_ASSERT_F(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); + ARKTS_ASSERT_F(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_F(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); @@ -158,7 +168,6 @@ bool ARKTS_DefineAccessorsV2(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, ARKTS_ASSERT_F(accessor.getter == undefined || ARKTS_IsCallable(env, accessor.getter), "getter not callable"); ARKTS_ASSERT_F(accessor.getter != undefined || accessor.setter != undefined, "getter and setter is undefined"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); auto handledUndef = ARKTS_ToHandle(undefined); @@ -177,10 +186,11 @@ bool ARKTS_DefineAccessorsV2(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, void ARKTS_SetProperty(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, ARKTS_Value jvalue) { ARKTS_ASSERT_V(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_V(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_V(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); auto value = ARKTS_ToHandle(jvalue); @@ -191,10 +201,11 @@ void ARKTS_SetProperty(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey, ARKTS_ ARKTS_Value ARKTS_GetProperty(ARKTS_Env env, ARKTS_Value jobj, ARKTS_Value jkey) { ARKTS_ASSERT_P(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_P(ARKTS_IsHeapObject(jobj), "object is not heap object"); ARKTS_ASSERT_P(ARKTSInner_IsJSKey(env, jkey), "key is not number、string or symbol"); - auto vm = P_CAST(env, EcmaVM*); auto object = BIT_CAST(jobj, Local); auto key = ARKTS_ToHandle(jkey); diff --git a/interfaces/inner_api/cjffi/ark_interop/ark_interop_string.cpp b/interfaces/inner_api/cjffi/ark_interop/ark_interop_string.cpp index ed36898e72196027984facdefd46a8dde57cd629..ca02417a7c045324d513f8c46647b0ad4dcdc9f7 100644 --- a/interfaces/inner_api/cjffi/ark_interop/ark_interop_string.cpp +++ b/interfaces/inner_api/cjffi/ark_interop/ark_interop_string.cpp @@ -44,28 +44,31 @@ ARKTS_Value ARKTS_CreateUtf8(ARKTS_Env env, const char* value, int32_t size) bool ARKTS_IsString(ARKTS_Env env, ARKTS_Value value) { + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); auto v = BIT_CAST(value, JSValueRef); if (v.IsHole() || !v.IsHeapObject()) { return false; } v = *P_CAST(value, JSValueRef*); - auto vm = P_CAST(env, EcmaVM*); return v.IsString(vm); } int32_t ARKTS_GetValueUtf8Size(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_I(env, "env is null"); - ARKTS_ASSERT_I(ARKTS_IsString(env, value), "not a string"); auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); + ARKTS_ASSERT_I(ARKTS_IsString(env, value), "not a string"); auto v = BIT_CAST(value, Local); return v->Utf8Length(vm, true); } int32_t ARKTS_GetValueUtf8(ARKTS_Env env, ARKTS_Value value, int32_t capacity, char* buffer) { - ARKTS_ASSERT_I(ARKTS_IsString(env, value), "not a string"); auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); + ARKTS_ASSERT_I(ARKTS_IsString(env, value), "not a string"); auto v = BIT_CAST(value, Local); return v->WriteUtf8(vm, buffer, capacity, true); } @@ -73,8 +76,9 @@ int32_t ARKTS_GetValueUtf8(ARKTS_Env env, ARKTS_Value value, int32_t capacity, c const char* ARKTS_GetValueCString(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT_I(env, "env is null"); - ARKTS_ASSERT_I(ARKTS_IsString(env, value), "not a string"); auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); + ARKTS_ASSERT_I(ARKTS_IsString(env, value), "not a string"); auto v = BIT_CAST(value, Local); auto size = v->Utf8Length(vm, true); if (size <= 0) { @@ -97,9 +101,10 @@ void ARKTS_FreeCString(const char* src) ARKTS_StringInfo ARKTS_GetStringInfo(ARKTS_Env env, ARKTS_Value value) { ARKTS_ASSERT(env, "env is null", {}); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT(ARKTS_IsString(env, value), "not a string", {}); - auto vm = P_CAST(env, EcmaVM*); auto string = BIT_CAST(value, Local); auto isCompressed = string->IsCompressed(vm); @@ -111,10 +116,11 @@ ARKTS_StringInfo ARKTS_GetStringInfo(ARKTS_Env env, ARKTS_Value value) void ARKTS_StringCopy(ARKTS_Env env, ARKTS_Value value, void* dst, uint32_t length) { ARKTS_ASSERT_V(env, "env is null"); + auto vm = P_CAST(env, EcmaVM*); + panda::JsiFastNativeScope fastNativeScope(vm); ARKTS_ASSERT_V(ARKTS_IsString(env, value), "not a string"); ARKTS_ASSERT_V(dst, "dst is null"); - auto vm = P_CAST(env, EcmaVM*); auto string = BIT_CAST(value, Local); if (string->IsCompressed(vm)) { string->WriteLatin1(vm, reinterpret_cast(dst), length);