Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Timob 11653 3 0 x: Expose error stack trace #3708

Merged
merged 4 commits into from
Jan 29, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,23 @@
"typeValidation":true,
"defaultValue": "null"
},
"org.appcelerator.kroll.KrollException":{
"jsType":"Value",
"jsConvertType":"Value",
"jsToJavaConverter":"jsValueToJavaError",
"javaToJsConverter":"javaObjectToJsValue",
"jvalue":"l",
"javaCallMethodType":"Object",
"javaReturnType":"jobject",
"javaValidation":true,
"javaDeleteLocalRef":true,
"rhinoType":"Object",
"rhinoJsCast":false,
"rhinoToJavaConverter":"jsObjectToJavaObject",
"javaToRhinoConverter":"javaObjectToJsObject",
"typeValidation":false,
"defaultValue": "null"
},
"java.lang.String":{
"jsType":"Value",
"jsToJavaConverter":"jsValueToJavaString",
Expand Down Expand Up @@ -438,6 +455,10 @@
<#if type?ends_with("Proxy")>
<#return typeInfo["org.appcelerator.kroll.KrollProxy"]>
</#if>

<#if type?ends_with("Exception")>
<#return typeInfo["org.appcelerator.kroll.KrollException"]>
</#if>

<#-- default type -->
<#return typeInfo["java.lang.Object"]>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/**
* Appcelerator Titanium Mobile
* Copyright (c) 2012-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/
package org.appcelerator.kroll;

public class KrollException
{
private String message;
private String stack;
private String lineNumber;
private String fileName;

public KrollException(String message, String stack)
{
this.message = message;
this.stack = stack;
parseInfo();
}

private void parseInfo()
{
if (stack == null) {
return;
}

String split[];
split = stack.split("\\n");
if (split.length >= 2) {
String secondLine = split[1];
secondLine = secondLine.replace("at", " ").trim();

String info[];
info = secondLine.split(":");
if (info.length >=2) {
lineNumber = info[1];
fileName = info[0];
}
}


}

public String getStack()
{
return stack;
}

public String getMessage()
{
return message;
}

public String getLineNumber()
{
return lineNumber;
}

public String getFileName()
{
return fileName;
}

}
4 changes: 4 additions & 0 deletions android/runtime/v8/src/native/JNIUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ jclass JNIUtil::v8ObjectClass = NULL;
jclass JNIUtil::v8FunctionClass = NULL;
jclass JNIUtil::krollRuntimeClass = NULL;
jclass JNIUtil::krollInvocationClass = NULL;
jclass JNIUtil::krollExceptionClass = NULL;
jclass JNIUtil::krollObjectClass = NULL;
jclass JNIUtil::krollProxyClass = NULL;
jclass JNIUtil::krollAssetHelperClass = NULL;
Expand Down Expand Up @@ -86,6 +87,7 @@ jmethodID JNIUtil::referenceTableGetReferenceMethod = NULL;

jint JNIUtil::krollRuntimeDontIntercept = -1;
jmethodID JNIUtil::krollInvocationInitMethod = NULL;
jmethodID JNIUtil::krollExceptionInitMethod = NULL;
jmethodID JNIUtil::krollObjectSetHasListenersForEventTypeMethod = NULL;
jmethodID JNIUtil::krollObjectOnEventFiredMethod = NULL;
jmethodID JNIUtil::krollProxyCreateProxyMethod = NULL;
Expand Down Expand Up @@ -291,6 +293,7 @@ void JNIUtil::initCache()
krollProxyClass = findClass("org/appcelerator/kroll/KrollProxy");
krollAssetHelperClass = findClass("org/appcelerator/kroll/util/KrollAssetHelper");
krollLoggingClass = findClass("org/appcelerator/kroll/KrollLogging");
krollExceptionClass = findClass("org/appcelerator/kroll/KrollException");
referenceTableClass = findClass("org/appcelerator/kroll/runtime/v8/ReferenceTable");

classGetNameMethod = getMethodID(classClass, "getName", "()Ljava/lang/String;", false);
Expand Down Expand Up @@ -332,6 +335,7 @@ void JNIUtil::initCache()
krollRuntimeDontIntercept = env->GetStaticIntField(krollRuntimeClass, dontInterceptField);

krollInvocationInitMethod = getMethodID(krollInvocationClass, "<init>", "(Ljava/lang/String;)V", false);
krollExceptionInitMethod = getMethodID(krollExceptionClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V", false);
krollObjectSetHasListenersForEventTypeMethod = getMethodID(krollObjectClass, "setHasListenersForEventType",
"(Ljava/lang/String;Z)V");
krollObjectOnEventFiredMethod = getMethodID(krollObjectClass, "onEventFired", "(Ljava/lang/String;Ljava/lang/Object;)V");
Expand Down
2 changes: 2 additions & 0 deletions android/runtime/v8/src/native/JNIUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ class JNIUtil
static jclass v8FunctionClass;
static jclass krollRuntimeClass;
static jclass krollInvocationClass;
static jclass krollExceptionClass;
static jclass krollObjectClass;
static jclass krollProxyClass;
static jclass krollAssetHelperClass;
Expand Down Expand Up @@ -111,6 +112,7 @@ class JNIUtil

static jint krollRuntimeDontIntercept;
static jmethodID krollInvocationInitMethod;
static jmethodID krollExceptionInitMethod;
static jmethodID krollObjectSetHasListenersForEventTypeMethod;
static jmethodID krollObjectOnEventFiredMethod;
static jmethodID krollProxyCreateProxyMethod;
Expand Down
37 changes: 37 additions & 0 deletions android/runtime/v8/src/native/TypeConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,43 @@ jobject TypeConverter::jsValueToJavaObject(v8::Local<v8::Value> jsValue, bool *i
return NULL;
}

// converts js value to java error
jobject TypeConverter::jsValueToJavaError(v8::Local<v8::Value> jsValue, bool* isNew)
{
JNIEnv *env = JNIScope::getEnv();
if (env == NULL) {
return NULL;
}

if (jsValue->IsObject()) {
v8::Handle<v8::Object> jsObject = jsValue->ToObject();

// If it's a java object, we just return null for now.
if (!JavaObject::isJavaObject(jsObject)) {

Handle<String> stackString = String::New("stack"), messageString = String::New("message");
if (jsObject->HasOwnProperty(stackString) || jsObject->HasOwnProperty(messageString)) {
bool keyIsNew, valueIsNew;
*isNew = true;
v8::Local<v8::Value> jsObjectMessageProperty = jsObject->GetRealNamedProperty(messageString);
v8::Local<v8::Value> jsObjectStackProperty = jsObject->GetRealNamedProperty(stackString);

return env->NewObject(JNIUtil::krollExceptionClass, JNIUtil::krollExceptionInitMethod,
TypeConverter::jsValueToJavaString(jsObjectMessageProperty), TypeConverter::jsValueToJavaString(jsObjectStackProperty));
}
}

} else {
*isNew = true;
return env->NewObject(JNIUtil::krollExceptionClass, JNIUtil::krollExceptionInitMethod,
TypeConverter::jsValueToJavaString(jsValue), NULL);
}

if (!jsValue->IsNull() && !jsValue->IsUndefined()) {
LOGW(TAG, "jsValueToJavaObject returning null.");
}
return NULL;
}
// converts java object to js value and recursively converts sub objects if this
// object is a container type
v8::Handle<v8::Value> TypeConverter::javaObjectToJsValue(jobject javaObject)
Expand Down
3 changes: 2 additions & 1 deletion android/runtime/v8/src/native/TypeConverter.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ class TypeConverter
bool isNew;
return jsValueToJavaObject(jsValue, &isNew);
}


static jobject jsValueToJavaError(v8::Local<v8::Value> jsValue, bool *isNew);
static jobject jsValueToJavaObject(v8::Local<v8::Value> jsValue, bool *isNew);
static v8::Handle<v8::Value> javaObjectToJsValue(jobject javaObject);

Expand Down