aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog11
-rw-r--r--src/interp/buildom.boot33
-rw-r--r--src/interp/g-opt.boot18
-rw-r--r--src/interp/i-analy.boot10
-rw-r--r--src/interp/i-eval.boot2
-rw-r--r--src/interp/vmlisp.lisp2
6 files changed, 33 insertions, 43 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index c4881406..52661c0a 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,16 @@
2011-05-19 Gabriel Dos Reis <gdr@cs.tamu.edu>
+ * interp/i-analy.boot (bottomUpForm0): Tidy.
+ * interp/i-eval.boot (evalForm): Likewise.
+ * interp/buildom.boot (formalRecordField): New.
+ (eltRecordFun): Use it.
+ (seteltRecordFun): New.
+ * interp/g-opt.boot (optSETRECORDELT): Remove.
+ (optRECORDCOPY): Likewise.
+ * interp/vmlisp.lisp (MAKE-VEC): Likewise.
+
+2011-05-19 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
* interp/i-eval.boot (evalForm): Adjust.
* interp/buildom.boot (mkRecordFun): New.
(eltRecordFun): Likewise.
diff --git a/src/interp/buildom.boot b/src/interp/buildom.boot
index 2db25403..5e666fcf 100644
--- a/src/interp/buildom.boot
+++ b/src/interp/buildom.boot
@@ -573,7 +573,6 @@ constructorCategory (title is [op,:.]) ==
canonicalForm(cat) := title
cat
---mkMappingFunList(nam,mapForm,e) == [[],e]
mkMappingFunList(nam,mapForm,e) ==
nargs := #rest mapForm
dc := gensym()
@@ -595,16 +594,27 @@ mkRecordFun n ==
'%vector
["XLAM",args,[op,:args]]
+++ Build expression for selecting the i-th field of a fomal record
+++ variable of length `n'.
+formalRecordField(n,i) ==
+ n < 2 => ['%head,"#1"]
+ n = 2 =>
+ i = 0 => ['%head,"#1"]
+ ['%tail,"#1"]
+ ['%vref,"#1",i]
+
++ Build an inline function for selecting field `i' or a
++ record of length `n'.
eltRecordFun(n,i) ==
- body :=
- n < 2 => ['%head,"#1"]
- n = 2 =>
- i = 0 => ['%head,"#1"]
- ['%tail,"#1"]
- ['%vref,"#1",i]
- ["XLAM",["#1","#2"],body]
+ ["XLAM",["#1","#2"],formalRecordField(n,i)]
+
+seteltRecordFun(n,i) ==
+ args := take(3,$FormalMapVariableList)
+ field := formalRecordField(n,i)
+ body :=
+ n > 2 => ['%store,field,"#3"]
+ ['SEQ,['%store,field,"#3"],['EXIT,field]]
+ ["XLAM",args,body]
copyRecordFun n ==
body :=
@@ -624,10 +634,9 @@ mkRecordFunList(nam,["Record",:Alist],e) ==
["coerce",[$OutputForm,nam],["ELT",dc,$FirstParamSlot+len+1]],:
[["elt",[A,nam,PNAME a],eltRecordFun(len,i)]
for i in 0.. for [.,a,A] in Alist],:
- [["setelt",[A,nam,PNAME a,A],["XLAM",["$1","$2","$3"],
- ["SETRECORDELT","$1",i, len,"$3"]]]
- for i in 0.. for [.,a,A] in Alist],:
- [["copy",[nam,nam],copyRecordFun len]]]
+ [["setelt",[A,nam,PNAME a,A],seteltRecordFun(len,i)]
+ for i in 0.. for [.,a,A] in Alist],
+ ["copy",[nam,nam],copyRecordFun len]]
[substitute(nam,dc,substituteDollarIfRepHack sigFunAlist),e]
mkNewUnionFunList(name,form is ["Union",:listOfEntries],e) ==
diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot
index b37b942c..39223218 100644
--- a/src/interp/g-opt.boot
+++ b/src/interp/g-opt.boot
@@ -392,21 +392,6 @@ optSEQ ["SEQ",:l] ==
l is ["SEQ",[op,a]] and op in '(EXIT RETURN THROW) => a
l
-optSETRECORDELT ["SETRECORDELT",name,ind,len,expr] ==
- len=1 =>
- ind = 0 => ['SEQ,['%store,['%head,name],expr],['EXIT,['%head,name]]]
- keyedSystemError("S2OO0002",[ind])
- len=2 =>
- ind = 0 => ['SEQ,['%store,['%head,name],expr],['EXIT,['%head,name]]]
- ind = 1 => ['SEQ,['%store,['%tail,name],expr],['EXIT,['%tail,name]]]
- keyedSystemError("S2OO0002",[ind])
- ['%store,['%vref,name,ind],expr]
-
-optRECORDCOPY ["RECORDCOPY",name,len] ==
- len = 1 => ['%list,['%head,name]]
- len = 2 => ['%pair,['%head,name],['%tail,name]]
- ["REPLACE",["MAKE_-VEC",len],name]
-
optSuchthat [.,:u] == ["SUCHTHAT",:u]
++ List of VM side effect free operators.
@@ -813,8 +798,7 @@ for x in '( (%call optCall) _
(CATCH optCatch)_
(%when optCond)_
(%retract optRetract)_
- (%CollectV optCollectVector)_
- (SETRECORDELT optSETRECORDELT)) _
+ (%CollectV optCollectVector)) _
repeat property(first x,'OPTIMIZE) := second x
--much quicker to call functions if they have an SBC
diff --git a/src/interp/i-analy.boot b/src/interp/i-analy.boot
index 9edac053..6fea2735 100644
--- a/src/interp/i-analy.boot
+++ b/src/interp/i-analy.boot
@@ -598,16 +598,6 @@ bottomUpForm0(t,op,opName,argl,argModeSetList) ==
m := isType t =>
bottomUpType(t, m)
- opName = 'copy and argModeSetList is [[['Record,:rargs]]] =>
- -- this is a hack until Records go through the normal
- -- modemap selection process
- rtype := ['Record,:rargs]
- code := optRECORDCOPY(['RECORDCOPY,getArgValue(first argl, rtype),#rargs])
-
- val := object(code,rtype)
- putValue(t,val)
- putModeSet(t,[rtype])
-
m := getModeOrFirstModeSetIfThere op
m is ['Record,:.] and argModeSetList is [[['Variable,x]]] and
member(x,getUnionOrRecordTags m) and (u := bottomUpElt t) => u
diff --git a/src/interp/i-eval.boot b/src/interp/i-eval.boot
index faf20da6..b8984de1 100644
--- a/src/interp/i-eval.boot
+++ b/src/interp/i-eval.boot
@@ -239,8 +239,6 @@ evalForm(op,opName,argl,mmS) ==
['SPADCALL,:form,freeFun]
fun is ['XLAM,xargs,:xbody] =>
rec := first form
- xbody is [['SETRECORDELT,.,ind,len,.]] =>
- optSETRECORDELT([CAAR xbody,rec,ind,len,third form])
['FUNCALL,['function , ['LAMBDA,xargs,:xbody]],:TAKE(#xargs, form)]
dcVector := evalDomain dc
fun0 :=
diff --git a/src/interp/vmlisp.lisp b/src/interp/vmlisp.lisp
index 4159b32d..0f3d1f2f 100644
--- a/src/interp/vmlisp.lisp
+++ b/src/interp/vmlisp.lisp
@@ -782,8 +782,6 @@
; 16.1 Creation
-(defun MAKE-VEC (n) (make-array n))
-
(defun GETREFV (n)
(make-array n :initial-element nil))