mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 05:09:17 +02:00
* first version of rtti support
This commit is contained in:
parent
811044754a
commit
028721c4de
@ -142,10 +142,10 @@ implementation
|
|||||||
pushusedregisters(pushedregs,$ff);
|
pushusedregisters(pushedregs,$ff);
|
||||||
secondpass(p^.left);
|
secondpass(p^.left);
|
||||||
del_reference(p^.left^.location.reference);
|
del_reference(p^.left^.location.reference);
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
secondpass(p^.right);
|
secondpass(p^.right);
|
||||||
del_reference(p^.right^.location.reference);
|
del_reference(p^.right^.location.reference);
|
||||||
emitpushreferenceaddr(p^.right^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.right^.location.reference);
|
||||||
emitcall('ANSISTRCMP',true);
|
emitcall('ANSISTRCMP',true);
|
||||||
maybe_loadesi;
|
maybe_loadesi;
|
||||||
popusedregisters(pushedregs);
|
popusedregisters(pushedregs);
|
||||||
@ -224,8 +224,8 @@ implementation
|
|||||||
pushusedregisters(pushedregs,pstringdef(p^.left^.resulttype)^.len)
|
pushusedregisters(pushedregs,pstringdef(p^.left^.resulttype)^.len)
|
||||||
else
|
else
|
||||||
pushusedregisters(pushedregs,$ff);
|
pushusedregisters(pushedregs,$ff);
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
emitpushreferenceaddr(p^.right^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.right^.location.reference);
|
||||||
emitcall('STRCONCAT',true);
|
emitcall('STRCONCAT',true);
|
||||||
maybe_loadesi;
|
maybe_loadesi;
|
||||||
popusedregisters(pushedregs);
|
popusedregisters(pushedregs);
|
||||||
@ -265,10 +265,10 @@ implementation
|
|||||||
pushusedregisters(pushedregs,$ff);
|
pushusedregisters(pushedregs,$ff);
|
||||||
secondpass(p^.left);
|
secondpass(p^.left);
|
||||||
del_reference(p^.left^.location.reference);
|
del_reference(p^.left^.location.reference);
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
secondpass(p^.right);
|
secondpass(p^.right);
|
||||||
del_reference(p^.right^.location.reference);
|
del_reference(p^.right^.location.reference);
|
||||||
emitpushreferenceaddr(p^.right^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.right^.location.reference);
|
||||||
emitcall('STRCMP',true);
|
emitcall('STRCMP',true);
|
||||||
maybe_loadesi;
|
maybe_loadesi;
|
||||||
popusedregisters(pushedregs);
|
popusedregisters(pushedregs);
|
||||||
@ -420,8 +420,8 @@ implementation
|
|||||||
del_reference(p^.left^.location.reference);
|
del_reference(p^.left^.location.reference);
|
||||||
del_reference(p^.right^.location.reference);
|
del_reference(p^.right^.location.reference);
|
||||||
pushusedregisters(pushedregs,$ff);
|
pushusedregisters(pushedregs,$ff);
|
||||||
emitpushreferenceaddr(p^.right^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.right^.location.reference);
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
emitcall('SET_COMP_SETS',true);
|
emitcall('SET_COMP_SETS',true);
|
||||||
maybe_loadesi;
|
maybe_loadesi;
|
||||||
popusedregisters(pushedregs);
|
popusedregisters(pushedregs);
|
||||||
@ -436,11 +436,11 @@ implementation
|
|||||||
href.symbol:=nil;
|
href.symbol:=nil;
|
||||||
pushusedregisters(pushedregs,$ff);
|
pushusedregisters(pushedregs,$ff);
|
||||||
gettempofsizereference(32,href);
|
gettempofsizereference(32,href);
|
||||||
emitpushreferenceaddr(href);
|
emitpushreferenceaddr(exprasmlist,href);
|
||||||
{ wrong place !! was hard to find out
|
{ wrong place !! was hard to find out
|
||||||
pushusedregisters(pushedregs,$ff);}
|
pushusedregisters(pushedregs,$ff);}
|
||||||
emitpushreferenceaddr(p^.right^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.right^.location.reference);
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
case p^.treetype of
|
case p^.treetype of
|
||||||
subn:
|
subn:
|
||||||
emitcall('SET_SUB_SETS',true);
|
emitcall('SET_SUB_SETS',true);
|
||||||
@ -1198,7 +1198,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1998-06-08 13:13:28 pierre
|
Revision 1.3 1998-06-25 08:48:04 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.2 1998/06/08 13:13:28 pierre
|
||||||
+ temporary variables now in temp_gen.pas unit
|
+ temporary variables now in temp_gen.pas unit
|
||||||
because it is processor independent
|
because it is processor independent
|
||||||
* mppc68k.bat modified to undefine i386 and support_mmx
|
* mppc68k.bat modified to undefine i386 and support_mmx
|
||||||
|
@ -147,7 +147,7 @@ implementation
|
|||||||
R_EDI,r)));
|
R_EDI,r)));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
del_reference(p^.left^.location.reference);
|
del_reference(p^.left^.location.reference);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -168,7 +168,7 @@ implementation
|
|||||||
R_EDI,r)));
|
R_EDI,r)));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
del_reference(p^.left^.location.reference);
|
del_reference(p^.left^.location.reference);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -190,7 +190,7 @@ implementation
|
|||||||
R_EDI,r)));
|
R_EDI,r)));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
del_reference(p^.left^.location.reference);
|
del_reference(p^.left^.location.reference);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -431,7 +431,7 @@ implementation
|
|||||||
R_EDI,r)));
|
R_EDI,r)));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -729,7 +729,7 @@ implementation
|
|||||||
R_EDI,r)));
|
R_EDI,r)));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
emitpushreferenceaddr(funcretref);
|
emitpushreferenceaddr(exprasmlist,funcretref);
|
||||||
end;
|
end;
|
||||||
{ procedure variable ? }
|
{ procedure variable ? }
|
||||||
if (p^.right=nil) then
|
if (p^.right=nil) then
|
||||||
@ -1996,7 +1996,7 @@ implementation
|
|||||||
pushusedregisters(pushed,$ff);
|
pushusedregisters(pushed,$ff);
|
||||||
exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,pfiledef(p^.left^.resulttype)^.typed_as^.size)));
|
exprasmlist^.concat(new(pai386,op_const(A_PUSH,S_L,pfiledef(p^.left^.resulttype)^.typed_as^.size)));
|
||||||
secondload(p^.left);
|
secondload(p^.left);
|
||||||
emitpushreferenceaddr(p^.left^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
if p^.inlinenumber=in_reset_typedfile then
|
if p^.inlinenumber=in_reset_typedfile then
|
||||||
emitcall('RESET_TYPED',true)
|
emitcall('RESET_TYPED',true)
|
||||||
else
|
else
|
||||||
@ -2193,7 +2193,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 1998-06-09 16:01:33 pierre
|
Revision 1.4 1998-06-25 08:48:06 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.3 1998/06/09 16:01:33 pierre
|
||||||
+ added procedure directive parsing for procvars
|
+ added procedure directive parsing for procvars
|
||||||
(accepted are popstack cdecl and pascal)
|
(accepted are popstack cdecl and pascal)
|
||||||
+ added C vars with the following syntax
|
+ added C vars with the following syntax
|
||||||
|
@ -300,7 +300,7 @@ implementation
|
|||||||
if codegenerror then
|
if codegenerror then
|
||||||
exit;
|
exit;
|
||||||
pushsetelement(hp^.left);
|
pushsetelement(hp^.left);
|
||||||
emitpushreferenceaddr(sref);
|
emitpushreferenceaddr(exprasmlist,sref);
|
||||||
{ register is save in subroutine }
|
{ register is save in subroutine }
|
||||||
emitcall('SET_SET_BYTE',true);
|
emitcall('SET_SET_BYTE',true);
|
||||||
hp:=hp^.right;
|
hp:=hp^.right;
|
||||||
@ -328,7 +328,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.4 1998-06-08 13:13:31 pierre
|
Revision 1.5 1998-06-25 08:48:07 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.4 1998/06/08 13:13:31 pierre
|
||||||
+ temporary variables now in temp_gen.pas unit
|
+ temporary variables now in temp_gen.pas unit
|
||||||
because it is processor independent
|
because it is processor independent
|
||||||
* mppc68k.bat modified to undefine i386 and support_mmx
|
* mppc68k.bat modified to undefine i386 and support_mmx
|
||||||
|
@ -530,7 +530,8 @@ do_jmp:
|
|||||||
exit;
|
exit;
|
||||||
|
|
||||||
case p^.left^.location.loc of
|
case p^.left^.location.loc of
|
||||||
LOC_MEM,LOC_REFERENCE : emitpushreferenceaddr(p^.left^.location.reference);
|
LOC_MEM,LOC_REFERENCE:
|
||||||
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
LOC_CREGISTER,LOC_REGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
|
LOC_CREGISTER,LOC_REGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
|
||||||
p^.left^.location.register)));
|
p^.left^.location.register)));
|
||||||
else Message(sym_e_type_mismatch);
|
else Message(sym_e_type_mismatch);
|
||||||
@ -589,7 +590,10 @@ do_jmp:
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1998-06-08 13:13:33 pierre
|
Revision 1.3 1998-06-25 08:48:08 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.2 1998/06/08 13:13:33 pierre
|
||||||
+ temporary variables now in temp_gen.pas unit
|
+ temporary variables now in temp_gen.pas unit
|
||||||
because it is processor independent
|
because it is processor independent
|
||||||
* mppc68k.bat modified to undefine i386 and support_mmx
|
* mppc68k.bat modified to undefine i386 and support_mmx
|
||||||
|
@ -132,7 +132,8 @@ implementation
|
|||||||
case p^.left^.location.loc of
|
case p^.left^.location.loc of
|
||||||
LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
|
LOC_CREGISTER : exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,
|
||||||
p^.left^.location.register)));
|
p^.left^.location.register)));
|
||||||
LOC_REFERENCE : emitpushreferenceaddr(p^.left^.location.reference);
|
LOC_REFERENCE:
|
||||||
|
emitpushreferenceaddr(exprasmlist,p^.left^.location.reference);
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -578,7 +579,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1998-06-08 13:13:35 pierre
|
Revision 1.3 1998-06-25 08:48:09 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.2 1998/06/08 13:13:35 pierre
|
||||||
+ temporary variables now in temp_gen.pas unit
|
+ temporary variables now in temp_gen.pas unit
|
||||||
because it is processor independent
|
because it is processor independent
|
||||||
* mppc68k.bat modified to undefine i386 and support_mmx
|
* mppc68k.bat modified to undefine i386 and support_mmx
|
||||||
|
@ -395,7 +395,7 @@ implementation
|
|||||||
if p^.swaped then
|
if p^.swaped then
|
||||||
swaptree(p);
|
swaptree(p);
|
||||||
pushsetelement(p^.left);
|
pushsetelement(p^.left);
|
||||||
emitpushreferenceaddr(p^.right^.location.reference);
|
emitpushreferenceaddr(exprasmlist,p^.right^.location.reference);
|
||||||
del_reference(p^.right^.location.reference);
|
del_reference(p^.right^.location.reference);
|
||||||
{ registers need not be save. that happens in SET_IN_BYTE }
|
{ registers need not be save. that happens in SET_IN_BYTE }
|
||||||
{ (EDI is changed) }
|
{ (EDI is changed) }
|
||||||
@ -661,10 +661,8 @@ implementation
|
|||||||
cleartempgen;
|
cleartempgen;
|
||||||
secondpass(p^.left);
|
secondpass(p^.left);
|
||||||
{ determines the size of the operand }
|
{ determines the size of the operand }
|
||||||
{ determines the size of the operand }
|
|
||||||
opsize:=bytes2Sxx[p^.left^.resulttype^.size];
|
opsize:=bytes2Sxx[p^.left^.resulttype^.size];
|
||||||
{ copy the case expression to a register }
|
{ copy the case expression to a register }
|
||||||
{ copy the case expression to a register }
|
|
||||||
case p^.left^.location.loc of
|
case p^.left^.location.loc of
|
||||||
LOC_REGISTER,
|
LOC_REGISTER,
|
||||||
LOC_CREGISTER:
|
LOC_CREGISTER:
|
||||||
@ -765,7 +763,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1998-06-16 08:56:18 peter
|
Revision 1.3 1998-06-25 08:48:10 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.2 1998/06/16 08:56:18 peter
|
||||||
+ targetcpu
|
+ targetcpu
|
||||||
* cleaner pmodules for newppu
|
* cleaner pmodules for newppu
|
||||||
|
|
||||||
|
@ -234,6 +234,7 @@ unit files;
|
|||||||
uf_shared_library = $10;
|
uf_shared_library = $10;
|
||||||
uf_big_endian = $20;
|
uf_big_endian = $20;
|
||||||
uf_smartlink = $40;
|
uf_smartlink = $40;
|
||||||
|
uf_finalize = $80;
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
var
|
var
|
||||||
@ -967,7 +968,10 @@ unit files;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.27 1998-06-24 14:48:34 peter
|
Revision 1.28 1998-06-25 08:48:12 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.27 1998/06/24 14:48:34 peter
|
||||||
* ifdef newppu -> ifndef oldppu
|
* ifdef newppu -> ifndef oldppu
|
||||||
|
|
||||||
Revision 1.26 1998/06/17 14:36:19 peter
|
Revision 1.26 1998/06/17 14:36:19 peter
|
||||||
|
@ -466,6 +466,25 @@ unit pass_1;
|
|||||||
doconv:=tc_equal;
|
doconv:=tc_equal;
|
||||||
b:=true;
|
b:=true;
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
{ nil is compatible with ansi- and wide strings }
|
||||||
|
if (fromtreetype=niln) and (def_to^.deftype=stringdef)
|
||||||
|
and (pstringdef(def_to)^.string_typ in [ansistring,widestring]) then
|
||||||
|
begin
|
||||||
|
doconv:=tc_equal;
|
||||||
|
b:=true;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{ ansi- and wide strings can be assigned to void pointers }
|
||||||
|
if (def_from^.deftype=stringdef) and
|
||||||
|
(pstringdef(def_from)^.string_typ in [ansistring,widestring]) and
|
||||||
|
(def_to^.deftype=pointerdef) and
|
||||||
|
(ppointerdef(def_to)^.definition^.deftype=orddef) and
|
||||||
|
(porddef(ppointerdef(def_to)^.definition)^.typ=uvoid) then
|
||||||
|
begin
|
||||||
|
doconv:=tc_equal;
|
||||||
|
b:=true;
|
||||||
|
end
|
||||||
{ procedure variable can be assigned to an void pointer }
|
{ procedure variable can be assigned to an void pointer }
|
||||||
{ Not anymore. Use the @ operator now.}
|
{ Not anymore. Use the @ operator now.}
|
||||||
else
|
else
|
||||||
@ -2797,9 +2816,19 @@ unit pass_1;
|
|||||||
function is_equal(def1,def2 : pdef) : boolean;
|
function is_equal(def1,def2 : pdef) : boolean;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{ all types can be passed to a formaldef }
|
{ all types can be passed to a formaldef }
|
||||||
is_equal:=(def1^.deftype=formaldef) or
|
is_equal:=(def1^.deftype=formaldef) or
|
||||||
(assigned(def2) and types.is_equal(def1,def2));
|
(assigned(def2) and types.is_equal(def1,def2))
|
||||||
|
{$ifdef USEANSISTRING}
|
||||||
|
{ to support ansi/long/wide strings in a proper way }
|
||||||
|
{ string and string[10] are assumed as equal }
|
||||||
|
or
|
||||||
|
(assigned(def1) and assigned(def2) and
|
||||||
|
(def1^.deftype=stringdef) and (def2^.deftype=stringdef) and
|
||||||
|
(pstringdef(def1)^.string_typ=pstringdef(def2)^.string_typ)
|
||||||
|
)
|
||||||
|
{$endif USEANSISTRING}
|
||||||
|
;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function is_in_limit(def_from,def_to : pdef) : boolean;
|
function is_in_limit(def_from,def_to : pdef) : boolean;
|
||||||
@ -3101,14 +3130,14 @@ unit pass_1;
|
|||||||
if not is_equal(hp^.nextpara^.data,pt^.resulttype) then
|
if not is_equal(hp^.nextpara^.data,pt^.resulttype) then
|
||||||
begin
|
begin
|
||||||
def_to:=hp^.nextpara^.data;
|
def_to:=hp^.nextpara^.data;
|
||||||
if (def_from^.deftype=orddef) and (def_to^.deftype=orddef) then
|
if ((def_from^.deftype=orddef) and (def_to^.deftype=orddef)) and
|
||||||
if is_in_limit(def_from,def_to) or
|
(is_in_limit(def_from,def_to) or
|
||||||
((hp^.nextpara^.paratyp=vs_var) and
|
((hp^.nextpara^.paratyp=vs_var) and
|
||||||
(def_from^.size=def_to^.size)) then
|
(def_from^.size=def_to^.size))) then
|
||||||
begin
|
begin
|
||||||
exactmatch:=true;
|
exactmatch:=true;
|
||||||
conv_to:=def_to;
|
conv_to:=def_to;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
hp:=hp^.next;
|
hp:=hp^.next;
|
||||||
end;
|
end;
|
||||||
@ -5018,7 +5047,10 @@ unit pass_1;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.33 1998-06-16 08:56:24 peter
|
Revision 1.34 1998-06-25 08:48:14 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.33 1998/06/16 08:56:24 peter
|
||||||
+ targetcpu
|
+ targetcpu
|
||||||
* cleaner pmodules for newppu
|
* cleaner pmodules for newppu
|
||||||
|
|
||||||
|
@ -122,6 +122,7 @@ unit pmodules;
|
|||||||
|
|
||||||
|
|
||||||
procedure inserttargetspecific;
|
procedure inserttargetspecific;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{$ifdef i386}
|
{$ifdef i386}
|
||||||
case target_info.target of
|
case target_info.target of
|
||||||
@ -943,7 +944,25 @@ unit pmodules;
|
|||||||
|
|
||||||
{ Shutdown the codegen for this procedure }
|
{ Shutdown the codegen for this procedure }
|
||||||
codegen_doneprocedure;
|
codegen_doneprocedure;
|
||||||
|
{$ifdef dummy}
|
||||||
|
if token=_FINALIZATION then
|
||||||
|
begin
|
||||||
|
current_module^.flags:=current_module^.flags or uf_finalize;
|
||||||
|
{ clear flags }
|
||||||
|
procinfo.flags:=0;
|
||||||
|
|
||||||
|
{Reset the codegenerator.}
|
||||||
|
codegen_newprocedure;
|
||||||
|
|
||||||
|
names.init;
|
||||||
|
names.insert(current_module^.modulename^+'_finalize');
|
||||||
|
names.insert('FINALIZE$$'+current_module^.modulename^);
|
||||||
|
compile_proc_body(names,true,false);
|
||||||
|
names.done;
|
||||||
|
|
||||||
|
codegen_doneprocedure;
|
||||||
|
end;
|
||||||
|
{$endif dummy}
|
||||||
consume(POINT);
|
consume(POINT);
|
||||||
|
|
||||||
{ size of the static data }
|
{ size of the static data }
|
||||||
@ -1131,7 +1150,10 @@ unit pmodules;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.31 1998-06-24 14:48:35 peter
|
Revision 1.32 1998-06-25 08:48:16 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.31 1998/06/24 14:48:35 peter
|
||||||
* ifdef newppu -> ifndef oldppu
|
* ifdef newppu -> ifndef oldppu
|
||||||
|
|
||||||
Revision 1.30 1998/06/17 14:10:16 peter
|
Revision 1.30 1998/06/17 14:10:16 peter
|
||||||
|
@ -815,7 +815,7 @@ unit pstatmnt;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function statement_block : ptree;
|
function statement_block(starttoken : ttoken) : ptree;
|
||||||
|
|
||||||
var
|
var
|
||||||
first,last : ptree;
|
first,last : ptree;
|
||||||
@ -824,10 +824,13 @@ unit pstatmnt;
|
|||||||
begin
|
begin
|
||||||
first:=nil;
|
first:=nil;
|
||||||
filepos:=tokenpos;
|
filepos:=tokenpos;
|
||||||
consume(_BEGIN);
|
consume(starttoken);
|
||||||
inc(statement_level);
|
inc(statement_level);
|
||||||
|
|
||||||
while token<>_END do
|
while not(
|
||||||
|
(token=_END) or
|
||||||
|
((starttoken=_INITIALIZATION) and (token=_FINALIZATION))
|
||||||
|
) do
|
||||||
begin
|
begin
|
||||||
if first=nil then
|
if first=nil then
|
||||||
begin
|
begin
|
||||||
@ -839,7 +842,8 @@ unit pstatmnt;
|
|||||||
last^.left:=gennode(statementn,nil,statement);
|
last^.left:=gennode(statementn,nil,statement);
|
||||||
last:=last^.left;
|
last:=last^.left;
|
||||||
end;
|
end;
|
||||||
if token=_END then
|
if (token=_END) or
|
||||||
|
((starttoken=_INITIALIZATION) and (token=_FINALIZATION)) then
|
||||||
break
|
break
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -855,7 +859,13 @@ unit pstatmnt;
|
|||||||
end;
|
end;
|
||||||
emptystats;
|
emptystats;
|
||||||
end;
|
end;
|
||||||
consume(_END);
|
|
||||||
|
{ don't consume the finalization token, it is consumed when
|
||||||
|
reading the finalization block !
|
||||||
|
}
|
||||||
|
if token=_END then
|
||||||
|
consume(_END);
|
||||||
|
|
||||||
dec(statement_level);
|
dec(statement_level);
|
||||||
|
|
||||||
last:=gensinglenode(blockn,first);
|
last:=gensinglenode(blockn,first);
|
||||||
@ -901,7 +911,7 @@ unit pstatmnt;
|
|||||||
plabelsym(srsym)^.number);
|
plabelsym(srsym)^.number);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
_BEGIN : code:=statement_block;
|
_BEGIN : code:=statement_block(_BEGIN);
|
||||||
_IF : code:=if_statement;
|
_IF : code:=if_statement;
|
||||||
_CASE : code:=case_statement;
|
_CASE : code:=case_statement;
|
||||||
_REPEAT : code:=repeat_statement;
|
_REPEAT : code:=repeat_statement;
|
||||||
@ -916,11 +926,13 @@ unit pstatmnt;
|
|||||||
SEMICOLON,
|
SEMICOLON,
|
||||||
_ELSE,
|
_ELSE,
|
||||||
_UNTIL,
|
_UNTIL,
|
||||||
_END : code:=genzeronode(niln);
|
_END:
|
||||||
_CONTINUE : begin
|
code:=genzeronode(niln);
|
||||||
consume(_CONTINUE);
|
_CONTINUE:
|
||||||
code:=genzeronode(continuen);
|
begin
|
||||||
end;
|
consume(_CONTINUE);
|
||||||
|
code:=genzeronode(continuen);
|
||||||
|
end;
|
||||||
_FAIL : begin
|
_FAIL : begin
|
||||||
{ internalerror(100); }
|
{ internalerror(100); }
|
||||||
if (aktprocsym^.definition^.options and poconstructor)=0 then
|
if (aktprocsym^.definition^.options and poconstructor)=0 then
|
||||||
@ -1065,19 +1077,37 @@ unit pstatmnt;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{Unit initialization?.}
|
{Unit initialization?.}
|
||||||
if (lexlevel=1) then
|
if (lexlevel=1) and (current_module^.is_unit) then
|
||||||
if (token=_END) then
|
if (token=_END) then
|
||||||
begin
|
begin
|
||||||
consume(_END);
|
consume(_END);
|
||||||
block:=nil;
|
block:=nil;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
current_module^.flags:=current_module^.flags or uf_init;
|
if token=_INITIALIZATION then
|
||||||
block:=statement_block;
|
begin
|
||||||
end
|
current_module^.flags:=current_module^.flags or uf_init;
|
||||||
|
block:=statement_block(_INITIALIZATION);
|
||||||
|
end
|
||||||
|
else if (token=_FINALIZATION) then
|
||||||
|
begin
|
||||||
|
if (current_module^.flags and uf_finalize)<>0 then
|
||||||
|
block:=statement_block(_FINALIZATION)
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
block:=nil;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
current_module^.flags:=current_module^.flags or uf_init;
|
||||||
|
block:=statement_block(_BEGIN);
|
||||||
|
end;
|
||||||
|
end
|
||||||
else
|
else
|
||||||
block:=statement_block;
|
block:=statement_block(_BEGIN);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function assembler_block : ptree;
|
function assembler_block : ptree;
|
||||||
@ -1136,7 +1166,10 @@ unit pstatmnt;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.22 1998-06-24 14:48:36 peter
|
Revision 1.23 1998-06-25 08:48:18 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.22 1998/06/24 14:48:36 peter
|
||||||
* ifdef newppu -> ifndef oldppu
|
* ifdef newppu -> ifndef oldppu
|
||||||
|
|
||||||
Revision 1.21 1998/06/24 14:06:34 peter
|
Revision 1.21 1998/06/24 14:06:34 peter
|
||||||
|
@ -44,7 +44,7 @@ unit scanner;
|
|||||||
ident = string[id_len];
|
ident = string[id_len];
|
||||||
|
|
||||||
const
|
const
|
||||||
max_keywords = 69;
|
max_keywords = 70;
|
||||||
anz_keywords : longint = max_keywords;
|
anz_keywords : longint = max_keywords;
|
||||||
|
|
||||||
{ the following keywords are no keywords in TP, they
|
{ the following keywords are no keywords in TP, they
|
||||||
@ -70,7 +70,7 @@ unit scanner;
|
|||||||
{ 'EXTERNAL',}
|
{ 'EXTERNAL',}
|
||||||
'FAIL','FALSE',
|
'FAIL','FALSE',
|
||||||
{ 'FAR',}
|
{ 'FAR',}
|
||||||
'FILE','FINALLY','FOR',
|
'FILE','FINALIZATION','FINALLY','FOR',
|
||||||
{ 'FORWARD',}
|
{ 'FORWARD',}
|
||||||
'FUNCTION','GOTO','IF','IMPLEMENTATION','IN',
|
'FUNCTION','GOTO','IF','IMPLEMENTATION','IN',
|
||||||
'INHERITED','INITIALIZATION',
|
'INHERITED','INITIALIZATION',
|
||||||
@ -106,7 +106,7 @@ unit scanner;
|
|||||||
{ _EXTERNAL,}
|
{ _EXTERNAL,}
|
||||||
_FAIL,_FALSE,
|
_FAIL,_FALSE,
|
||||||
{ _FAR,}
|
{ _FAR,}
|
||||||
_FILE,_FINALLY,_FOR,
|
_FILE,_FINALIZATION,_FINALLY,_FOR,
|
||||||
{ _FORWARD,}
|
{ _FORWARD,}
|
||||||
_FUNCTION,_GOTO,_IF,_IMPLEMENTATION,_IN,
|
_FUNCTION,_GOTO,_IF,_IMPLEMENTATION,_IN,
|
||||||
_INHERITED,_INITIALIZATION,
|
_INHERITED,_INITIALIZATION,
|
||||||
@ -1231,10 +1231,10 @@ unit scanner;
|
|||||||
procedure change_to_tp_keywords;
|
procedure change_to_tp_keywords;
|
||||||
|
|
||||||
const
|
const
|
||||||
non_tp : array[0..13] of string[id_len] = (
|
non_tp : array[0..14] of string[id_len] = (
|
||||||
'AS','CLASS','EXCEPT','FINALLY','INITIALIZATION','IS',
|
'AS','CLASS','EXCEPT','FINALLY','INITIALIZATION','IS',
|
||||||
'ON','OPERATOR','OTHERWISE','PROPERTY','RAISE','TRY',
|
'ON','OPERATOR','OTHERWISE','PROPERTY','RAISE','TRY',
|
||||||
'EXPORTS','LIBRARY');
|
'EXPORTS','LIBRARY','FINALIZATION');
|
||||||
|
|
||||||
var
|
var
|
||||||
i : longint;
|
i : longint;
|
||||||
@ -1267,7 +1267,10 @@ unit scanner;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.26 1998-06-16 08:56:30 peter
|
Revision 1.27 1998-06-25 08:48:19 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.26 1998/06/16 08:56:30 peter
|
||||||
+ targetcpu
|
+ targetcpu
|
||||||
* cleaner pmodules for newppu
|
* cleaner pmodules for newppu
|
||||||
|
|
||||||
|
@ -583,21 +583,12 @@ implementation
|
|||||||
short_name : 'GO32V2';
|
short_name : 'GO32V2';
|
||||||
unit_env : 'GO32V2UNITS';
|
unit_env : 'GO32V2UNITS';
|
||||||
system_unit : 'SYSTEM';
|
system_unit : 'SYSTEM';
|
||||||
{$ifndef UseAnsiString}
|
|
||||||
smartext : '.SL';
|
smartext : '.SL';
|
||||||
unitext : '.PPU';
|
unitext : '.PPU';
|
||||||
unitlibext : '.PPL';
|
unitlibext : '.PPL';
|
||||||
asmext : '.S';
|
asmext : '.S';
|
||||||
objext : '.O';
|
objext : '.O';
|
||||||
exeext : '.EXE';
|
exeext : '.EXE';
|
||||||
{$else UseAnsiString}
|
|
||||||
smartext : '.SL';
|
|
||||||
unitext : '.PAU';
|
|
||||||
unitlibext : '.PPL';
|
|
||||||
asmext : '.SA';
|
|
||||||
objext : '.OA';
|
|
||||||
exeext : '.EXE';
|
|
||||||
{$endif UseAnsiString}
|
|
||||||
os : os_GO32V2;
|
os : os_GO32V2;
|
||||||
link : link_ldgo32v2;
|
link : link_ldgo32v2;
|
||||||
assem : as_o;
|
assem : as_o;
|
||||||
@ -875,7 +866,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.22 1998-06-17 14:10:21 peter
|
Revision 1.23 1998-06-25 08:48:20 florian
|
||||||
|
* first version of rtti support
|
||||||
|
|
||||||
|
Revision 1.22 1998/06/17 14:10:21 peter
|
||||||
* small os2 fixes
|
* small os2 fixes
|
||||||
* fixed interdependent units with newppu (remake3 under linux works now)
|
* fixed interdependent units with newppu (remake3 under linux works now)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user