diff options
author | Andy Wingo <wingo@pobox.com> | 2008-09-18 22:49:55 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2008-09-18 22:49:55 +0200 |
commit | d51406fe875ae5040324da19459c3e867df434a3 (patch) | |
tree | 7996c92a31164bd3424c5b84e6ded8617df756f0 /libguile/vm-engine.c | |
parent | 87e7228ff6b76d44ecf63e092fadb5754557e5eb (diff) | |
download | guile-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.c | 5 |
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"); |