Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ jobs:
- name: Check FFI backend boundaries
run: npm run check:ffi-boundaries

- name: Test React Native package
run: npm run test:react-native

- name: Download V8
run: ./scripts/download_v8.sh

Expand Down
1 change: 0 additions & 1 deletion NativeScript/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,6 @@ if(ENABLE_JS_RUNTIME)
runtime/apple/modules/worker/MessageV8.cpp
runtime/apple/modules/worker/ConcurrentQueue.cpp
runtime/apple/modules/worker/WorkerImpl.mm
runtime/apple/modules/worker/WorkerImpl.mm
runtime/apple/modules/module/ModuleInternal.cpp
runtime/apple/modules/node/Node.cpp
runtime/apple/modules/node/FS.cpp
Expand Down
23 changes: 12 additions & 11 deletions NativeScript/ffi/jni/napi/callbackhandlers/CallbackHandlers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ bool CallbackHandlers::RegisterInstance(napi_env env, napi_value jsObject,

int javaObjectID = objectManager->GenerateNewObjectID();

objectManager->Link(jsObject, javaObjectID, nullptr);
objectManager->Link(jsObject, javaObjectID);

// resolve constructor
auto mi = MethodCache::ResolveConstructorSignature(env, argWrapper, fullClassName,
Expand Down Expand Up @@ -514,8 +514,6 @@ bool CallbackHandlers::RegisterInstance(napi_env env, napi_value jsObject,
success = !localInstance.IsNull();

if (success) {
jclass instanceClass = jEnv.FindClass(fullClassName);
objectManager->SetJavaClass(jsObject, instanceClass);
*jsThisProxy = objectManager->GetOrCreateProxy(javaObjectID, jsObject);
} else {
DEBUG_WRITE_FORCE("RegisterInstance failed with null new instance class: %s",
Expand Down Expand Up @@ -1245,18 +1243,21 @@ void CallbackHandlers::InitChoreographer() {
}

void CallbackHandlers::RemoveEnvEntries(napi_env env) {
for (auto &item: cache_) {
if (item.second.env_ == env) {
cache_.erase(item.first);
for (auto it = cache_.begin(); it != cache_.end();) {
if (it->second.env_ == env) {
it = cache_.erase(it);
} else {
++it;
}
}

for (auto &item: frameCallbackCache_) {
if (item.second.env == env) {
frameCallbackCache_.erase(item.first);
for (auto it = frameCallbackCache_.begin(); it != frameCallbackCache_.end();) {
if (it->second.env == env) {
it = frameCallbackCache_.erase(it);
} else {
++it;
}
}

}

// Worker
Expand Down Expand Up @@ -1922,4 +1923,4 @@ jmethodID CallbackHandlers::WORKER_SCOPE_CLOSE_METHOD_ID = nullptr;
NumericCasts CallbackHandlers::castFunctions;

ArrayElementAccessor CallbackHandlers::arrayElementAccessor;
FieldAccessor CallbackHandlers::fieldAccessor;
FieldAccessor CallbackHandlers::fieldAccessor;
50 changes: 19 additions & 31 deletions NativeScript/ffi/jni/napi/conversion/JsArgConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ bool JsArgConverter::ConvertArg(napi_env env, napi_value arg, int index) {
success = !obj.IsNull();

if (success) {
SetConvertedObject(index, obj.Move(), obj.IsGlobal());
SetConvertedObject(index, obj.Move(), false);
} else {
if (napi_util::is_number_object(env, arg)) {
success = ConvertJavaScriptNumber(env, arg, index, true);
Expand Down Expand Up @@ -717,16 +717,9 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
&offset);
}

jobject directBuffer;

if (isDataView || isTypedArray) {
directBuffer =jEnv.NewDirectByteBuffer(static_cast<uint8_t *>(data) + offset, length);
} else {
directBuffer = jEnv.NewDirectByteBuffer(static_cast<uint8_t *>(data), length);
}


auto directBufferClazz = jEnv.GetObjectClass(directBuffer);
JniLocalRef directBuffer(jEnv.NewDirectByteBuffer(
static_cast<uint8_t *>(data) + (isDataView || isTypedArray ? offset : 0), length));
JniLocalRef directBufferClazz(jEnv.GetObjectClass(directBuffer));

auto byteOrderId = BYTE_ORDER_METHOD_ID;

Expand All @@ -736,7 +729,7 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
BYTE_ORDER_METHOD_ID = byteOrderId;
}

auto byteOrderClazz = jEnv.FindClass("java/nio/ByteOrder");
JniLocalRef byteOrderClazz(jEnv.FindClass("java/nio/ByteOrder"));

auto byteOrderEnumId = BYTE_ORDER_ENUM_ID;

Expand All @@ -747,14 +740,13 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
BYTE_ORDER_ENUM_ID = byteOrderEnumId;
}

auto nativeByteOrder = jEnv.CallStaticObjectMethodA(byteOrderClazz,
byteOrderEnumId,
nullptr);

directBuffer = jEnv.CallObjectMethod(directBuffer, byteOrderId,
nativeByteOrder);
JniLocalRef nativeByteOrder(jEnv.CallStaticObjectMethodA(byteOrderClazz,
byteOrderEnumId,
nullptr));
directBuffer = JniLocalRef(jEnv.CallObjectMethod(directBuffer, byteOrderId,
static_cast<jobject>(nativeByteOrder)));

jobject buffer;
JniLocalRef buffer;

if (bufferCastType == BufferCastType::Short) {
auto id = AS_SHORT_BUFFER;
Expand All @@ -764,7 +756,7 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
AS_SHORT_BUFFER = id;
}

buffer = jEnv.CallObjectMethodA(directBuffer, id, nullptr);
buffer = JniLocalRef(jEnv.CallObjectMethodA(directBuffer, id, nullptr));
} else if (bufferCastType == BufferCastType::Int) {
auto id = AS_INT_BUFFER;

Expand All @@ -773,7 +765,7 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
"()Ljava/nio/IntBuffer;");
AS_INT_BUFFER = id;
}
buffer = jEnv.CallObjectMethodA(directBuffer, id, nullptr);
buffer = JniLocalRef(jEnv.CallObjectMethodA(directBuffer, id, nullptr));
} else if (bufferCastType == BufferCastType::Long) {
auto id = AS_LONG_BUFFER;

Expand All @@ -783,7 +775,7 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
AS_LONG_BUFFER = id;
}

buffer = jEnv.CallObjectMethodA(directBuffer, id, nullptr);
buffer = JniLocalRef(jEnv.CallObjectMethodA(directBuffer, id, nullptr));
} else if (bufferCastType == BufferCastType::Float) {

auto id = AS_FLOAT_BUFFER;
Expand All @@ -793,7 +785,7 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
AS_FLOAT_BUFFER = id;
}

buffer = jEnv.CallObjectMethodA(directBuffer, id, nullptr);
buffer = JniLocalRef(jEnv.CallObjectMethodA(directBuffer, id, nullptr));
} else if (bufferCastType == BufferCastType::Double) {

auto id = AS_DOUBLE_BUFFER;
Expand All @@ -802,21 +794,17 @@ JniLocalRef JsArgConverter::GetByteBuffer(napi_env env, napi_value object, bool
"()Ljava/nio/DoubleBuffer;");
AS_DOUBLE_BUFFER = id;
}
buffer = jEnv.CallObjectMethodA(directBuffer, id, nullptr);
buffer = JniLocalRef(jEnv.CallObjectMethodA(directBuffer, id, nullptr));
} else {
buffer = directBuffer;
buffer = std::move(directBuffer);
}

buffer = jEnv.NewGlobalRef(buffer);

ObjectManager *objectManager = Runtime::GetRuntime(env)->GetObjectManager();

int id = objectManager->GetOrCreateObjectId(buffer);
auto clazz = jEnv.GetObjectClass(buffer);

ObjectManager::MarkObject(env, object);

objectManager->Link(object, id, clazz);
objectManager->Link(object, id);

return objectManager->GetJavaObjectByJsObject(object);
}
Expand All @@ -827,4 +815,4 @@ jmethodID JsArgConverter::AS_SHORT_BUFFER = nullptr;
jmethodID JsArgConverter::AS_LONG_BUFFER = nullptr;
jmethodID JsArgConverter::AS_FLOAT_BUFFER = nullptr;
jmethodID JsArgConverter::AS_INT_BUFFER = nullptr;
jmethodID JsArgConverter::AS_DOUBLE_BUFFER = nullptr;
jmethodID JsArgConverter::AS_DOUBLE_BUFFER = nullptr;
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ bool JsArgToArrayConverter::ConvertArg(napi_env env, napi_value arg, int index)

success = !obj.IsNull();
if (success) {
SetConvertedObject(jEnv, index, obj.Move(), obj.IsGlobal());
SetConvertedObject(jEnv, index, obj.Move(), false);
} else {
if (napi_util::is_number_object(env, arg)) {
napi_value numValue = napi_util::valueOf(env, arg);
Expand Down Expand Up @@ -426,4 +426,4 @@ JsArgToArrayConverter::~JsArgToArrayConverter() {
}
}

jclass JsArgToArrayConverter::JAVA_LANG_OBJECT_CLASS = nullptr;
jclass JsArgToArrayConverter::JAVA_LANG_OBJECT_CLASS = nullptr;
45 changes: 39 additions & 6 deletions NativeScript/ffi/jni/napi/exceptions/NativeScriptException.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,50 @@ using namespace std;
using namespace tns;

NativeScriptException::NativeScriptException(JEnv& env)
: m_javascriptException(nullptr) {
: m_javascriptException(nullptr), m_napiEnv(nullptr) {
jthrowable thrw = env.ExceptionOccurred();
m_javaException = JniLocalRef(thrw);
env.ExceptionClear();
DEBUG_WRITE("%s, %s", GetExceptionMessage(env, m_javaException).c_str(), GetExceptionStackTrace(env, m_javaException).c_str());
}

NativeScriptException::NativeScriptException(const string& message)
: m_javascriptException(nullptr), m_javaException(JniLocalRef()), m_message(message) {
: m_javascriptException(nullptr), m_napiEnv(nullptr), m_javaException(JniLocalRef()), m_message(message) {

DEBUG_WRITE("%s", m_message.c_str());
}

NativeScriptException::NativeScriptException(const string& message, const string& stackTrace)
: m_javascriptException(nullptr), m_javaException(JniLocalRef()), m_message(message), m_stackTrace(stackTrace) {
: m_javascriptException(nullptr), m_napiEnv(nullptr), m_javaException(JniLocalRef()), m_message(message), m_stackTrace(stackTrace) {

DEBUG_WRITE("%s, %s ", m_message.c_str(), m_stackTrace.c_str());
}

NativeScriptException::NativeScriptException(napi_env env, napi_value error, const string& message)
: m_javaException(JniLocalRef()) {
m_javascriptException = nullptr;
: m_javascriptException(nullptr), m_napiEnv(env), m_javaException(JniLocalRef()) {
napi_create_reference(env, error, 1, &m_javascriptException);
m_message = GetErrorMessage(env, error, message);
m_stackTrace = GetErrorStackTrace(env, error);
m_fullMessage = GetFullMessage(env, error, m_message);
}

NativeScriptException::NativeScriptException(NativeScriptException&& other) noexcept
: m_javascriptException(other.m_javascriptException),
m_napiEnv(other.m_napiEnv),
m_javaException(std::move(other.m_javaException)),
m_message(std::move(other.m_message)),
m_stackTrace(std::move(other.m_stackTrace)),
m_fullMessage(std::move(other.m_fullMessage)) {
other.m_javascriptException = nullptr;
other.m_napiEnv = nullptr;
}

NativeScriptException::~NativeScriptException() {
if (m_javascriptException != nullptr && m_napiEnv != nullptr) {
napi_delete_reference(m_napiEnv, m_javascriptException);
}
}

void NativeScriptException::ReThrowToNapi(napi_env env) {
napi_value errObj;

Expand All @@ -61,6 +77,12 @@ void NativeScriptException::ReThrowToNapi(napi_env env) {

napi_throw(env, errObj);

if (m_javascriptException != nullptr) {
napi_delete_reference(env, m_javascriptException);
m_javascriptException = nullptr;
m_napiEnv = nullptr;
}

// JSLeave
}

Expand All @@ -69,6 +91,7 @@ void NativeScriptException::ReThrowToJava(napi_env env) {
NapiScope scope(env);
}
jthrowable ex = nullptr;
bool transferredJavascriptException = false;
JEnv jEnv;

if (!m_javaException.IsNull()) {
Expand Down Expand Up @@ -98,6 +121,7 @@ void NativeScriptException::ReThrowToJava(napi_env env) {

if (ex == nullptr) {
ex = static_cast<jthrowable>(jEnv.NewObject(NATIVESCRIPTEXCEPTION_CLASS, NATIVESCRIPTEXCEPTION_JSVALUE_CTOR_ID, (jstring)msg, (jstring)stackTrace, reinterpret_cast<jlong>(m_javascriptException)));
transferredJavascriptException = true;
} else {
auto objectManager = Runtime::GetRuntime(env)->GetObjectManager();
auto excClassName = objectManager->GetClassName(ex);
Expand All @@ -114,6 +138,14 @@ void NativeScriptException::ReThrowToJava(napi_env env) {
ex = static_cast<jthrowable>(jEnv.NewObject(NATIVESCRIPTEXCEPTION_CLASS, NATIVESCRIPTEXCEPTION_JSVALUE_CTOR_ID, (jstring)msg, (jstring)nullptr, (jlong)0));
}
jEnv.Throw(ex);

if (m_javascriptException != nullptr) {
if (!transferredJavascriptException && m_napiEnv != nullptr) {
napi_delete_reference(m_napiEnv, m_javascriptException);
}
m_javascriptException = nullptr;
m_napiEnv = nullptr;
}
}

void NativeScriptException::Init() {
Expand Down Expand Up @@ -183,6 +215,7 @@ napi_value NativeScriptException::WrapJavaToJsException(napi_env env) {
auto pv = reinterpret_cast<napi_ref>(addr);
napi_get_reference_value(env, pv, &errObj);
napi_delete_reference(env, pv);
jenv.SetLongField(m_javaException, fieldID, 0);
} else {
errObj = GetJavaExceptionFromEnv(env, m_javaException, jenv);
}
Expand Down Expand Up @@ -369,4 +402,4 @@ jclass NativeScriptException::NATIVESCRIPTEXCEPTION_CLASS = nullptr;
jmethodID NativeScriptException::NATIVESCRIPTEXCEPTION_JSVALUE_CTOR_ID = nullptr;
jmethodID NativeScriptException::NATIVESCRIPTEXCEPTION_THROWABLE_CTOR_ID = nullptr;
jmethodID NativeScriptException::NATIVESCRIPTEXCEPTION_GET_MESSAGE_METHOD_ID = nullptr;
jmethodID NativeScriptException::NATIVESCRIPTEXCEPTION_GET_STACK_TRACE_AS_STRING_METHOD_ID = nullptr;
jmethodID NativeScriptException::NATIVESCRIPTEXCEPTION_GET_STACK_TRACE_AS_STRING_METHOD_ID = nullptr;
8 changes: 7 additions & 1 deletion NativeScript/ffi/jni/napi/exceptions/NativeScriptException.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ class NativeScriptException {
*/
NativeScriptException(napi_env env, napi_value error, const std::string& message = "");

NativeScriptException(const NativeScriptException&) = delete;
NativeScriptException& operator=(const NativeScriptException&) = delete;
NativeScriptException(NativeScriptException&& other) noexcept;
~NativeScriptException();

void ReThrowToNapi(napi_env env);
void ReThrowToJava(napi_env env);

Expand Down Expand Up @@ -86,6 +91,7 @@ class NativeScriptException {
std::string GetFullMessage(napi_env env, napi_value error, const std::string& jsExceptionMessage);

napi_ref m_javascriptException;
napi_env m_napiEnv;
JniLocalRef m_javaException;
std::string m_message;
std::string m_stackTrace;
Expand All @@ -103,4 +109,4 @@ class NativeScriptException {
};
}

#endif /* NATIVESCRIPTEXCEPTION_H_ */
#endif /* NATIVESCRIPTEXCEPTION_H_ */
Loading
Loading