|
2 | 2 | #include "utils.h" |
3 | 3 | #include <string.h> |
4 | 4 | #include <algorithm> |
| 5 | +#include <sstream> |
5 | 6 | #include "javaObject.h" |
6 | 7 |
|
7 | 8 | std::list<jobject> javaReflectionGetMethods(JNIEnv *env, jclass clazz) { |
@@ -266,8 +267,30 @@ jarray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end, std: |
266 | 267 | v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, jthrowable ex, const std::string& alternateMessage) { |
267 | 268 | v8::HandleScope scope; |
268 | 269 |
|
269 | | - std::string msg = alternateMessage + "\n" + javaObjectToString(env, ex); |
270 | | - return scope.Close(v8::Exception::TypeError(v8::String::New(msg.c_str()))); |
| 270 | + std::ostringstream msg; |
| 271 | + msg << alternateMessage; |
| 272 | + |
| 273 | + if(ex) { |
| 274 | + jclass stringWriterClazz = env->FindClass("java/io/StringWriter"); |
| 275 | + jmethodID stringWriter_constructor = env->GetMethodID(stringWriterClazz, "<init>", "()V"); |
| 276 | + jmethodID stringWriter_toString = env->GetMethodID(stringWriterClazz, "toString", "()Ljava/lang/String;"); |
| 277 | + jobject stringWriter = env->NewObject(stringWriterClazz, stringWriter_constructor); |
| 278 | + |
| 279 | + jclass printWriterClazz = env->FindClass("java/io/PrintWriter"); |
| 280 | + jmethodID printWriter_constructor = env->GetMethodID(printWriterClazz, "<init>", "(Ljava/io/Writer;)V"); |
| 281 | + jobject printWriter = env->NewObject(printWriterClazz, printWriter_constructor, stringWriter); |
| 282 | + |
| 283 | + jclass throwableClazz = env->FindClass("java/lang/Throwable"); |
| 284 | + jmethodID throwable_printStackTrace = env->GetMethodID(throwableClazz, "printStackTrace", "(Ljava/io/PrintWriter;)V"); |
| 285 | + env->CallObjectMethod(ex, throwable_printStackTrace, printWriter); |
| 286 | + |
| 287 | + jstring strObj = (jstring)env->CallObjectMethod(stringWriter, stringWriter_toString); |
| 288 | + std::string stackTrace = javaToString(env, strObj); |
| 289 | + |
| 290 | + msg << "\n" << stackTrace; |
| 291 | + } |
| 292 | + |
| 293 | + return scope.Close(v8::Exception::Error(v8::String::New(msg.str().c_str()))); |
271 | 294 | } |
272 | 295 |
|
273 | 296 | v8::Handle<v8::Value> javaExceptionToV8(JNIEnv* env, const std::string& alternateMessage) { |
|
0 commit comments