starting to do something
This commit is contained in:
parent
efb978b52f
commit
6904222c69
|
@ -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()));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -7,4 +7,4 @@
|
||||||
(provide version)
|
(provide version)
|
||||||
(: version String)
|
(: version String)
|
||||||
|
|
||||||
(define version "1.97")
|
(define version "1.98")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user