@@ -10,6 +10,8 @@ MethodCallBaton::MethodCallBaton(Java* java, jobject method, jarray args, v8::Ha
1010 m_args = (jarray)env->NewGlobalRef (args);
1111 m_callback = v8::Persistent<v8::Value>::New (callback);
1212 m_method = env->NewGlobalRef (method);
13+ m_error = NULL ;
14+ m_result = NULL ;
1315}
1416
1517MethodCallBaton::~MethodCallBaton () {
@@ -48,21 +50,29 @@ v8::Handle<v8::Value> MethodCallBaton::runSync() {
4850
4951void MethodCallBaton::after (JNIEnv *env) {
5052 if (m_callback->IsFunction ()) {
53+ v8::Handle<v8::Value> result = resultsToV8 (env);
5154 v8::Handle<v8::Value> argv[2 ];
52- argv[0 ] = v8::Undefined ();
53- argv[1 ] = resultsToV8 (env);
55+ if (result->IsNativeError ()) {
56+ argv[0 ] = result;
57+ argv[1 ] = v8::Undefined ();
58+ } else {
59+ argv[0 ] = v8::Undefined ();
60+ argv[1 ] = result;
61+ }
5462 v8::Function::Cast (*m_callback)->Call (v8::Context::GetCurrent ()->Global (), 2 , argv);
5563 }
5664
57- env->DeleteGlobalRef (m_result);
65+ if (m_result) {
66+ env->DeleteGlobalRef (m_result);
67+ }
5868}
5969
6070v8::Handle<v8::Value> MethodCallBaton::resultsToV8 (JNIEnv *env) {
6171 v8::HandleScope scope;
6272
63- if (! m_error. IsEmpty () && !m_error-> IsNull () ) {
64- v8::Handle<v8::Value> err = m_error;
65- m_error. Dispose ( );
73+ if (m_error) {
74+ v8::Handle<v8::Value> err = javaExceptionToV8 (env, m_error, m_errorString) ;
75+ env-> DeleteGlobalRef (m_error );
6676 return scope.Close (err);
6777 }
6878
@@ -112,11 +122,16 @@ void NewInstanceBaton::execute(JNIEnv *env) {
112122 // printf("invoke: %s\n", javaObjectToString(env, m_method).c_str());
113123
114124 jobject result = env->CallObjectMethod (m_method, constructor_newInstance, m_args);
125+ jthrowable err = env->ExceptionOccurred ();
126+ if (err) {
127+ m_error = (jthrowable)env->NewGlobalRef (err);
128+ m_errorString = " Error creating class" ;
129+ env->ExceptionClear ();
130+ return ;
131+ }
132+
115133 m_resultType = TYPE_OBJECT;
116134 m_result = env->NewGlobalRef (result);
117- if (env->ExceptionCheck ()) {
118- m_error = v8::Persistent<v8::Value>::New (javaExceptionToV8 (env, " Error running method" ));
119- }
120135}
121136
122137void StaticMethodCallBaton::execute (JNIEnv *env) {
@@ -137,8 +152,10 @@ void StaticMethodCallBaton::execute(JNIEnv *env) {
137152 m_resultType = javaGetType (env, returnType);
138153 jobject result = env->CallObjectMethod (m_method, method_invoke, NULL , m_args);
139154 m_result = env->NewGlobalRef (result);
140- if (env->ExceptionCheck ()) {
141- m_error = v8::Persistent<v8::Value>::New (javaExceptionToV8 (env, " Error running method" ));
155+ jthrowable err = env->ExceptionOccurred ();
156+ if (err) {
157+ m_error = (jthrowable)env->NewGlobalRef (err);
158+ m_errorString = " Error running static method" ;
142159 }
143160}
144161
@@ -160,8 +177,10 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
160177 m_resultType = javaGetType (env, returnType);
161178 jobject result = env->CallObjectMethod (m_method, method_invoke, m_javaObject->getObject (), m_args);
162179 m_result = env->NewGlobalRef (result);
163- if (env->ExceptionCheck ()) {
164- m_error = v8::Persistent<v8::Value>::New (javaExceptionToV8 (env, " Error running method" ));
180+ jthrowable err = env->ExceptionOccurred ();
181+ if (err) {
182+ m_error = (jthrowable)env->NewGlobalRef (err);
183+ m_errorString = " Error running instance method" ;
165184 }
166185}
167186
0 commit comments