|
1 | | - |
2 | 1 | #include "javaObject.h" |
3 | 2 | #include "java.h" |
4 | 3 | #include "javaScope.h" |
@@ -93,18 +92,6 @@ JavaObject::JavaObject(Java *java, jobject obj) { |
93 | 92 |
|
94 | 93 | JavaObject::~JavaObject() { |
95 | 94 | JNIEnv *env = m_java->getJavaEnv(); |
96 | | - |
97 | | - jclass nodeDynamicProxyClass = env->FindClass("node/NodeDynamicProxyClass"); |
98 | | - if(env->IsInstanceOf(m_obj, nodeDynamicProxyClass)) { |
99 | | - jfieldID ptrField = env->GetFieldID(nodeDynamicProxyClass, "ptr", "J"); |
100 | | - DynamicProxyData* proxyData = (DynamicProxyData*)(long)env->GetLongField(m_obj, ptrField); |
101 | | - if(dynamicProxyDataVerify(proxyData)) { |
102 | | - proxyData->markerStart = 0; |
103 | | - proxyData->markerEnd = 0; |
104 | | - delete proxyData; |
105 | | - } |
106 | | - } |
107 | | - |
108 | 95 | env->DeleteGlobalRef(m_obj); |
109 | 96 | env->DeleteGlobalRef(m_class); |
110 | 97 | } |
@@ -245,3 +232,59 @@ NAN_SETTER(JavaObject::fieldSetter) { |
245 | 232 | return; |
246 | 233 | } |
247 | 234 | } |
| 235 | + |
| 236 | +/*static*/ v8::Persistent<v8::FunctionTemplate> JavaProxyObject::s_proxyCt; |
| 237 | + |
| 238 | +/*static*/ void JavaProxyObject::init() { |
| 239 | + v8::Local<v8::FunctionTemplate> t = NanNew<v8::FunctionTemplate>(); |
| 240 | + NanAssignPersistent(s_proxyCt, t); |
| 241 | + t->InstanceTemplate()->SetInternalFieldCount(1); |
| 242 | + t->SetClassName(NanNew<v8::String>("NodeDynamicProxy")); |
| 243 | + |
| 244 | + v8::Handle<v8::String> methodName = NanNew<v8::String>("unref"); |
| 245 | + v8::Local<v8::FunctionTemplate> methodCallTemplate = NanNew<v8::FunctionTemplate>(doUnref); |
| 246 | + t->PrototypeTemplate()->Set(methodName, methodCallTemplate->GetFunction()); |
| 247 | + |
| 248 | + v8::Handle<v8::String> fieldName = NanNew<v8::String>("invocationHandler"); |
| 249 | + t->InstanceTemplate()->SetAccessor(fieldName, invocationHandlerGetter); |
| 250 | +} |
| 251 | + |
| 252 | +v8::Local<v8::Object> JavaProxyObject::New(Java *java, jobject obj, DynamicProxyData* dynamicProxyData) { |
| 253 | + NanEscapableScope(); |
| 254 | + |
| 255 | + v8::Local<v8::Function> ctor = s_proxyCt->GetFunction(); |
| 256 | + v8::Local<v8::Object> javaObjectObj = ctor->NewInstance(); |
| 257 | + javaObjectObj->SetHiddenValue(NanNew<v8::String>(V8_HIDDEN_MARKER_JAVA_OBJECT), NanNew<v8::Boolean>(true)); |
| 258 | + JavaProxyObject *self = new JavaProxyObject(java, obj, dynamicProxyData); |
| 259 | + self->Wrap(javaObjectObj); |
| 260 | + |
| 261 | + return NanEscapeScope(javaObjectObj); |
| 262 | +} |
| 263 | + |
| 264 | +JavaProxyObject::JavaProxyObject(Java *java, jobject obj, DynamicProxyData* dynamicProxyData) : JavaObject(java, obj) { |
| 265 | + m_dynamicProxyData = dynamicProxyData; |
| 266 | +} |
| 267 | + |
| 268 | +JavaProxyObject::~JavaProxyObject() { |
| 269 | + if(dynamicProxyDataVerify(m_dynamicProxyData)) { |
| 270 | + unref(m_dynamicProxyData); |
| 271 | + } |
| 272 | +} |
| 273 | + |
| 274 | +NAN_METHOD(JavaProxyObject::doUnref) { |
| 275 | + JavaProxyObject* self = node::ObjectWrap::Unwrap<JavaProxyObject>(args.This()); |
| 276 | + if (dynamicProxyDataVerify(self->m_dynamicProxyData)) { |
| 277 | + unref(self->m_dynamicProxyData); |
| 278 | + } |
| 279 | + NanReturnUndefined(); |
| 280 | +} |
| 281 | + |
| 282 | +NAN_GETTER(JavaProxyObject::invocationHandlerGetter) { |
| 283 | + NanScope(); |
| 284 | + |
| 285 | + JavaProxyObject* self = node::ObjectWrap::Unwrap<JavaProxyObject>(args.This()); |
| 286 | + if (!dynamicProxyDataVerify(self->m_dynamicProxyData)) { |
| 287 | + return NanThrowError("dynamicProxyData has been destroyed or corrupted"); |
| 288 | + } |
| 289 | + NanReturnValue(self->m_dynamicProxyData->functions); |
| 290 | +} |
0 commit comments