From ca7c8eb9a3a54d1c6687f58642998af0039eb184 Mon Sep 17 00:00:00 2001 From: Danny Yoo Date: Mon, 11 Jul 2011 15:48:58 -0400 Subject: [PATCH] Chased issue where we lose the trampoline down to incorrect use of setTimeout. Yikes. --- image/private/js-impl.js | 29 ++++++++++++--------- js-assembler/package.rkt | 2 +- js-assembler/runtime-src/baselib-modules.js | 29 +++++++++++++++------ js-assembler/runtime-src/runtime.js | 18 ++++--------- 4 files changed, 43 insertions(+), 35 deletions(-) diff --git a/image/private/js-impl.js b/image/private/js-impl.js index b3a65ae..83ede7f 100644 --- a/image/private/js-impl.js +++ b/image/private/js-impl.js @@ -12,6 +12,7 @@ var checkImage = plt.baselib.check.makeCheckArgumentType( var Closure = plt.baselib.functions.Closure; +var finalizeClosureCall = plt.baselib.functions.finalizeClosureCall; var PAUSE = plt.runtime.PAUSE; @@ -61,27 +62,29 @@ EXPORTS['image-url'] = new Closure( function(MACHINE) { var url = checkString(MACHINE, 'image-url', 0); - PAUSE(function(restart) { + PAUSE( + function(restart) { var rawImage = new Image(); rawImage.onload = function() { restart(function(MACHINE) { - finalizeClosureCall( - makeFileImage( - path.toString(), - rawImage)); - }) - }); - rawImage.onerror = - (function(e) { + finalizeClosureCall( + MACHINE, + makeFileImage(url.toString(), + rawImage)); + }); + }; + rawImage.onerror = function(e) { restart(function(MACHINE) { plt.baselib.exceptions.raise( MACHINE, new Error(plt.baselib.format.format( - "unable to load: ~a", - url))); + "unable to load ~a: ~a", + url, + e.message))); }); - }); - rawImage.src = path.toString(); + } + rawImage.src = url.toString(); + } ); }, 1, diff --git a/js-assembler/package.rkt b/js-assembler/package.rkt index b859b68..061e330 100644 --- a/js-assembler/package.rkt +++ b/js-assembler/package.rkt @@ -155,7 +155,7 @@ MACHINE.modules[~s] = (define (assemble-modinvoke path after) (let ([name (rewrite-path (path->string path))]) (format "if (! MACHINE.modules[~s].isInvoked) { - MACHINE.modules[~s].invoke(MACHINE, + MACHINE.modules[~s].internalInvoke(MACHINE, function() { /////////////////////////// diff --git a/js-assembler/runtime-src/baselib-modules.js b/js-assembler/runtime-src/baselib-modules.js index 2418b2a..18a95bf 100644 --- a/js-assembler/runtime-src/baselib-modules.js +++ b/js-assembler/runtime-src/baselib-modules.js @@ -26,6 +26,17 @@ // External invokation of a module. 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; succ = succ || function(){}; fail = fail || function(){}; @@ -33,22 +44,22 @@ var oldErrorHandler = MACHINE.params['currentErrorHandler']; var afterGoodInvoke = function(MACHINE) { MACHINE.params['currentErrorHandler'] = oldErrorHandler; - setTimeout(succ, 0); + succ(); }; if (this.isInvoked) { - setTimeout(succ, 0); + succ(); } else { MACHINE.params['currentErrorHandler'] = function(MACHINE, anError) { MACHINE.params['currentErrorHandler'] = oldErrorHandler; - setTimeout( - function() { - fail(MACHINE, anError) - }, - 0); + fail(MACHINE, anError) }; 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; diff --git a/js-assembler/runtime-src/runtime.js b/js-assembler/runtime-src/runtime.js index 46cd374..53565f5 100644 --- a/js-assembler/runtime-src/runtime.js +++ b/js-assembler/runtime-src/runtime.js @@ -339,8 +339,8 @@ if(this['plt'] === undefined) { this['plt'] = {}; } }; 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); }, 0); }; - setTimeout( - function() { - e.onPause(restart); - }, - 0); + e.onPause(restart); return; } else if (e instanceof HaltError) { MACHINE.running = false; - setTimeout( - function() { e.onHalt(MACHINE); }, - 0); + e.onHalt(MACHINE); return; } else { MACHINE.running = false; - setTimeout( - function() { MACHINE.params.currentErrorHandler(MACHINE, e); }, - 0); + MACHINE.params.currentErrorHandler(MACHINE, e); return; } }