starting to do something

This commit is contained in:
Danny Yoo 2011-12-04 18:43:25 -05:00
parent efb978b52f
commit 6904222c69
3 changed files with 143 additions and 137 deletions

View File

@ -128,70 +128,69 @@
var coerseClosureToJavaScript = function (v, MACHINE) { var coerseClosureToJavaScript = function (v, MACHINE) {
var f = function (succ, fail) { var f = function (succ, fail) {
succ = succ || function () {};
fail = fail || function () {};
if (!(baselib.arity.isArityMatching(v.racketArity, arguments.length - 2))) {
var msg = baselib.format.format(
"arity mismatch: ~s expected ~s argument(s) but received ~s",
[v.displayName, v.racketArity, arguments.length - 2]);
return fail(new baselib.exceptions.RacketError(
msg,
baselib.exceptions.makeExnFailContractArity(msg,
MACHINE.captureContinuationMarks())));
}
var oldVal = MACHINE.v;
var oldArgcount = MACHINE.a;
var oldProc = MACHINE.p;
var oldErrorHandler = MACHINE.params['currentErrorHandler'];
var afterGoodInvoke = function (MACHINE) {
plt.runtime.PAUSE(
function (restart) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
var returnValue = MACHINE.v;
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
succ(returnValue);
});
};
afterGoodInvoke.mvr = function (MACHINE) {
plt.runtime.PAUSE(
function (restart) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
var returnValues = [MACHINE.v], i;
for (i = 0; i < MACHINE.a - 1; i++) {
returnValues.push(MACHINE.e.pop());
}
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
succ.apply(null, returnValues);
});
};
MACHINE.c.push(
new baselib.frames.CallFrame(afterGoodInvoke, v));
MACHINE.a = arguments.length - 2;
var i;
for (i = 0; i < arguments.length - 2; i++) {
MACHINE.e.push(arguments[arguments.length - 1 - i]);
}
MACHINE.p = v;
MACHINE.params['currentErrorHandler'] = function (MACHINE, e) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
fail(e);
};
MACHINE.exclusiveLock.acquire( MACHINE.exclusiveLock.acquire(
"js-as-closure", "js-as-closure",
function(releaseLock) { function(releaseLock) {
succ = succ || function () {};
fail = fail || function () {};
if (!(baselib.arity.isArityMatching(v.racketArity, arguments.length - 2))) {
var msg = baselib.format.format(
"arity mismatch: ~s expected ~s argument(s) but received ~s",
[v.displayName, v.racketArity, arguments.length - 2]);
return fail(new baselib.exceptions.RacketError(
msg,
baselib.exceptions.makeExnFailContractArity(msg,
MACHINE.captureContinuationMarks())));
}
var oldVal = MACHINE.v;
var oldArgcount = MACHINE.a;
var oldProc = MACHINE.p;
var oldErrorHandler = MACHINE.params['currentErrorHandler'];
var afterGoodInvoke = function (MACHINE) {
plt.runtime.PAUSE(
function (restart) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
var returnValue = MACHINE.v;
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
succ(returnValue);
});
};
afterGoodInvoke.mvr = function (MACHINE) {
plt.runtime.PAUSE(
function (restart) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
var returnValues = [MACHINE.v], i;
for (i = 0; i < MACHINE.a - 1; i++) {
returnValues.push(MACHINE.e.pop());
}
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
succ.apply(null, returnValues);
});
};
MACHINE.c.push(
new baselib.frames.CallFrame(afterGoodInvoke, v));
MACHINE.a = arguments.length - 2;
var i;
for (i = 0; i < arguments.length - 2; i++) {
MACHINE.e.push(arguments[arguments.length - 1 - i]);
}
MACHINE.p = v;
MACHINE.params['currentErrorHandler'] = function (MACHINE, e) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
fail(e);
};
releaseLock(); releaseLock();
MACHINE.trampoline(v.label); MACHINE.trampoline(v.label);
}); });
@ -223,69 +222,76 @@
// internallCallDuringPause: call a Racket procedure and get its results. // internallCallDuringPause: call a Racket procedure and get its results.
// The use assumes the machine is in a running-but-paused state. // The use assumes the machine is in a running-but-paused state.
var internalCallDuringPause = function (MACHINE, proc, success, fail) { var internalCallDuringPause = function (MACHINE, proc, success, fail) {
var i; MACHINE.exclusiveLock.acquire(
var oldArgcount, oldVal, oldProc, oldErrorHandler; "internal call during pause",
if (! baselib.arity.isArityMatching(proc.racketArity, arguments.length - 4)) { function(releaseLock) {
var msg = baselib.format.format("arity mismatch: ~s expected ~s arguments, but received ~s",
[proc.displayName, proc.racketArity, arguments.length - 4]);
return fail(baselib.exceptions.makeExnFailContractArity(msg,
MACHINE.captureContinuationMarks()));
}
if (isClosure(proc)) { var i;
oldVal = MACHINE.v; var oldArgcount, oldVal, oldProc, oldErrorHandler;
oldArgcount = MACHINE.a; if (! baselib.arity.isArityMatching(proc.racketArity, arguments.length - 4)) {
oldProc = MACHINE.p; var msg = baselib.format.format("arity mismatch: ~s expected ~s arguments, but received ~s",
[proc.displayName, proc.racketArity, arguments.length - 4]);
return fail(baselib.exceptions.makeExnFailContractArity(msg,
MACHINE.captureContinuationMarks()));
}
oldErrorHandler = MACHINE.params['currentErrorHandler']; if (isClosure(proc)) {
var afterGoodInvoke = function (MACHINE) { oldVal = MACHINE.v;
plt.runtime.PAUSE(function (restart) { oldArgcount = MACHINE.a;
MACHINE.params['currentErrorHandler'] = oldErrorHandler; oldProc = MACHINE.p;
var returnValue = MACHINE.v;
MACHINE.v = oldVal; oldErrorHandler = MACHINE.params['currentErrorHandler'];
MACHINE.a = oldArgcount; var afterGoodInvoke = function (MACHINE) {
MACHINE.p = oldProc; plt.runtime.PAUSE(function (restart) {
success(returnValue); MACHINE.params['currentErrorHandler'] = oldErrorHandler;
}); var returnValue = MACHINE.v;
}; MACHINE.v = oldVal;
afterGoodInvoke.mvr = function (MACHINE) { MACHINE.a = oldArgcount;
plt.runtime.PAUSE(function (restart) { MACHINE.p = oldProc;
MACHINE.params['currentErrorHandler'] = oldErrorHandler; success(returnValue);
var returnValues = [MACHINE.v]; });
var i; };
for (i = 0; i < MACHINE.a - 1; i++) { afterGoodInvoke.mvr = function (MACHINE) {
returnValues.push(MACHINE.e.pop()); plt.runtime.PAUSE(function (restart) {
MACHINE.params['currentErrorHandler'] = oldErrorHandler;
var returnValues = [MACHINE.v];
var i;
for (i = 0; i < MACHINE.a - 1; i++) {
returnValues.push(MACHINE.e.pop());
}
MACHINE.v = oldVal;
MACHINE.a = oldArgcount;
MACHINE.p = oldProc;
success.apply(null, returnValues);
});
};
MACHINE.c.push(
new baselib.frames.CallFrame(afterGoodInvoke, proc));
MACHINE.a = arguments.length - 4;
for (i = 0; i < arguments.length - 4; i++) {
MACHINE.e.push(arguments[arguments.length - 1 - i]);
} }
MACHINE.v = oldVal; MACHINE.p = proc;
MACHINE.a = oldArgcount; MACHINE.params['currentErrorHandler'] = function (MACHINE, e) {
MACHINE.p = oldProc; MACHINE.params['currentErrorHandler'] = oldErrorHandler;
success.apply(null, returnValues); MACHINE.v = oldVal;
}); MACHINE.a = oldArgcount;
}; MACHINE.p = oldProc;
fail(e);
};
MACHINE.c.push( releaseLock();
new baselib.frames.CallFrame(afterGoodInvoke, proc)); MACHINE.trampoline(proc.label);
MACHINE.a = arguments.length - 4;
for (i = 0; i < arguments.length - 4; i++) { } else {
MACHINE.e.push(arguments[arguments.length - 1 - i]); fail(baselib.exceptions.makeExnFail(
} baselib.format.format(
MACHINE.p = proc; "Not a procedure: ~e",
MACHINE.params['currentErrorHandler'] = function (MACHINE, e) { proc),
MACHINE.params['currentErrorHandler'] = oldErrorHandler; MACHINE.captureContinuationMarks()));
MACHINE.v = oldVal; }
MACHINE.a = oldArgcount; });
MACHINE.p = oldProc;
fail(e);
};
MACHINE.trampoline(proc.label);
} else {
fail(baselib.exceptions.makeExnFail(
baselib.format.format(
"Not a procedure: ~e",
proc),
MACHINE.captureContinuationMarks()));
}
}; };

View File

@ -195,11 +195,11 @@
// entity who is locking. // entity who is locking.
if (this.locked === false || this.locked === id) { if (this.locked === false || this.locked === id) {
this.locked = id; this.locked = id;
onAcquire.call( setTimeout(
this,
// NOTE: the caller must release the lock or else deadlock!
function() { function() {
setTimeout( onAcquire.call(
that,
// NOTE: the caller must release the lock or else deadlock!
function() { function() {
var waiter; var waiter;
if (that.locked === false) { if (that.locked === false) {
@ -211,9 +211,9 @@
waiter = that.waiters.shift(); waiter = that.waiters.shift();
that.acquire(waiter.id, waiter.onAcquire); that.acquire(waiter.id, waiter.onAcquire);
} }
}, });
0); },
}); 0);
} else { } else {
this.waiters.push({ id: id, this.waiters.push({ id: id,
onAcquire: onAcquire } ); onAcquire: onAcquire } );
@ -442,16 +442,16 @@
var recomputeMaxNumBouncesBeforeYield; var recomputeMaxNumBouncesBeforeYield;
var scheduleTrampoline = function(MACHINE, f) { var scheduleTrampoline = function(MACHINE, f) {
MACHINE.exclusiveLock.acquire( setTimeout(
'scheduleTrampoline', function() {
function(release) { MACHINE.exclusiveLock.acquire(
setTimeout( 'scheduleTrampoline',
function() { function(release) {
release(); release();
return MACHINE.trampoline(f); MACHINE.trampoline(f);
}, });
0); },
}); 0);
}; };
// Creates a restarting function, that reschedules f in a context // Creates a restarting function, that reschedules f in a context

View File

@ -7,4 +7,4 @@
(provide version) (provide version)
(: version String) (: version String)
(define version "1.97") (define version "1.98")