1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

Use scheme.frame.Prompt objects for prompts on dynstack

This commit is contained in:
Ian Price 2015-06-17 20:31:04 +01:00
parent 6f77715457
commit 46597b49dc

View file

@ -309,11 +309,11 @@ var abort_to_prompt = function(self, k, prompt) {
var args = Array.prototype.slice.call(arguments, 3); var args = Array.prototype.slice.call(arguments, 3);
var idx = find_prompt(prompt); var idx = find_prompt(prompt);
var spec = scheme.dynstack[idx]; var frame = scheme.dynstack[idx];
var kont = undefined; // actual value doesn't matter var kont = undefined; // actual value doesn't matter
if (!scheme.is_true(spec[1])) { if (!scheme.is_true(frame.escape_only)) {
var f = function (self, k2) { var f = function (self, k2) {
var args = Array.prototype.slice.call(arguments, 2); var args = Array.prototype.slice.call(arguments, 2);
return k.apply(k,args); return k.apply(k,args);
@ -323,7 +323,7 @@ var abort_to_prompt = function(self, k, prompt) {
unwind(idx); unwind(idx);
var handler = spec[2]; var handler = frame.handler;
args.unshift(kont); args.unshift(kont);
return handler.apply(handler, args); return handler.apply(handler, args);
}; };
@ -383,7 +383,8 @@ scheme.primitives["unwind"] = not_implemented_yet;
// Misc // Misc
scheme.primitives["prompt"] = function(escape_only, tag, handler){ scheme.primitives["prompt"] = function(escape_only, tag, handler){
scheme.dynstack.unshift([tag, escape_only, handler]); var frame = new scheme.frame.Prompt(tag, escape_only, handler);
scheme.dynstack.unshift(frame);
}; };
var unwind = function (idx) { var unwind = function (idx) {
@ -397,10 +398,20 @@ var find_prompt = function(prompt) {
return scheme.is_true(eq(x,prompt)) || scheme.is_true(eq(x,scheme.TRUE)); return scheme.is_true(eq(x,prompt)) || scheme.is_true(eq(x,scheme.TRUE));
}; };
for (idx in scheme.dynstack) { for (idx in scheme.dynstack) {
if (test(scheme.dynstack[idx][0])) { var frame = scheme.dynstack[idx];
if (frame instanceof scheme.frame.Prompt && test(frame.tag)) {
return idx; return idx;
}; };
}; };
// FIXME: should error // FIXME: should error
return undefined; return undefined;
}; };
// Dynstack frames
scheme.frame = {};
scheme.frame.Prompt = function(tag, escape_only, handler){
this.tag = tag;
this.escape_only = escape_only;
this.handler = handler;
};