| 67 | } |
| 68 | |
| 69 | bool CallbackHandlers::RegisterInstance(Isolate *isolate, const Local<Object> &jsObject, |
| 70 | const std::string &fullClassName, |
| 71 | const ArgsWrapper &argWrapper, |
| 72 | const Local<Object> &implementationObject, |
| 73 | bool isInterface, |
| 74 | const std::string &baseClassName) { |
| 75 | bool success; |
| 76 | |
| 77 | DEBUG_WRITE("RegisterInstance called for '%s'", fullClassName.c_str()); |
| 78 | |
| 79 | auto runtime = Runtime::GetRuntime(isolate); |
| 80 | auto objectManager = runtime->GetObjectManager(); |
| 81 | |
| 82 | JEnv env; |
| 83 | |
| 84 | jclass generatedJavaClass = ResolveClass(isolate, baseClassName, fullClassName, |
| 85 | implementationObject, |
| 86 | isInterface); |
| 87 | |
| 88 | int javaObjectID = objectManager->GenerateNewObjectID(); |
| 89 | |
| 90 | objectManager->Link(jsObject, javaObjectID, nullptr); |
| 91 | |
| 92 | // resolve constructor |
| 93 | auto mi = MethodCache::ResolveConstructorSignature(argWrapper, fullClassName, |
| 94 | generatedJavaClass, isInterface); |
| 95 | |
| 96 | // while the "instance" is being created, if an exception is thrown during the construction |
| 97 | // this scope will guarantee the "javaObjectID" will be set to -1 and won't have an invalid value |
| 98 | jobject instance; |
| 99 | { |
| 100 | JavaObjectIdScope objIdScope(env, CURRENT_OBJECTID_FIELD_ID, runtime->GetJavaRuntime(), |
| 101 | javaObjectID); |
| 102 | |
| 103 | if (argWrapper.type == ArgType::Interface) { |
| 104 | instance = env.NewObject(generatedJavaClass, mi.mid); |
| 105 | } else { |
| 106 | // resolve arguments before passing them on to the constructor |
| 107 | // JSToJavaConverter argConverter(isolate, argWrapper.args, mi.signature); |
| 108 | JsArgConverter argConverter(argWrapper.args, mi.signature); |
| 109 | auto ctorArgs = argConverter.ToArgs(); |
| 110 | |
| 111 | instance = env.NewObjectA(generatedJavaClass, mi.mid, ctorArgs); |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | env.CallVoidMethod(runtime->GetJavaRuntime(), MAKE_INSTANCE_STRONG_ID, instance, javaObjectID); |
| 116 | |
| 117 | AdjustAmountOfExternalAllocatedMemory(env, isolate); |
| 118 | |
| 119 | JniLocalRef localInstance(instance); |
| 120 | success = !localInstance.IsNull(); |
| 121 | |
| 122 | if (success) { |
| 123 | jclass instanceClass = env.FindClass(fullClassName); |
| 124 | objectManager->SetJavaClass(jsObject, instanceClass); |
| 125 | } else { |
| 126 | DEBUG_WRITE_FORCE("RegisterInstance failed with null new instance class: %s", |
nothing calls this directly
no test coverage detected