Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(546)

Unified Diff: frog/corejs.dart

Issue 8694007: Ensure that exception message is printed. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: x Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | frog/frogsh » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/corejs.dart
diff --git a/frog/corejs.dart b/frog/corejs.dart
index 6193659a8853094db044fecffe1310a7317e32df..fd5f1f81efaacd6e7c000457b3ccbce591841819 100644
--- a/frog/corejs.dart
+++ b/frog/corejs.dart
@@ -253,42 +253,58 @@ function $stackTraceOf(e) {
// Translate a JavaScript exception to a Dart exception
// TODO(jmesserly): cross browser support. This is Chrome specific.
function $toDartException(e) {
- var res = e;
+ function attachStack(dartEx) {
+ // TODO(jmesserly): setting the stack property is not a long term solution.
+ var stack = e.stack;
+ // The stack contains the error message, and the stack is all that is
+ // printed (the exception's toString() is never called). Attempt to replace
+ // the JS message (e.g. TypeError) with the Dart exception's toString().
+ if (typeof stack == 'string') {
+ try { // toString is in a try-catch due to Issue 470.
Jennifer Messerly 2011/11/29 00:46:18 Issue 470 is fixed--can you see if the try-catch c
+ var message = dartEx.toString();
+ if (/^(Type|Range)Error:/.test(stack)) {
+ // Remove JS message.
+ stack = stack.substring(stack.indexOf('\n') + 1);
+ }
+ stack = message + '\n' + stack;
+ } catch(_) {
+ stack = '' + dartEx.constructor.name + ': (corrupt)\n' + stack;
+ }
+ }
+ dartEx.stack = stack;
+ return dartEx;
+ }
+
if (e instanceof TypeError) {
switch(e.type) {
case 'property_not_function':
case 'called_non_callable':
if (e.arguments[0] == null) {
- res = new NullPointerException();
+ return attachStack(new NullPointerException());
} else {
- res = new ObjectNotClosureException();
+ return attachStack(new ObjectNotClosureException());
}
break;
case 'non_object_property_call':
case 'non_object_property_load':
- res = new NullPointerException();
+ return attachStack(new NullPointerException());
break;
case 'undefined_method':
if (e.arguments[0] == 'call' || e.arguments[0] == 'apply') {
- res = new ObjectNotClosureException();
+ return attachStack(new ObjectNotClosureException());
} else {
// TODO(jmesserly): can this ever happen?
- res = new NoSuchMethodException('', e.arguments[0], []);
+ // sra: Yes.
Jennifer Messerly 2011/11/29 00:46:18 Can you add context about what conditions it happe
+ return attachStack(new NoSuchMethodException('', e.arguments[0], []));
}
break;
}
} else if (e instanceof RangeError) {
if (e.message.indexOf('call stack') >= 0) {
- res = new StackOverflowException();
+ return attachStack(new StackOverflowException());
}
}
- if (res) {
- // TODO(jmesserly): setting the stack property is not a long term solution.
- // Also it causes the exception to print as if it were a JS TypeError or
- // RangeError, instead of using the proper toString.
- res.stack = e.stack;
- }
- return res;
+ return e;
}""");
}
« no previous file with comments | « no previous file | frog/frogsh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698