Chased issue where we lose the trampoline down to incorrect use of setTimeout. Yikes.
This commit is contained in:
parent
34c9d7954b
commit
ca7c8eb9a3
|
@ -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,
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user