| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (comp-lambda): The init-forms
for optional parameters in a lambda must be compiled in the
environment in which prior arguments are visible.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): All
special forms are handled, so "not handled yet" wording is
inappropriate. Going forward, no special form will be added
without compiler support.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-call-impl):
Instead of allocating N temporary registers for N arguments,
some (or even none) of which may actually be used, we
do this one argument at a time: allocate just one register,
compile the argument expression, and then free the register
immediately if that fragment specifies its own output location
instead of the register. Otherwise keep the register and push
it on a stack. This strategy lowers maximum register use.
Also, since we are pushing the used registers on a stack,
when we call free-tregs, they get liberated in reverse
order of allocation, which keeps things tidy.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler check-treg-leak): New
method.
(usr:compile-toplevel): Free the top-level output register,
then call check-treg-leak to verify all were returned.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (expand-bind-mac-params): The
listp function identifies a recursive parameter, not consp,
because nil is an empty pattern, and not a variable name,
in macro-style parameter lists.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
We use the ifq instruction for compiling (if (eq x y) ...)
and (if (neq x y ...) rather than emitting a call to
eq or neq.
* share/txr/stdlib/compiler.tl (%test-funs-pos%,
%test-funs-neg%, %test-funs%, %test-inv%): New global
%variables.
(comp-if): Recognize when test expression is one of the tests
in %test-funs% and transform into (sys:ift ...) syntax.
Also, minor unrelated change here: (if test) optimized away to
nil if test is a constant expression.
(compiler comp-ift): New method.
(compiler comp-fun-form): Recognize sys:ift in operator
position; hand off to comp-ift.
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Pass form
to comp-fun-form rather than sym and (cdr form).
(compile comp-fun-form): Take just a form argument.
Internally destructure to sym and args with tree-bind.
This will allow some special cases added in the future
to have access to the original form.
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-cond): Replace
pointlessly verbose cond implementation compact implementation
that rewrites cond to combinations of if, progn and smaller
cond. This generates pretty much the same code, and will
automatically benefit from special case translations
applied in if.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler): Remove gcallop and
callop static members.
(%gcall-op%, %call-op%): New global variables.
(compiler comp-fun-form): Use new globals instead of old
static members.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-if): Remove a
trailing maybe-mov from the instruction template that
serves no purpose and can potentially generate an instruction.
|
|
|
|
|
|
| |
* share/txr/stdlib/asm.tl (disassemble-c-d): When printing the
data table, use capital hexadecimal for the dregs, consistent
with the instruction listing.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Very similar issue to the sys:fbind issue fixed some commits
ago. When we are setting up parallel bindings, we don't want
to compile initforms in the original env, because then they
get the same frame level as the new env we are compiling. Thus
(let ((x (let (...)))) ...) is mistranslated. Both lets,
have environments which are siblings of the same parent env,
which puts them on the same level. But their lifetimes at
run-time are nested, so they cannot share the same level.
The VM caught this since frame instructions declare their
absolute level and it must be one higher than the current
level. (I had the foresight to predict this might be a source
of problems and put in the checks.)
* share/txr/stdlib/compiler.tl (compiler comp-let): Same trick
as in sys:fbind case: set up an empty environment above the
initforms, so when an initform creates an environment, it is a
granddaughter of env, and thus a niece rather than sister of
of nenv, consequenty one frame level higher.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler get-dreg): If the
input atom is nil, return the t0 register that always
holds nil.
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler get-dreg):
Restructure code. Don't increment dreg-cntr past 255.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler): new slot,
treg-cntr; slot nregs removed; tregs stack initialized to
empty list.
(compiler alloc-treg): Take from stack if possible,
otherwise create new treg using counter, up to 255.
(usr:compile-toplevel): Referenceco.treg-cntr for register
count, rather than removed co.nreg.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-progn): Since
oreg-discard is conditionally allocated, it must be
only be freed if it had been allocated.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
prof via comp-prof method.
(comp-prof): New method.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/asm.tl (prof): New opcode.
(op-prof): New opcode class.
* vm.c (vm_prof_callback, vm_prof): New static functions.
(vm_execute): Handle PROF opcode via vm_prof.
* vmop.h: Regenerated.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
sys:switch via comp-switch method.
(comp-switch): New method.
|
|
|
|
|
|
|
|
|
|
|
|
| |
When a (flet ...) form is compiled, the function arguments of
the lambda are being bound in the same frame and clashing
against the variables being bound by the construct.
* share/txr/stdlib/compiler.tl (compiler comp-fbind): For the
non-recursive case, insert the dummy empty environment eenv,
and compile the forms in that environment. This raises them
up to the appropriate display level without affecting what
is visible in their scope.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler): New slots, gcallop
and callop.
(compiler comp-fun-form): Restructured to handle apply and
call forms, turning them into better code, exploiting the
call, gcall, apply and gapply instructions.
(compiler comp-call): Take opcode argument so apply calls can
be handled.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
commit 87caead8269055b4791de53be0e03afab01f1dd4, subject
"macros: expand declined form in outer env" broke tagbody.
The tagbody implementation uses a dubious trick of setting up
local macros which return the original form, as a way of
prevening an outer scoped macro from expanding the form. The
above commit specifically changes the behavior in such a way
that this strategy is nullified.
However, the macro fallback feature introduced by the above
commit is exactly what tagbody needs!
* share/txr/stdlib/tagbody.tl (tagbody): Simplify the
treatment of (go label) thanks to new behavior in macro
expander. We no longer need an extra sys:expand pass to
allow inner tagbodies to expand their go forms, and intercept
any unexpanded ones. We have a simple go macrolet which
performs the expansiion when the label is recognized, or else
returns the form to decline expansion. The macro expander
will then fall back by trying the macro in the next outer
scope. Thus, every (go label) is resolved in the tagbody
to which label belongs, or else lands into the top-level
go macro which diagnoses undefined labels.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
sys:catch via comp-catch method.
(comp-catch): New method.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/asm.tl (backpatch-low16, backpatch-high16):
New struct types.
(%backpatch-low16%, %backpatch-high16%): New global variables.
(swtch): New opcode.
(op-swtch): New opcode class.
* vm.c (vm_swtch): New static function.
(vm_execute): Handle SWTCH opcode via vm_swtch.
* vmop.h: Regenerated.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
defmacro via comp-handler-bind method.
(comp-handler-bind): New method.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/asm.tl (abscsr): New instruction.
(op-abscsr): New opcode class, derived from op-retsr.
* share/txr/stdlib/compiler.tl: Handle sys:abscond-from via
comp-return-from method.
(compiler comp-return-from): Handle sys:abscond-from by
switching to abscsr opcode instead of ret pseudo-op.
* vm.c (vm_abscsr): New static function.
(vm_execute): Dispatch ABSCSR opcode.
* vmop.h: Regenerated.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Route
block* to same helper method as block.
(compiler comp-block): Handle block* also by compiling the
name form and using the resulting value as the name
operand in the block instruction.
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
defsymacro via expand-defsymacro expander.
(expand-defsymacro): New function.
* eval.c (rt_defsymacro): New static function.
(eval_init): register sys:rt-defsymacro intrinsic.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
defmacro via expand-defmacro expander.
(expand-defmacro): New function.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
defun via expand-defun expander.
(expand-defun): New function.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
defvarl via expand-defvarl expander.
(expand-defvarl): New function.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
sys:setqf via comp-setqf.
(compiler comp-setqf): New method.
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-setq): The
output register of the returned frag must be that of the value
calculating frag, not vloc, because in the dynamic variable
case, vloc holds the d-reg with the variable's name, not the
v-reg that receives its value.
(compiler compl-lisp1-setq): Fix same bug which got propagated
by copy-and-paste coding.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle
sys:lisp1-setq via comp-lisp1-setq.
(compiler comp-lisp1-setq): New method.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Handle dwim
case via comp-dwim.
(compiler comp-dwim): New method.
|
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (vbinding, fbinding): New
structs subtyping binding.
(sys:env lookup-lisp1): New method.
(sys:env extend-var, sys:env extend-var*, sys:env extend-fun):
Instantiate a vbinding or fbinding as appropriate.
This lets us tell whether we have a function or variable
binding after doing a successful lookup-lisp1.
(compiler compile): Add sys:lisp1-value case.
(compiler comp-lisp1-value): New method.
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-fun-form): Add a
caseq form to handle certain top-level functions specially.
Add a case for the call function, handled by comp-call.
(compiler comp-call): New method.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Call
comp-fun-form instead of comp-call.
(compiler comp-call): Rename to comp-fun-form.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Route fun
to comp-fun.
(compiler comp-fun): New method.
|
|
|
|
|
|
|
|
| |
This supports labels and flet.
* share/txr/stdlib/compiler.tl (compiler compile): Route fbind
and lbind to comp-fbind method.
(compiler comp-fbind): New method.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (sys:env extend-fun): The
v register's level is two less than the frame level.
Add missing ppred call; extend-var has it already.
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-call): Pass the
location, not the binding itself, to comp-call-impl.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Wire in
unwind-protect case via comp-unwind-protect method.
(compiler comp-unwind-protect): New method.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler compile): Wire in
tree-bind case via comp-mac-param-bind method.
(compiler comp-mac-param-bind): New method.
|
|
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (expand-bind-mac-params): Take
the context form and error forms as separate arguments instead
of calculating one from the other. Moreover, they are no
longer assumed to be objects to be quoted and inserted but
rather expressions to be substituted into the code directly.
This gives the caller flexibility to make them calculated.
(compiler comp-tree-bind, compiler comp-tree-case): Make the
compensating adjustments to preserve the behavior.
|
|
|
|
|
|
| |
* share/txr/stdlib/asm.tl (assembler dis-listing): Return the
number of instructions that were traversed.
(disassemble-c-d): Print count after instruction listing.
|
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (expand-bind-mac-params): We
don't need the full form for error reporting, because only the
leading symbol is reported in diagnostics. We do need the full
form if the :form parameter is used. If :form is not used,
then a compiled function need not carry the entire form in its
data table.
|
|
|
|
|
|
|
|
|
| |
var is sys:var when we're working in the system package.
This sometimes confuses the code walker, because
(sys:var X) is the implementation of the @X notation.
* share/txr/stdlib/compiler.tl (expand-bind-mac-params): Use
sym instead of var.
|
|
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-prog1): prog1
already uses progn. When using progn, though, it should append
the nil form to the tail, otherwise progn will spare the last
from from being eliminated, leaving an unused constant in the
data table.
|
|
|
|
|
|
| |
* share/txr/stdlib/compiler.tl (compiler comp-progn):
Eliminate any form which is a constant or a symbol,
unless it appears in the last position.
|