Skip to content

chore: merge main into v8-10.3.22-perf #1750

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"name": "@nativescript/android",
"description": "NativeScript Runtime for Android",
"version": "8.4.0-alpha.6",
"description": "NativeScript for Android using v8",
"version": "8.4.0",
"repository": {
"type": "git",
"url": "https://github.com/NativeScript/android-runtime.git"
"url": "https://github.com/NativeScript/android.git"
},
"files": [
"**/*"
Expand Down
26 changes: 5 additions & 21 deletions test-app/runtime/src/main/cpp/JsArgConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -253,37 +253,25 @@ bool JsArgConverter::ConvertArg(const Local<Value> &arg, int index) {
size_t offset = 0;
size_t length;
uint8_t *data = nullptr;
auto link_with_data = false;
if (jsObject->IsArrayBuffer()) {
auto array = jsObject.As<v8::ArrayBuffer>();
store = array->GetBackingStore();
length = array->ByteLength();
data = static_cast<uint8_t *>(store->Data());
} else if (jsObject->IsArrayBufferView()) {
auto array = jsObject.As<v8::ArrayBufferView>();

if (!array->HasBuffer()) {

length = array->ByteLength();
void *data_ = malloc(length);
array->CopyContents(data_, length);
data = (uint8_t *) data_;
link_with_data = true;
} else {
length = array->ByteLength();
}
offset = array->ByteOffset();
length = array->ByteLength();
store = array->Buffer()->GetBackingStore();
data = static_cast<uint8_t *>(store->Data()) + offset;
bufferCastType = JsArgConverter::GetCastType(array);
} else {
auto array = jsObject.As<v8::TypedArray>();
offset = array->ByteOffset();
store = array->Buffer()->GetBackingStore();
length = array->ByteLength();
bufferCastType = JsArgConverter::GetCastType(array);
}

if (data == nullptr) {
data = static_cast<uint8_t *>(store->Data()) + offset;
bufferCastType = JsArgConverter::GetCastType(array);
}

auto directBuffer = env.NewDirectByteBuffer(
Expand Down Expand Up @@ -342,11 +330,7 @@ bool JsArgConverter::ConvertArg(const Local<Value> &arg, int index) {
int id = objectManager->GetOrCreateObjectId(buffer);
auto clazz = env.GetObjectClass(buffer);

if (link_with_data) {
objectManager->LinkWithExtraData(jsObject, id, clazz, data);
} else {
objectManager->Link(jsObject, id, clazz);
}
objectManager->Link(jsObject, id, clazz);

obj = objectManager->GetJavaObjectByJsObject(jsObject);
}
Expand Down
23 changes: 4 additions & 19 deletions test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,36 +256,25 @@ bool JsArgToArrayConverter::ConvertArg(Local<Context> context, const Local<Value
size_t offset = 0;
size_t length;
uint8_t *data = nullptr;
auto link_with_data = false;
if (jsObj->IsArrayBuffer()) {
auto array = jsObj.As<v8::ArrayBuffer>();
store = array->GetBackingStore();
length = array->ByteLength();
data = static_cast<uint8_t *>(store->Data());
} else if (jsObj->IsArrayBufferView()) {
auto array = jsObj.As<v8::ArrayBufferView>();

if (!array->HasBuffer()) {

length = array->ByteLength();
void *data_ = malloc(length);
array->CopyContents(data_, length);
data = (uint8_t *) data_;
link_with_data = true;
} else {
length = array->ByteLength();
}
offset = array->ByteOffset();
length = array->ByteLength();
store = array->Buffer()->GetBackingStore();
bufferCastType = JsArgConverter::GetCastType(array);
data = static_cast<uint8_t *>(store->Data()) + offset;
} else {
auto array = jsObj.As<v8::TypedArray>();
offset = array->ByteOffset();
store = array->Buffer()->GetBackingStore();
length = array->ByteLength();
bufferCastType = JsArgConverter::GetCastType(array);
}

if (data == nullptr) {
data = static_cast<uint8_t *>(store->Data()) + offset;
}

Expand Down Expand Up @@ -344,11 +333,7 @@ bool JsArgToArrayConverter::ConvertArg(Local<Context> context, const Local<Value

int id = objectManager->GetOrCreateObjectId(buffer);
auto clazz = env.GetObjectClass(buffer);
if (link_with_data) {
objectManager->LinkWithExtraData(jsObj, id, clazz, data);
} else {
objectManager->Link(jsObj, id, clazz);
}
objectManager->Link(jsObj, id, clazz);

obj = objectManager->GetJavaObjectByJsObject(jsObj);
}
Expand Down
22 changes: 16 additions & 6 deletions test-app/runtime/src/main/cpp/MetadataReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,15 @@ MetadataReader::MetadataReader(uint32_t nodesLength, uint8_t* nodeData, uint32_t
m_root = BuildTree();
}

// helper debug function when need to convert a metadata node to its full name
//std::string toFullName(MetadataTreeNode* p) {
// std::string final = p->name;
// while((p = p->parent) && !p->name.empty()) {
// final.insert(0,p->name + ".");
// };
// return final;
//}

MetadataTreeNode* MetadataReader::BuildTree() {
MetadataTreeNodeRawData* rootNodeData = reinterpret_cast<MetadataTreeNodeRawData*>(m_nodeData);

Expand All @@ -43,21 +52,22 @@ MetadataTreeNode* MetadataReader::BuildTree() {
node->children = new vector<MetadataTreeNode*>;
MetadataTreeNodeRawData* childNodeData = rootNodeData + curNodeData->firstChildId;
while (true) {

uint16_t childNodeDataId = childNodeData - rootNodeData;
// node (and its next siblings) already visited, so we don't need to visit it again
if (m_v[childNodeDataId] != emptyNode) {
break;
}

MetadataTreeNode* childNode = new MetadataTreeNode;
childNode->parent = node;
childNode->name = ReadName(childNodeData->offsetName);
childNode->offsetValue = childNodeData->offsetValue;

node->children->push_back(childNode);

uint16_t childNodeDataId = childNodeData - rootNodeData;

m_v[childNodeDataId] = childNode;

if (childNodeDataId == childNodeData->nextSiblingId) {
break;
}

childNodeData = rootNodeData + childNodeData->nextSiblingId;
}
}
Expand Down
86 changes: 1 addition & 85 deletions test-app/runtime/src/main/cpp/ObjectManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,41 +266,6 @@ void ObjectManager::Link(const Local<Object> &object, uint32_t javaObjectID, jcl
m_idToObject.insert(make_pair(javaObjectID, objectHandle));
}

void ObjectManager::LinkWithExtraData(const v8::Local<v8::Object>& object, uint32_t javaObjectID, jclass clazz, void* data) {
if (!IsJsRuntimeObject(object)) {
string errMsg("Trying to link invalid 'this' to a Java object");
throw NativeScriptException(errMsg);
}

auto isolate = m_isolate;

DEBUG_WRITE("Linking js object: %d and java instance id: %d", object->GetIdentityHash(),
javaObjectID);

auto jsInstanceInfo = new JSInstanceInfo(false/*isJavaObjWeak*/, javaObjectID, clazz);

auto objectHandle = new Persistent<Object>(isolate, object);
auto state = new ObjectWeakCallbackState(this, jsInstanceInfo, objectHandle);

// subscribe for JS GC event
if (m_markingMode == JavaScriptMarkingMode::None) {
objectHandle->SetWeak(state, JSObjectFinalizerStatic, WeakCallbackType::kFinalizer);
} else {
objectHandle->SetWeak(state, JSObjectWeakCallbackStatic, WeakCallbackType::kFinalizer);
}

auto jsInfoIdx = static_cast<int>(MetadataNodeKeys::JsInfo);

auto jsInfo = External::New(isolate, jsInstanceInfo);

//link
object->SetInternalField(jsInfoIdx, jsInfo);

V8SetPrivateValue(isolate, object, String::NewFromUtf8(isolate,"object_with_extra_data").ToLocalChecked(), External::New(isolate, data));

m_idToObject.insert(make_pair(javaObjectID, objectHandle));
}

bool ObjectManager::CloneLink(const Local<Object> &src, const Local<Object> &dest) {
auto jsInfo = GetJSInstanceInfo(src);

Expand Down Expand Up @@ -387,55 +352,6 @@ void ObjectManager::JSObjectFinalizer(Isolate *isolate, ObjectWeakCallbackState
}


void ObjectManager::JSObjectFinalizerStaticWithExtraData(const WeakCallbackInfo<ObjectWeakCallbackState> &data) {
ObjectWeakCallbackState *callbackState = data.GetParameter();

ObjectManager *thisPtr = callbackState->thisPtr;

auto isolate = data.GetIsolate();

thisPtr->JSObjectFinalizerWithExtraData(isolate, callbackState);
}

void ObjectManager::JSObjectFinalizerWithExtraData(Isolate *isolate, ObjectWeakCallbackState *callbackState) {
HandleScope handleScope(m_isolate);
Persistent<Object> *po = callbackState->target;
auto jsInstanceInfo = GetJSInstanceInfoFromRuntimeObject(po->Get(m_isolate));

if (jsInstanceInfo == nullptr) {
po->Reset();
delete po;
delete callbackState;
return;
}

auto javaObjectID = jsInstanceInfo->JavaObjectID;
JEnv env;
jboolean isJavaInstanceAlive = env.CallBooleanMethod(m_javaRuntimeObject,
MAKE_INSTANCE_WEAK_AND_CHECK_IF_ALIVE_METHOD_ID,
javaObjectID);
if (isJavaInstanceAlive) {
// If the Java instance is alive, keep the JavaScript instance alive.
po->SetWeak(callbackState, JSObjectFinalizerStatic, WeakCallbackType::kFinalizer);
} else {
// If the Java instance is dead, this JavaScript instance can be let die.
delete jsInstanceInfo;
auto jsInfoIdx = static_cast<int>(MetadataNodeKeys::JsInfo);
po->Get(m_isolate)->SetInternalField(jsInfoIdx, Undefined(m_isolate));
v8::Local<v8::Value> out;
V8GetPrivateValue(isolate, po->Get(m_isolate), String::NewFromUtf8(isolate,"object_with_extra_data").ToLocalChecked(), out);
V8SetPrivateValue(isolate, po->Get(m_isolate), String::NewFromUtf8(isolate,"object_with_extra_data").ToLocalChecked(), Undefined(m_isolate));
if(!out.IsEmpty() && out->IsExternal()) {
auto data = out.As<v8::External>()->Value();
free(data);
}
po->Reset();
m_idToObject.erase(javaObjectID);
delete po;
delete callbackState;
}
}

/*
* When JS GC happens change state of the java counterpart to mirror state of JS object and REVIVE the JS object unconditionally
* "Regular" js objects are pushed into the "regular objects" array
Expand Down Expand Up @@ -466,7 +382,7 @@ void ObjectManager::JSObjectWeakCallback(Isolate *isolate, ObjectWeakCallbackSta

if (hasImplObj) {
if (jsInstanceInfo->IsJavaObjectWeak) {
m_implObjWeak.push_back(PersistentObjectIdPair(po, javaObjectID));
m_implObjWeak.emplace_back(po, javaObjectID);
} else {
m_implObjStrong.insert(make_pair(javaObjectID, po));
jsInstanceInfo->IsJavaObjectWeak = true;
Expand Down
7 changes: 0 additions & 7 deletions test-app/runtime/src/main/cpp/ObjectManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ class ObjectManager {

void Link(const v8::Local<v8::Object>& object, uint32_t javaObjectID, jclass clazz);

void LinkWithExtraData(const v8::Local<v8::Object>& object, uint32_t javaObjectID, jclass clazz, void* data);

void ReleaseNativeCounterpart(v8::Local<v8::Object>& object);

bool CloneLink(const v8::Local<v8::Object>& src, const v8::Local<v8::Object>& dest);
Expand Down Expand Up @@ -167,15 +165,10 @@ class ObjectManager {

static void JSObjectFinalizerStatic(const v8::WeakCallbackInfo<ObjectWeakCallbackState>& data);

static void JSObjectFinalizerStaticWithExtraData(const v8::WeakCallbackInfo<ObjectWeakCallbackState> &data);


void JSObjectWeakCallback(v8::Isolate* isolate, ObjectWeakCallbackState* callbackState);

void JSObjectFinalizer(v8::Isolate* isolate, ObjectWeakCallbackState* callbackState);

void JSObjectFinalizerWithExtraData(v8::Isolate* isolate, ObjectWeakCallbackState* callbackState);

bool HasImplObject(v8::Isolate* isolate, const v8::Local<v8::Object>& obj);

jweak GetJavaObjectByID(uint32_t javaObjectID);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,12 +212,7 @@ bool tns::ConvertJavaScriptObject(

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

if (link_with_data) {
objectManager->LinkWithExtraData(jsObject, id, clazz, data);
} else {
objectManager->Link(jsObject, id, clazz);
}
objectManager->Link(jsObject, id, clazz);

obj = objectManager->GetJavaObjectByJsObject(jsObject);
}
Expand Down