This reorganization kills the ugly module-export-all hacks in
bootstrap.scm and core.scm. In fact, it gets rid of core.scm entirely,
breaking out its functionality into separate files.
* module/system/vm/trace.scm:
* module/system/vm/profile.scm:
* module/system/vm/disasm.scm:
* module/system/vm/debug.scm:
* module/system/vm/conv.scm:
* module/system/vm/assemble.scm:
* module/system/repl/repl.scm:
* module/system/repl/common.scm:
* module/system/base/compile.scm:
* module/system/repl/command.scm: Update for changes, and fix a bug in
procedure-documentation.
* module/system/vm/bootstrap.scm: Just call scm_bootstrap_vm, which
handles setting load-compiled for us.
* module/system/vm/core.scm: Removed, functionality folded into other
modules.
* module/system/vm/frame.scm: Export the C frame procedures here; also
move scheme functions from core.scm here.
* module/system/vm/instruction.scm: New file, exports procedures from
instructions.c.
* module/system/vm/objcode.scm: New file, exports procedures from
objcodes.c.
* module/system/vm/program.scm: New file, exports procedures from
programs.c, and some scheme functions originally from core.scm.
* module/system/vm/vm.scm: New file, from vm.c and core.scm.
* src/Makefile.am (libguile_vm_la_SOURCES): Add bootstrap.h.
* src/bootstrap.h: New file, prototypes scm_bootstrap_vm (), which the
scm_init_* functions call.
* src/frames.h:
* src/frames.c (scm_init_frames):
* src/frames.c (scm_bootstrap_frames):
* src/vm.h:
* src/instructions.h:
* src/instructions.c (scm_init_instructions):
* src/instructions.c (scm_bootstrap_instructions):
* src/objcodes.h:
* src/objcodes.c (scm_bootstrap_objcodes):
* src/objcodes.c (scm_init_objcodes):
* src/programs.h:
* src/programs.c (scm_bootstrap_programs):
* src/programs.c (scm_init_programs):
* src/vm.c (scm_bootstrap_vm):
* src/vm.c (scm_init_vm): Call scm_bootstrap_vm() before doing anything
in an init function. Bootstrap_vm will call bootstrap_instructions(),
etc to initialize types, then set load-compiled to point to
load-compiled/vm.
* src/vm.c (scm_load_compiled_with_vm): Code to load .go files, if
they're present.
* src/vm_loader.c:
* src/vm_scheme.c: Use SYNC_REGISTER, although it's the same as
SYNC_BEFORE_GC. A style issue?
* src/vm_system.c (call, tail-call): Explicitly do a SYNC_REGISTER, not
relying on POP_LIST to do it for us, because POP_LIST won't do it if
there are 0 arguments. The way that this manifested itself to me was
badness after the second (read) call in a repl session. I wish I
understood more about this problem.
* .gitignore: Ignore .go files.
* src/vm_loader.c:
* src/vm_scheme.c:
* src/vm_system.c: Sync the VM's state before calling out to C
procedures that might cons or cause a nonlocal exit.
* src/vm_system.c: Disable those trampoline "optimizations", as they
actually slowed down benchmark/measure.scm '(fibo 30)'. They were
edifying, in that now I have an appreciation of the need for
SYNC_ALL().
* m4/labels-as-values.m4: New file, checks for computed goto.
* configure.in: Use AC_C_LABELS_AS_VALUES.
* module/system/repl/command.scm (procedure-documentation): Extend the
core's procedure-documentation in an ad-hoc way, so that ,help works.
* module/system/vm/core.scm (program-properties): New function.
(program-documentation): New function.
* src/vm_engine.h (DROP, DROPN): Decrement sp before checking for
underflow.
* src/vm_system.c (call, tail-call): Add some optimized dispatch for some
C functions, so that we can avoid consing and the interpreter if
possible. However currently it seems that I'm always getting the
scm_call_* trampolines back.
* module/language/scheme/translate.scm (translate): Adapt to lambda
having a `meta' slot now.
(primitive-syntax-table, parse-lambda-meta): Parse out a docstring from
lambda forms, putting in the <ghil-lambda>'s meta slot.
* module/system/il/compile.scm (optimize, codegen): Passthrough for the
`meta' slot to the <glil-asm> object.
* module/system/il/ghil.scm (<ghil-lambda>): Add meta slot.
* module/system/il/glil.scm (<glil-asm>): Add meta slot.
(unparse): Unparse meta.
* module/system/vm/assemble.scm (preprocess): Pass through the meta slot.
(codegen): So, set the bytespec's meta slot as a list: bindings, source
info, then the tail is the meta-info, which should be an alist.
Currently the only defined key is `documentation', but `name' could
come in the future.
* module/system/vm/core.scm (program-sources): Sources are now in the
cadr...
(program-property): And here we have access to the cddr.
* module/language/scheme/translate.scm (translate, trans)
(make-pmatch-transformers): When recursing into subexpressions, get the
appropriate source location information.
(location): Include the source filename in the location information.
* module/system/il/compile.scm (codegen): Record source locations in more
cases. (This information ends up being part of the procedure metadata,
not the actual codepath.)
* module/system/il/glil.scm (unparse): Don't destructure the source
locations (it's a vector now).
* ice-9/boot-9.scm (eval-case): Define two more conditions:
compile-toplevel and evaluate, as common lisp and chez scheme do.
(defmacro, define-option-interface, define-macro, define-syntax-macro)
(define-module, use-modules, use-syntax, define-public)
(defmacro-public, export, re-export): Add `compile-toplevel' to all
uses of eval-case.
* ice-9/syncase.scm (current-eval-closure): New procedure.
(env->eval-closure): Don't default to the root module: if we have no
environment, we default to the current module via the logic in
current-eval-closure. This is because psyntax's compilation mode
doesn't know about guile modules, and thus won't dump the code to
twiddle the current eval closure.
(putprop, getprop, guile-macro): Use `current-eval-closure'.
At the end, leave the expansion-eval-closure set to #f.
When you use GDS to evaluate Scheme code from Emacs, you can now use
`C-u' to indicate that you want to single step through that code. See
`Evaluating Scheme Code' in the manual for more details.
* scheme-using.texi (Evaluating Scheme Code): Document use of
`C-u' prefix with evaluation commands.
* gds-scheme.el (gds-eval-region, gds-eval-expression)
(gds-eval-defun, gds-eval-last-sexp): Support `C-u' prefix,
meaning that user wants to single step through the code.
* gds-client.scm (handle-nondebug-protocol): Add support for
setting a trap on code that is about to be evaluated.
* configure.in: Update stack direction test to be like that in
Autoconf _AC_LIBOBJ_ALLOCA and Gnulib; specifically in involving a
function calling itself.
* benchmark/lib.scm: Add a comment, update the loop disassembly. Loop is
now faster in the VM, thankfully.
* src/vm_engine.h (CACHE_PROGRAM): Only release and regrab the object
array handle if the program changed. That is to say, optimize the
self-tail-recursive case. But perhaps the thing to optimize here are
the procedure calls themselves. Worth looking at in the future.
* module/system/il/inline.scm: New module, implements generic inlining of
scheme functions. It even does the right thing regarding (define
arity:nopt caddr) and such. So now there are many more inlines: the
arithmetics, `apply', the caddr family, etc. This makes the benchmarks
*much* faster.
* module/language/scheme/translate.scm (trans): Remove the
%scheme-primitives code in favor of the generic (scheme il inline)
code. Adds inlining for +, -, =, etc.
* src/vm.c (vm_puts): Fix to work.
* module/system/base/compile.scm (system): Export load/compile also.
* module/system/il/compile.scm (optimize): Further debitrotting, but I
haven't tried this function yet. It seems that <ghil-inst> was what
<ghil-inline> is.
* module/system/il/ghil.scm (*core-primitives*, *macro-module*)
(ghil-primitive-macro?, ghil-macro-expander, ghil-primitive?): Remove
these unused things.
* module/system/il/macros.scm: Removed, replaced with inline.scm.
* module/system/vm/assemble.scm (stack->bytes): Before, the final
serialization code did an (apply u8vector (apply append (map
u8vector->list ...))). Aside from the misspelling of append-map, this
ends up pushing all elements of the u8vector on the stack -- assuredly
not what you want. But besides even that, I think that pushing more
than 32k arguments on the stack brings out some other bug that I think
was hidden before, because now we actually use the `apply' VM
instruction. Further testing is needed here, I think. Fixed the code to
be more efficient, which fixes the manifestation of this particular
bug: a failure to self-compile after inlining was enabled.
* module/system/vm/bootstrap.scm: New module, serves to bootstrap
boot-9's `load-compiled'. That way when we load (system vm core), we're
loading compiled code already.
* module/system/vm/core.scm: Use (system vm bootstrap).
* src/guilec.in: Use the bootstrap code, so that we really are compiling
with an entirely compiled compiler.
* module/system/repl/repl.scm (default-catch-handler): An attempt at
making the repl print a backtrace; more work needed here.
* module/system/vm/frame.scm (make-frame-chain): Fix some misspellings --
I think, anyway.
* guilec.mk: New file, to be included when building .go files.
* module/language/scheme/Makefile.am:
* module/system/base/Makefile.am:
* module/system/il/Makefile.am:
* module/system/repl/Makefile.am:
* module/system/vm/Makefile.am: Use guilec.mk.
* module/system/base/compile.scm (compiled-file-name): Work on the
basename of a file, so that we always create files in the directory
where we run. Perhaps should add a -o option to guilec in the future.
* Makefile.am: Actually recurse into module/ in a normal build.