From b6c0577382e16633b802934ed052bcac90aa195d Mon Sep 17 00:00:00 2001 From: Joe Ferner Date: Tue, 11 Oct 2016 20:40:04 -0400 Subject: [PATCH] Replace Get/SetHiddenValue latest versions of V8 has removed them --- src/javaObject.cpp | 4 ++-- src/utils.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++---- src/utils.h | 5 +++++ 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/javaObject.cpp b/src/javaObject.cpp index 97a3ec24..db47d7df 100644 --- a/src/javaObject.cpp +++ b/src/javaObject.cpp @@ -114,7 +114,7 @@ v8::Local ctor = funcTemplate->GetFunction(); v8::Local javaObjectObj = ctor->NewInstance(); - javaObjectObj->SetHiddenValue(Nan::New(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked(), Nan::New(true)); + SetHiddenValue(javaObjectObj, Nan::New(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked(), Nan::New(true)); JavaObject *self = new JavaObject(java, obj); self->Wrap(javaObjectObj); @@ -347,7 +347,7 @@ v8::Local JavaProxyObject::New(Java *java, jobject obj, DynamicProxy v8::Local ctor = Nan::New(s_proxyCt)->GetFunction(); v8::Local javaObjectObj = ctor->NewInstance(); - javaObjectObj->SetHiddenValue(Nan::New(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked(), Nan::New(true)); + SetHiddenValue(javaObjectObj, Nan::New(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked(), Nan::New(true)); JavaProxyObject *self = new JavaProxyObject(java, obj, dynamicProxyData); self->Wrap(javaObjectObj); diff --git a/src/utils.cpp b/src/utils.cpp index d568b285..2c495701 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -293,7 +293,7 @@ static std::string getArrayElementType(v8::Local array, uint32_t arra } else if(arg->IsObject()) { v8::Local obj = v8::Local::Cast(arg); - v8::Local isJavaLong = obj->GetHiddenValue(Nan::New(V8_HIDDEN_MARKER_JAVA_LONG).ToLocalChecked()); + v8::Local isJavaLong = GetHiddenValue(obj, Nan::New(V8_HIDDEN_MARKER_JAVA_LONG).ToLocalChecked()); if(!isJavaLong.IsEmpty() && isJavaLong->IsBoolean()) { types.insert(kLong); } @@ -367,12 +367,12 @@ jobject v8ToJava(JNIEnv* env, v8::Local arg) { if(arg->IsObject()) { v8::Local obj = v8::Local::Cast(arg); - v8::Local isJavaObject = obj->GetHiddenValue(Nan::New(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked()); + v8::Local isJavaObject = GetHiddenValue(obj, Nan::New(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked()); if(!isJavaObject.IsEmpty() && isJavaObject->IsBoolean()) { return v8ToJava_javaObject(env, obj); } - v8::Local isJavaLong = obj->GetHiddenValue(Nan::New(V8_HIDDEN_MARKER_JAVA_LONG).ToLocalChecked()); + v8::Local isJavaLong = GetHiddenValue(obj, Nan::New(V8_HIDDEN_MARKER_JAVA_LONG).ToLocalChecked()); if(!isJavaLong.IsEmpty() && isJavaLong->IsBoolean()) { return v8ToJava_javaLong(env, obj); } @@ -709,7 +709,7 @@ v8::Local javaToV8(Java* java, JNIEnv* env, jobject obj, DynamicProxy v8::Local v8Result = Nan::New((double)result); v8::NumberObject* v8ResultNumberObject = v8::NumberObject::Cast(*v8Result); v8ResultNumberObject->Set(Nan::New("longValue").ToLocalChecked(), Nan::New(strValue.c_str()).ToLocalChecked()); - v8ResultNumberObject->SetHiddenValue(Nan::New(V8_HIDDEN_MARKER_JAVA_LONG).ToLocalChecked(), Nan::New(true)); + SetHiddenValue(v8ResultNumberObject, Nan::New(V8_HIDDEN_MARKER_JAVA_LONG).ToLocalChecked(), Nan::New(true)); return v8Result; } case TYPE_INT: @@ -930,3 +930,50 @@ jarray javaGetArgsForConstructor(JNIEnv *env, jobject method, jarray args) { checkJavaException(env); return result; } + +#if (NODE_MODULE_VERSION > 48) + // The two methods below were copied from + // https://github.com/electron/electron?branch=master&filepath=atom/common/api/atom_api_v8_util.cc + // Copyright (c) 2013 GitHub, Inc. + // Use of this source code is governed by the MIT license. + + v8::Local GetHiddenValue(v8::Local object, v8::Local key) { + v8::Local context = v8::Isolate::GetCurrent()->GetCurrentContext(); + v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), key); + v8::Local value; + v8::Maybe result = object->HasPrivate(context, privateKey); + if (!(result.IsJust() && result.FromJust())) + return v8::Local(); + if (object->GetPrivate(context, privateKey).ToLocal(&value)) + return value; + return v8::Local(); + } + + void SetHiddenValue(v8::NumberObject* object, v8::Local key, v8::Local value) { + if (value.IsEmpty()) + return; + v8::Local context = v8::Isolate::GetCurrent()->GetCurrentContext(); + v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), key); + object->SetPrivate(context, privateKey, value); + } + + void SetHiddenValue(v8::Local object, v8::Local key, v8::Local value) { + if (value.IsEmpty()) + return; + v8::Local context = v8::Isolate::GetCurrent()->GetCurrentContext(); + v8::Local privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), key); + object->SetPrivate(context, privateKey, value); + } +#else + v8::Local GetHiddenValue(v8::Local object, v8::Local key) { + return object->GetHiddenValue(key); + } + + void SetHiddenValue(v8::NumberObject* object, v8::Local key, v8::Local value) { + object->SetHiddenValue(key, value); + } + + void SetHiddenValue(v8::Local object, v8::Local key, v8::Local value) { + object->SetHiddenValue(key, value); + } +#endif diff --git a/src/utils.h b/src/utils.h index 46986d4d..f5bfb3bb 100644 --- a/src/utils.h +++ b/src/utils.h @@ -82,6 +82,11 @@ jobject javaFindMethod(JNIEnv *env, jclass clazz, std::string& methodName, jobje jobject javaFindConstructor(JNIEnv *env, jclass clazz, jobjectArray methodArgs); void javaCastArguments(JNIEnv *env, jobjectArray methodArgs, jobject method); +// TODO remove these functions after node nan gets updated +v8::Local GetHiddenValue(v8::Local object, v8::Local key); +void SetHiddenValue(v8::Local object, v8::Local key, v8::Local value); +void SetHiddenValue(v8::NumberObject*, v8::Local key, v8::Local value); + #define assertNoException(env) \ if (env->ExceptionCheck()) { \ env->ExceptionDescribe(); \