Skip to content

Commit 5150804

Browse files
authored
Merge pull request #1750 from vmutafov/vmutafov/v8-10.3.22-perf-merged-main
chore: merge main into v8-10.3.22-perf
2 parents 97d7465 + 0640fce commit 5150804

File tree

7 files changed

+30
-147
lines changed

7 files changed

+30
-147
lines changed

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "@nativescript/android",
3-
"description": "NativeScript Runtime for Android",
4-
"version": "8.4.0-alpha.6",
3+
"description": "NativeScript for Android using v8",
4+
"version": "8.4.0",
55
"repository": {
66
"type": "git",
7-
"url": "https://github.com/NativeScript/android-runtime.git"
7+
"url": "https://github.com/NativeScript/android.git"
88
},
99
"files": [
1010
"**/*"

test-app/runtime/src/main/cpp/JsArgConverter.cpp

+5-21
Original file line numberDiff line numberDiff line change
@@ -253,37 +253,25 @@ bool JsArgConverter::ConvertArg(const Local<Value> &arg, int index) {
253253
size_t offset = 0;
254254
size_t length;
255255
uint8_t *data = nullptr;
256-
auto link_with_data = false;
257256
if (jsObject->IsArrayBuffer()) {
258257
auto array = jsObject.As<v8::ArrayBuffer>();
259258
store = array->GetBackingStore();
260259
length = array->ByteLength();
260+
data = static_cast<uint8_t *>(store->Data());
261261
} else if (jsObject->IsArrayBufferView()) {
262262
auto array = jsObject.As<v8::ArrayBufferView>();
263-
264-
if (!array->HasBuffer()) {
265-
266-
length = array->ByteLength();
267-
void *data_ = malloc(length);
268-
array->CopyContents(data_, length);
269-
data = (uint8_t *) data_;
270-
link_with_data = true;
271-
} else {
272-
length = array->ByteLength();
273-
}
274263
offset = array->ByteOffset();
264+
length = array->ByteLength();
275265
store = array->Buffer()->GetBackingStore();
266+
data = static_cast<uint8_t *>(store->Data()) + offset;
276267
bufferCastType = JsArgConverter::GetCastType(array);
277268
} else {
278269
auto array = jsObject.As<v8::TypedArray>();
279270
offset = array->ByteOffset();
280271
store = array->Buffer()->GetBackingStore();
281272
length = array->ByteLength();
282-
bufferCastType = JsArgConverter::GetCastType(array);
283-
}
284-
285-
if (data == nullptr) {
286273
data = static_cast<uint8_t *>(store->Data()) + offset;
274+
bufferCastType = JsArgConverter::GetCastType(array);
287275
}
288276

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

345-
if (link_with_data) {
346-
objectManager->LinkWithExtraData(jsObject, id, clazz, data);
347-
} else {
348-
objectManager->Link(jsObject, id, clazz);
349-
}
333+
objectManager->Link(jsObject, id, clazz);
350334

351335
obj = objectManager->GetJavaObjectByJsObject(jsObject);
352336
}

test-app/runtime/src/main/cpp/JsArgToArrayConverter.cpp

+4-19
Original file line numberDiff line numberDiff line change
@@ -256,36 +256,25 @@ bool JsArgToArrayConverter::ConvertArg(Local<Context> context, const Local<Value
256256
size_t offset = 0;
257257
size_t length;
258258
uint8_t *data = nullptr;
259-
auto link_with_data = false;
260259
if (jsObj->IsArrayBuffer()) {
261260
auto array = jsObj.As<v8::ArrayBuffer>();
262261
store = array->GetBackingStore();
263262
length = array->ByteLength();
263+
data = static_cast<uint8_t *>(store->Data());
264264
} else if (jsObj->IsArrayBufferView()) {
265265
auto array = jsObj.As<v8::ArrayBufferView>();
266266

267-
if (!array->HasBuffer()) {
268-
269-
length = array->ByteLength();
270-
void *data_ = malloc(length);
271-
array->CopyContents(data_, length);
272-
data = (uint8_t *) data_;
273-
link_with_data = true;
274-
} else {
275-
length = array->ByteLength();
276-
}
277267
offset = array->ByteOffset();
268+
length = array->ByteLength();
278269
store = array->Buffer()->GetBackingStore();
279270
bufferCastType = JsArgConverter::GetCastType(array);
271+
data = static_cast<uint8_t *>(store->Data()) + offset;
280272
} else {
281273
auto array = jsObj.As<v8::TypedArray>();
282274
offset = array->ByteOffset();
283275
store = array->Buffer()->GetBackingStore();
284276
length = array->ByteLength();
285277
bufferCastType = JsArgConverter::GetCastType(array);
286-
}
287-
288-
if (data == nullptr) {
289278
data = static_cast<uint8_t *>(store->Data()) + offset;
290279
}
291280

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

345334
int id = objectManager->GetOrCreateObjectId(buffer);
346335
auto clazz = env.GetObjectClass(buffer);
347-
if (link_with_data) {
348-
objectManager->LinkWithExtraData(jsObj, id, clazz, data);
349-
} else {
350-
objectManager->Link(jsObj, id, clazz);
351-
}
336+
objectManager->Link(jsObj, id, clazz);
352337

353338
obj = objectManager->GetJavaObjectByJsObject(jsObj);
354339
}

test-app/runtime/src/main/cpp/MetadataReader.cpp

+16-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ MetadataReader::MetadataReader(uint32_t nodesLength, uint8_t* nodeData, uint32_t
1717
m_root = BuildTree();
1818
}
1919

20+
// helper debug function when need to convert a metadata node to its full name
21+
//std::string toFullName(MetadataTreeNode* p) {
22+
// std::string final = p->name;
23+
// while((p = p->parent) && !p->name.empty()) {
24+
// final.insert(0,p->name + ".");
25+
// };
26+
// return final;
27+
//}
28+
2029
MetadataTreeNode* MetadataReader::BuildTree() {
2130
MetadataTreeNodeRawData* rootNodeData = reinterpret_cast<MetadataTreeNodeRawData*>(m_nodeData);
2231

@@ -43,21 +52,22 @@ MetadataTreeNode* MetadataReader::BuildTree() {
4352
node->children = new vector<MetadataTreeNode*>;
4453
MetadataTreeNodeRawData* childNodeData = rootNodeData + curNodeData->firstChildId;
4554
while (true) {
55+
56+
uint16_t childNodeDataId = childNodeData - rootNodeData;
57+
// node (and its next siblings) already visited, so we don't need to visit it again
58+
if (m_v[childNodeDataId] != emptyNode) {
59+
break;
60+
}
61+
4662
MetadataTreeNode* childNode = new MetadataTreeNode;
4763
childNode->parent = node;
4864
childNode->name = ReadName(childNodeData->offsetName);
4965
childNode->offsetValue = childNodeData->offsetValue;
5066

5167
node->children->push_back(childNode);
5268

53-
uint16_t childNodeDataId = childNodeData - rootNodeData;
54-
5569
m_v[childNodeDataId] = childNode;
5670

57-
if (childNodeDataId == childNodeData->nextSiblingId) {
58-
break;
59-
}
60-
6171
childNodeData = rootNodeData + childNodeData->nextSiblingId;
6272
}
6373
}

test-app/runtime/src/main/cpp/ObjectManager.cpp

+1-85
Original file line numberDiff line numberDiff line change
@@ -266,41 +266,6 @@ void ObjectManager::Link(const Local<Object> &object, uint32_t javaObjectID, jcl
266266
m_idToObject.insert(make_pair(javaObjectID, objectHandle));
267267
}
268268

269-
void ObjectManager::LinkWithExtraData(const v8::Local<v8::Object>& object, uint32_t javaObjectID, jclass clazz, void* data) {
270-
if (!IsJsRuntimeObject(object)) {
271-
string errMsg("Trying to link invalid 'this' to a Java object");
272-
throw NativeScriptException(errMsg);
273-
}
274-
275-
auto isolate = m_isolate;
276-
277-
DEBUG_WRITE("Linking js object: %d and java instance id: %d", object->GetIdentityHash(),
278-
javaObjectID);
279-
280-
auto jsInstanceInfo = new JSInstanceInfo(false/*isJavaObjWeak*/, javaObjectID, clazz);
281-
282-
auto objectHandle = new Persistent<Object>(isolate, object);
283-
auto state = new ObjectWeakCallbackState(this, jsInstanceInfo, objectHandle);
284-
285-
// subscribe for JS GC event
286-
if (m_markingMode == JavaScriptMarkingMode::None) {
287-
objectHandle->SetWeak(state, JSObjectFinalizerStatic, WeakCallbackType::kFinalizer);
288-
} else {
289-
objectHandle->SetWeak(state, JSObjectWeakCallbackStatic, WeakCallbackType::kFinalizer);
290-
}
291-
292-
auto jsInfoIdx = static_cast<int>(MetadataNodeKeys::JsInfo);
293-
294-
auto jsInfo = External::New(isolate, jsInstanceInfo);
295-
296-
//link
297-
object->SetInternalField(jsInfoIdx, jsInfo);
298-
299-
V8SetPrivateValue(isolate, object, String::NewFromUtf8(isolate,"object_with_extra_data").ToLocalChecked(), External::New(isolate, data));
300-
301-
m_idToObject.insert(make_pair(javaObjectID, objectHandle));
302-
}
303-
304269
bool ObjectManager::CloneLink(const Local<Object> &src, const Local<Object> &dest) {
305270
auto jsInfo = GetJSInstanceInfo(src);
306271

@@ -387,55 +352,6 @@ void ObjectManager::JSObjectFinalizer(Isolate *isolate, ObjectWeakCallbackState
387352
}
388353

389354

390-
void ObjectManager::JSObjectFinalizerStaticWithExtraData(const WeakCallbackInfo<ObjectWeakCallbackState> &data) {
391-
ObjectWeakCallbackState *callbackState = data.GetParameter();
392-
393-
ObjectManager *thisPtr = callbackState->thisPtr;
394-
395-
auto isolate = data.GetIsolate();
396-
397-
thisPtr->JSObjectFinalizerWithExtraData(isolate, callbackState);
398-
}
399-
400-
void ObjectManager::JSObjectFinalizerWithExtraData(Isolate *isolate, ObjectWeakCallbackState *callbackState) {
401-
HandleScope handleScope(m_isolate);
402-
Persistent<Object> *po = callbackState->target;
403-
auto jsInstanceInfo = GetJSInstanceInfoFromRuntimeObject(po->Get(m_isolate));
404-
405-
if (jsInstanceInfo == nullptr) {
406-
po->Reset();
407-
delete po;
408-
delete callbackState;
409-
return;
410-
}
411-
412-
auto javaObjectID = jsInstanceInfo->JavaObjectID;
413-
JEnv env;
414-
jboolean isJavaInstanceAlive = env.CallBooleanMethod(m_javaRuntimeObject,
415-
MAKE_INSTANCE_WEAK_AND_CHECK_IF_ALIVE_METHOD_ID,
416-
javaObjectID);
417-
if (isJavaInstanceAlive) {
418-
// If the Java instance is alive, keep the JavaScript instance alive.
419-
po->SetWeak(callbackState, JSObjectFinalizerStatic, WeakCallbackType::kFinalizer);
420-
} else {
421-
// If the Java instance is dead, this JavaScript instance can be let die.
422-
delete jsInstanceInfo;
423-
auto jsInfoIdx = static_cast<int>(MetadataNodeKeys::JsInfo);
424-
po->Get(m_isolate)->SetInternalField(jsInfoIdx, Undefined(m_isolate));
425-
v8::Local<v8::Value> out;
426-
V8GetPrivateValue(isolate, po->Get(m_isolate), String::NewFromUtf8(isolate,"object_with_extra_data").ToLocalChecked(), out);
427-
V8SetPrivateValue(isolate, po->Get(m_isolate), String::NewFromUtf8(isolate,"object_with_extra_data").ToLocalChecked(), Undefined(m_isolate));
428-
if(!out.IsEmpty() && out->IsExternal()) {
429-
auto data = out.As<v8::External>()->Value();
430-
free(data);
431-
}
432-
po->Reset();
433-
m_idToObject.erase(javaObjectID);
434-
delete po;
435-
delete callbackState;
436-
}
437-
}
438-
439355
/*
440356
* When JS GC happens change state of the java counterpart to mirror state of JS object and REVIVE the JS object unconditionally
441357
* "Regular" js objects are pushed into the "regular objects" array
@@ -466,7 +382,7 @@ void ObjectManager::JSObjectWeakCallback(Isolate *isolate, ObjectWeakCallbackSta
466382

467383
if (hasImplObj) {
468384
if (jsInstanceInfo->IsJavaObjectWeak) {
469-
m_implObjWeak.push_back(PersistentObjectIdPair(po, javaObjectID));
385+
m_implObjWeak.emplace_back(po, javaObjectID);
470386
} else {
471387
m_implObjStrong.insert(make_pair(javaObjectID, po));
472388
jsInstanceInfo->IsJavaObjectWeak = true;

test-app/runtime/src/main/cpp/ObjectManager.h

-7
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ class ObjectManager {
3737

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

40-
void LinkWithExtraData(const v8::Local<v8::Object>& object, uint32_t javaObjectID, jclass clazz, void* data);
41-
4240
void ReleaseNativeCounterpart(v8::Local<v8::Object>& object);
4341

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

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

170-
static void JSObjectFinalizerStaticWithExtraData(const v8::WeakCallbackInfo<ObjectWeakCallbackState> &data);
171-
172-
173168
void JSObjectWeakCallback(v8::Isolate* isolate, ObjectWeakCallbackState* callbackState);
174169

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

177-
void JSObjectFinalizerWithExtraData(v8::Isolate* isolate, ObjectWeakCallbackState* callbackState);
178-
179172
bool HasImplObject(v8::Isolate* isolate, const v8::Local<v8::Object>& obj);
180173

181174
jweak GetJavaObjectByID(uint32_t javaObjectID);

test-app/runtime/src/main/cpp/conversions/objects/JSToJavaObjectsConverter.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,7 @@ bool tns::ConvertJavaScriptObject(
212212

213213
int id = objectManager->GetOrCreateObjectId(buffer);
214214
auto clazz = env.GetObjectClass(buffer);
215-
216-
if (link_with_data) {
217-
objectManager->LinkWithExtraData(jsObject, id, clazz, data);
218-
} else {
219-
objectManager->Link(jsObject, id, clazz);
220-
}
215+
objectManager->Link(jsObject, id, clazz);
221216

222217
obj = objectManager->GetJavaObjectByJsObject(jsObject);
223218
}

0 commit comments

Comments
 (0)