(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/compile-tree-il.scm: Remove import of
"(language tree-il eval)".
(defmacro): Use standard "eval".
* module/language/elisp/runtime.scm: Remove import of "(language tree-il eval)".
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/boot.el (eval): Update with simplified definition.
* module/language/elisp/compile-tree-il.scm: Import "(language tree-il eval)".
(eval-when-compile): Use eval-elisp.
(defmacro): Use eval-tree-il.
* module/language/elisp/runtime.scm: Import "(language tree-il eval)".
(eval-elisp): Use "eval" to evaluate compiled form within current-module.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/compile-tree-il.scm (compile-pair): Use
compile-expr-1 instead of compile-expr.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/compile-tree-il.scm (defmacro): Check to see
whether toplevel? is true before compiling a macro.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/compile-tree-il.scm (let): Conditionally invoke
make-body within make-dynlet or just on its own depending on whether
or not dynamic? is null?.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/compile-tree-il.scm (progn): Use compile-expr-1
instead of compile-expr.
(toplevel?, compile-time-too?): New fluids.
(eval-when): New special form.
(compile-expr, compile-expr-1): compile-expr is renamed to
compile-expr-1, and compile-expr is now a procedure which, if
fulid-ref of toplevel? is true, will call compile-expr-1 with
toplevel? fulid bound to #f. Otherwise, continue with compile-expr-1.
(compile-tree-il): Set toplevel? and compile-time-too? fluids to #t
during evaluation.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/boot.el (null, consp, listp, car, cdr): Update
to use defsubst.
(atom): New variable, using defsubst.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/boot.el (%define-compiler-macro): New macro.
* module/language/elisp/compile-tree-il.scm: New function.
(compile-pair): Update to handle %compiler-macro condition.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/compile-tree-il.scm (defconst, defvar): Use
proclaim-special!.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/boot.el
(progn, eval-when-compile, if, defconst, defvar, setq, let, flet)
(labels, let*, function, defmacro, quote): Removed.
* module/language/elisp/compile-tree-il.scm (special-operators): Removed.
(compound-pair): Use find-operator to check if a 'special-operator
rather than checking the now removed special-operators table.
* module/language/elisp/runtime.scm (defspecial): Update to use
set-symbol-function!
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/runtime.scm (value-slot-module)
(function-slot-module, plist-slot-module): Update to set #:pure to #t.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/runtime.scm:
(symbol-default-bound?, symbol-default-value, set-symbol-default-value!):
New procedure aliases. Export their symbols.
(emacs!): Update to accept new parameters dref, dset, dboundp.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/elisp/bindings.scm (get-lexical-binding)
(get-function-binding): Use cadr instead of fluid-ref on slot.
(with-fluids**): New procedure.
(with-symbol-bindings, with-function-bindings): Use with-fluids**.
Also stop using "make-fluid", use "(list #f #f)" instead as default
lexical-bindings hashtable value.
(with-lexical-bindings): Drop the error checking for invalid targets.
* module/language/elisp/boot.el (defun, save-excursion)
(save-current-buffer, save-restriction, track-mouse, setq-default)
(catch, condition-case): New macros.
(omega, eval, gensym, interactive, autoload-do-load, fset, prin1)
(backtrace-frame, backtrace, %set-eager-macroexpansion-mode): New functions.
(null, consp, listp, car, cdr, make-symbol, signal): Wrap in eval-and-compile.
(prog1, cond, or, while): Update to make use of gensym.
(unwind-protect): Switch from funcall to %funcall.
(%functionp): Rename from functionp.
(%indirect-function): Update to use %functionp instead of functionp.
Add check for if object is null, signaling void-function. Instead of
calling symbol-function directly, call via %funcall from the module
"(language elisp runtime)".
(fset): Significant additions and refactoring.
(gload): Renamed from fload.
(defvaralias, nthcdr, nth, eq): Move functions to a different location.
(eq): Also stop using null.
(dolist): Remove quasiquoting, build list manually.
(random): Fix indentation.
(progn, eval-when-compile, if, defconst, defvar, setq, let, flet)
(labels, let*, function, defmacro, quote): Protect as special
operators by raising error if invoked as a function.
* module/language/elisp/compile-tree-il.scm: Import "(ice-9 format)".
Export compile-%function.
(lexical-binding, handle-var-def, defun, valid-symbol-list-arg?)
(process-options!): Remove.
(reference-variable): Adjust functions passed to access-variable.
(global?): Drop module parameter, use value-slot instead.
(ensure-globals!, set-variable!, parse-body-1, parse-lambda-list)
(compile-lambda, defconst, defvar, let, let*, compile-pair): Refactor.
(reference-function): Use '(elisp-functions) instead of function-slot.
(bind-lexically?): Drop module parameter, simplify.
(make-dynlet): Switch from using make-primcall to make-call.
(find-operator): Switch from using resolve-interface/resolve-module
to using function-slot.
(if, defconst, defvar, let, let*, flet, labels, guile-ref)
(guile-private-ref, guile-primitive, defmacro, `, quote, %funcall)
(%set-lexical-binding-mode): Add error checking.
(setq): Pass in args to report-error.
(function): Simplified, now calling %function.
(%function): New function, based on prior "function". Refactor, including
adding support for matching against a closure.
(%set-lexical-binding-mode): Switch from using fluid-set! to
set-lexical-binding-mode.
(special-operators): New variable. Build from following for-each
statement.
(compile-tree-il): Drop call to "process-options!"
* module/language/elisp/lexer.scm: Import "(language elisp runtime)".
(lex): Switch from using "list->string" to "make-lisp-string".
* module/language/elisp/runtime.scm: Use modules "(ice-9 format)",
"(system base compile)".
Remove from export list list, removing ensure-fluid!, symbol-fluid!,
set-symbol-fluid!. Add to export list ensure-dynamic!, symbol-name,
symbol-plist, set-symbol-plist!, bind-symbol, symbol-desc, proclaim-symbol!
special? emacs! unbound, lexical-binding?, set-lexical-binding-mode,
log!, eval-elisp, local-eval-elisp, make-lisp-string, lisp-string?
(make-list-string, lisp-string?) New function aliases.
(value-slot-module, function-slot-module): Adjust module resolution.
(nil_, t_): New variables.
(ensure-fluid!, symbol-fluid, set-symbol-fluid!): Removed.
(lexical-binding, unbound): New variables.
(lexical-binding?, set-lexical-binding-mode, unbound, dynamic?)
(make-dynamic, dynamic-ref, dynamic-set!, dynamic-unset!)
(dynamic-bound?, dynamic-bind, ensure-present!, ensure-desc!)
(schemify, symbol-name, symbol-desc, ensure-dynamic!, symbol-dynamic)
(set-symbol-plist!, special?, proclaim-special!, emacs!, eval-elisp)
(make-string): New procedures.
(symbol-value): Use dynamic-ref! instead of fluid-ref!.
(set-symbol-value!): Use dynamic-set! instead of fluid-set!.
(symbol-function, set-symbol-function!, symbol-bound?)
(symbol-fbound?, makunbound!, fmakunbound!): Refactor, including
adjusting how module resolution is being done.
* module/language/elisp/spec.scm: Import module "(system vm vm)".
Setup elisp-symbols, elisp-functions, elisp-plists.
Use "set-default-vm-engine!" and "set-vm-engine!" to be set to
'debug.
(elisp): Comment out joiner.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* module/language/cps/types.scm (constant-type): No longer error
if type not determined. Return &all-types instead.
(Best-ability ChangeLog annotation added by Christopher Allan Webber.)
* libguile/loader.c (load_thunk_from_memory): Refactor, adding
"constants" argument and passing to "init" if appropriate.
(load_thunk_from_file): Call "load-thunk-from-memory" with
"constants" set to #f.
(scm_load_thunk_from_memory): Instead of a bytevector, accept
a cons of "(bytevector . constants)", where constants is either
a vector or #f. Pass this into "load_thunk_from_memory".
* module/language/bytecode/spec.scm: Adapt printer.
* module/language/cps/compile-bytecode.scm (compile-bytecode):
New variable.
* module/system/repl/command.scm (disassemble):
Adapt to expect pair which includes bytevector as its car.
* module/system/vm/assembler.scm <asm>: Add "to-file?" slot.
(fresh-block): New variable.
(make-assembler): Adapt to expect "to-file?" keyword argument.
(intern-constant): Support "asm-to-file?" in checks.
(emit-init-constants, link-data): Likewise.
(link-assembly): Update logic for handling "(bytevector . constants)"
pair, as well as the expectations of its invocation by compile-bytecode.
* module/language/cps/types.scm (type-entry-saturating-union): Fix range
saturation in the negative direction. Previously we were artificially
truncating negative range ends to zero.
* module/language/cps/optimize.scm (cps-default-optimization-options):
Add missing #:simplify? option. Otherwise the simplification pass was
running even at -O0.
* module/language/tree-il/peval.scm (peval): In test context,
fold (let ((x EXP)) (if x x ALT)) to (if EXP #t ALT). This reduces
the number of boolean literals that the compiler has to reify, by
causing EXP to evaluate in test context instead of value context.
Also, rotate `let' out of the test part of conditionals, for the same
reason.
* module/language/cps/simplify.scm (compute-eta-reductions): Eta-reduce
branches as well, so that passing a constant to a branch will fold to
the true or false branch, provided that the test variable was just
used in the branch.
* module/language/cps/reify-primitives.scm (primitive-module): Add cases
for SRFI-4 primitives. These primitives are only treated as such for
the purposes of Tree-IL primitive expansion; perhaps the right fix is
elsewhere, but it's here for now.
* module/language/cps/types.scm (&min/0, &min/s64, &max/s64, &max/size)
(&max/u64, &max/vector): New clamped variable range accessors. Use
them in type inferrers.
* module/language/cps/utils.scm (intmap-map): Use transient intmap-add!
on an empty intmap to build the result instead of intmap-replace! on
the argument. Avoids spooky action-at-a-distance mutation of the
argument if it happens to be a transient -- although the intmap-fold
will correctly traverse a snapshot of the argument and the result will
be correct, the argument value would be modified in place, causing
strange results to calling code that passes in a transient.
* module/language/cps/intmap.scm: Remove srfi-18 import. We just need
current-thread which is actually defined in (guile), and
importing (srfi srfi-18) raises an error if Guile is compiled without
threads support.
* libguile/vm-engine.c (BR_U64_SCM_COMPARISON): New helper.
(br-if-u64-<=-scm, br-if-u64-<-scm, br-if-u64-=-scm)
(br-if-u64->-scm, br-if-u64->=-scm): New instructions, to compare an
untagged u64 with a tagged SCM. Avoids many u64->scm operations.
* module/language/cps/compile-bytecode.scm (compile-function):
* module/language/cps/effects-analysis.scm:
* module/language/cps/type-fold.scm:
* module/system/vm/assembler.scm:
* module/system/vm/disassembler.scm (code-annotation, compute-labels):
* module/language/cps/primitives.scm (*branching-primcall-arities*): Add
support for new opcodes.
* module/language/cps/specialize-numbers.scm
(specialize-u64-scm-comparison): New helper.
* module/language/cps/specialize-numbers.scm (specialize-operations):
Specialize u64 comparisons.
* module/language/cps/types.scm (true-comparison-restrictions): New helper.
(define-comparison-inferrer): Use the new helper. Add support for
u64-<-scm et al.
* libguile/vm-engine.c (logsub): New op.
* module/language/cps/effects-analysis.scm (logsub):
* module/language/cps/types.scm (logsub):
* module/system/vm/assembler.scm (system): Add support for the new op.
* module/language/tree-il/compile-cps.scm (canonicalize):
Rewrite (logand x (lognot y)) to (logsub x y).
* libguile/vm-engine.c (bv-s8-ref, bv-s16-ref, bv-s32-ref, bv-s64-ref):
Unbox index and return unboxed S32 value.
(bv-s8-set!, bv-s16-set!, bv-s32-set!, bv-s64-set!): Unbox index and
take unboxed S32 value.
(bv-u8-ref, bv-u16-ref, bv-u32-ref, bv-u64-ref)
(bv-s8-set!, bv-s16-set!, bv-s32-set!, bv-s64-set!): Likewise, but
with unsigned values.
(bv-f32-ref, bv-f32-set!, bv-f64-ref, bv-f64-set!): Use memcpy to
access the value so we don't have to think about alignment. GCC will
inline this to a single instruction on architectures that support
unaligned access.
* libguile/vm.c (vm_error_out_of_range_uint64)
(vm_error_out_of_range_int64): New helpers.
* module/language/cps/slot-allocation.scm (compute-var-representations):
All bytevector ref operations produce untagged values.
* module/language/cps/types.scm (define-bytevector-accessors): Update
for bytevector untagged indices and values.
* module/language/cps/utils.scm (compute-constant-values): Fix s64
case.
* module/language/tree-il/compile-cps.scm (convert): Box results of all
bytevector accesses, and unbox incoming indices and values.