Răsfoiți Sursa

* make it possible to override parts of the typed constant code generation
by platform-specific units

git-svn-id: branches/jvmbackend@18658 -

Jonas Maebe 14 ani în urmă
părinte
comite
51095fdd28
2 a modificat fișierele cu 16 adăugiri și 8 ștergeri
  1. 14 6
      compiler/ngtcon.pas
  2. 2 2
      compiler/ptconst.pas

+ 14 - 6
compiler/ngtcon.pas

@@ -62,8 +62,9 @@ interface
         procedure tc_emit_stringdef(def: tstringdef; var node: tnode);virtual;abstract;
        public
         constructor create(sym: tstaticvarsym);
-//        function parse_into_nodetree: tnode;
       end;
+      ttypedconstbuilderclass = class of ttypedconstbuilder;
+
 
       { should be changed into nested type of tasmlisttypedconstbuilder when
         possible }
@@ -95,12 +96,13 @@ interface
         procedure tc_emit_enumdef(def: tenumdef; var node: tnode);override;
         procedure tc_emit_stringdef(def: tstringdef; var node: tnode);override;
        public
-        constructor create(sym: tstaticvarsym);
+        constructor create(sym: tstaticvarsym);virtual;
         function parse_into_asmlist: tasmlist;
       end;
+      tasmlisttypedconstbuilderclass = class of tasmlisttypedconstbuilder;
 
       tnodetreetypedconstbuilder = class(ttypedconstbuilder)
-       private
+       protected
         resultblock: tblocknode;
         statmnt: tstatementnode;
 
@@ -108,7 +110,6 @@ interface
           etc. }
         basenode: tnode;
 
-       protected
         procedure parse_arraydef(def:tarraydef);override;
         procedure parse_procvardef(def:tprocvardef);override;
         procedure parse_recorddef(def:trecorddef);override;
@@ -122,10 +123,15 @@ interface
         procedure tc_emit_enumdef(def: tenumdef; var node: tnode);override;
         procedure tc_emit_stringdef(def: tstringdef; var node: tnode);override;
        public
-        constructor create(sym: tstaticvarsym; previnit: tnode);
+        constructor create(sym: tstaticvarsym; previnit: tnode);virtual;
         destructor destroy;override;
         function parse_into_nodetree: tnode;
       end;
+      tnodetreetypedconstbuilderclass = class of tnodetreetypedconstbuilder;
+
+   var
+     ctypedconstbuilder: ttypedconstbuilderclass;
+
 implementation
 
 uses
@@ -2017,5 +2023,7 @@ uses
         self.resultblock:=nil;
       end;
 
-
+begin
+  { default to asmlist version, best for most targets }
+  ctypedconstbuilder:=tasmlisttypedconstbuilder;
 end.

+ 2 - 2
compiler/ptconst.pas

@@ -70,7 +70,7 @@ implementation
             else
               cursectype:=sec_data;
             maybe_new_object_file(list);
-            tcbuilder:=tasmlisttypedconstbuilder.create(sym);
+            tcbuilder:=tasmlisttypedconstbuilderclass(ctypedconstbuilder).create(sym);
             reslist:=tasmlisttypedconstbuilder(tcbuilder).parse_into_asmlist;
             tcbuilder.free;
           end
@@ -80,7 +80,7 @@ implementation
               previnit:=current_structdef.tcinitcode
             else
               previnit:=tnode(current_module.tcinitcode);
-            tcbuilder:=tnodetreetypedconstbuilder.create(sym,previnit);
+            tcbuilder:=tnodetreetypedconstbuilderclass(ctypedconstbuilder).create(sym,previnit);
             restree:=tnodetreetypedconstbuilder(tcbuilder).parse_into_nodetree;
             if assigned(current_structdef) then
               current_structdef.tcinitcode:=restree