* Link the JavaScript object and it's java counterpart with an ID */
| 263 | * Link the JavaScript object and it's java counterpart with an ID |
| 264 | */ |
| 265 | void ObjectManager::Link(const Local<Object>& object, uint32_t javaObjectID, |
| 266 | jclass clazz) { |
| 267 | if (!IsJsRuntimeObject(object)) { |
| 268 | string errMsg("Trying to link invalid 'this' to a Java object"); |
| 269 | throw NativeScriptException(errMsg); |
| 270 | } |
| 271 | |
| 272 | auto isolate = m_isolate; |
| 273 | |
| 274 | DEBUG_WRITE("Linking js object: %d and java instance id: %d", |
| 275 | object->GetIdentityHash(), javaObjectID); |
| 276 | |
| 277 | auto jsInstanceInfo = |
| 278 | new JSInstanceInfo(false /*isJavaObjWeak*/, javaObjectID, clazz); |
| 279 | |
| 280 | auto objectHandle = new Persistent<Object>(isolate, object); |
| 281 | auto state = new ObjectWeakCallbackState(this, jsInstanceInfo, objectHandle); |
| 282 | |
| 283 | // subscribe for JS GC event |
| 284 | if (m_markingMode == JavaScriptMarkingMode::None) { |
| 285 | objectHandle->SetWeak(state, JSObjectFinalizerStatic, |
| 286 | WeakCallbackType::kFinalizer); |
| 287 | } else { |
| 288 | objectHandle->SetWeak(state, JSObjectWeakCallbackStatic, |
| 289 | 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 | m_idToObject.emplace(javaObjectID, objectHandle); |
| 300 | } |
| 301 | |
| 302 | bool ObjectManager::CloneLink(const Local<Object>& src, |
| 303 | const Local<Object>& dest) { |
no test coverage detected