Skip to content

Commit

Permalink
switch scoping to use JavaScope class
Browse files Browse the repository at this point in the history
  • Loading branch information
joeferner committed Dec 10, 2012
1 parent 3d080c4 commit 64139b7
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 76 deletions.
1 change: 1 addition & 0 deletions binding.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"sources": [
"src/java.cpp",
"src/javaObject.cpp",
"src/javaScope.cpp",
"src/methodCallBaton.cpp",
"src/nodeJavaBridge.cpp",
"src/utils.cpp"
Expand Down
25 changes: 14 additions & 11 deletions src/java.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <unistd.h>
#endif
#include "javaObject.h"
#include "javaScope.h"
#include "methodCallBaton.h"
#include "node_NodeDynamicProxyClass.h"
#include <sstream>
Expand Down Expand Up @@ -265,6 +266,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {

int argsStart = 0;
int argsEnd = args.Length();
UNUSED_VARIABLE(argsEnd);

ARGS_FRONT_STRING(interfaceName);
ARGS_FRONT_OBJECT(functions);
Expand Down Expand Up @@ -402,6 +404,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {

int argsStart = 0;
int argsEnd = args.Length();
UNUSED_VARIABLE(argsEnd);

// arguments
ARGS_FRONT_CLASSNAME();
Expand Down Expand Up @@ -522,7 +525,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
return ensureJvmResults;
}
JNIEnv* env = self->getJavaEnv();
PUSH_LOCAL_JAVA_FRAME();
JavaScope javaScope(env);

int argsStart = 0;
int argsEnd = args.Length();
Expand All @@ -537,15 +540,15 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
if(clazz == NULL) {
std::ostringstream errStr;
errStr << "Could not create class " << className.c_str();
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
return ThrowException(javaExceptionToV8(env, errStr.str()));
}

// get the field
jobject field = javaFindField(env, clazz, fieldName);
if(field == NULL) {
std::ostringstream errStr;
errStr << "Could not find field " << fieldName.c_str() << " on class " << className.c_str();
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
return ThrowException(javaExceptionToV8(env, errStr.str()));
}

jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
Expand All @@ -556,10 +559,10 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
if(env->ExceptionOccurred()) {
std::ostringstream errStr;
errStr << "Could not get field " << fieldName.c_str() << " on class " << className.c_str();
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
return ThrowException(javaExceptionToV8(env, errStr.str()));
}

POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(javaToV8(self, env, val)));
return scope.Close(javaToV8(self, env, val));
}

/*static*/ v8::Handle<v8::Value> Java::setStaticFieldValue(const v8::Arguments& args) {
Expand All @@ -570,7 +573,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
return ensureJvmResults;
}
JNIEnv* env = self->getJavaEnv();
PUSH_LOCAL_JAVA_FRAME();
JavaScope javaScope(env);

int argsStart = 0;
int argsEnd = args.Length();
Expand All @@ -583,7 +586,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
if(args.Length() < argsStart+1) {
std::ostringstream errStr;
errStr << "setStaticFieldValue requires " << (argsStart+1) << " arguments";
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str()))));
return ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str())));
}
jobject newValue = v8ToJava(env, args[argsStart]);
argsStart++;
Expand All @@ -595,15 +598,15 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
if(clazz == NULL) {
std::ostringstream errStr;
errStr << "Could not create class " << className.c_str();
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
return ThrowException(javaExceptionToV8(env, errStr.str()));
}

// get the field
jobject field = javaFindField(env, clazz, fieldName);
if(field == NULL) {
std::ostringstream errStr;
errStr << "Could not find field " << fieldName.c_str() << " on class " << className.c_str();
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
return ThrowException(javaExceptionToV8(env, errStr.str()));
}

jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
Expand All @@ -616,10 +619,10 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
if(env->ExceptionOccurred()) {
std::ostringstream errStr;
errStr << "Could not set field " << fieldName.c_str() << " on class " << className.c_str();
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
return ThrowException(javaExceptionToV8(env, errStr.str()));
}

POP_LOCAL_JAVA_FRAME_AND_RETURN(v8::Undefined());
return v8::Undefined();
}

void EIO_CallJs(uv_work_t* req) {
Expand Down
32 changes: 6 additions & 26 deletions src/javaObject.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

#include "javaObject.h"
#include "java.h"
#include "javaScope.h"
#include "utils.h"
#include <sstream>
#include <algorithm>
Expand All @@ -15,8 +16,7 @@

JNIEnv *env = java->getJavaEnv();
obj = env->NewGlobalRef(obj);

PUSH_LOCAL_JAVA_FRAME();
JavaScope javaScope(env);

jclass objClazz = env->GetObjectClass(obj);
jclass classClazz = env->FindClass("java/lang/Class");
Expand Down Expand Up @@ -77,8 +77,6 @@
JavaObject *self = new JavaObject(java, obj);
self->Wrap(javaObjectObj);

POP_LOCAL_JAVA_FRAME();

return scope.Close(javaObjectObj);
}

Expand Down Expand Up @@ -109,8 +107,7 @@ JavaObject::~JavaObject() {
v8::HandleScope scope;
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
JNIEnv *env = self->m_java->getJavaEnv();

PUSH_LOCAL_JAVA_FRAME();
JavaScope javaScope(env);

v8::String::AsciiValue methodName(args.Data());
std::string methodNameStr = *methodName;
Expand All @@ -122,7 +119,6 @@ JavaObject::~JavaObject() {
ARGS_BACK_CALLBACK();

if(!callbackProvided && methodNameStr == "toString") {
POP_LOCAL_JAVA_FRAME();
return methodCallSync(args);
}

Expand All @@ -132,25 +128,21 @@ JavaObject::~JavaObject() {
if(method == NULL) {
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, args, argsStart, argsEnd);
EXCEPTION_CALL_CALLBACK(msg);
POP_LOCAL_JAVA_FRAME();
return v8::Undefined();
}

// run
InstanceMethodCallBaton* baton = new InstanceMethodCallBaton(self->m_java, self, method, methodArgs, callback);
baton->run();

POP_LOCAL_JAVA_FRAME();

END_CALLBACK_FUNCTION("\"Method '" << methodNameStr << "' called without a callback did you mean to use the Sync version?\"");
}

/*static*/ v8::Handle<v8::Value> JavaObject::methodCallSync(const v8::Arguments& args) {
v8::HandleScope scope;
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
JNIEnv *env = self->m_java->getJavaEnv();

PUSH_LOCAL_JAVA_FRAME();
JavaScope javaScope(env);

v8::String::AsciiValue methodName(args.Data());
std::string methodNameStr = *methodName;
Expand All @@ -164,7 +156,6 @@ JavaObject::~JavaObject() {
if(method == NULL) {
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, args, argsStart, argsEnd);
v8::Handle<v8::Value> ex = javaExceptionToV8(env, msg);
POP_LOCAL_JAVA_FRAME();
return ThrowException(ex);
}

Expand All @@ -174,8 +165,6 @@ JavaObject::~JavaObject() {
v8::Handle<v8::Value> result = baton->runSync();
delete baton;

POP_LOCAL_JAVA_FRAME();

if(result->IsNativeError()) {
return ThrowException(result);
}
Expand All @@ -187,8 +176,7 @@ JavaObject::~JavaObject() {
v8::HandleScope scope;
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This());
JNIEnv *env = self->m_java->getJavaEnv();

PUSH_LOCAL_JAVA_FRAME();
JavaScope javaScope(env);

v8::String::AsciiValue propertyCStr(property);
std::string propertyStr = *propertyCStr;
Expand All @@ -197,7 +185,6 @@ JavaObject::~JavaObject() {
std::ostringstream errStr;
errStr << "Could not find field " << propertyStr;
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
POP_LOCAL_JAVA_FRAME();
return ThrowException(ex);
}

Expand All @@ -210,23 +197,20 @@ JavaObject::~JavaObject() {
std::ostringstream errStr;
errStr << "Could not get field " << propertyStr;
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
POP_LOCAL_JAVA_FRAME();
return ThrowException(ex);
}

v8::Handle<v8::Value> result = javaToV8(self->m_java, env, val);

POP_LOCAL_JAVA_FRAME();

return scope.Close(result);
}

/*static*/ void JavaObject::fieldSetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info) {
v8::HandleScope scope;
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This());
JNIEnv *env = self->m_java->getJavaEnv();
JavaScope javaScope(env);

PUSH_LOCAL_JAVA_FRAME();
jobject newValue = v8ToJava(env, value);

v8::String::AsciiValue propertyCStr(property);
Expand All @@ -236,7 +220,6 @@ JavaObject::~JavaObject() {
std::ostringstream errStr;
errStr << "Could not find field " << propertyStr;
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
POP_LOCAL_JAVA_FRAME();
ThrowException(ex);
return;
}
Expand All @@ -252,10 +235,7 @@ JavaObject::~JavaObject() {
std::ostringstream errStr;
errStr << "Could not set field " << propertyStr;
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
POP_LOCAL_JAVA_FRAME();
ThrowException(ex);
return;
}

POP_LOCAL_JAVA_FRAME();
}
17 changes: 17 additions & 0 deletions src/javaScope.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

#include "javaScope.h"

JavaScope::JavaScope(JNIEnv *env) {
m_env = env;
m_result = NULL;
m_env->PushLocalFrame(LOCAL_FRAME_SIZE);
}

JavaScope::~JavaScope() {
m_env->PopLocalFrame(m_result);
}

jobject JavaScope::Close(jobject result) {
m_result = result;
return m_result;
}
20 changes: 20 additions & 0 deletions src/javaScope.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

#ifndef _javaScope_h_
#define _javaScope_h_

#include <jni.h>

#define LOCAL_FRAME_SIZE 500

class JavaScope {
public:
JavaScope(JNIEnv *env);
~JavaScope();
jobject Close(jobject result);

private:
JNIEnv *m_env;
jobject m_result;
};

#endif
4 changes: 0 additions & 4 deletions src/methodCallBaton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,6 @@ void StaticMethodCallBaton::execute(JNIEnv *env) {
}

void InstanceMethodCallBaton::execute(JNIEnv *env) {
PUSH_LOCAL_JAVA_FRAME();

jclass methodClazz = env->FindClass("java/lang/reflect/Method");
jmethodID method_invoke = env->GetMethodID(methodClazz, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");

Expand All @@ -144,7 +142,6 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
m_error = (jthrowable)env->NewGlobalRef(err);
m_errorString = "Error running instance method";
env->ExceptionClear();
POP_LOCAL_JAVA_FRAME();
return;
}

Expand All @@ -154,7 +151,6 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
m_result = env->NewGlobalRef(result);
env->DeleteLocalRef(result);
}
POP_LOCAL_JAVA_FRAME();
}

NewInstanceBaton::NewInstanceBaton(
Expand Down
Loading

0 comments on commit 64139b7

Please sign in to comment.