Chased issue where we lose the trampoline down to incorrect use of setTimeout. Yikes.

This commit is contained in:
Danny Yoo 2011-07-11 15:48:58 -04:00
parent 34c9d7954b
commit ca7c8eb9a3
4 changed files with 43 additions and 35 deletions

View File

@ -12,6 +12,7 @@ var checkImage = plt.baselib.check.makeCheckArgumentType(
var Closure = plt.baselib.functions.Closure; var Closure = plt.baselib.functions.Closure;
var finalizeClosureCall = plt.baselib.functions.finalizeClosureCall;
var PAUSE = plt.runtime.PAUSE; var PAUSE = plt.runtime.PAUSE;
@ -61,27 +62,29 @@ EXPORTS['image-url'] =
new Closure( new Closure(
function(MACHINE) { function(MACHINE) {
var url = checkString(MACHINE, 'image-url', 0); var url = checkString(MACHINE, 'image-url', 0);
PAUSE(function(restart) { PAUSE(
function(restart) {
var rawImage = new Image(); var rawImage = new Image();
rawImage.onload = function() { rawImage.onload = function() {
restart(function(MACHINE) { restart(function(MACHINE) {
finalizeClosureCall( finalizeClosureCall(
makeFileImage( MACHINE,
path.toString(), makeFileImage(url.toString(),
rawImage)); rawImage));
}) });
}); };
rawImage.onerror = rawImage.onerror = function(e) {
(function(e) {
restart(function(MACHINE) { restart(function(MACHINE) {
plt.baselib.exceptions.raise( plt.baselib.exceptions.raise(
MACHINE, MACHINE,
new Error(plt.baselib.format.format( new Error(plt.baselib.format.format(
"unable to load: ~a", "unable to load ~a: ~a",
url))); url,
e.message)));
}); });
}); }
rawImage.src = path.toString(); rawImage.src = url.toString();
}
); );
}, },
1, 1,

View File

@ -155,7 +155,7 @@ MACHINE.modules[~s] =
(define (assemble-modinvoke path after) (define (assemble-modinvoke path after)
(let ([name (rewrite-path (path->string path))]) (let ([name (rewrite-path (path->string path))])
(format "if (! MACHINE.modules[~s].isInvoked) { (format "if (! MACHINE.modules[~s].isInvoked) {
MACHINE.modules[~s].invoke(MACHINE, MACHINE.modules[~s].internalInvoke(MACHINE,
function() { function() {
/////////////////////////// ///////////////////////////

View File

@ -26,6 +26,17 @@
// External invokation of a module. // External invokation of a module.
ModuleRecord.prototype.invoke = function(MACHINE, succ, fail) { ModuleRecord.prototype.invoke = function(MACHINE, succ, fail) {
this._invoke(false, MACHINE, succ, fail);
};
// Internal invokation of a module.
ModuleRecord.prototype.internalInvoke = function(MACHINE, succ, fail) {
this._invoke(true, MACHINE, succ, fail);
};
// Private: general invokation of a module
ModuleRecord.prototype._invoke = function(isInternal, MACHINE, succ, fail) {
var that = this;
MACHINE = MACHINE || plt.runtime.currentMachine; MACHINE = MACHINE || plt.runtime.currentMachine;
succ = succ || function(){}; succ = succ || function(){};
fail = fail || function(){}; fail = fail || function(){};
@ -33,22 +44,22 @@
var oldErrorHandler = MACHINE.params['currentErrorHandler']; var oldErrorHandler = MACHINE.params['currentErrorHandler'];
var afterGoodInvoke = function(MACHINE) { var afterGoodInvoke = function(MACHINE) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler; MACHINE.params['currentErrorHandler'] = oldErrorHandler;
setTimeout(succ, 0); succ();
}; };
if (this.isInvoked) { if (this.isInvoked) {
setTimeout(succ, 0); succ();
} else { } else {
MACHINE.params['currentErrorHandler'] = function(MACHINE, anError) { MACHINE.params['currentErrorHandler'] = function(MACHINE, anError) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler; MACHINE.params['currentErrorHandler'] = oldErrorHandler;
setTimeout( fail(MACHINE, anError)
function() {
fail(MACHINE, anError)
},
0);
}; };
MACHINE.control.push(new plt.baselib.frames.CallFrame(afterGoodInvoke, null)); MACHINE.control.push(new plt.baselib.frames.CallFrame(afterGoodInvoke, null));
plt.runtime.trampoline(MACHINE, this.label); if (isInternal) {
throw that.label;
} else {
plt.runtime.trampoline(MACHINE, that.label);
}
} }
}; };
@ -57,6 +68,8 @@
exports.ModuleRecord = ModuleRecord; exports.ModuleRecord = ModuleRecord;

View File

@ -339,8 +339,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
}; };
var PAUSE = function(onPause) { var PAUSE = function(onPause) {
throw new Pause(onPause); throw(new Pause(onPause));
} };
@ -411,23 +411,15 @@ if(this['plt'] === undefined) { this['plt'] = {}; }
function() { trampoline(MACHINE, thunk); }, function() { trampoline(MACHINE, thunk); },
0); 0);
}; };
setTimeout( e.onPause(restart);
function() {
e.onPause(restart);
},
0);
return; return;
} else if (e instanceof HaltError) { } else if (e instanceof HaltError) {
MACHINE.running = false; MACHINE.running = false;
setTimeout( e.onHalt(MACHINE);
function() { e.onHalt(MACHINE); },
0);
return; return;
} else { } else {
MACHINE.running = false; MACHINE.running = false;
setTimeout( MACHINE.params.currentErrorHandler(MACHINE, e);
function() { MACHINE.params.currentErrorHandler(MACHINE, e); },
0);
return; return;
} }
} }