summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2008-09-18 22:49:55 +0200
committerAndy Wingo <wingo@pobox.com>2008-09-18 22:49:55 +0200
commitd51406fe875ae5040324da19459c3e867df434a3 (patch)
tree7996c92a31164bd3424c5b84e6ded8617df756f0 /libguile/vm-engine.c
parent87e7228ff6b76d44ecf63e092fadb5754557e5eb (diff)
downloadguile-d51406fe875ae5040324da19459c3e867df434a3.tar.gz
lambda-lifting for (lambda () ...) as consumer of call-with-values
* libguile/vm-engine.c (vm_run): Add new error case, vm_error_not_enough_values. * libguile/vm-i-system.c (goto/nargs, call/nargs): So, in these cases, if we get too many values, we don't truncate the values like we do in the single-value continuation case, or in the mvbind case. What to do? I guess we either truncate them here, or only allow the correct number of values. Dunno. Mark the code as a fixme. (truncate-values): New instruction, for mv-bind: checks that the number of values on the stack is compatible with the number of bindings we have arranged for them, truncating if necessary. * module/language/scheme/translate.scm (custom-transformer-table): Compile receive as a primary form -- not so much because it is a primary form, but more to test the mv-bind machinery. Also it's more efficient, I think. * module/system/il/compile.scm (lift-variables!): New helper, factored out of `optimize'. (optimize): Add a few more cases. Adapt `lambda' optimization, which isn't much. I'm not happy with ghil as a mungeable language. Add a case for call-with-values with the second argument is a lambda: lift the lambda. Untested. (codegen): Refactor the push-bindings! code. Compile mv-bind. * module/system/il/ghil.scm (<ghil-mv-bind>): Add mv-bind construct, along with its procedures. * module/system/il/glil.scm (<glil-mv-bind>): Add mv-bind construct, different from the high-level one. It makes sense in the source, I think. * module/system/vm/assemble.scm (codegen): Assemble glil-mv-bind by pushing onto the bindings list, and actually push some code to truncate the values.
Diffstat (limited to 'libguile/vm-engine.c')
-rw-r--r--libguile/vm-engine.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c
index 73990d041..66d821329 100644
--- a/libguile/vm-engine.c
+++ b/libguile/vm-engine.c
@@ -172,6 +172,11 @@ vm_run (SCM vm, SCM program, SCM args)
err_args = SCM_EOL;
goto vm_error;
+ vm_error_not_enough_values:
+ err_msg = scm_from_locale_string ("VM: Not enough values for mv-bind");
+ err_args = SCM_EOL;
+ goto vm_error;
+
#if VM_CHECK_IP
vm_error_invalid_address:
err_msg = scm_from_locale_string ("VM: Invalid program address");