commit bc651b35b90895e2cbeb09380afb90b834f276f0
parent bd4b0e0aa5d742992e7fc94d67b1ddc3c67f067e
Author: Commit-Bot <unknown>
Date: Wed, 9 Jun 2010 15:12:05 +0000
Automatic commit from picoLisp.tgz, From: Wed, 09 Jun 2010 15:12:05 GMT
Diffstat:
17 files changed, 604 insertions(+), 183 deletions(-)
diff --git a/app/lib.l b/app/lib.l
@@ -1,9 +1,9 @@
-# 22jan08abu
+# 08jun10abu
# (c) Software Lab. Alexander Burger
### PDF-Print ###
(dm (ps> . +Ord) ()
- (a4)
+ (a4 (pack "Order" (: nr)))
(font (12 . "Helvetica"))
(eps "img/7fach.eps" 340 150 75)
(window 380 120 120 30
diff --git a/doc64/structures b/doc64/structures
@@ -1,4 +1,4 @@
-# 02jun10abu
+# 07jun10abu
# (c) Software Lab. Alexander Burger
@@ -193,8 +193,8 @@
Method frame:
^
- cls |
- key |
+ <II> cls |
+ <I> key |
LINK ----+ <-- Meth
@@ -218,6 +218,28 @@
LINK ----+ <-- inFrames, outFrames, ctlFrames
+ Coroutine frame:
+ ^
+ X |
+ Y |
+ Z |
+ L |
+ <III> [env] |
+ <II> seg |
+ <I> lim |
+ LINK ----+ <-- co7
+
+
+ Stack segment:
+ <-I> tag # Tag
+ <-II> stk # Stack pointer --+
+ [env] # Environment |
+ Stack ... |
+ X |
+ Y |
+ Z |
+ L <-----------------------+
+
### Memory ###
@@ -263,7 +285,6 @@
+--------------------------+ Mic
-
### Database file ###
+-------------+-+-------------+-+----+
diff --git a/img/7fach.eps b/img/7fach.eps
@@ -1,7 +1,6 @@
%!PS-Adobe-3.0 EPSF-3.0
%%For: Josef Bartl
%%CreationDate: Tue Feb 18 11:34:19 2003
-%%Title: 7fach.eps
%%Creator: Sketch 0.6.7
%%Pages: 1
%%BoundingBox: 35 63 232 148
diff --git a/lib/ps.l b/lib/ps.l
@@ -1,4 +1,4 @@
-# 12nov09abu
+# 08jun10abu
# (c) Software Lab. Alexander Burger
# "*Glyph" "*PgX" "*PgY"
@@ -47,8 +47,9 @@
(pack "-dDEVICEHEIGHTPOINTS=" "*PgY")
Ps Pdf ) ) )
-(de psHead (DX DY)
- (prinl "%!PS-Adobe-1.0")
+(de psHead (DX DY Ttl)
+ (prinl "%!PS-Adobe-2.0")
+ (and Ttl (prinl "%%Title: " @))
(prinl "%%Creator: PicoLisp")
(prinl "%%BoundingBox: 0 0 "
(setq "*DX" DX "*PgX" DX) " "
@@ -58,17 +59,17 @@
(off "*Fonts" "*Lim" "*UL")
(setq "*Size" 12) )
-(de a4 ()
- (psHead 595 842) )
+(de a4 (Ttl)
+ (psHead 595 842 Ttl) )
-(de a4L ()
- (psHead 842 595) )
+(de a4L (Ttl)
+ (psHead 842 595 Ttl) )
-(de a5 ()
- (psHead 420 595) )
+(de a5 (Ttl)
+ (psHead 420 595 Ttl) )
-(de a5L ()
- (psHead 595 420) )
+(de a5L (Ttl)
+ (psHead 595 420 Ttl) )
(de _font ()
(prinl "/" "*Font" " findfont " "*Size" " scalefont setfont") )
@@ -293,11 +294,11 @@
(psEval "Prg") ) )
(de eps (Eps X Y DX DY)
- (prinl "gsave " (or X 0) " " (- "*PgY" (or Y 0)) " translate")
+ (prinl "save " (or X 0) " " (- "*PgY" (or Y 0)) " translate")
(when DX
(prinl DX " 100. div " (or DY DX) " 100. div scale") )
(in Eps (echo))
- (prinl "grestore") )
+ (prinl "restore") )
(====)
diff --git a/lib/tags b/lib/tags
@@ -1,5 +1,5 @@
-! (2560 . "@src64/flow.l")
-$ (2662 . "@src64/flow.l")
+! (2823 . "@src64/flow.l")
+$ (2925 . "@src64/flow.l")
% (2251 . "@src64/big.l")
& (2472 . "@src64/big.l")
* (2070 . "@src64/big.l")
@@ -25,28 +25,28 @@ $ (2662 . "@src64/flow.l")
>> (2306 . "@src64/big.l")
abs (2396 . "@src64/big.l")
accept (139 . "@src64/net.l")
-adr (560 . "@src64/main.l")
-alarm (475 . "@src64/main.l")
+adr (593 . "@src64/main.l")
+alarm (483 . "@src64/main.l")
all (772 . "@src64/sym.l")
-and (1637 . "@src64/flow.l")
+and (1635 . "@src64/flow.l")
any (3758 . "@src64/io.l")
append (1329 . "@src64/subr.l")
apply (581 . "@src64/apply.l")
-arg (1928 . "@src64/main.l")
-args (1904 . "@src64/main.l")
-argv (2549 . "@src64/main.l")
+arg (1963 . "@src64/main.l")
+args (1939 . "@src64/main.l")
+argv (2584 . "@src64/main.l")
as (146 . "@src64/flow.l")
asoq (2938 . "@src64/subr.l")
assoc (2903 . "@src64/subr.l")
-at (2122 . "@src64/flow.l")
+at (2120 . "@src64/flow.l")
atom (2370 . "@src64/subr.l")
-bind (1375 . "@src64/flow.l")
+bind (1373 . "@src64/flow.l")
bit? (2413 . "@src64/big.l")
-bool (1737 . "@src64/flow.l")
-box (839 . "@src64/flow.l")
+bool (1735 . "@src64/flow.l")
+box (837 . "@src64/flow.l")
box? (999 . "@src64/sym.l")
by (1535 . "@src64/apply.l")
-bye (3137 . "@src64/flow.l")
+bye (3400 . "@src64/flow.l")
caaaar (271 . "@src64/subr.l")
caaadr (288 . "@src64/subr.l")
caaar (99 . "@src64/subr.l")
@@ -61,11 +61,11 @@ caddar (409 . "@src64/subr.l")
cadddr (435 . "@src64/subr.l")
caddr (156 . "@src64/subr.l")
cadr (45 . "@src64/subr.l")
-call (2793 . "@src64/flow.l")
+call (3056 . "@src64/flow.l")
car (5 . "@src64/subr.l")
-case (1978 . "@src64/flow.l")
-catch (2478 . "@src64/flow.l")
-cd (2304 . "@src64/main.l")
+case (1976 . "@src64/flow.l")
+catch (2476 . "@src64/flow.l")
+cd (2339 . "@src64/main.l")
cdaaar (464 . "@src64/subr.l")
cdaadr (487 . "@src64/subr.l")
cdaar (179 . "@src64/subr.l")
@@ -87,63 +87,64 @@ chop (1093 . "@src64/sym.l")
circ (816 . "@src64/subr.l")
clip (1784 . "@src64/subr.l")
close (4146 . "@src64/io.l")
-cmd (2531 . "@src64/main.l")
+cmd (2566 . "@src64/main.l")
cnt (1279 . "@src64/apply.l")
+co (2558 . "@src64/flow.l")
commit (1503 . "@src64/db.l")
con (725 . "@src64/subr.l")
conc (781 . "@src64/subr.l")
-cond (1932 . "@src64/flow.l")
+cond (1930 . "@src64/flow.l")
connect (201 . "@src64/net.l")
cons (747 . "@src64/subr.l")
copy (1216 . "@src64/subr.l")
ctl (4086 . "@src64/io.l")
-ctty (2329 . "@src64/main.l")
+ctty (2364 . "@src64/main.l")
cut (1795 . "@src64/sym.l")
-date (2043 . "@src64/main.l")
+date (2078 . "@src64/main.l")
dbck (2092 . "@src64/db.l")
-de (551 . "@src64/flow.l")
+de (549 . "@src64/flow.l")
dec (2004 . "@src64/big.l")
-def (475 . "@src64/flow.l")
+def (473 . "@src64/flow.l")
default (1659 . "@src64/sym.l")
del (1850 . "@src64/sym.l")
delete (1392 . "@src64/subr.l")
delq (1443 . "@src64/subr.l")
diff (2561 . "@src64/subr.l")
-dir (2462 . "@src64/main.l")
-dm (563 . "@src64/flow.l")
-do (2152 . "@src64/flow.l")
-e (2623 . "@src64/flow.l")
+dir (2497 . "@src64/main.l")
+dm (561 . "@src64/flow.l")
+do (2150 . "@src64/flow.l")
+e (2886 . "@src64/flow.l")
echo (4177 . "@src64/io.l")
-env (572 . "@src64/main.l")
+env (605 . "@src64/main.l")
eof (3317 . "@src64/io.l")
eol (3308 . "@src64/io.l")
-errno (1255 . "@src64/main.l")
+errno (1290 . "@src64/main.l")
eval (208 . "@src64/flow.l")
ext (4864 . "@src64/io.l")
ext? (1034 . "@src64/sym.l")
extern (900 . "@src64/sym.l")
-extra (1280 . "@src64/flow.l")
+extra (1278 . "@src64/flow.l")
extract (1084 . "@src64/apply.l")
fifo (1961 . "@src64/sym.l")
-file (2409 . "@src64/main.l")
+file (2444 . "@src64/main.l")
fill (3165 . "@src64/subr.l")
filter (1027 . "@src64/apply.l")
fin (2018 . "@src64/subr.l")
-finally (2536 . "@src64/flow.l")
+finally (2534 . "@src64/flow.l")
find (1188 . "@src64/apply.l")
fish (1479 . "@src64/apply.l")
flg? (2417 . "@src64/subr.l")
flip (1686 . "@src64/subr.l")
flush (4839 . "@src64/io.l")
fold (3341 . "@src64/sym.l")
-for (2241 . "@src64/flow.l")
-fork (2960 . "@src64/flow.l")
+for (2239 . "@src64/flow.l")
+fork (3223 . "@src64/flow.l")
format (1770 . "@src64/big.l")
free (2034 . "@src64/db.l")
from (3336 . "@src64/io.l")
full (1066 . "@src64/subr.l")
fun? (734 . "@src64/sym.l")
-gc (380 . "@src64/gc.l")
+gc (442 . "@src64/gc.l")
ge0 (2372 . "@src64/big.l")
get (2748 . "@src64/sym.l")
getd (742 . "@src64/sym.l")
@@ -151,29 +152,29 @@ getl (3030 . "@src64/sym.l")
glue (1232 . "@src64/sym.l")
gt0 (2383 . "@src64/big.l")
head (1805 . "@src64/subr.l")
-heap (530 . "@src64/main.l")
+heap (538 . "@src64/main.l")
hear (3058 . "@src64/io.l")
host (184 . "@src64/net.l")
id (1034 . "@src64/db.l")
idx (2035 . "@src64/sym.l")
-if (1818 . "@src64/flow.l")
-if2 (1837 . "@src64/flow.l")
-ifn (1878 . "@src64/flow.l")
+if (1816 . "@src64/flow.l")
+if2 (1835 . "@src64/flow.l")
+ifn (1876 . "@src64/flow.l")
in (3982 . "@src64/io.l")
inc (1937 . "@src64/big.l")
index (2609 . "@src64/subr.l")
-info (2366 . "@src64/main.l")
+info (2401 . "@src64/main.l")
intern (875 . "@src64/sym.l")
-ipid (2905 . "@src64/flow.l")
-isa (976 . "@src64/flow.l")
-job (1442 . "@src64/flow.l")
+ipid (3168 . "@src64/flow.l")
+isa (974 . "@src64/flow.l")
+job (1440 . "@src64/flow.l")
journal (977 . "@src64/db.l")
key (3167 . "@src64/io.l")
-kill (2937 . "@src64/flow.l")
+kill (3200 . "@src64/flow.l")
last (2029 . "@src64/subr.l")
length (2685 . "@src64/subr.l")
-let (1492 . "@src64/flow.l")
-let? (1553 . "@src64/flow.l")
+let (1490 . "@src64/flow.l")
+let? (1551 . "@src64/flow.l")
lieu (1163 . "@src64/db.l")
line (3492 . "@src64/io.l")
lines (3645 . "@src64/io.l")
@@ -183,7 +184,7 @@ listen (151 . "@src64/net.l")
lit (183 . "@src64/flow.l")
load (3959 . "@src64/io.l")
lock (1191 . "@src64/db.l")
-loop (2184 . "@src64/flow.l")
+loop (2182 . "@src64/flow.l")
low? (3213 . "@src64/sym.l")
lowc (3243 . "@src64/sym.l")
lst? (2387 . "@src64/subr.l")
@@ -205,8 +206,8 @@ maxi (1377 . "@src64/apply.l")
member (2427 . "@src64/subr.l")
memq (2449 . "@src64/subr.l")
meta (3135 . "@src64/sym.l")
-meth (1102 . "@src64/flow.l")
-method (1066 . "@src64/flow.l")
+meth (1100 . "@src64/flow.l")
+method (1064 . "@src64/flow.l")
min (2341 . "@src64/subr.l")
mini (1428 . "@src64/apply.l")
mix (1251 . "@src64/subr.l")
@@ -215,15 +216,15 @@ n0 (2174 . "@src64/subr.l")
n== (2072 . "@src64/subr.l")
nT (2183 . "@src64/subr.l")
name (499 . "@src64/sym.l")
-nand (1672 . "@src64/flow.l")
-native (1263 . "@src64/main.l")
+nand (1670 . "@src64/flow.l")
+native (1298 . "@src64/main.l")
need (918 . "@src64/subr.l")
-new (850 . "@src64/flow.l")
-next (1911 . "@src64/main.l")
-nil (1755 . "@src64/flow.l")
-nond (1955 . "@src64/flow.l")
-nor (1693 . "@src64/flow.l")
-not (1745 . "@src64/flow.l")
+new (848 . "@src64/flow.l")
+next (1946 . "@src64/main.l")
+nil (1753 . "@src64/flow.l")
+nond (1953 . "@src64/flow.l")
+nor (1691 . "@src64/flow.l")
+not (1743 . "@src64/flow.l")
nth (685 . "@src64/subr.l")
num? (2398 . "@src64/subr.l")
off (1596 . "@src64/sym.l")
@@ -232,9 +233,9 @@ on (1581 . "@src64/sym.l")
onOff (1611 . "@src64/sym.l")
one (1644 . "@src64/sym.l")
open (4108 . "@src64/io.l")
-opid (2921 . "@src64/flow.l")
-opt (2652 . "@src64/main.l")
-or (1653 . "@src64/flow.l")
+opid (3184 . "@src64/flow.l")
+opt (2687 . "@src64/main.l")
+or (1651 . "@src64/flow.l")
out (4002 . "@src64/io.l")
pack (1144 . "@src64/sym.l")
pair (2379 . "@src64/subr.l")
@@ -256,92 +257,94 @@ prinl (4777 . "@src64/io.l")
print (4803 . "@src64/io.l")
println (4834 . "@src64/io.l")
printsp (4819 . "@src64/io.l")
-prog (1773 . "@src64/flow.l")
-prog1 (1781 . "@src64/flow.l")
-prog2 (1798 . "@src64/flow.l")
+prog (1771 . "@src64/flow.l")
+prog1 (1779 . "@src64/flow.l")
+prog2 (1796 . "@src64/flow.l")
prop (2779 . "@src64/sym.l")
-protect (520 . "@src64/main.l")
+protect (528 . "@src64/main.l")
prove (3412 . "@src64/subr.l")
push (1686 . "@src64/sym.l")
push1 (1722 . "@src64/sym.l")
put (2696 . "@src64/sym.l")
putl (2948 . "@src64/sym.l")
-pwd (2293 . "@src64/main.l")
+pwd (2328 . "@src64/main.l")
queue (1918 . "@src64/sym.l")
-quit (976 . "@src64/main.l")
+quit (1009 . "@src64/main.l")
quote (141 . "@src64/flow.l")
rand (2640 . "@src64/big.l")
range (988 . "@src64/subr.l")
rank (2966 . "@src64/subr.l")
-raw (453 . "@src64/main.l")
+raw (461 . "@src64/main.l")
rd (4881 . "@src64/io.l")
read (2498 . "@src64/io.l")
replace (1490 . "@src64/subr.l")
-rest (1957 . "@src64/main.l")
+rest (1992 . "@src64/main.l")
reverse (1665 . "@src64/subr.l")
rewind (4847 . "@src64/io.l")
rollback (1885 . "@src64/db.l")
rot (848 . "@src64/subr.l")
rpc (4986 . "@src64/io.l")
-run (332 . "@src64/flow.l")
+run (331 . "@src64/flow.l")
sect (2513 . "@src64/subr.l")
seed (2625 . "@src64/big.l")
seek (1141 . "@src64/apply.l")
-send (1146 . "@src64/flow.l")
+send (1144 . "@src64/flow.l")
seq (1090 . "@src64/db.l")
set (1480 . "@src64/sym.l")
setq (1513 . "@src64/sym.l")
-sigio (491 . "@src64/main.l")
+sigio (499 . "@src64/main.l")
size (2750 . "@src64/subr.l")
skip (3294 . "@src64/io.l")
sort (3837 . "@src64/subr.l")
sp? (711 . "@src64/sym.l")
space (4781 . "@src64/io.l")
split (1579 . "@src64/subr.l")
-state (2022 . "@src64/flow.l")
+stack (567 . "@src64/main.l")
+state (2020 . "@src64/flow.l")
stem (1974 . "@src64/subr.l")
str (3812 . "@src64/io.l")
str? (1013 . "@src64/sym.l")
strip (1563 . "@src64/subr.l")
sub? (1442 . "@src64/sym.l")
sum (1326 . "@src64/apply.l")
-super (1233 . "@src64/flow.l")
+super (1231 . "@src64/flow.l")
sym (3798 . "@src64/io.l")
sym? (2406 . "@src64/subr.l")
sync (3020 . "@src64/io.l")
-sys (2764 . "@src64/flow.l")
-t (1764 . "@src64/flow.l")
+sys (3027 . "@src64/flow.l")
+t (1762 . "@src64/flow.l")
tail (1896 . "@src64/subr.l")
tell (3090 . "@src64/io.l")
text (1270 . "@src64/sym.l")
-throw (2504 . "@src64/flow.l")
-tick (2873 . "@src64/flow.l")
+throw (2502 . "@src64/flow.l")
+tick (3136 . "@src64/flow.l")
till (3403 . "@src64/io.l")
-time (2176 . "@src64/main.l")
+time (2211 . "@src64/main.l")
touch (1049 . "@src64/sym.l")
trim (1746 . "@src64/subr.l")
-try (1187 . "@src64/flow.l")
-type (929 . "@src64/flow.l")
+try (1185 . "@src64/flow.l")
+type (927 . "@src64/flow.l")
udp (268 . "@src64/net.l")
unify (3810 . "@src64/subr.l")
-unless (1914 . "@src64/flow.l")
-until (2098 . "@src64/flow.l")
-up (659 . "@src64/main.l")
+unless (1912 . "@src64/flow.l")
+until (2096 . "@src64/flow.l")
+up (692 . "@src64/main.l")
upp? (3228 . "@src64/sym.l")
uppc (3292 . "@src64/sym.l")
-use (1586 . "@src64/flow.l")
-usec (2281 . "@src64/main.l")
+use (1584 . "@src64/flow.l")
+usec (2316 . "@src64/main.l")
val (1461 . "@src64/sym.l")
-version (2666 . "@src64/main.l")
+version (2701 . "@src64/main.l")
wait (2982 . "@src64/io.l")
-when (1897 . "@src64/flow.l")
-while (2074 . "@src64/flow.l")
+when (1895 . "@src64/flow.l")
+while (2072 . "@src64/flow.l")
wipe (3088 . "@src64/sym.l")
-with (1343 . "@src64/flow.l")
+with (1341 . "@src64/flow.l")
wr (4970 . "@src64/io.l")
xchg (1536 . "@src64/sym.l")
-xor (1714 . "@src64/flow.l")
+xor (1712 . "@src64/flow.l")
x| (2552 . "@src64/big.l")
+yield (2712 . "@src64/flow.l")
yoke (1187 . "@src64/subr.l")
zap (1063 . "@src64/sym.l")
zero (1629 . "@src64/sym.l")
diff --git a/src/flow.c b/src/flow.c
@@ -1,4 +1,4 @@
-/* 19may10abu
+/* 04jun10abu
* (c) Software Lab. Alexander Burger
*/
@@ -1397,8 +1397,8 @@ static struct { // bindFrame
} Brk;
any brkLoad(any x) {
- if (!Env.brk && isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
- Env.brk = YES;
+ if (!Break && isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
+ Break = YES;
Brk.cnt = 3;
Brk.bnd[0].sym = Up, Brk.bnd[0].val = val(Up), val(Up) = x;
Brk.bnd[1].sym = Run, Brk.bnd[1].val = val(Run), val(Run) = Nil;
@@ -1412,7 +1412,7 @@ any brkLoad(any x) {
val(Run) = Brk.bnd[1].val;
x = val(Up), val(Up) = Brk.bnd[0].val;
Env.bind = Brk.link;
- Env.brk = NO;
+ Break = NO;
}
return x;
}
@@ -1431,7 +1431,7 @@ any doE(any ex) {
inFrame *in;
cell c1, at, key;
- if (!Env.brk)
+ if (!Break)
err(ex, NULL, "No Break");
Push(c1,val(Dbg)), val(Dbg) = Nil;
Push(at, val(At)), val(At) = Brk.bnd[2].val;
diff --git a/src/io.c b/src/io.c
@@ -1,4 +1,4 @@
-/* 30may10abu
+/* 03jun10abu
* (c) Software Lab. Alexander Burger
*/
@@ -1229,6 +1229,8 @@ any token(any x, int c) {
byteSym(Chr, &i, &y);
}
y = Pop(c1);
+ if (unDig(y) == ('L'<<16 | 'I'<<8 | 'N'))
+ return Nil;
if (x = findHash(y, h = Intern + ihash(y)))
return x;
x = consSym(Nil,y);
diff --git a/src/main.c b/src/main.c
@@ -1,4 +1,4 @@
-/* 30may10abu
+/* 04jun10abu
* (c) Software Lab. Alexander Burger
*/
@@ -29,6 +29,7 @@ any ApplyArgs, ApplyBody, DbVal, DbTail;
any Nil, DB, Meth, Quote, T;
any Solo, PPid, Pid, At, At2, At3, This, Dbg, Zap, Ext, Scl, Class;
any Run, Hup, Sig1, Sig2, Up, Err, Msg, Uni, Led, Tsm, Adr, Fork, Bye;
+bool Break;
sig_atomic_t Signal[SIGIO+1];
static int TtyPid;
@@ -476,7 +477,7 @@ void err(any ex, any x, char *fmt, ...) {
}
}
Chr = ExtN = 0;
- Env.brk = NO;
+ Break = NO;
Alarm = Line = Nil;
f.pid = 0, f.fd = STDERR_FILENO, pushOutFiles(&f);
if (InFile && InFile->name) {
diff --git a/src/pico.h b/src/pico.h
@@ -1,4 +1,4 @@
-/* 20may10abu
+/* 04jun10abu
* (c) Software Lab. Alexander Burger
*/
@@ -129,7 +129,6 @@ typedef struct stkEnv {
parseFrame *parser;
void (*get)(void);
void (*put)(int);
- bool brk;
} stkEnv;
typedef struct catchFrame {
@@ -256,6 +255,7 @@ extern any ApplyArgs, ApplyBody, DbVal, DbTail;
extern any Nil, DB, Meth, Quote, T;
extern any Solo, PPid, Pid, At, At2, At3, This, Dbg, Zap, Ext, Scl, Class;
extern any Run, Hup, Sig1, Sig2, Up, Err, Msg, Uni, Led, Tsm, Adr, Fork, Bye;
+extern bool Break;
extern sig_atomic_t Signal[SIGIO+1]; // SIGIO is highest used signal number
/* Prototypes */
diff --git a/src64/defs.l b/src64/defs.l
@@ -1,13 +1,14 @@
-# 03mar10abu
+# 05jun10abu
# (c) Software Lab. Alexander Burger
# Constants
-(equ HEAP (* 1024 1024)) # Heap size in bytes
-(equ CELLS (/ HEAP 16)) # Number of cells in a single heap (65536)
-(equ ZERO (short 0)) # Short number '0'
-(equ ONE (short 1)) # Short number '1'
-(equ TOP (hex "10000")) # Character top
-(equ DB1 (hex "1A")) # Name of '{1}'
+(equ HEAP (* 1024 1024)) # Heap size in bytes
+(equ CELLS (/ HEAP 16)) # Number of cells in a single heap (65536)
+(equ STACK (* 4 1024 1024)) # Default stack segment size
+(equ ZERO (short 0)) # Short number '0'
+(equ ONE (short 1)) # Short number '1'
+(equ TOP (hex "10000")) # Character top
+(equ DB1 (hex "1A")) # Name of '{1}'
# Pointer offsets
(equ I 8)
diff --git a/src64/err.l b/src64/err.l
@@ -1,4 +1,4 @@
-# 02jun10abu
+# 09jun10abu
# (c) Software Lab. Alexander Burger
# Debug print routine
@@ -79,7 +79,7 @@
end
ld (Chr) 0 # Init globals
ld (ExtN) 0
- ld (EnvBrk) 0
+ ld (Break) 0
ld (Alarm) Nil
ld (Sigio) Nil
ld (LineX) ZERO
@@ -159,7 +159,11 @@
ld (EnvYoke) 0
ld (EnvTrace) 0
ld L 0 # Init link register
- ld S (Stack0) # and stack pointer
+ ld S (Stack0) # stack pointer
+ lea A (S 4096) # and stack limit
+ sub A (StkSize)
+ ld (StkLimit) A
+ ld (Stacks) 0 # Free all stack segments
jmp restart # Restart interpreter
: ErrTok asciz "!? "
: Dashes asciz " -- "
@@ -364,6 +368,16 @@
: ProtErr asciz "Protected symbol"
### Error messages ###
+(code 'stkErrE)
+ ld X E
+(code 'stkErrX)
+ ld E 0
+(code 'stkErrEX)
+ ld Y StkErr
+ ld (StkLimit) 0 # Temporarily without stack limit
+ jmp errEXYZ
+: StkErr asciz "Stack overflow"
+
(code 'argErrAX)
ld E A
(code 'argErrEX)
@@ -440,11 +454,24 @@
jmp errEXYZ
: RenErr asciz "Can't rename"
-(code 'makeErrEX)
+(code 'makeErrX)
+ ld E 0
ld Y MakeErr
jmp errEXYZ
: MakeErr asciz "Not making"
+(code 'reentErrEX)
+ ld Y ReentErr
+ jmp errEXYZ
+: ReentErr asciz "Reentrant coroutine"
+
+(code 'yieldErrX)
+ ld E 0
+(code 'yieldErrEX)
+ ld Y YieldErr
+ jmp errEXYZ
+: YieldErr asciz "No coroutine"
+
(code 'msgErrYX)
ld A Y
(code 'msgErrAX)
diff --git a/src64/flow.l b/src64/flow.l
@@ -1,4 +1,4 @@
-# 02jun10abu
+# 09jun10abu
# (c) Software Lab. Alexander Burger
(code 'redefMsgEC)
@@ -311,10 +311,9 @@
while nz
ld Y ((Y) I) # Follow link
loop
- ld A (Y) # End of bindings in A
add (Y -I) (L -I) # Increment 'eswp' by 'cnt'
if z # Last pass
- sub A II
+ lea A ((Y) -II) # Last binding in A
do
xchg ((A)) (A I) # Exchange next symbol value with saved value
sub A II
@@ -452,10 +451,9 @@
while nz
ld Y ((Y) I) # Follow link
loop
- ld A (Y) # End of bindings in A
add (Y -I) (L -I) # Increment 'eswp' by 'cnt'
if z # Last pass
- sub A II
+ lea A ((Y) -II) # Last binding in A
do
xchg ((A)) (A I) # Exchange next symbol value with saved value
sub A II
@@ -2481,19 +2479,19 @@
push Z
push L
ld X (E CDR)
- ld E (X) # Get tag
- ld X (X CDR) # X on body
- eval # Evaluate tag
- sub S "(EnvEnd-Env)" # Build catch frame
+ ld E (X) # Eval tag
+ eval
+ sub S "EnvEnd-Env" # Build catch frame
save (Env) (EnvEnd) (S) # Save environment
push ZERO # 'fin'
push E # 'tag'
push (Catch) # Link
ld (Catch) S # Close catch frame
- prog X # Run body
+ ld X (X CDR) # Run body
+ prog X
: caught
pop (Catch) # Restore catch link
- add S "(EnvEnd-Env)+8+8" # Clean up
+ add S (pack II "+(EnvEnd-Env)") # Clean up
pop L
pop Z
pop Y
@@ -2535,7 +2533,7 @@
# (finally exe . prg) -> any
(code 'doFinally 2)
push X
- sub S "(EnvEnd-Env)" # Build catch frame
+ sub S "EnvEnd-Env" # Build catch frame
save (Env) (EnvEnd) (S) # Save environment
ld X (E CDR)
push (X) # 'exe' -> 'fin'
@@ -2552,7 +2550,272 @@
ld E (L I) # Get result
drop
pop (Catch) # Restore catch link
- add S "(EnvEnd-Env)+8+8" # Clean up
+ add S (pack II "+(EnvEnd-Env)") # Clean up
+ pop X
+ ret
+
+# (co 'sym [. prg]) -> any
+(code 'doCo 2)
+ push X
+ ld X (E CDR) # Get tag
+ call evSymX_E # Evaluate to a symbol
+ atom (X CDR) # 'prg'?
+ if z # Yes
+ push Y
+ push Z
+ push L
+ sub S "EnvMid-Env" # Space for env
+ ld Y (Stack0) # Search through stack segments
+ ld C (Stacks) # Segment bitmask
+ do
+ sub Y (StkSize) # Next segment
+ shr C 1 # In use?
+ if c # Yes
+ cmp E (Y -I) # Found tag?
+ continue ne # No
+ null (Y -II) # Already active?
+ jz reentErrEX # Yes
+ push Y # Resume coroutine: Save 'seg'
+ push (StkLimit) # and 'lim'
+ push (EnvCo7) # Link
+ ld (EnvCo7) S # Close coroutine frame
+ save (Env) (EnvMid) (S III) # Save environment
+: resumeCoroutine
+ ld S (Y -II) # Restore stack pointer
+ ld (Y -II) 0 # Mark as active
+ lea A (Y 4096) # Set stack limit
+ sub A (StkSize)
+ ld (StkLimit) A
+ push (EnvApply) # Save current routine's apply stack
+ ld C (EnvBind) # Current routine's bindings
+ load (Env) (EnvMid) (Y (pack -II "-(EnvMid-Env)")) # Restore environment
+ ld X (EnvBind) # Reversed bindings
+ do
+ null X # More reversed bindings?
+ while nz # Yes
+ ld Y (X) # Link address in Y
+ null (X -I) # Env swap zero?
+ if z # Yes
+ lea Z (Y -II) # End of bindings in Z
+ do
+ xchg ((Z)) (Z I) # Exchange symbol value with saved value
+ sub Z II
+ cmp Z X # More?
+ until lt # No
+ end
+ ld A (Y I) # Get down link
+ ld (Y I) C # Undo reversal
+ ld C X
+ ld X A
+ loop
+ ld (EnvBind) C # Set local bindings
+ pop C # Get main routine's apply stack
+ ld X (EnvApply) # Local apply stack
+ null X # Any?
+ if z # No
+ ld (EnvApply) C # Set local apply stack
+ else
+ ld X (X) # End if frame in X
+ do
+ ld A (X I) # Get link
+ null A # More?
+ while ne # No
+ ld X A # Follow link
+ loop
+ ld (X I) C # Clear link
+ end
+ pop X # Get saved L
+ null X # Any?
+ if nz # Yes
+ ld Y (X) # Pointer to link
+ do
+ ld A (Y) # Get link
+ null A # Found end?
+ while nz # No
+ ld Y (A) # Next frame
+ loop
+ ld (Y) L # Link to main stack
+ ld L X
+ end
+ pop Z
+ pop Y
+ pop X
+ ret
+ end
+ until z
+ ld Y (Stack0) # Find unused stack segment
+ ld Z 1 # New mask
+ ld C (Stacks) # Segment bitmask
+ do
+ sub Y (StkSize) # Next segment
+ test C Z # Free?
+ while nz # No
+ add Z Z # Next bit
+ jc stkErrEX # Overflow
+ loop
+ or (Stacks) Z # Mark segment as used
+ push Y # Save 'seg'
+ push (StkLimit) # and 'lim'
+ push (EnvCo7) # Link
+ ld (EnvCo7) S # Close coroutine frame
+ save (Env) (EnvMid) (S III) # Save environment
+ ld (EnvMake) 0 # Init local 'make' env
+ ld (EnvYoke) 0
+ lea A (Y 4096) # Calculate stack limit
+ sub A (StkSize)
+ ld (StkLimit) A
+ ld S Y # Set stack pointer
+ push E # Save 'tag'
+ push 0 # Mark 'stk' as active
+ sub S "EnvMid-Env" # Space for 'env'
+ ld X (X CDR) # Run 'prg'
+ prog X
+ xor (Stacks) Z # Not yielded: Mark segment as unused
+ ld S (EnvCo7) # Restore stack pointer
+ load (Env) (EnvMid) (S III) # Restore environment
+ pop (EnvCo7) # Restore coroutine link
+ pop (StkLimit) # 'lim'
+ add S (pack I "+(EnvMid-Env)") # Clean up
+ pop L
+ pop Z
+ pop Y
+ pop X
+ ret
+ end
+ ld X (Stack0) # Search through stack segments
+ ld C (Stacks) # Segment bitmask
+ ld A 1
+ do
+ sub X (StkSize) # Next segment
+ shr C 1 # In use?
+ if c # Yes
+ cmp E (X -I) # Found tag?
+ if eq # Yes
+ null (X -II) # Active?
+ ldz E Nil
+ if nz # No
+ xor (Stacks) A # Clear in segment bitmask
+ ld E TSym # Return T
+ end
+ pop X
+ ret
+ end
+ end
+ while nz
+ add A A
+ loop
+ ld E Nil # Return NIL
+ pop X
+ ret
+
+# (yield 'any ['sym]) -> any
+(code 'doYield 2)
+ push X
+ push Y
+ push Z
+ ld X E
+ ld Z (EnvCo7) # Get coroutine
+ null Z # Any?
+ jz yieldErrX # No
+ ld Y (E CDR)
+ ld E (Y) # Eval 'any'
+ eval
+ link
+ push E # <L I> Result
+ link
+ ld Y (Y CDR) # Next arg
+ ld E (Y)
+ eval # Eval optional 'sym'
+ ld Y 0 # Preload "no target"
+ cmp E Nil # Any?
+ if ne # Yes
+ ld Y (Stack0) # Search for target coroutine
+ ld C (Stacks) # Segment bitmask
+ do
+ sub Y (StkSize) # Next segment
+ shr C 1 # In use?
+ if c # Yes
+ cmp E (Y -I) # Found tag?
+ continue ne # No
+ null (Y -II) # Already active?
+ jz reentErrEX # Yes
+ break T
+ end
+ jz yieldErrEX
+ loop
+ end
+ ld E (L I) # Get result
+ drop
+ ld C (Z (pack III "+(EnvMid-Env)")) # Main routine's link
+ cmp L C # Local stack?
+ ldz L 0
+ if ne # Yes
+ ld X (L) # Pointer to link
+ do
+ ld A (X) # Get link
+ cmp A C # Reached main routine's link?
+ while ne # No
+ ld X A # Follow link
+ loop
+ ld (X) 0 # Clear link
+ end
+ push L # End of segment
+ push Y # Save taget coroutine
+ ld X (EnvApply) # Get apply stack
+ null X # Any?
+ if nz # Yes
+ cmp X (Z (pack III "+(EnvMid-EnvApply)")) # Local apply stack?
+ if eq # No
+ ld (EnvApply) 0 # Clear it
+ else
+ ld X (X) # End of frame in X
+ do
+ ld A (X I) # Get link
+ cmp A (Z (pack III "+(EnvMid-EnvApply)")) # Reached main routine's stack?
+ while ne # No
+ ld X A # Follow link
+ loop
+ ld (X I) 0 # Clear link
+ end
+ end
+ ld C 0 # Back link
+ ld X (EnvBind) # Reverse bindings
+ null X # Any?
+ if nz # Yes
+ do
+ cmp X (Z III) # Reached main routine's bindings?
+ while ne # No
+ ld Y X # Keep bind frame in Y
+ null (X -I) # Env swap zero?
+ if z # Yes
+ add X I # X on bindings
+ do
+ xchg ((X)) (X I) # Exchange symbol value with saved value
+ add X II
+ cmp X (Y) # More?
+ until eq # No
+ end
+ ld A (Y) # A on bind link
+ ld X (A I) # X on next frame
+ ld (A I) C # Set back link
+ ld C Y
+ loop
+ end
+ ld (EnvBind) C # Store back link in coroutine's env
+ pop Y # Restore taget coroutine
+ ld X (Z II) # Get segment
+ ld (X -II) S # Save stack pointer
+ save (Env) (EnvMid) (X (pack -II "-(EnvMid-Env)")) # Save environment
+ null Y # Target coroutine?
+ jnz resumeCoroutine # Yes
+ ld S Z # Set stack pointer
+ load (Env) (EnvMid) (S III) # Restore environment
+ pop (EnvCo7) # Restore coroutine link
+ pop (StkLimit) # 'lim'
+ add S (pack I "+(EnvMid-Env)") # Clean up
+ pop L
+ pop Z
+ pop Y
pop X
ret
@@ -2566,7 +2829,7 @@
eval/ret
(code 'brkLoadE_E)
- null (EnvBrk) # Already in breakpoint?
+ null (Break) # Already in breakpoint?
if z # No
cc isatty(0) # STDIN
nul4 # on a tty?
@@ -2588,7 +2851,7 @@
push At
link
ld (EnvBind) L # Close bind frame
- ld (EnvBrk) L # Set break env
+ ld (Break) L # Set break env
push 0 # Init env swap
sub S IV # <L -V> OutFrame
ld Y S
@@ -2611,7 +2874,7 @@
pop (Up) # and '^'
pop L # Restore link
pop (EnvBind) # Restore bind link
- ld (EnvBrk) 0 # Leave breakpoint
+ ld (Break) 0 # Leave breakpoint
pop Y
pop X
end
@@ -2624,7 +2887,7 @@
push X
push Y
ld X E
- null (EnvBrk) # Breakpoint?
+ null (Break) # Breakpoint?
jz brkErrX # No
link
push (Dbg) # Save '*Dbg'
@@ -2632,7 +2895,7 @@
push (Run) # and '*Run'
link
ld (Dbg) Nil # Switch off debug mode
- ld C (EnvBrk) # Get break env
+ ld C (Break) # Get break env
ld (At) (C II) # Set '@'
ld (Run) (C IV) # and '*Run'
call popOutFiles # Leave debug I/O env
@@ -2647,7 +2910,7 @@
eval
end
call pushInFilesY # Restore debug I/O env
- lea Y ((EnvBrk) -V)
+ lea Y ((Break) -V)
call pushOutFilesY
pop L # Restore debug env
pop (Run)
diff --git a/src64/gc.l b/src64/gc.l
@@ -1,4 +1,4 @@
-# 19may10abu
+# 09jun10abu
# (c) Software Lab. Alexander Burger
# Mark data
@@ -105,7 +105,7 @@
call markE
ld E (Transient I)
call markE
- ### Mark stack ###
+ ### Mark stack(s) ###
ld Y L
do
null Y # End of stack?
@@ -143,6 +143,35 @@
call markE
ld Y (Y) # Next frame
loop
+ ld Y (Stack0) # Search through stack segments
+ ld C (Stacks) # Segment bitmask
+ do
+ sub Y (StkSize) # Next segment
+ shr C 1 # In use?
+ if c # Yes
+ null (Y -II) # Active?
+ continue z # Yes
+ push Y
+ push C
+ ld Y ((Y -II)) # Else get saved L
+ do
+ null Y # End of stack?
+ while ne # No
+ ld Z (Y) # Keep end of frame in Z
+ do
+ add Y I # End of frame?
+ cmp Y Z
+ while ne # No
+ ld E (Y) # Next item
+ call markE # Mark it
+ loop
+ ld Y (Y) # Next frame
+ loop
+ pop C
+ pop Y
+ continue T
+ end
+ until z
# Mark externals
ld Y Extern
ld Z 0 # Clear TOS
@@ -298,6 +327,39 @@
loop
loop
50 ### Clean up ###
+ ld Y (Stack0) # Search through stack segments
+ ld C (Stacks) # Segment bitmask
+ ld A 1
+ do
+ sub Y (StkSize) # Next segment
+ shr C 1 # In use?
+ if c # Yes
+ test ((Y -I)) 1 # 'tag' symbol gone?
+ if nz # Yes
+ xor (Stacks) A # Clear in segment bitmask
+ else
+ null (Y -II) # Active?
+ if nz # No
+ ld X (Y (pack -II "-(EnvMid-EnvApply)")) # Saved apply stack
+ do
+ null X # End of stack?
+ while ne # No
+ ld Z (X) # Keep end of frame in Z
+ add X II
+ do
+ off (X) 1 # Clear
+ add X II # Next gc mark
+ cmp X Z # End of frame?
+ until ge # Yes
+ ld X (Z I) # Next frame
+ loop
+ end
+ end
+ jmp 60
+ end
+ while nz
+60 add A A
+ loop
ld Y (EnvApply) # Apply stack
do
null Y # End of stack?
@@ -309,7 +371,7 @@
add Y II # Next gc mark
cmp Y Z # End of frame?
until ge # Yes
- ld Y (Z) # Next frame
+ ld Y (Z I) # Next frame
loop
### Sweep ###
ld X 0 # Avail list
diff --git a/src64/glob.l b/src64/glob.l
@@ -1,4 +1,4 @@
-# 20may10abu
+# 08jun10abu
# (c) Software Lab. Alexander Burger
(data 'Globals 0)
@@ -16,6 +16,9 @@
word 0
: Stack0 word 0 # Initial stack pointer
+: Stacks word 0 # Stack segment bitmask
+: StkSize word STACK # Stack segment size
+: StkLimit word 0 # Stack limit: StackN-StkSize+4096
: Link word 0 # Saved link register
: Catch word 0 # Catch frames
: Termio word 0 # Raw mode terminal I/O
@@ -49,6 +52,7 @@
: Sigio word Nil # Sigio handler
: LineX word ZERO # Console line
: LineC word -1
+: Break word 0 # Breakpoint
: GcCount word CELLS # Collector count
: Sep0 word (char ".") # Decimal separator
: Sep3 word (char ",") # Thousand separator
@@ -129,6 +133,7 @@
initSym NIL "sigio" doSigio
initSym NIL "protect" doProtect
initSym NIL "heap" doHeap
+ initSym NIL "stack" doStack
initSym NIL "adr" doAdr
initSym NIL "env" doEnv
initSym NIL "up" doUp
@@ -232,6 +237,8 @@
initSym NIL "catch" doCatch
initSym NIL "throw" doThrow
initSym NIL "finally" doFinally
+ initSym NIL "co" doCo
+ initSym NIL "yield" doYield
initSym NIL "!" doBreak
initSym NIL "e" doE
initSym NIL "$" doTrace
@@ -525,18 +532,17 @@
: EnvNext word 0 # Next vararg
: EnvApply word 0 # Apply frames
: EnvMeth word 0 # Method frames
-: EnvTask word Nil # Task list
: EnvMake word 0 # 'make' env
: EnvYoke word 0
+: EnvMid # Must be aligned
+: EnvCo7 word 0 # Coroutines
+: EnvTask word Nil # Task list
: EnvParseX word 0 # Parser status
: EnvParseC word 0
: EnvParseEOF word -1
-: EnvSort word 0 # Sort function
: EnvProtect word 0 # Signal protection
: EnvTrace word 0 # Trace level
-: EnvBrk word 0 # Breakpoint
- align 8 # Padding
-: EnvEnd
+: EnvEnd # Must be aligned
initData
diff --git a/src64/main.l b/src64/main.l
@@ -1,4 +1,4 @@
-# 02jun10abu
+# 08jun10abu
# (c) Software Lab. Alexander Burger
### Global return labels ###
@@ -56,7 +56,7 @@
10 sub Z Y # Length
ld C Z # Keep in Z
inc C # Space for null byte
- cc malloc(C)
+ call allocC_A
ld (Home) A # Set 'Home'
movn (A) (Y) Z # Copy path including "/"
add Z (Home) # Pointer to null byte
@@ -73,6 +73,7 @@
or A CNT
ld (Pid) A
ld (Stack0) S # Save top level stack pointer
+ lea (StkLimit) (S (- 4096 STACK)) # Set stack limit
ld L 0 # Init link register
call heapAlloc # Allocate initial heap
ld E Nil # Init internal symbols
@@ -208,11 +209,17 @@
ret
# Allocate memory
+(code 'allocC_A 0)
+ cc malloc(C) # Allocate memory of size C
+ null A # OK?
+ jz NoMemory # No
+ ret
(code 'allocAE_A 0)
cc realloc(A E) # Reallocate pointer in A to size E
null A # OK?
jnz Ret # Return
- ld X Alloc # Else no memory
+: NoMemory
+ ld X Alloc # No memory
jmp giveupX
: Alloc asciz "No memory"
@@ -422,7 +429,8 @@
if nz # Yes
null (Termio) # Already in raw mode?
if z # No
- cc malloc(TERMIOS) # Allocate space for termio structure
+ ld C TERMIOS # Allocate space for termio structure
+ call allocC_A
ld (Termio) A # Save it
ld C A # Pointer in C
movn (C) (OrgTermio) TERMIOS # Copy original termio structure
@@ -555,6 +563,31 @@
or E CNT
ret
+# (stack ['cnt]) -> cnt
+(code 'doStack 2)
+ push X
+ ld X E
+ ld E (E CDR) # Arg?
+ atom E
+ if z # Yes
+ null (Stacks) # Stack segments allocated?
+ if z # No
+ ld E (E) # Eval 'cnt'
+ call evCntEX_FE
+ shl E 20 # [MB]
+ ld (StkSize) E # Set new stack size
+ lea A ((Stack0) 4096) # and stack limit
+ sub A E
+ ld (StkLimit) A
+ jmp 10
+ end
+ end
+ ld E (StkSize) # Return current stack size
+10 shr E 16 # Make short number in MB
+ or E CNT
+ pop X
+ ret
+
# (adr 'var) -> num
# (adr 'num) -> var
(code 'doAdr 2)
@@ -996,6 +1029,8 @@
push X
push Y
push Z
+ cmp S (StkLimit) # Stack check
+ jlt stkErrE
ld X (E CDR) # Get CDR
ld Y (C) # Parameter list in Y
ld Z (C CDR) # Body in Z
@@ -1390,7 +1425,7 @@
ld E (E CDR) # Ignore variable
ld C ((E)) # Get buffer size
shr C 4 # Normalize
- cc malloc(C) # Allocate buffer
+ call allocC_A # Allocate buffer
push A # Save it
ld Z A # Buffer pointer in Z
do
diff --git a/src64/subr.l b/src64/subr.l
@@ -1,4 +1,4 @@
-# 19may10abu
+# 04jun10abu
# (c) Software Lab. Alexander Burger
# (car 'var) -> any
@@ -1099,7 +1099,7 @@
push X
ld X E
null (EnvMake) # In 'make'?
- jz makeErrEX # No
+ jz makeErrX # No
push Y
ld Y (E CDR) # Y on args
atom Y # Any?
@@ -1133,7 +1133,7 @@
push X
ld X E
null (EnvMake) # In 'make'?
- jz makeErrEX # No
+ jz makeErrX # No
push Y
ld Y (E CDR) # Y on args
do
@@ -1164,7 +1164,7 @@
push X
ld X E
null (EnvMake) # In 'make'?
- jz makeErrEX # No
+ jz makeErrX # No
push Y
ld Y (E CDR) # Y on args
do
@@ -1188,7 +1188,7 @@
push X
ld X E
null (EnvMake) # In 'make'?
- jz makeErrEX # No
+ jz makeErrX # No
push Y
ld Y (E CDR) # Y on args
do
@@ -3844,7 +3844,6 @@
atom E # List?
if z # Yes
push Z
- push (EnvSort) # Save sort function
link
push E # Save 'lst'
ld E ((Y CDR)) # Eval 'fun'
@@ -3852,10 +3851,10 @@
ld A Nil # Init local elements
cmp E Nil # User function?
if eq # No
- ld (EnvSort) cmpDfltA_F # Use default sort function
+ ld Z cmpDfltA_F # Use default sort function
xchg E (S) # <L VII> out[1]
else
- ld (EnvSort) cmpUserAX_F # Use user supplied sort function
+ ld Z cmpUserAX_F # Use user supplied sort function
xchg E (S) # 'fun'
push A
push A # <L VIII> Apply args
@@ -3877,7 +3876,7 @@
atom (L V) # in[1] list?
if z # Yes
ld A Y # in
- call (EnvSort) # Less?
+ call (Z) # Less?
if ge # No
lea Y (L V) # &in[1]
end
@@ -3907,7 +3906,7 @@
end
ld (L II) Y # last[0] = p
lea A (L II) # last
- call (EnvSort) # Less?
+ call (Z) # Less?
if lt # Yes
xchg (L -I) (L -II) # Exchange tail[0] and tail[1]
end
@@ -3921,25 +3920,25 @@
ld (L II) Y # last[0] = p
ld (L V) (Y CDR) # in[1] = cdr(in[1])
lea A (L II) # last
- call (EnvSort) # Less?
+ call (Z) # Less?
if lt # Yes
xchg (L -I) (L -II) # Exchange tail[0] and tail[1]
end
else # Both in[0] and in[1] are lists
lea A (L II) # last
ld (A) (L IV) # last[0] = in[0]
- call (EnvSort) # Less?
+ call (Z) # Less?
if lt # Yes
lea A (L II) # last
ld (A) (L V) # last[0] = in[1]
- call (EnvSort) # Less?
+ call (Z) # Less?
if ge # No
ld Y (L V) # p = in[1]
ld (L I) Y
ld (L V) (Y CDR) # in[1] = cdr(in[1])
else
lea A (L IV) # in
- call (EnvSort) # Less?
+ call (Z) # Less?
if lt # Yes
ld Y (L IV) # p = in[0]
ld (L I) Y
@@ -3954,14 +3953,14 @@
else
lea A (L II) # last
ld (A) (L V) # last[0] = in[1]
- call (EnvSort) # Less?
+ call (Z) # Less?
if lt # Yes
ld Y (L IV) # p = in[0]
ld (L I) Y
ld (L IV) (Y CDR) # in[0] = cdr(in[0])
else
lea A (L IV) # in
- call (EnvSort) # Less?
+ call (Z) # Less?
if lt # Yes
ld Y (L IV) # p = in[0]
ld (L I) Y
@@ -3984,7 +3983,6 @@
until nz
ld E (L VI) # Return out[0]
drop
- pop (EnvSort)
pop Z
end
pop Y
@@ -3998,6 +3996,7 @@
(code 'cmpUserAX_F 0)
push Y
+ push Z
lea Z (L VIII) # Point Z to apply args
ld (Z) ((A I)) # Copy CAR of second item
ld (Z I) ((A)) # and CAR of first item
@@ -4007,6 +4006,7 @@
if ne
setc # Set carry if "less"
end
+ pop Z
pop Y
ret
diff --git a/src64/version.l b/src64/version.l
@@ -1,6 +1,6 @@
-# 01jun10abu
+# 09jun10abu
# (c) Software Lab. Alexander Burger
-(de *Version 3 0 2 26)
+(de *Version 3 0 2 27)
# vi:et:ts=3:sw=3