* make it possible to override parts of the typed constant code generation

by platform-specific units

git-svn-id: branches/jvmbackend@18658 -
This commit is contained in:
Jonas Maebe 2011-08-20 08:21:59 +00:00
parent 402390a25d
commit 51095fdd28
2 changed files with 16 additions and 8 deletions

View File

@ -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.

View File

@ -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