* module/system/xref.scm (ensure-callers-db): OK! Since we can see the
same variable twice, e.g. in different modules, keep a unified hash of
seen vars and modules. Prevents duplicates in procedure-callers.
* module/system/xref.scm (program-callee-rev-vars): It's possible to get
duplicates when combining callees of inner procedures, so ignore dups.
Quadratic, boo.
* libguile/extensions.h: Define a scm_t_extension_init_func.
* libguile/frames.c:
* libguile/instructions.c:
* libguile/objcodes.c:
* libguile/programs.c:
* libguile/vm.c: Register extension init funcs. Should play nicer with a
static Guile, in addition to working on Darwin with non-default
installation prefixes without munging DYLD_LIBRARY_PATH.
* module/system/vm/frame.scm:
* module/system/vm/instruction.scm:
* module/system/vm/objcode.scm:
* module/system/vm/program.scm:
* module/system/vm/vm.scm: Use load-extension.
* module/oop/goops.scm (method-source): Don't throw an error if this
method has no source.
(method-formals): New generic function, the complement of
method-specializers for introspection.
* module/system/xref.scm (procedure-callers): Rework to calculate the
callers of a *variable*, not of a value. This is because the
module-observers only get fired when the module changes, not with the
variables change values. Also accept either a variable, a symbol
(resolved in the current module), or a modname . symname pair.
* module/system/xref.scm: Implement procedure-callers, as the inverse of
procedure-callees, with a cache invalidated by changes in modules.
* module/ice-9/boot-9.scm (module-use!): Don't poke module observers when
module-use! is called for an already-used module.
* module/system/xref.scm (hacky-procedure-callees): Add a
procedure-callees implementation for procedures with source, that
currently does nothing. Not sure what to do, going into the future.
* module/language/ghil/compile-glil.scm (codegen): Push a program's
source locations before copying external args to heap -- perhaps fixes
(program-source p 0) for some programs.
* module/language/glil/decompile-assembly.scm (decompile-load-program):
Take another arg, the object vector. Emit <glil-bind> and <glil-unbind>
correctly. Properly unparse properties. Just have to deal with source
locations now.
* module/language/glil/decompile-assembly.scm: A first pass at an
assembly->glil decompiler. Works for a small subset of programs.
* module/Makefile.am (GLIL_LANG_SOURCES):
* module/language/glil/spec.scm (glil): Add the decompiler.
* module/ice-9/annotate.scm (set-annotation-stripped!): Fix prototype to
correspond to what syncase needs.
* module/ice-9/psyntax.scm (strip-annotation): Use `if', not `when', for
portability.
* module/ice-9/psyntax-pp.scm: Regenerate.
* module/ice-9/annotate.scm (deannotate/source-properties): Version of
deannotate that sets source properties on the resulting expressions.
* module/ice-9/syncase.scm (sc-macro, syncase): Annotate expressions
before they go into syncase, and deannotate/source-properties when they
come out. The upshot is that syncase now understands source
information, yay!
* module/ice-9/psyntax.scm (build-annotated): New helper, used by the
output constructors.
(build-application, build-conditional, build-lexical-reference)
(build-lexical-assignment, build-global-reference)
(build-global-assignment, build-global-definition, build-lambda)
(build-primref, build-data, build-sequence, build-let)
(build-named-let, build-letrec, build-lexical-var): Use
build-annotated, so we produce annotated source if we have source
information.
* module/ice-9/psyntax-pp.scm: Regenerated.
* module/ice-9/annotate.scm (<annotation>): Slightly more concise
printing.
(annotate): Don't create annotations if we have no source info.
* module/ice-9/psyntax.scm (annotation?): Remove this definition, as we
now provide annotation support.
* module/ice-9/psyntax-pp.scm: Regenerated.
* module/ice-9/syncase.scm: Use (ice-9 annotate).
* module/language/scheme/expand.scm (eval-when): Define the eval-when
transformer.
* module/ice-9/boot-9.scm (eval-when): Replace eval-case with eval-when.
Eval-when is *much* simpler, and more expressive to boot. Perhaps in
the future we'll get 'visit and 'revisit too.
* module/ice-9/deprecated.scm (eval-case): Provide mostly-working
deprecated version of eval-case.
* module/ice-9/boot-9.scm (defmacro, define-macro): Relax condition: we
can make defmacros that are not at the toplevel now. But in the future
we should replace this implementation of defmacros with one written in
syntax-case.
(define-module, use-modules, use-syntax): Allow at non-toplevel.
(define-public, defmacro-public, export, re-export): Don't evaluate at
compile-time, I can't see how that helps things. Allow `export' and
`re-export' at non-toplevel.
* module/ice-9/getopt-long.scm:
* module/ice-9/i18n.scm:
* module/oop/goops.scm:
* module/oop/goops/compile.scm:
* module/oop/goops/dispatch.scm: Switch to use eval-when, not
eval-case.
* module/language/scheme/compile-ghil.scm (eval-when): Replace eval-case
transformer with eval-when transformer. Sooooo much simpler, and it
will get better once we separate expansion from compilation.
* module/language/scheme/expand.scm (quasiquote): Hm, expand quasiquote
properly. Not hygienic. Syncase needed.
(lambda): Handle internal defines with docstrings propertly.
* module/language/scheme/expand.scm: New module, implements a separate
expansion phase, not interleaved with compilation.
* module/language/scheme/amatch.scm: Helper for expand.scm, it's pmatch
with support for annotated source.
* module/ice-9/Makefile.am (SOURCES): Add annotate.scm to build list --
early on because it will be used in the compiler.
* module/ice-9/annotate.scm: Fix the printer, default to unstripped
(whatever that is), and add a deannotator.
* module/system/base/compile.scm (call-with-compile-error-catch): Fix for
new representation of source locations.
* module/Makefile.am (SCHEME_LANG_SOURCES): Add amatch and expand.
* module/language/ecmascript/compile-ghil.scm: Use -> to make the ES
compiler more readable. Fix bugs in do, while, and for, whereby we were
missing ->boolean calls.
* module/language/ghil/compile-glil.scm (optimize*): Add a note.
* module/system/base/syntax.scm (transform-record): Access the common
slots once at the beginning. Cuts down on the number of toplevel refs
needed by the generated code.
* module/system/base/syntax.scm (transform-record): Introduce a ->
binding inside the body, that produces records of the same type.
* module/language/ghil/compile-glil.scm (optimize*): Remove our ->ghil
definition, as transform-record introduces a -> binding for us. Nice.
* module/language/ghil/compile-glil.scm (optimize*): Rewritten optimizer
-- not yet in use, but it's closer to the code that I'd like to write.
* module/system/base/syntax.scm (transform-record): New crazy macro,
makes GHIL a little less painful to work with.
* module/system/vm/program.scm (program-arguments): New function, used by
procedure-arguments.
* module/ice-9/session.scm (procedure-arguments): New exported function,
returns an alist describing the given procedure.
* am/guilec (.scm.go): Create the target's directory, in case
$(builddir) != $(srcdir).
* configure.in: Don't output any makefile under `module/system' or
`module/language'.
* module/Makefile.am (SUBDIRS): Remove `language' and `system'. Add `.'
to the front.
(modpath, SOURCES, SCHEME_LANG_SOURCES, ECMASCRIPT_LANG_SOURCES,
GHIL_LANG_SOURCES, GLIL_LANG_SOURCES, ASSEMBLY_LANG_SOURCES,
BYTECODE_LANG_SOURCES, OBJCODE_LANG_SOURCES, VALUE_LANG_SOURCES): New
variables, taken from former `Makefile.am' files in sub-directories.
* module/system/repl/repl.scm (meta-reader): If the (next-char #t)
returns EOF, return that EOF directly, as it seems that with guile -q,
the subsequent `read' actually waits for another C-d. Dunno why.
* module/system/base/compile.scm (call-with-output-file/atomic): Temp
files get created 0600. After we're done writing, chmod them to
something in line with the user's umask.
* module/language/ecmascript/base.scm (prop-keys): New method, returns
the list of keys of props of this instance.
* module/language/ecmascript/impl.scm: Refactor the global object into a
special kind of module object. Provide a prop-keys implementation for
module objects.
* module/language/ecmascript/compile-ghil.scm (comp): Compile for-in.
* module/language/ecmascript/impl.scm: Reshuffly things, and implement
make-enumerator, a helper for use in for-in statements.
* module/language/ecmascript/parse.scm (parse-ecmascript): Fix parsing of
for (var foo in bar) {}...
* module/language/ecmascript/impl.scm: Add <js-module-object>, that wraps
a module. Add js-require, a javascript-happy function that returns an
object that wraps a Guile module. Bind it to `require' in the default
environment.
* module/language/ecmascript/tokenize.scm: Attach source information to
tokens. We have to enhance the lalr parser to actually let this
information propagate through, though...