aboutsummaryrefslogtreecommitdiff
path: root/src/interp
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2008-10-05 17:30:19 +0000
committerdos-reis <gdr@axiomatics.org>2008-10-05 17:30:19 +0000
commit7b9149e57a6ebacf677bf0fdd08528df3cbdb32f (patch)
tree3020470fed8fd23edfbd2ad823c892cfe5912104 /src/interp
parent94756b27ee8d56cd01e8591f19feffc3fa2898fa (diff)
downloadopen-axiom-7b9149e57a6ebacf677bf0fdd08528df3cbdb32f.tar.gz
* interp/c-util.boot ($optExportedFunctionReference): New.
(setCompilerOptimizations): Set it. * interp/define.boot ($capsuleFunctionStack): New. (spadCompileOrSetq): Collect capsule function definitions. (compFunctorBody): Compile them at end of capsule.
Diffstat (limited to 'src/interp')
-rw-r--r--src/interp/c-util.boot4
-rw-r--r--src/interp/define.boot17
2 files changed, 19 insertions, 2 deletions
diff --git a/src/interp/c-util.boot b/src/interp/c-util.boot
index a85d8bb0..080e683d 100644
--- a/src/interp/c-util.boot
+++ b/src/interp/c-util.boot
@@ -58,6 +58,8 @@ $optProclaim := false
++ true if we have to inline simple functions before codegen.
$optReplaceSimpleFunctions := false
+++ true if we have to resolve references to exported operations.
+$optExportedFunctionReference := false
--%
@@ -904,6 +906,8 @@ setCompilerOptimizations level ==
if level > 0 then
$optProclaim := true
$optReplaceSimpleFunctions := true
+ if level > 1 then
+ $optExportedFunctionReference := true
coreError '"unknown optimization level request"
diff --git a/src/interp/define.boot b/src/interp/define.boot
index 58c39f1b..7dc8a79a 100644
--- a/src/interp/define.boot
+++ b/src/interp/define.boot
@@ -37,6 +37,8 @@ import cattable
import category
namespace BOOT
+module define
+
--%
NRTPARSE := false
@@ -55,9 +57,11 @@ $suffix := nil
-- ??? turns off buggy code
$NRTopt := false
-
$doNotCompileJustPrint := false
+++ stack of pending capsule function definitions.
+$capsuleFunctionStack := []
+
--%
++ List of operations defined in a given capsule
@@ -659,7 +663,10 @@ disallowNilAttribute x ==
compFunctorBody(body,m,e,parForm) ==
$bootStrapMode = true =>
[bootStrapError($functorForm, _/EDITFILE),m,e]
+ $capsuleFunctionStack := nil -- start collecting capsule functions.
T:= compOrCroak(body,m,e)
+ COMP $capsuleFunctionStack
+ $capsuleFunctionStack := nil -- release storage.
body is [op,:.] and MEMQ(op,'(add CAPSULE)) => T
$NRTaddForm :=
body is ["SubDomain",domainForm,predicate] => domainForm
@@ -1244,7 +1251,11 @@ spadCompileOrSetq (form is [nam,[lam,vl,body]]) ==
macform := ['XLAM,vl',body]
LAM_,EVALANDFILEACTQ ['PUT,MKQ nam,MKQ 'SPADreplace,MKQ macform]
sayBrightly ['" ",:bright nam,'"is replaced by",:bright body]
- $insideCapsuleFunctionIfTrue => first COMP LIST form
+ $insideCapsuleFunctionIfTrue =>
+ $optExportedFunctionReference =>
+ $capsuleFunctionStack := [form,:$capsuleFunctionStack]
+ first form
+ first COMP LIST form
compileConstructor form
compileConstructor form ==
@@ -1679,3 +1690,5 @@ compCategoryItem(x,predl,env) ==
diagnoseUknownType(t,env)
noteExport(rest x,pred)
PUSH(MKQ [rest x,pred],$sigList)
+
+--%