Browse Source

Fixes issue #775

Nicolas Petton 11 years ago
parent
commit
f891079524
1 changed files with 30 additions and 1 deletions
  1. 30 1
      support/boot.js

+ 30 - 1
support/boot.js

@@ -901,13 +901,42 @@ function RuntimeBrik(brikz, st) {
 		return result;
 	}
 
+	/* Wrap a JavaScript exception in a Smalltalk Exception. 
+	 
+	 In case of a RangeError, stub the stack after 100 contexts to
+	 avoid another RangeError later when the stack is manipulated. */
 	function wrappedError(error) {
 		var errorWrapper = st.JavaScriptException._on_(error);
+		var context = st.getThisContext();
+		if(isRangeError(error)) {
+			stubContextStack(context);
+		}
+		// Set the error to signaled state in the Smalltalk-side
 		try { errorWrapper._signal(); } catch (ex) {}
-		errorWrapper._context_(st.getThisContext());
+		errorWrapper._context_(context);
 		return errorWrapper;
 	}
 
+	/* Stub the context stack after 100 contexts */
+	function stubContextStack(context) {
+		var currentContext = context;
+		var contexts = 0;
+		while(contexts < 100) {
+			if(currentContext) {
+				currentContext = currentContext.homeContext;
+			}
+			contexts++;
+		}
+		if(currentContext) {
+			currentContext.homeContext = undefined;
+		}
+	}
+
+	function isRangeError(error) {
+		return error.constructor === RangeError;
+	}
+
+
 	/* Handles Smalltalk errors. Triggers the registered ErrorHandler
 		(See the Smalltalk class ErrorHandler and its subclasses */