* move class of definitions into type section for delphi

This commit is contained in:
peter 2001-09-02 21:12:06 +00:00
parent d523065fb1
commit 43dea5a35f
12 changed files with 202 additions and 172 deletions

View File

@ -39,13 +39,14 @@ interface
{ parts explicitely in the code generator (JM) }
function first_addstring: tnode; virtual;
end;
taddnodeclass = class of taddnode;
var
{ caddnode is used to create nodes of the add type }
{ the virtual constructor allows to assign }
{ another class type to caddnode => processor }
{ specific node types can be created }
caddnode : class of taddnode;
caddnode : taddnodeclass;
implementation
@ -120,7 +121,6 @@ implementation
hp:=self;
if isbinaryoverloaded(hp) then
begin
resulttypepass(hp);
result:=hp;
exit;
end;
@ -261,18 +261,19 @@ implementation
slashn :
begin
{ int/int becomes a real }
if int(rv)=0 then
rvd:=rv;
lvd:=lv;
if int(rvd)=0 then
begin
Message(parser_e_invalid_float_operation);
t:=crealconstnode.create(0,pbestrealtype^);
end
else
t:=crealconstnode.create(int(lv)/int(rv),pbestrealtype^);
t:=crealconstnode.create(int(lvd)/int(rvd),pbestrealtype^);
end;
else
CGMessage(type_e_mismatch);
end;
resulttypepass(t);
result:=t;
exit;
end;
@ -327,7 +328,6 @@ implementation
else
CGMessage(type_e_mismatch);
end;
resulttypepass(t);
result:=t;
exit;
end;
@ -367,7 +367,6 @@ implementation
end;
donewidestring(ws1);
donewidestring(ws2);
resulttypepass(t);
result:=t;
exit;
end;
@ -432,7 +431,6 @@ implementation
end;
ansistringdispose(s1,l1);
ansistringdispose(s2,l2);
resulttypepass(t);
result:=t;
exit;
end;
@ -526,7 +524,6 @@ implementation
End;
end;
dispose(resultset);
resulttypepass(t);
result:=t;
exit;
end;
@ -585,7 +582,6 @@ implementation
(b and (ot=unequaln)) then
begin
hp:=cnotnode.create(hp);
resulttypepass(hp);
end;
result:=hp;
exit;
@ -602,7 +598,6 @@ implementation
(b and (ot=unequaln)) then
begin
hp:=cnotnode.create(hp);
resulttypepass(hp);
end;
result:=hp;
exit;
@ -623,7 +618,6 @@ implementation
begin
inserttypeconv(left,cshortstringtype);
hp := genaddsstringcharoptnode(self);
resulttypepass(hp);
result := hp;
exit;
end;
@ -811,7 +805,7 @@ implementation
if not(is_shortstring(rd) or is_char(rd)) then
inserttypeconv(right,cshortstringtype);
end;
end
{ pointer comparision and subtraction }
@ -1375,7 +1369,10 @@ begin
end.
{
$Log$
Revision 1.35 2001-08-31 15:42:15 jonas
Revision 1.36 2001-09-02 21:12:06 peter
* move class of definitions into type section for delphi
Revision 1.35 2001/08/31 15:42:15 jonas
* added missing type conversion from small to normal sets
Revision 1.34 2001/08/30 15:43:14 jonas

View File

@ -35,12 +35,14 @@ interface
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tnothingnodeclass = class of tnothingnode;
terrornode = class(tnode)
constructor create;virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
terrornodeclass = class of terrornode;
tasmnode = class(tnode)
p_asm : taasmoutput;
@ -51,6 +53,7 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode): boolean; override;
end;
tasmnodeclass = class of tasmnode;
tstatementnode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
@ -60,12 +63,14 @@ interface
procedure dowrite;override;
{$endif extdebug}
end;
tstatementnodeclass = class of tstatementnode;
tblocknode = class(tunarynode)
constructor create(l : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tblocknodeclass = class of tblocknode;
{ to allow access to the location by temp references even after the temp has }
{ already been disposed and to make sure the coherency between temps and }
@ -100,6 +105,7 @@ interface
protected
persistent: boolean;
end;
ttempcreatenodeclass = class of ttempcreatenode;
{ a node which is a reference to a certain temp }
ttemprefnode = class(tnode)
@ -111,6 +117,7 @@ interface
protected
tempinfo: ptempinfo;
end;
ttemprefnodeclass = class of ttemprefnode;
{ a node which removes a temp }
ttempdeletenode = class(tnode)
@ -123,16 +130,17 @@ interface
protected
tempinfo: ptempinfo;
end;
ttempdeletenodeclass = class of ttempdeletenode;
var
cnothingnode : class of tnothingnode;
cerrornode : class of terrornode;
casmnode : class of tasmnode;
cstatementnode : class of tstatementnode;
cblocknode : class of tblocknode;
ctempcreatenode : class of ttempcreatenode;
ctemprefnode : class of ttemprefnode;
ctempdeletenode : class of ttempdeletenode;
cnothingnode : tnothingnodeclass;
cerrornode : terrornodeclass;
casmnode : tasmnodeclass;
cstatementnode : tstatementnodeclass;
cblocknode : tblocknodeclass;
ctempcreatenode : ttempcreatenodeclass;
ctemprefnode : ttemprefnodeclass;
ctempdeletenode : ttempdeletenodeclass;
implementation
@ -617,7 +625,10 @@ begin
end.
{
$Log$
Revision 1.16 2001-08-26 13:36:38 florian
Revision 1.17 2001-09-02 21:12:06 peter
* move class of definitions into type section for delphi
Revision 1.16 2001/08/26 13:36:38 florian
* some cg reorganisation
* some PPC updates

View File

@ -47,7 +47,7 @@ interface
{ the RTL) (JM) }
restype: ttype;
restypeset: boolean;
{ only the processor specific nodes need to override this }
{ constructor }
constructor create(l:tnode; v : tprocsym;st : tsymtable; mp : tnode);virtual;
@ -61,6 +61,7 @@ interface
function docompare(p: tnode): boolean; override;
procedure set_procvar(procvar:tnode);
end;
tcallnodeclass = class of tcallnode;
tcallparaflags = (
{ flags used by tcallparanode }
@ -89,6 +90,7 @@ interface
para_alignment,para_offset : longint);virtual;abstract;
function docompare(p: tnode): boolean; override;
end;
tcallparanodeclass = class of tcallparanode;
tprocinlinenode = class(tnode)
inlinetree : tnode;
@ -101,14 +103,15 @@ interface
function pass_1 : tnode;override;
function docompare(p: tnode): boolean; override;
end;
tprocinlinenodeclass = class of tprocinlinenode;
function reverseparameters(p: tcallparanode): tcallparanode;
var
ccallnode : class of tcallnode;
ccallparanode : class of tcallparanode;
cprocinlinenode : class of tprocinlinenode;
ccallnode : tcallnodeclass;
ccallparanode : tcallparanodeclass;
cprocinlinenode : tprocinlinenodeclass;
implementation
@ -1357,7 +1360,6 @@ implementation
end
else
hpt:=geninlinenode(tprocdef(procdefinition).extnumber,is_const,nil);
resulttypepass(hpt);
result:=hpt;
goto errorexit;
end;
@ -1744,7 +1746,10 @@ begin
end.
{
$Log$
Revision 1.48 2001-08-30 15:39:59 jonas
Revision 1.49 2001-09-02 21:12:06 peter
* move class of definitions into type section for delphi
Revision 1.48 2001/08/30 15:39:59 jonas
* fixed docompare for the fields I added to tcallnode in my previous
commit
* removed nested comment warning

View File

@ -77,23 +77,26 @@ interface
function first_char_to_char : tnode;virtual;
function first_call_helper(c : tconverttype) : tnode;
end;
ttypeconvnodeclass = class of ttypeconvnode;
tasnode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tasnodeclass = class of tasnode;
tisnode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tisnodeclass = class of tisnode;
var
ctypeconvnode : class of ttypeconvnode;
casnode : class of tasnode;
cisnode : class of tisnode;
ctypeconvnode : ttypeconvnodeclass;
casnode : tasnodeclass;
cisnode : tisnodeclass;
procedure inserttypeconv(var p:tnode;const t:ttype);
procedure arrayconstructor_to_set(var p : tarrayconstructornode);
@ -398,14 +401,14 @@ implementation
if left.nodetype=ordconstn then
begin
{ check if we have a valid pointer constant (JM) }
if (sizeof(tordconstnode) > sizeof(tpointerord)) then
if (sizeof(tpointerord) = 4) then
if (sizeof(pointer) > sizeof(TConstPtrUInt)) then
if (sizeof(TConstPtrUInt) = 4) then
begin
if (tordconstnode(left).value < low(longint)) or
(tordconstnode(left).value > high(cardinal)) then
CGMessage(parser_e_range_check_error);
end
else if (sizeof(tpointerord) = 8) then
else if (sizeof(TConstPtrUInt) = 8) then
begin
if (tordconstnode(left).value < low(int64)) or
(tordconstnode(left).value > high(qword)) then
@ -413,8 +416,7 @@ implementation
end
else
internalerror(2001020801);
t:=cpointerconstnode.create(tpointerord(tordconstnode(left).value),resulttype);
resulttypepass(t);
t:=cpointerconstnode.create(TConstPtrUInt(tordconstnode(left).value),resulttype);
result:=t;
end
else
@ -427,9 +429,8 @@ implementation
'fpc_chararray_to_'+lower(tstringdef(resulttype.def).stringtypname),
ccallparanode.create(left,nil),resulttype);
left := nil;
resulttypepass(result);
end;
function ttypeconvnode.resulttype_string_to_chararray : tnode;
var
arrsize: longint;
@ -454,9 +455,8 @@ implementation
'_to_chararray',ccallparanode.create(left,ccallparanode.create(
cordconstnode.create(arrsize,s32bittype),nil)),resulttype);
left := nil;
resulttypepass(result);
end;
function ttypeconvnode.resulttype_string_to_string : tnode;
var
procname: string[31];
@ -509,10 +509,9 @@ implementation
st_shortstring) then
stringpara.right := ccallparanode.create(cinlinenode.create(
in_high_x,false,self.getcopy),nil);
{ and create the callnode }
result := ccallnode.createinternres(procname,stringpara,resulttype);
resulttypepass(result);
end;
end;
@ -536,7 +535,6 @@ implementation
end
else
hp:=cstringconstnode.createstr(chr(tordconstnode(left).value),tstringdef(resulttype.def).string_typ);
resulttypepass(hp);
result:=hp;
end
else
@ -553,7 +551,6 @@ implementation
{ and finally the call }
result := ccallnode.createinternres(procname,para,resulttype);
resulttypepass(result);
end;
end;
@ -570,7 +567,6 @@ implementation
begin
hp:=cordconstnode.create(
ord(unicode2asciichar(tcompilerwidechar(tordconstnode(left).value))),cchartype);
resulttypepass(hp);
result:=hp;
end
else if (torddef(resulttype.def).typ=uwidechar) and
@ -578,7 +574,6 @@ implementation
begin
hp:=cordconstnode.create(
asciichar2unicode(chr(tordconstnode(left).value)),cwidechartype);
resulttypepass(hp);
result:=hp;
end
else
@ -596,7 +591,6 @@ implementation
if left.nodetype=ordconstn then
begin
t:=crealconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(t);
result:=t;
exit;
end;
@ -611,7 +605,6 @@ implementation
if left.nodetype=realconstn then
begin
t:=crealconstnode.create(trealconstnode(left).value_real,resulttype);
resulttypepass(t);
result:=t;
end;
end;
@ -651,8 +644,6 @@ implementation
left:=nil;
{ create a set constructor tree }
arrayconstructor_to_set(tarrayconstructornode(hp));
{ now resulttypepass the set }
resulttypepass(hp);
result:=hp;
end;
@ -663,7 +654,6 @@ implementation
'fpc_pchar_to_'+lower(tstringdef(resulttype.def).stringtypname),
ccallparanode.create(left,nil),resulttype);
left := nil;
resulttypepass(result);
end;
@ -765,7 +755,6 @@ implementation
{ tell explicitly which def we must use !! (PM) }
tcallnode(hp).procdefinition:=aprocdef;
left:=nil;
resulttypepass(hp);
result:=hp;
exit;
end;
@ -843,7 +832,6 @@ implementation
if left.nodetype=ordconstn then
begin
hp:=cordconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -862,7 +850,6 @@ implementation
if left.nodetype=ordconstn then
begin
hp:=cordconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -877,7 +864,6 @@ implementation
else if (left.nodetype=niln) and is_ordinal(resulttype.def) then
begin
hp:=cordconstnode.create(0,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -887,7 +873,6 @@ implementation
(left.nodetype=pointerconstn) then
begin
hp:=cordconstnode.create(tpointerconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -900,7 +885,6 @@ implementation
if left.nodetype=ordconstn then
begin
hp:=cordconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -919,7 +903,6 @@ implementation
if left.nodetype=ordconstn then
begin
hp:=cordconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -938,7 +921,6 @@ implementation
if left.nodetype=ordconstn then
begin
hp:=cordconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -956,7 +938,6 @@ implementation
if left.nodetype=ordconstn then
begin
hp:=cordconstnode.create(tordconstnode(left).value,resulttype);
resulttypepass(hp);
result:=hp;
exit;
end
@ -1039,7 +1020,6 @@ implementation
begin
hp:=cnilnode.create;
hp.resulttype:=resulttype;
resulttypepass(hp);
result:=hp;
exit;
end;
@ -1486,7 +1466,10 @@ begin
end.
{
$Log$
Revision 1.35 2001-08-29 19:49:03 jonas
Revision 1.36 2001-09-02 21:12:06 peter
* move class of definitions into type section for delphi
Revision 1.35 2001/08/29 19:49:03 jonas
* some fixes in compilerprocs for chararray to string conversions
* conversion from string to chararray is now also done via compilerprocs

View File

@ -43,6 +43,7 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode) : boolean; override;
end;
trealconstnodeclass = class of trealconstnode;
tordconstnode = class(tnode)
restype : ttype;
@ -53,16 +54,18 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode) : boolean; override;
end;
tordconstnodeclass = class of tordconstnode;
tpointerconstnode = class(tnode)
restype : ttype;
value : TPointerOrd;
constructor create(v : tpointerord;const t:ttype);virtual;
value : TConstPtrUInt;
constructor create(v : TConstPtrUInt;const t:ttype);virtual;
function getcopy : tnode;override;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
function docompare(p: tnode) : boolean; override;
end;
tpointerconstnodeclass = class of tpointerconstnode;
tstringconstnode = class(tnode)
value_str : pchar;
@ -79,6 +82,7 @@ interface
function getpcharcopy : pchar;
function docompare(p: tnode) : boolean; override;
end;
tstringconstnodeclass = class of tstringconstnode;
tsetconstnode = class(tunarynode)
restype : ttype;
@ -91,20 +95,22 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode) : boolean; override;
end;
tsetconstnodeclass = class of tsetconstnode;
tnilnode = class(tnode)
constructor create;virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tnilnodeclass = class of tnilnode;
var
crealconstnode : class of trealconstnode;
cordconstnode : class of tordconstnode;
cpointerconstnode : class of tpointerconstnode;
cstringconstnode : class of tstringconstnode;
csetconstnode : class of tsetconstnode;
cnilnode : class of tnilnode;
crealconstnode : trealconstnodeclass;
cordconstnode : tordconstnodeclass;
cpointerconstnode : tpointerconstnodeclass;
cstringconstnode : tstringconstnodeclass;
csetconstnode : tsetconstnodeclass;
cnilnode : tnilnodeclass;
function genintconstnode(v : TConstExprInt) : tordconstnode;
function genenumnode(v : tenumsym) : tordconstnode;
@ -255,29 +261,29 @@ implementation
p1:=nil;
case p.consttyp of
constint :
p1:=genintconstnode(p.value);
p1:=genintconstnode(p.valueord);
conststring :
begin
len:=p.len;
if not(cs_ansistrings in aktlocalswitches) and (len>255) then
len:=255;
getmem(pc,len+1);
move(pchar(tpointerord(p.value))^,pc^,len);
move(pchar(p.valueptr)^,pc^,len);
pc[len]:=#0;
p1:=cstringconstnode.createpchar(pc,len);
end;
constchar :
p1:=cordconstnode.create(p.value,cchartype);
p1:=cordconstnode.create(p.valueord,cchartype);
constreal :
p1:=crealconstnode.create(pbestreal(tpointerord(p.value))^,pbestrealtype^);
p1:=crealconstnode.create(pbestreal(p.valueptr)^,pbestrealtype^);
constbool :
p1:=cordconstnode.create(p.value,booltype);
p1:=cordconstnode.create(p.valueord,booltype);
constset :
p1:=csetconstnode.create(pconstset(tpointerord(p.value)),p.consttype);
p1:=csetconstnode.create(pconstset(p.valueptr),p.consttype);
constord :
p1:=cordconstnode.create(p.value,p.consttype);
p1:=cordconstnode.create(p.valueord,p.consttype);
constpointer :
p1:=cpointerconstnode.create(p.value,p.consttype);
p1:=cpointerconstnode.create(p.valueordptr,p.consttype);
constnil :
p1:=cnilnode.create;
constresourcestring:
@ -383,7 +389,7 @@ implementation
TPOINTERCONSTNODE
*****************************************************************************}
constructor tpointerconstnode.create(v : tpointerord;const t:ttype);
constructor tpointerconstnode.create(v : TConstPtrUInt;const t:ttype);
begin
inherited create(pointerconstn);
@ -656,7 +662,10 @@ begin
end.
{
$Log$
Revision 1.21 2001-08-26 13:36:40 florian
Revision 1.22 2001-09-02 21:12:06 peter
* move class of definitions into type section for delphi
Revision 1.21 2001/08/26 13:36:40 florian
* some cg reorganisation
* some PPC updates

View File

@ -48,36 +48,42 @@ interface
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
twhilerepeatnodeclass = class of twhilerepeatnode;
tifnode = class(tloopnode)
constructor create(l,r,_t1 : tnode);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
tifnodeclass = class of tifnode;
tfornode = class(tloopnode)
constructor create(l,r,_t1,_t2 : tnode;back : boolean);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
tfornodeclass = class of tfornode;
texitnode = class(tunarynode)
constructor create(l:tnode);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
texitnodeclass = class of texitnode;
tbreaknode = class(tnode)
constructor create;virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
tbreaknodeclass = class of tbreaknode;
tcontinuenode = class(tnode)
constructor create;virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
tcontinuenodeclass = class of tcontinuenode;
tgotonode = class(tnode)
labelnr : tasmlabel;
@ -89,6 +95,7 @@ interface
function pass_1 : tnode;override;
function docompare(p: tnode): boolean; override;
end;
tgotonodeclass = class of tgotonode;
tlabelnode = class(tunarynode)
labelnr : tasmlabel;
@ -101,6 +108,7 @@ interface
function pass_1 : tnode;override;
function docompare(p: tnode): boolean; override;
end;
tlabelnodeclass = class of tlabelnode;
traisenode = class(tbinarynode)
frametree : tnode;
@ -111,18 +119,21 @@ interface
function pass_1 : tnode;override;
function docompare(p: tnode): boolean; override;
end;
traisenodeclass = class of traisenode;
ttryexceptnode = class(tloopnode)
constructor create(l,r,_t1 : tnode);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
ttryexceptnodeclass = class of ttryexceptnode;
ttryfinallynode = class(tbinarynode)
constructor create(l,r:tnode);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
ttryfinallynodeclass = class of ttryfinallynode;
tonnode = class(tbinarynode)
exceptsymtable : tsymtable;
@ -134,6 +145,7 @@ interface
function getcopy : tnode;override;
function docompare(p: tnode): boolean; override;
end;
tonnodeclass = class of tonnode;
tfailnode = class(tnode)
constructor create;virtual;
@ -141,24 +153,25 @@ interface
function pass_1: tnode;override;
function docompare(p: tnode): boolean; override;
end;
tfailnodeclass = class of tfailnode;
{ for compatibilty }
function genloopnode(t : tnodetype;l,r,n1 : tnode;back : boolean) : tnode;
var
cwhilerepeatnode : class of twhilerepeatnode;
cifnode : class of tifnode;
cfornode : class of tfornode;
cexitnode : class of texitnode;
cbreaknode : class of tbreaknode;
ccontinuenode : class of tcontinuenode;
cgotonode : class of tgotonode;
clabelnode : class of tlabelnode;
craisenode : class of traisenode;
ctryexceptnode : class of ttryexceptnode;
ctryfinallynode : class of ttryfinallynode;
connode : class of tonnode;
cfailnode : class of tfailnode;
cwhilerepeatnode : twhilerepeatnodeclass;
cifnode : tifnodeclass;
cfornode : tfornodeclass;
cexitnode : texitnodeclass;
cbreaknode : tbreaknodeclass;
ccontinuenode : tcontinuenodeclass;
cgotonode : tgotonodeclass;
clabelnode : tlabelnodeclass;
craisenode : traisenodeclass;
ctryexceptnode : ttryexceptnodeclass;
ctryfinallynode : ttryfinallynodeclass;
connode : tonnodeclass;
cfailnode : tfailnodeclass;
implementation
@ -1167,7 +1180,10 @@ begin
end.
{
$Log$
Revision 1.23 2001-08-30 20:56:38 peter
Revision 1.24 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.23 2001/08/30 20:56:38 peter
* exit() with exceptions fix
Revision 1.22 2001/08/26 13:36:40 florian

View File

@ -45,9 +45,10 @@ interface
function handle_read_write: tnode;
function handle_val: tnode;
end;
tinlinenodeclass = class of tinlinenode;
var
cinlinenode : class of tinlinenode;
cinlinenode : tinlinenodeclass;
function geninlinenode(number : byte;is_const:boolean;l : tnode) : tinlinenode;
@ -380,7 +381,7 @@ implementation
{ temprefs will be part of the filepara, of which we need }
{ the resulttype later on and temprefs can only be }
{ resulttypepassed if the resulttype of the temp is known) }
resulttypepass(filetemp);
resulttypepass(tnode(filetemp));
{ assign the address of the file to the temp }
newstatement.left := cstatementnode.create(nil,
@ -781,7 +782,6 @@ implementation
{ otherwise return the newly generated block of instructions, }
{ but first free the errornode we generated at the beginning }
result.free;
resulttypepass(newblock);
result := newblock
end;
end;
@ -859,7 +859,7 @@ implementation
newstatement := tstatementnode(newstatement.left);
{ set the resulttype of the temp (needed to be able to get }
{ the resulttype of the tempref used in the new code para) }
resulttypepass(tempcode);
resulttypepass(tnode(tempcode));
{ create a temp codepara, but save the original code para to }
{ assign the result to later on }
if assigned(codepara) then
@ -959,8 +959,6 @@ implementation
{ free the errornode }
result.free;
{ resulttypepass our new code }
resulttypepass(newblock);
{ and return it }
result := newblock;
end;
@ -1041,12 +1039,8 @@ implementation
end;
procedure setconstrealvalue(r : bestreal);
var
hp : tnode;
begin
hp:=crealconstnode.create(r,pbestrealtype^);
resulttypepass(hp);
result:=hp;
result:=crealconstnode.create(r,pbestrealtype^);
end;
var
@ -1268,7 +1262,6 @@ implementation
end;
if hp=nil then
hp:=tnode.create(errorn);
resulttypepass(hp);
result:=hp;
goto myexit;
end
@ -1304,7 +1297,6 @@ implementation
in_hi_qword :
hp:=cordconstnode.create(tordconstnode(left).value shr 32,left.resulttype);
end;
resulttypepass(hp);
result:=hp;
goto myexit;
end;
@ -1342,7 +1334,6 @@ implementation
if (left.nodetype=ordconstn) then
begin
hp:=cordconstnode.create(tordconstnode(left).value,s32bittype);
resulttypepass(hp);
result:=hp;
goto myexit;
end;
@ -1358,7 +1349,6 @@ implementation
hp:=ctypeconvnode.create(left,u8bittype);
left:=nil;
include(hp.flags,nf_explizit);
resulttypepass(hp);
result:=hp;
end;
bool16bit,
@ -1368,7 +1358,6 @@ implementation
hp:=ctypeconvnode.create(left,u16bittype);
left:=nil;
include(hp.flags,nf_explizit);
resulttypepass(hp);
result:=hp;
end;
bool32bit :
@ -1377,7 +1366,6 @@ implementation
hp:=ctypeconvnode.create(left,u32bittype);
left:=nil;
include(hp.flags,nf_explizit);
resulttypepass(hp);
result:=hp;
end;
uvoid :
@ -1396,7 +1384,6 @@ implementation
hp:=ctypeconvnode.create(left,s32bittype);
left:=nil;
include(hp.flags,nf_explizit);
resulttypepass(hp);
result:=hp;
end;
else
@ -1411,7 +1398,6 @@ implementation
hp:=ctypeconvnode.create(left,cchartype);
include(hp.flags,nf_explizit);
left:=nil;
resulttypepass(hp);
result:=hp;
end;
@ -1436,7 +1422,6 @@ implementation
if (left.nodetype=stringconstn) then
begin
hp:=cordconstnode.create(tstringconstnode(left).len,s32bittype);
resulttypepass(hp);
result:=hp;
goto myexit;
end;
@ -1448,7 +1433,6 @@ implementation
is_widechar(left.resulttype.def) then
begin
hp:=cordconstnode.create(1,s32bittype);
resulttypepass(hp);
result:=hp;
goto myexit;
end
@ -1463,7 +1447,6 @@ implementation
srsym:=searchsymonlyin(tloadnode(left).symtable,'high'+tvarsym(tloadnode(left).symtableentry).name);
hp:=caddnode.create(addn,cloadnode.create(tvarsym(srsym),tloadnode(left).symtable),
cordconstnode.create(1,s32bittype));
resulttypepass(hp);
result:=hp;
goto myexit;
end
@ -1473,7 +1456,6 @@ implementation
hp:=cordconstnode.create(tarraydef(left.resulttype.def).highrange-
tarraydef(left.resulttype.def).lowrange+1,
s32bittype);
resulttypepass(hp);
result:=hp;
goto myexit;
end;
@ -1509,7 +1491,6 @@ implementation
begin
set_varstate(left,false);
hp:=cordconstnode.create(0,s32bittype);
resulttypepass(hp);
result:=hp;
goto myexit;
end;
@ -1535,7 +1516,6 @@ implementation
hp:=cordconstnode.create(tordconstnode(left).value+1,left.resulttype)
else
hp:=cordconstnode.create(tordconstnode(left).value-1,left.resulttype);
resulttypepass(hp);
result:=hp;
end;
end;
@ -1650,7 +1630,6 @@ implementation
hp:=ccallparanode.create(cordconstnode.create(tcallparanode(left).left.resulttype.def.size,s32bittype),left);
hp:=ccallnode.create(hp,tprocsym(srsym),systemunit,nil);
left:=nil;
resulttypepass(hp);
result:=hp;
end;
@ -1714,13 +1693,11 @@ implementation
enumdef:
begin
hp:=do_lowhigh(left.resulttype);
resulttypepass(hp);
result:=hp;
end;
setdef:
begin
hp:=do_lowhigh(tsetdef(left.resulttype.def).elementtype);
resulttypepass(hp);
result:=hp;
end;
arraydef:
@ -1728,7 +1705,6 @@ implementation
if inlinenumber=in_low_x then
begin
hp:=cordconstnode.create(tarraydef(left.resulttype.def).lowrange,tarraydef(left.resulttype.def).rangetype);
resulttypepass(hp);
result:=hp;
end
else
@ -1738,7 +1714,6 @@ implementation
begin
srsym:=searchsymonlyin(tloadnode(left).symtable,'high'+tvarsym(tloadnode(left).symtableentry).name);
hp:=cloadnode.create(tvarsym(srsym),tloadnode(left).symtable);
resulttypepass(hp);
result:=hp;
end
else
@ -1753,7 +1728,6 @@ implementation
{ make sure the left node doesn't get disposed, since it's }
{ reused in the new node (JM) }
left:=nil;
resulttypepass(hp);
result:=hp;
end
else
@ -2303,7 +2277,10 @@ begin
end.
{
$Log$
Revision 1.54 2001-08-28 13:24:46 jonas
Revision 1.55 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.54 2001/08/28 13:24:46 jonas
+ compilerproc implementation of most string-related type conversions
- removed all code from the compiler which has been replaced by
compilerproc implementations (using {$ifdef hascompilerproc} is not

View File

@ -41,6 +41,7 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode): boolean; override;
end;
tloadnodeclass = class of tloadnode;
{ different assignment types }
tassigntype = (at_normal,at_plus,at_minus,at_star,at_slash);
@ -53,6 +54,7 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode): boolean; override;
end;
tassignmentnodeclass = class of tassignmentnode;
tfuncretnode = class(tnode)
funcretsym : tfuncretsym;
@ -62,12 +64,14 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode): boolean; override;
end;
tfuncretnodeclass = class of tfuncretnode;
tarrayconstructorrangenode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tarrayconstructorrangenodeclass = class of tarrayconstructorrangenode;
tarrayconstructornode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
@ -77,6 +81,7 @@ interface
function docompare(p: tnode): boolean; override;
procedure force_type(tt:ttype);
end;
tarrayconstructornodeclass = class of tarrayconstructornode;
ttypenode = class(tnode)
allowed : boolean;
@ -86,14 +91,15 @@ interface
function det_resulttype:tnode;override;
function docompare(p: tnode): boolean; override;
end;
ttypenodeclass = class of ttypenode;
var
cloadnode : class of tloadnode;
cassignmentnode : class of tassignmentnode;
cfuncretnode : class of tfuncretnode;
carrayconstructorrangenode : class of tarrayconstructorrangenode;
carrayconstructornode : class of tarrayconstructornode;
ctypenode : class of ttypenode;
cloadnode : tloadnodeclass;
cassignmentnode : tassignmentnodeclass;
cfuncretnode : tfuncretnodeclass;
carrayconstructorrangenode : tarrayconstructorrangenodeclass;
carrayconstructornode : tarrayconstructornodeclass;
ctypenode : ttypenodeclass;
implementation
@ -153,7 +159,6 @@ implementation
p1:=tnode(twithsymtable(symtable).withrefnode).getcopy;
p1:=csubscriptnode.create(tvarsym(symtableentry),p1);
left:=nil;
resulttypepass(p1);
result:=p1;
exit;
end;
@ -184,7 +189,7 @@ implementation
((tfuncretsym(symtableentry)=p^.procdef.resultfuncretsym) or
(tfuncretsym(symtableentry)=p^.procdef.funcretsym)) then
begin
symtableentry:=p^.procdef.funcretsym;
symtableentry:=p^.procdef.funcretsym;
break;
end;
p:=p^.parent;
@ -592,7 +597,6 @@ implementation
begin
hp:=tarrayconstructornode(getcopy);
arrayconstructor_to_set(hp);
resulttypepass(hp);
result:=hp;
exit;
end;
@ -796,7 +800,10 @@ begin
end.
{
$Log$
Revision 1.24 2001-08-30 15:48:34 jonas
Revision 1.25 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.24 2001/08/30 15:48:34 jonas
* fix from Peter for getting correct symtableentry for funcret loads
Revision 1.23 2001/08/26 13:36:41 florian

View File

@ -34,29 +34,33 @@ interface
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tmoddivnodeclass = class of tmoddivnode;
tshlshrnode = class(tbinopnode)
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tshlshrnodeclass = class of tshlshrnode;
tunaryminusnode = class(tunarynode)
constructor create(expr : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tunaryminusnodeclass = class of tunaryminusnode;
tnotnode = class(tunarynode)
constructor create(expr : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tnotnodeclass = class of tnotnode;
var
cmoddivnode : class of tmoddivnode;
cshlshrnode : class of tshlshrnode;
cunaryminusnode : class of tunaryminusnode;
cnotnode : class of tnotnode;
cmoddivnode : tmoddivnodeclass;
cshlshrnode : tshlshrnodeclass;
cunaryminusnode : tunaryminusnodeclass;
cnotnode : tnotnodeclass;
implementation
@ -110,7 +114,6 @@ implementation
divn:
t:=genintconstnode(lv div rv);
end;
resulttypepass(t);
result:=t;
exit;
end;
@ -119,7 +122,6 @@ implementation
t:=self;
if isbinaryoverloaded(t) then
begin
resulttypepass(t);
result:=t;
exit;
end;
@ -236,7 +238,6 @@ implementation
shln:
t:=genintconstnode(tordconstnode(left).value shl tordconstnode(right).value);
end;
resulttypepass(t);
result:=t;
exit;
end;
@ -245,7 +246,6 @@ implementation
t:=self;
if isbinaryoverloaded(t) then
begin
resulttypepass(t);
result:=t;
exit;
end;
@ -362,7 +362,6 @@ implementation
t:=ccallnode.create(ccallparanode.create(left,nil),
overloaded_operators[_minus],nil,nil);
left:=nil;
resulttypepass(t);
result:=t;
exit;
end;
@ -478,7 +477,6 @@ implementation
CGMessage(type_e_mismatch);
end;
t:=cordconstnode.create(v,left.resulttype);
resulttypepass(t);
result:=t;
exit;
end;
@ -515,7 +513,6 @@ implementation
t:=ccallnode.create(ccallparanode.create(left,nil),
overloaded_operators[_op_not],nil,nil);
left:=nil;
resulttypepass(t);
result:=t;
exit;
end;
@ -590,7 +587,10 @@ begin
end.
{
$Log$
Revision 1.21 2001-08-26 13:36:41 florian
Revision 1.22 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.21 2001/08/26 13:36:41 florian
* some cg reorganisation
* some PPC updates

View File

@ -37,48 +37,56 @@ interface
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tloadvmtnodeclass = class of tloadvmtnode;
thnewnode = class(tnode)
constructor create;virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
thnewnodeclass = class of thnewnode;
tnewnode = class(tunarynode)
constructor create(l : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tnewnodeclass = class of tnewnode;
thdisposenode = class(tunarynode)
constructor create(l : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
thdisposenodeclass = class of thdisposenode;
tsimplenewdisposenode = class(tunarynode)
constructor create(n : tnodetype;l : tnode);
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tsimplenewdisposenodeclass = class of tsimplenewdisposenode;
taddrnode = class(tunarynode)
constructor create(l : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
taddrnodeclass = class of taddrnode;
tdoubleaddrnode = class(tunarynode)
constructor create(l : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tdoubleaddrnodeclass = class of tdoubleaddrnode;
tderefnode = class(tunarynode)
constructor create(l : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tderefnodeclass = class of tderefnode;
tsubscriptnode = class(tunarynode)
vs : tvarsym;
@ -88,12 +96,14 @@ interface
function docompare(p: tnode): boolean; override;
function det_resulttype:tnode;override;
end;
tsubscriptnodeclass = class of tsubscriptnode;
tvecnode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tvecnodeclass = class of tvecnode;
tselfnode = class(tnode)
classdef : tobjectdef;
@ -101,6 +111,7 @@ interface
function pass_1 : tnode;override;
function det_resulttype:tnode;override;
end;
tselfnodeclass = class of tselfnode;
twithnode = class(tbinarynode)
withsymtable : twithsymtable;
@ -113,20 +124,21 @@ interface
function docompare(p: tnode): boolean; override;
function det_resulttype:tnode;override;
end;
twithnodeclass = class of twithnode;
var
cloadvmtnode : class of tloadvmtnode;
chnewnode : class of thnewnode;
cnewnode : class of tnewnode;
chdisposenode : class of thdisposenode;
csimplenewdisposenode : class of tsimplenewdisposenode;
caddrnode : class of taddrnode;
cdoubleaddrnode : class of tdoubleaddrnode;
cderefnode : class of tderefnode;
csubscriptnode : class of tsubscriptnode;
cvecnode : class of tvecnode;
cselfnode : class of tselfnode;
cwithnode : class of twithnode;
cloadvmtnode : tloadvmtnodeclass;
chnewnode : thnewnodeclass;
cnewnode : tnewnodeclass;
chdisposenode : thdisposenodeclass;
csimplenewdisposenode : tsimplenewdisposenodeclass;
caddrnode : taddrnodeclass;
cdoubleaddrnode : tdoubleaddrnodeclass;
cderefnode : tderefnodeclass;
csubscriptnode : tsubscriptnodeclass;
cvecnode : tvecnodeclass;
cselfnode : tselfnodeclass;
cwithnode : twithnodeclass;
implementation
@ -970,7 +982,10 @@ begin
end.
{
$Log$
Revision 1.19 2001-08-26 13:36:42 florian
Revision 1.20 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.19 2001/08/26 13:36:42 florian
* some cg reorganisation
* some PPC updates

View File

@ -62,11 +62,13 @@ type
taddsstringcharoptnode = class(taddsstringoptnode)
constructor create(l,r : tnode); virtual;
end;
taddsstringcharoptnodeclass = class of taddsstringcharoptnode;
{ add a constant string to a short string }
taddsstringcsstringoptnode = class(taddsstringoptnode)
constructor create(l,r : tnode); virtual;
end;
taddsstringcsstringoptnodeclass = class of taddsstringcsstringoptnode;
function canbeaddsstringcharoptnode(p: taddnode): boolean;
function genaddsstringcharoptnode(p: taddnode): tnode;
@ -77,10 +79,8 @@ function genaddsstringcsstringoptnode(p: taddnode): tnode;
function is_addsstringoptnode(p: tnode): boolean;
var
{ these are never used directly
caddoptnode: class of taddoptnode; }
caddsstringcharoptnode: class of taddsstringcharoptnode;
caddsstringcsstringoptnode: class of taddsstringcsstringoptnode;
caddsstringcharoptnode: taddsstringcharoptnodeclass;
caddsstringcsstringoptnode: taddsstringcsstringoptnodeclass;
implementation
@ -278,7 +278,10 @@ end.
{
$Log$
Revision 1.4 2001-08-26 13:36:43 florian
Revision 1.5 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.4 2001/08/26 13:36:43 florian
* some cg reorganisation
* some PPC updates

View File

@ -54,18 +54,21 @@ interface
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
tsetelementnodeclass = class of tsetelementnode;
tinnode = class(tbinopnode)
constructor create(l,r : tnode);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
tinnodeclass = class of tinnode;
trangenode = class(tbinarynode)
constructor create(l,r : tnode);virtual;
function det_resulttype:tnode;override;
function pass_1 : tnode;override;
end;
trangenodeclass = class of trangenode;
tcasenode = class(tbinarynode)
nodes : pcaserecord;
@ -78,12 +81,13 @@ interface
function pass_1 : tnode;override;
function docompare(p: tnode): boolean; override;
end;
tcasenodeclass = class of tcasenode;
var
csetelementnode : class of tsetelementnode;
cinnode : class of tinnode;
crangenode : class of trangenode;
ccasenode : class of tcasenode;
csetelementnode : tsetelementnodeclass;
cinnode : tinnodeclass;
crangenode : trangenodeclass;
ccasenode : tcasenodeclass;
{ counts the labels }
function case_count_labels(root : pcaserecord) : longint;
@ -584,7 +588,10 @@ begin
end.
{
$Log$
Revision 1.14 2001-08-26 13:36:43 florian
Revision 1.15 2001-09-02 21:12:07 peter
* move class of definitions into type section for delphi
Revision 1.14 2001/08/26 13:36:43 florian
* some cg reorganisation
* some PPC updates