aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2013-05-27 23:06:51 +0000
committerdos-reis <gdr@axiomatics.org>2013-05-27 23:06:51 +0000
commit82ca7adccc719b3a3a3e260be596a6aa20608e08 (patch)
tree9317d2a92fc54482ecb6c061230e41883adca19c
parent046ba395bff60fa8efd27b956ac3d37fd9e7eeb1 (diff)
downloadopen-axiom-82ca7adccc719b3a3a3e260be596a6aa20608e08.tar.gz
Introduce a data structure for ephemeral compilation artifacts
-rw-r--r--src/interp/c-util.boot18
-rw-r--r--src/interp/define.boot7
-rw-r--r--src/interp/lisplib.boot4
3 files changed, 20 insertions, 9 deletions
diff --git a/src/interp/c-util.boot b/src/interp/c-util.boot
index 7203eca6..3ba88514 100644
--- a/src/interp/c-util.boot
+++ b/src/interp/c-util.boot
@@ -143,13 +143,21 @@ macro domainData d ==
--% usedEntities: VectorBuffer Pair(SourceEntity,Elaboration))
--%
+structure %CompilationData ==
+ Record(subst: %Substitution,idata: %Substitution,bytes: List %Fixnum,
+ items: %Buffer %Pair(%SourceEntity,%Elaboration)) with
+ cdSubstitution == (.subst)
+ cdImplicits == (.idata)
+ cdBytes == (.bytes)
+ cdItems == (.items)
+
++ Make a fresh compilation data structure.
makeCompilationData() ==
- [nil,nil,nil,[nil,:0]]
+ mk%CompilationData(nil,nil,nil,[nil,:0])
++ Subsitution that replaces parameters with formals.
macro dbFormalSubst db ==
- first dbCompilerData db
+ cdSubstitution dbCompilerData db
++ Return source-level parameters of this constructor.
dbParameters db ==
@@ -159,17 +167,17 @@ dbParameters db ==
++ information is active only during the elaboration of the
++ constructor associated with `db'.
macro dbImplicitData db ==
- second dbCompilerData db
+ cdImplicits dbCompilerData db
++ Return the list of encoding bytes for a function during elaboration.
++ Transcient data.
macro dbByteList db ==
- third dbCompilerData db
+ cdBytes dbCompilerData db
++ Return a buffer of entities referenced during elaboration
++ of current functor.
macro dbEntityBuffer db ==
- fourth dbCompilerData db
+ cdItems dbCompilerData db
++ List (in reverse order) of used entities during elaboration of
++ current functor.
diff --git a/src/interp/define.boot b/src/interp/define.boot
index 8ad48282..62114a90 100644
--- a/src/interp/define.boot
+++ b/src/interp/define.boot
@@ -1117,6 +1117,7 @@ compDefineCategory2(form,signature,body,m,e,$formalArgList) ==
--Set in DomainSubstitutionFunction, used further down
-- 1.1 augment e to add declaration $: <form>
db := constructorDB $op
+ dbClearForCompilation! db
dbCompilerData(db) := makeCompilationData()
dbFormalSubst(db) := pairList(form.args,$TriangleVariableList)
dbInstanceCache(db) := true
@@ -1180,7 +1181,6 @@ compDefineCategory2(form,signature,body,m,e,$formalArgList) ==
dbPrincipals(db) := getParentsFor db
dbAncestors(db) := computeAncestorsOf(form,nil)
dbModemaps(db) := modemapsFromCategory(db,[op',:sargl],formalBody,signature')
- dbCompilerData(db) := nil
[fun,$Category,e]
mkConstructor: %Form -> %Form
@@ -1198,9 +1198,10 @@ compDefineCategory(df,m,e,fal) ==
db := constructorDB ctor
kind := dbConstructorKind db
kind ~= "category" => throwKeyedMsg("S2IC0016",[ctor,"category",kind])
- dbClearForCompilation! db
dbConstructorForm(db) := lhs
- $insideFunctorIfTrue => compDefineCategory1(df,m,e,fal)
+ $insideFunctorIfTrue =>
+ try compDefineCategory1(df,m,e,fal)
+ finally dbCompilerData(db) := nil
compDefineLisplib(df,m,e,fal,'compDefineCategory1)
diff --git a/src/interp/lisplib.boot b/src/interp/lisplib.boot
index 5da16dec..54220181 100644
--- a/src/interp/lisplib.boot
+++ b/src/interp/lisplib.boot
@@ -439,7 +439,9 @@ compDefineLisplib(df:=["DEF",[op,:.],:.],m,e,fal,fn) ==
leaveIfErrors(libName,dbConstructorKind db)
sayMSG ['" finalizing ",$spadLibFT,:bright libName]
ok := finalizeLisplib(db,libName)
- finally RSHUT $libFile
+ finally
+ RSHUT $libFile
+ dbCompilerData(db) := nil
if ok then lisplibDoRename(libName)
filearg := makeFullFilePath [libName,$spadLibFT,$libraryDirectory]
RPACKFILE filearg