1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588 |
- {
- $Id$
- Copyright (C) 1998-2000 by Daniel Mantione
- and other members of the Free Pascal development team
- This unit handles symbols
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ****************************************************************************
- }
- {$ifdef TP}
- {$N+,E+,F+}
- {$endif}
- unit symbols;
- interface
- uses symtable,aasm,objects,cobjects,defs,cpubase,tokens;
- {Note: It is forbidden to add the symtablt unit. A symbol should not now in
- which symtable it is.}
- {The tokens unit is only needed for the overloaded operators array. This
- array can better be moved into another unit.}
- type Ttypeprop=(sp_primary_typesym);
- Ttypepropset=set of Ttypeprop;
- Tobjprop=(sp_public,sp_private,sp_protected,sp_published,sp_static);
- Tobjpropset=set of Tobjprop;
- Tpropprop=(ppo_indexed,ppo_defaultproperty,
- ppo_stored,ppo_published,ppo_hasparameters);
- Tproppropset=set of Tpropprop;
- Tvarprop=(vo_regable,vo_fpuregable,vo_is_C_var,vo_is_external,
- vo_is_dll_var,vo_is_thread_var);
- Tvarpropset=set of Tvarprop;
- {State of a variable, if it's declared, assigned or used.}
- Tvarstate=(vs_none,vs_declared,vs_declared_and_first_found,
- vs_set_but_first_not_passed,vs_assigned,vs_used);
- Plabelsym=^Tlabelsym;
- Tlabelsym=object(Tsym)
- lab:Pasmlabel;
- defined:boolean;
- constructor init(const n:string;l:Pasmlabel);
- constructor load(var s:Tstream);
- function mangledname:string;virtual;
- procedure store(var s:Tstream);virtual;
- end;
- { Punitsym=^Tunitsym;
- Tunitsym=object(Tsym)
- unitsymtable : punitsymtable;
- prevsym : punitsym;
- refs : longint;
- constructor init(const n : string;ref : punitsymtable);
- constructor load(var s:Tstream);
- destructor done;virtual;
- procedure store(var s:Tstream);virtual;
- end;}
- Perrorsym=^Terrorsym;
- Terrorsym=object(tsym)
- constructor init;
- end;
- Pprocsym=^Tprocsym;
- Tprocsym=object(Tsym)
- definitions:Pobject; {Is Pprocdef when procedure not
- overloaded, or a Pcollection of
- Pprocdef when it is overloaded.
- Since most procedures are not
- overloaded, this saves a lot of
- memory.}
- objprop:Tobjpropset; {All overloaded procedures should
- have the same scope, so the object
- scope information is put in the
- symbol.}
- sub_of:Pprocsym;
- _class:Pobjectdef;
- constructor init(const n:string;Asub_of:Pprocsym);
- constructor load(var s:Tstream);
- function count:word;
- function firstthat(action:pointer):Pprocdef;
- procedure foreach(action:pointer);
- procedure insert(def:Pprocdef);
- function mangledname:string;virtual; {Causes internalerror.}
- {Writes all declarations.}
- procedure write_parameter_lists;
- {Tests, if all procedures definitions are defined and not
- just available as forward,}
- procedure check_forward;
- procedure store(var s:Tstream);virtual;
- procedure deref;virtual;
- procedure load_references;virtual;
- function write_references:boolean;virtual;
- destructor done;virtual;
- end;
- Ptypesym=^Ttypesym;
- Ttypesym=object(Tsym)
- definition:Pdef;
- forwardpointers:Pcollection; {Contains the forwardpointers.}
- properties:Ttypepropset;
- synonym:Ptypesym;
- constructor init(const n:string;d:Pdef);
- constructor load(var s:Tstream);
- { procedure addforwardpointer(p:Ppointerdef);}
- procedure deref;virtual;
- procedure store(var s:Tstream);virtual;
- procedure load_references;virtual;
- procedure updateforwarddef(p:pdef);
- function write_references:boolean;virtual;
- destructor done;virtual;
- end;
- Psyssym=^Tsyssym;
- Tsyssym=object(Tsym)
- number:longint;
- constructor init(const n:string;l:longint);
- constructor load(var s:Tstream);
- procedure store(var s:Tstream);virtual;
- end;
- Pmacrosym=^Tmacrosym;
- Tmacrosym=object(Tsym)
- defined,is_used:boolean;
- buftext:Pchar;
- buflen:longint;
- {Macros aren't written to PPU files !}
- constructor init(const n:string);
- destructor done;virtual;
- end;
- Penumsym=^Tenumsym;
- Tenumsym=object(tsym)
- value:longint;
- definition:Penumdef;
- nextenum:Penumsym;
- constructor init(const n:string;def:Penumdef;v:longint);
- constructor load(var s:Tstream);
- procedure store(var s:Tstream);virtual;
- procedure deref;virtual;
- procedure order;
- end;
- Pprogramsym=^Tprogramsym;
- Tprogramsym=object(Tsym)
- end;
- Pvarsym=^Tvarsym;
- Tvarsym=object(tsym)
- address:longint;
- localvarsym:Pvarsym;
- islocalcopy:boolean;
- definition:Pdef;
- refs:longint;
- properties:Tvarpropset;
- state:Tvarstate;
- objprop:Tobjpropset;
- _mangledname:Pstring;
- reg:Tregister; {If reg<>R_NO, then the variable is an register
- variable }
- constructor init(const n:string;p:Pdef);
- constructor init_dll(const n:string;p:Pdef);
- constructor init_C(const n,mangled:string;p:Pdef);
- constructor load(var s:Tstream);
- procedure concatdata(const n:string;len:longint);
- procedure deref;virtual;
- function getsize:longint;virtual;
- function mangledname:string;virtual;
- procedure insert_in_data;virtual;
- procedure setmangledname(const s:string);
- procedure store(var s:Tstream);virtual;
- destructor done;virtual;
- end;
- Pparamsym=^Tparamsym;
- Tparamsym=object(Tvarsym)
- varspez:Tvarspez;
- pushaddress:longint;
- constructor init(const n:string;p:Pdef;vs:Tvarspez);
- function getsize:longint;virtual;
- function getpushsize:longint;virtual;
- procedure insert_in_data;virtual;
- end;
- Ptypedconstsym=^Ttypedconstsym;
- Ttypedconstsym=object(Tsym)
- prefix:Pstring;
- definition:Pdef;
- is_really_const:boolean;
- constructor init(const n:string;p:Pdef;really_const:boolean);
- constructor load(var s:Tstream);
- destructor done;virtual;
- function mangledname:string;virtual;
- procedure store(var s:Tstream);virtual;
- procedure deref;virtual;
- function getsize:longint;
- procedure insert_in_data;virtual;
- end;
- Tconsttype=(constord,conststring,constreal,constbool,
- constint,constchar,constset,constnil);
- Pconstsym=^Tconstsym;
- Tconstsym=object(Tsym)
- definition:Pdef;
- consttype:Tconsttype;
- value,len:longint; {Len is needed for string length.}
- constructor init(const n:string;t:Tconsttype;v:longint);
- constructor init_def(const n:string;t:Tconsttype;v:longint;
- def:Pdef);
- constructor init_string(const n:string;t:Tconsttype;
- str:Pchar;l:longint);
- constructor load(var s:Tstream);
- procedure deref;virtual;
- procedure store(var s:Tstream);virtual;
- destructor done;virtual;
- end;
- absolutetyp = (tovar,toasm,toaddr);
- Pabsolutesym = ^tabsolutesym;
- Tabsolutesym = object(tvarsym)
- abstyp:absolutetyp;
- absseg:boolean;
- ref:Psym;
- asmname:Pstring;
- constructor load(var s:Tstream);
- procedure deref;virtual;
- function mangledname : string;virtual;
- procedure store(var s:Tstream);virtual;
- end;
- Pfuncretsym=^Tfuncretsym;
- Tfuncretsym=object(tsym)
- funcretprocinfo:pointer{Pprocinfo};
- definition:Pdef;
- address:longint;
- constructor init(const n:string;approcinfo:pointer{pprocinfo});
- constructor load(var s:Tstream);
- procedure insert_in_data;virtual;
- procedure store(var s:Tstream);virtual;
- procedure deref;virtual;
- end;
- Ppropertysym=^Tpropertysym;
- Tpropertysym=object(Tsym)
- properties:Tproppropset;
- definition:Pdef;
- objprop:Tobjpropset;
- rangedef:Pdef; {Type of the range for array properties.}
- {For record property's like property x read a.b.c, the
- collection contains a as first element, b as second element,
- and c as the third element.}
- readaccess,
- writeaccess,
- storedaccess:Pcollection;
- index,default:longint;
- constructor load(var s:Tstream);
- function getsize:longint;virtual;
- procedure store(var s:Tstream);virtual;
- procedure deref;virtual;
- end;
- const {Last and first operators which can be overloaded.}
- first_overloaded = _PLUS;
- last_overloaded = _ASSIGNMENT;
- overloaded_names : array [first_overloaded..
- last_overloaded] of string[16] =
- ('plus','minus','star','slash',
- 'equal','greater','lower','greater_or_equal',
- 'lower_or_equal','sym_diff','starstar','as',
- 'is','in','or','and',
- 'div','mod','shl','shr',
- 'xor','assign');
- var current_object_option:Tobjprop;
- current_type_option:Ttypepropset;
- aktprocsym:Pprocsym; {Pointer to the symbol for the
- currently parsed procedure.}
- aktprocdef:Pprocdef; {Pointer to the defnition for the
- currently parsed procedure.}
- aktvarsym:Pvarsym; {Pointer to the symbol for the
- currently read var, only used
- for variable directives.}
- overloaded_operators:array[first_overloaded..
- last_overloaded] of Pprocsym;
- { unequal is not equal}
- implementation
- uses callspec,verbose,globals,systems,globtype,types;
- {****************************************************************************
- Tlabelsym
- ****************************************************************************}
- constructor Tlabelsym.init(const n:string;l:Pasmlabel);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- lab:=l;
- defined:=false;
- end;
- constructor Tlabelsym.load(var s:Tstream);
- begin
- inherited load(s);
- defined:=true;
- end;
- function Tlabelsym.mangledname:string;
- begin
- mangledname:=lab^.name;
- end;
- procedure Tlabelsym.store(var s:Tstream);
- begin
- inherited store(s);
- { current_ppu^.writeentry(iblabelsym);}
- end;
- {****************************************************************************
- Terrorsym
- ****************************************************************************}
- constructor terrorsym.init;
- begin
- inherited init('');
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- end;
- {****************************************************************************
- Tprocsym
- ****************************************************************************}
- constructor Tprocsym.init(const n:string;Asub_of:Pprocsym);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- sub_of:=Asub_of;
- end;
- constructor Tprocsym.load(var s:Tstream);
- begin
- inherited load(s);
- { definition:=Pprocdef(readdefref);}
- end;
- function Tprocsym.count:word;
- begin
- if typeof(definitions^)=typeof(Tcollection) then
- count:=Pcollection(definitions)^.count
- else
- count:=1;
- end;
- function Tprocsym.firstthat(action:pointer):Pprocdef;
- begin
- firstthat:=nil;
- if definitions<>nil then
- if typeof(definitions^)=typeof(Tcollection) then
- firstthat:=Pcollection(definitions)^.firstthat(action)
- else if boolean(byte(longint(callpointerlocal(action,
- previousframepointer,definitions)))) then
- firstthat:=Pprocdef(definitions);
- end;
- procedure Tprocsym.foreach(action:pointer);
- begin
- if definitions<>nil then
- begin
- if typeof(definitions^)=typeof(Tcollection) then
- Pcollection(definitions)^.foreach(action)
- else
- callpointerlocal(action,previousframepointer,definitions);
- end;
- end;
- procedure Tprocsym.insert(def:Pprocdef);
- function matchparas(item:pointer):boolean;{$IFDEF TP}far;{$ENDIF}
- begin
- matchparas:=equal_paras(Pprocdef(item)^.parameters,
- Pprocdef(def)^.parameters,false);
- end;
- var c:Pcollection;
- ovs:Pprocsym;
- ovd:Pprocdef;
- ve:Pvmtentry;
- errparam:string;
- begin
- if _class<>nil then
- begin
- {Update object information.}
- if po_virtualmethod in def^.options then
- include(_class^.options,oo_has_virtual);
- if po_abstractmethod in def^.options then
- include(_class^.options,oo_has_abstract);
- if def^.proctype=po_type_constructor then
- include(_class^.options,oo_has_constructor);
- if def^.proctype=po_type_destructor then
- include(_class^.options,oo_has_destructor);
- {Check if we are overriding an existing method.}
- ovs:=Pprocsym(_class^.childof^.search(name,true));
- ovd:=ovs^.firstthat(@matchparas);
- if ovd<>nil then
- begin
- errparam:=_class^.objname^+'.'+name;
- {If the old method is virtual and we are not, we
- refuse this for objects, and warn for classes.}
- if (po_virtualmethod in ovd^.options) then
- if (po_virtualmethod in Pprocdef(def)^.options) then
- if oo_is_class in _class^.options then
- message1(parser_w_should_use_override,errparam)
- else
- message1(parser_w_overloaded_are_not_both_virtual,errparam)
- else
- {Both are virtual.
- The flags have to match except abstract,
- assembler and override.}
- if (def^.calloptions<>ovd^.calloptions) or
- (def^.proctype<>ovd^.proctype) or
- ((def^.options-[po_abstractmethod,po_overridingmethod,po_assembler])<>
- (ovd^.options-[po_abstractmethod,po_overridingmethod,po_assembler])) then
- message1(parser_e_header_dont_match_forward,errparam);
- {Error if the return types aren't equal.}
- if not(is_equal(def^.retdef,ovd^.retdef)) and
- not(def^.retdef^.is_object(typeof(Tobjectdef)) and
- Pprocdef(ovd)^.retdef^.is_object(typeof(Tobjectdef)) and
- (oo_is_class in Pobjectdef(def^.retdef)^.options) and
- (oo_is_class in Pobjectdef(ovd^.retdef)^.options) and
- (pobjectdef(def^.retdef)^.is_related(pobjectdef(ovd^.retdef)))) then
- message1(parser_e_overloaded_methodes_not_same_ret,errparam);
- if po_virtualmethod in def^.options then
- begin
- if not(oo_has_constructor in _class^.options) then
- message1(parser_w_virtual_without_constructor,_class^.objname^);
- {We change the the vmt layout so we are called instead
- of our ancestor.}
- if sp_private in objprop then
- ve:=new(Plocalvmtentry,init(_class,def))
- else
- ve:=new(Pglobalvmtentry,init(_class,def));
- _class^.vmt_layout^.atput(ovd^.vmt_index,ve);
- def^.vmt_index:=ovd^.vmt_index;
- end;
- end
- else
- begin
- if not(oo_has_constructor in _class^.options) then
- message1(parser_w_virtual_without_constructor,_class^.objname^);
- {The method is not overridden; if it is virtual we should
- generate a vmt entry.}
- if po_virtualmethod in def^.options then
- begin
- if sp_private in objprop then
- ve:=new(Plocalvmtentry,init(_class,def))
- else
- ve:=new(Pglobalvmtentry,init(_class,def));
- _class^.vmt_layout^.insert(ve);
- def^.vmt_index:=_class^.vmt_layout^.count-1;
- end;
- end;
- end;
- if definitions=nil then
- definitions:=def
- else
- if typeof(definitions^)=typeof(Tcollection) then
- Pcollection(def)^.insert(def)
- else
- begin
- c:=new(Pcollection,init(8,4));
- c^.insert(definitions);
- definitions:=c;
- end;
- end;
- function Tprocsym.mangledname:string;
- {This function calls internalerror, because procsyms can be overloaded.
- Procedures should use the foreach to check for the right overloaded procsym
- and then call mangledname on that procsym.}
- begin
- internalerror($99080201);
- end;
- procedure Tprocsym.write_parameter_lists;
- {var p:Pprocdef;}
- begin
- (* p:=definition;
- while assigned(p) do
- begin
- {Force the error to be printed.}
- verbose.message1(sym_b_param_list,name+p^.demangled_paras);
- p:=p^.nextoverloaded;
- end;*)
- end;
- procedure tprocsym.check_forward;
- {var pd:Pprocdef;}
- begin
- (* pd:=definition;
- while assigned(pd) do
- begin
- if pd^.forwarddef then
- begin
- if assigned(pd^._class) then
- messagepos1(fileinfo,sym_e_forward_not_resolved,
- pd^._class^.objname^+'.'+name+
- demangledparas(pd^.demangled_paras))
- else
- messagepos1(fileinfo,sym_e_forward_not_resolved,
- name+pd^.demangled_paras);
- {Turn futher error messages off.}
- pd^.forwarddef:=false;
- end;
- pd:=pd^.nextoverloaded;
- end;*)
- end;
- procedure tprocsym.deref;
- {var t:ttoken;
- last:Pprocdef;}
- begin
- (*
- resolvedef(pdef(definition));
- if (definition^.options and pooperator) <> 0 then
- begin
- last:=definition;
- while assigned(last^.nextoverloaded) do
- last:=last^.nextoverloaded;
- for t:=first_overloaded to last_overloaded do
- if (name=overloaded_names[t]) then
- begin
- if assigned(overloaded_operators[t]) then
- last^.nextoverloaded:=overloaded_operators[t]^.definition;
- overloaded_operators[t]:=@self;
- end;
- end;*)
- end;
- procedure Tprocsym.store(var s:Tstream);
- begin
- inherited store(s);
- { writedefref(pdef(definition));
- current_ppu^.writeentry(ibprocsym);}
- end;
- procedure tprocsym.load_references;
- begin
- inherited load_references;
- end;
- function Tprocsym.write_references:boolean;
- {var prdef:Pprocdef;}
- begin
- (* write_references:=false;
- if not inherited write_references then
- exit;
- write_references:=true;
- prdef:=definition;
- while assigned(prdef) and (prdef^.owner=definition^.owner) do
- begin
- prdef^.write_references;
- prdef:=prdef^.nextoverloaded;
- end;*)
- end;
- destructor Tprocsym.done;
- begin
- {Don't check if errors !!}
- if errorcount=0 then
- check_forward;
- inherited done;
- end;
- {****************************************************************************
- Ttypesym
- ****************************************************************************}
- constructor Ttypesym.init(const n:string;d:Pdef);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- definition:=d;
- if assigned(definition) then
- begin
- if definition^.sym<>nil then
- begin
- definition^.sym:=@self;
- properties:=[sp_primary_typesym];
- end
- else
- begin
- synonym:=Ptypesym(definition^.sym)^.synonym;
- Ptypesym(definition^.sym)^.synonym:=@self;
- end;
- end;
- end;
- constructor Ttypesym.load(var s:Tstream);
- begin
- inherited load(s);
- { definition:=readdefref;}
- end;
- {procedure Ttypesym.addforwardpointer(p:Ppointerdef);
- begin
- if forwardpointers=nil then
- new(forwardpointers,init(8,4));
- forwardpointers^.insert(p);
- end;}
- procedure ttypesym.deref;
- begin
- (* resolvedef(definition);
- if assigned(definition) then
- begin
- if properties=sp_primary_typesym then
- begin
- if definition^.sym<>@self then
- synonym:=definition^.sym;
- definition^.sym:=@self;
- end
- else
- begin
- if assigned(definition^.sym) then
- begin
- synonym:=definition^.sym^.synonym;
- if definition^.sym<>@self then
- definition^.sym^.synonym:=@self;
- end
- else
- definition^.sym:=@self;
- end;
- if (definition^.deftype=recorddef) and
- assigned(precdef(definition)^.symtable) and
- (definition^.sym=@self) then
- precdef(definition)^.symtable^.name:=stringdup('record '+name);
- end;*)
- end;
- procedure ttypesym.store(var s:Tstream);
- begin
- inherited store(s);
- { writedefref(definition);
- current_ppu^.writeentry(ibtypesym);}
- end;
- procedure ttypesym.load_references;
- begin
- inherited load_references;
- { if typeof(definition^)=typeof(Trecorddef) then
- Precdef(definition)^.symtable^.load_browser;
- if typeof(definition^)=typeof(Tobjectdef) then
- Pobjectdef(definition)^.publicsyms^.load_browser;}
- end;
- function ttypesym.write_references : boolean;
- begin
- (* if not inherited write_references then
- {Write address of this symbol if record or object
- even if no real refs are there
- because we need it for the symtable }
- if (definition^.deftype=recorddef) or
- (definition^.deftype=objectdef) then
- begin
- writesymref(@self);
- current_ppu^.writeentry(ibsymref);
- end;
- write_references:=true;
- if (definition^.deftype=recorddef) then
- precdef(definition)^.symtable^.write_browser;
- if (definition^.deftype=objectdef) then
- pobjectdef(definition)^.publicsyms^.write_browser;*)
- end;
- procedure ttypesym.updateforwarddef(p:pdef);
- var i:word;
- begin
- if definition<>nil then
- internalerror($99080203)
- else
- definition:=p;
- properties:=current_type_option;
- fileinfo:=tokenpos;
- if assigned(definition) and not(assigned(definition^.sym)) then
- definition^.sym:=@self;
- {Update all forwardpointers to this definition.}
- { for i:=1 to forwardpointers^.count do
- Ppointerdef(forwardpointers^.at(i))^.definition:=definition;}
- forwardpointers^.deleteall;
- dispose(forwardpointers,done);
- forwardpointers:=nil;
- end;
- destructor Ttypesym.done;
- var prevsym:Ptypesym;
- begin
- if assigned(definition) then
- begin
- prevsym:=Ptypesym(definition^.sym);
- if prevsym=@self then
- definition^.sym:=synonym;
- while assigned(prevsym) do
- begin
- if (prevsym^.synonym=@self) then
- begin
- prevsym^.synonym:=synonym;
- break;
- end;
- prevsym:=prevsym^.synonym;
- end;
- end;
- synonym:=nil;
- definition:=nil;
- inherited done;
- end;
- {****************************************************************************
- Tsyssym
- ****************************************************************************}
- constructor Tsyssym.init(const n:string;l:longint);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- number:=l;
- end;
- constructor Tsyssym.load(var s:Tstream);
- begin
- inherited load(s);
- { number:=readlong;}
- end;
- procedure tsyssym.store(var s:Tstream);
- begin
- Tsym.store(s);
- { writelong(number);
- current_ppu^.writeentry(ibsyssym);}
- end;
- {****************************************************************************
- Tenumsym
- ****************************************************************************}
- constructor Tenumsym.init(const n:string;def:Penumdef;v:longint);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- definition:=def;
- value:=v;
- if def^.minval>v then
- def^.setmin(v);
- if def^.maxval<v then
- def^.setmax(v);
- order;
- end;
- constructor Tenumsym.load(var s:Tstream);
- begin
- inherited load(s);
- { definition:=Penumdef(readdefref);
- value:=readlong;}
- end;
- procedure Tenumsym.deref;
- begin
- { resolvedef(pdef(definition));
- order;}
- end;
- procedure Tenumsym.order;
- var i:word;
- label inserted;
- begin
- {Keep the enum symbols ordered by value...}
- with definition^.symbols^ do
- begin
- {Most of the time, enums are defined in order, so we count down.}
- for i:=count-1 downto 0 do
- begin
- if Penumsym(at(i))^.value<value then
- begin
- atinsert(i+1,@self);
- {We have to use goto to keep the
- code efficient :( }
- goto inserted;
- end;
- end;
- atinsert(0,@self);
- inserted:
- end;
- end;
- procedure Tenumsym.store(var s:Tstream);
- begin
- inherited store(s);
- (* writedefref(definition);
- writelong(value);
- current_ppu^.writeentry(ibenumsym);*)
- end;
- {****************************************************************************
- Tmacrosym
- ****************************************************************************}
- constructor Tmacrosym.init(const n:string);
- begin
- inherited init(n);
- defined:=true;
- end;
- destructor Tmacrosym.done;
- begin
- if assigned(buftext) then
- freemem(buftext,buflen);
- inherited done;
- end;
- {****************************************************************************
- Tprogramsym
- ****************************************************************************}
- {****************************************************************************
- Tvarsym
- ****************************************************************************}
- constructor Tvarsym.init(const n:string;p:Pdef);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- definition:=p;
- {Can we load the value into a register ? }
- if dp_regable in p^.properties then
- include(properties,vo_regable);
- reg:=R_NO;
- end;
- constructor Tvarsym.init_dll(const n:string;p:Pdef);
- begin
- init(n,p);
- include(properties,vo_is_dll_var);
- end;
- constructor Tvarsym.init_C(const n,mangled:string;p:Pdef);
- begin
- init(n,p);
- include(properties,vo_is_C_var);
- setmangledname(mangled);
- end;
- procedure Tvarsym.concatdata(const n:string;len:longint);
- begin
- end;
- constructor Tvarsym.load(var s:Tstream);
- begin
- inherited load(s);
- reg:=R_NO;
- { if read_member then
- address:=readlong
- else
- address:=0;
- definition:=readdefref;
- var_options:=readbyte;
- if (var_options and vo_is_C_var)<>0 then
- setmangledname(readstring);}
- end;
- function Tvarsym.getsize:longint;
- begin
- if definition<>nil then
- getsize:=definition^.size
- else
- getsize:=0;
- end;
- procedure Tvarsym.deref;
- begin
- { resolvedef(definition);}
- end;
- procedure Tvarsym.store(var s:Tstream);
- begin
- (* inherited store(s);
- if read_member then
- writelong(address);
- writedefref(definition);
- { symbols which are load are never candidates for a register,
- turn of the regable }
- writebyte(var_options and (not vo_regable));
- if (var_options and vo_is_C_var)<>0 then
- writestring(mangledname);
- current_ppu^.writeentry(ibvarsym);*)
- end;
- procedure Tvarsym.setmangledname(const s:string);
- begin
- _mangledname:=stringdup(s);
- end;
- function Tvarsym.mangledname:string;
- var prefix:string;
- begin
- if assigned(_mangledname) then
- mangledname:=_mangledname^
- else
- mangledname:=owner^.varsymprefix+name;
- end;
- procedure Tvarsym.insert_in_data;
- var l,ali,modulo:longint;
- storefilepos:Tfileposinfo;
- begin
- if (vo_is_external in properties) then
- begin
- {Handle static variables of objects especially }
- if read_member and (sp_static in objprop) then
- begin
- {The data field is generated in parser.pas
- with a tobject_FIELDNAME variable, so we do
- not need to do it in this procedure.}
- {This symbol can't be loaded to a register.}
- exclude(properties,vo_regable);
- end
- else
- if not(read_member) then
- begin
- storefilepos:=aktfilepos;
- aktfilepos:=tokenpos;
- if (vo_is_thread_var in properties) then
- l:=4
- else
- l:=getsize;
- address:=owner^.varsymtodata(@self,l);
- aktfilepos:=storefilepos;
- end;
- end;
- end;
- destructor Tvarsym.done;
- begin
- disposestr(_mangledname);
- inherited done;
- end;
- {****************************************************************************
- Tparamsym
- ****************************************************************************}
- constructor Tparamsym.init(const n:string;p:Pdef;vs:Tvarspez);
- begin
- inherited init(n,p);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- varspez:=vs;
- end;
- function Tparamsym.getsize:longint;
- begin
- if (definition<>nil) and (varspez=vs_value) then
- getsize:=definition^.size
- else
- getsize:=0;
- end;
- function Tparamsym.getpushsize:longint;
- begin
- if assigned(definition) then
- begin
- case varspez of
- vs_var:
- getpushsize:=target_os.size_of_pointer;
- vs_value,vs_const:
- if dp_pointer_param in definition^.properties then
- getpushsize:=target_os.size_of_pointer
- else
- getpushsize:=definition^.size;
- end;
- end
- else
- getpushsize:=0;
- end;
- procedure Tparamsym.insert_in_data;
- var storefilepos:Tfileposinfo;
- begin
- storefilepos:=aktfilepos;
- if not(read_member) then
- pushaddress:=owner^.varsymtodata(@self,getpushsize);
- if (varspez=vs_var) then
- address:=0
- else if (varspez=vs_value) then
- if dp_pointer_param in definition^.properties then
- begin
- {Allocate local space.}
- address:=owner^.datasize;
- inc(owner^.datasize,getsize);
- end
- else
- address:=pushaddress
- else
- {vs_const}
- if dp_pointer_param in definition^.properties then
- address:=0
- else
- address:=pushaddress;
- aktfilepos:=storefilepos;
- end;
- {****************************************************************************
- Ttypedconstsym
- *****************************************************************************}
- constructor Ttypedconstsym.init(const n:string;p:Pdef;really_const:boolean);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- definition:=p;
- is_really_const:=really_const;
- prefix:=stringdup(procprefix);
- end;
- constructor Ttypedconstsym.load(var s:Tstream);
- begin
- inherited load(s);
- (* definition:=readdefref;
- {$ifdef DELPHI_CONST_IN_RODATA}
- is_really_const:=boolean(readbyte);
- {$else DELPHI_CONST_IN_RODATA}
- is_really_const:=false;
- {$endif DELPHI_CONST_IN_RODATA}
- prefix:=stringdup(readstring);*)
- end;
- procedure Ttypedconstsym.deref;
- begin
- { resolvedef(definition);}
- end;
- function Ttypedconstsym.mangledname:string;
- begin
- mangledname:='TC_'+prefix^+'_'+name;
- end;
- function Ttypedconstsym.getsize:longint;
- begin
- if assigned(definition) then
- getsize:=definition^.size
- else
- getsize:=0;
- end;
- procedure Ttypedconstsym.store(var s:Tstream);
- begin
- inherited store(s);
- (* writedefref(definition);
- writestring(prefix^);
- {$ifdef DELPHI_CONST_IN_RODATA}
- writebyte(byte(is_really_const));
- {$endif DELPHI_CONST_IN_RODATA}
- current_ppu^.writeentry(ibtypedconstsym);*)
- end;
- { for most symbol types ther is nothing to do at all }
- procedure Ttypedconstsym.insert_in_data;
- var constsegment:Paasmoutput;
- l,ali,modulo:longint;
- storefilepos:Tfileposinfo;
- begin
- storefilepos:=aktfilepos;
- aktfilepos:=tokenpos;
- owner^.tconstsymtodata(@self,getsize);
- aktfilepos:=storefilepos;
- end;
- destructor Ttypedconstsym.done;
- begin
- stringdispose(prefix);
- inherited done;
- end;
- {****************************************************************************
- TCONSTSYM
- ****************************************************************************}
- constructor Tconstsym.init(const n : string;t : tconsttype;v : longint);
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- consttype:=t;
- value:=v;
- end;
- constructor Tconstsym.init_def(const n:string;t:Tconsttype;
- v:longint;def:Pdef);
- begin
- inherited init(n);
- consttype:=t;
- value:=v;
- definition:=def;
- end;
- constructor Tconstsym.init_string(const n:string;t:Tconsttype;str:Pchar;l:longint);
- begin
- inherited init(n);
- consttype:=t;
- value:=longint(str);
- len:=l;
- end;
- constructor Tconstsym.load(var s:Tstream);
- var pd:Pbestreal;
- ps:Pnormalset;
- begin
- inherited load(s);
- (* consttype:=tconsttype(readbyte);
- case consttype of
- constint,
- constbool,
- constchar : value:=readlong;
- constord :
- begin
- definition:=readdefref;
- value:=readlong;
- end;
- conststring :
- begin
- len:=readlong;
- getmem(pchar(value),len+1);
- current_ppu^.getdata(pchar(value)^,len);
- end;
- constreal :
- begin
- new(pd);
- pd^:=readreal;
- value:=longint(pd);
- end;
- constset :
- begin
- definition:=readdefref;
- new(ps);
- readnormalset(ps^);
- value:=longint(ps);
- end;
- constnil : ;
- else
- Message1(unit_f_ppu_invalid_entry,tostr(ord(consttype)));
- end;*)
- end;
- procedure Tconstsym.deref;
- begin
- { if consttype in [constord,constset] then
- resolvedef(pdef(definition));}
- end;
- procedure Tconstsym.store(var s:Tstream);
- begin
- (* inherited store(s);
- writebyte(byte(consttype));
- case consttype of
- constnil : ;
- constint,
- constbool,
- constchar :
- writelong(value);
- constord :
- begin
- writedefref(definition);
- writelong(value);
- end;
- conststring :
- begin
- writelong(len);
- current_ppu^.putdata(pchar(value)^,len);
- end;
- constreal :
- writereal(pbestreal(value)^);
- constset :
- begin
- writedefref(definition);
- writenormalset(pointer(value)^);
- end;
- else
- internalerror(13);
- end;
- current_ppu^.writeentry(ibconstsym);*)
- end;
- destructor Tconstsym.done;
- begin
- case consttype of
- conststring:
- freemem(Pchar(value),len+1);
- constreal:
- dispose(Pbestreal(value));
- constset:
- dispose(Pnormalset(value));
- end;
- inherited done;
- end;
- {****************************************************************************
- Tabsolutesym
- ****************************************************************************}
- constructor Tabsolutesym.load(var s:Tstream);
- begin
- inherited load(s);
- (* typ:=absolutesym;
- abstyp:=absolutetyp(readbyte);
- case abstyp of
- tovar :
- begin
- asmname:=stringdup(readstring);
- ref:=srsym;
- end;
- toasm :
- asmname:=stringdup(readstring);
- toaddr :
- begin
- address:=readlong;
- absseg:=boolean(readbyte);
- end;
- end;*)
- end;
- procedure tabsolutesym.store(var s:Tstream);
- begin
- inherited store(s);
- (* writebyte(byte(varspez));
- if read_member then
- writelong(address);
- writedefref(definition);
- writebyte(var_options and (not vo_regable));
- writebyte(byte(abstyp));
- case abstyp of
- tovar :
- writestring(ref^.name);
- toasm :
- writestring(asmname^);
- toaddr :
- begin
- writelong(address);
- writebyte(byte(absseg));
- end;
- end;
- current_ppu^.writeentry(ibabsolutesym);*)
- end;
- procedure tabsolutesym.deref;
- begin
- (* resolvedef(definition);
- if (abstyp=tovar) and (asmname<>nil) then
- begin
- { search previous loaded symtables }
- getsym(asmname^,false);
- if not(assigned(srsym)) then
- getsymonlyin(owner,asmname^);
- if not(assigned(srsym)) then
- srsym:=generrorsym;
- ref:=srsym;
- stringdispose(asmname);
- end;*)
- end;
- function Tabsolutesym.mangledname : string;
- begin
- case abstyp of
- tovar :
- mangledname:=ref^.mangledname;
- toasm :
- mangledname:=asmname^;
- toaddr :
- mangledname:='$'+tostr(address);
- else
- internalerror(10002);
- end;
- end;
- {****************************************************************************
- Tfuncretsym
- ****************************************************************************}
- constructor Tfuncretsym.init(const n:string;approcinfo:pointer{pprocinfo});
- begin
- inherited init(n);
- {$IFDEF TP}setparent(typeof(Tsym));{$ENDIF}
- funcretprocinfo:=approcinfo;
- { funcretdef:=Pprocinfo(approcinfo)^.retdef;}
- { address valid for ret in param only }
- { otherwise set by insert }
- { address:=pprocinfo(approcinfo)^.retoffset;}
- end;
- constructor Tfuncretsym.load(var s:Tstream);
- begin
- inherited load(s);
- { funcretdef:=readdefref;
- address:=readlong;
- funcretprocinfo:=nil;
- typ:=funcretsym;}
- end;
- procedure Tfuncretsym.store(var s:Tstream);
- begin
- (*
- Normally all references are
- transfered to the function symbol itself !! PM *)
- inherited store(s);
- { writedefref(funcretdef);
- writelong(address);
- current_ppu^.writeentry(ibfuncretsym);}
- end;
- procedure Tfuncretsym.deref;
- begin
- {resolvedef(funcretdef);}
- end;
- procedure Tfuncretsym.insert_in_data;
- var l:longint;
- begin
- {Allocate space in local if ret in acc or in fpu.}
- { if dp_ret_in_acc in procinfo.retdef^.properties
- or (procinfo.retdef^.deftype=floatdef) then
- begin
- l:=funcretdef^.size;
- adress:=owner^.varsymtodata('',l);
- procinfo.retoffset:=-owner^.datasize;
- end;}
- end;
- {****************************************************************************
- Tpropertysym
- ****************************************************************************}
- constructor tpropertysym.load(var s:Tstream);
- begin
- inherited load(s);
- (* proptype:=readdefref;
- options:=readlong;
- index:=readlong;
- default:=readlong;
- { it's hack ... }
- readaccesssym:=psym(stringdup(readstring));
- writeaccesssym:=psym(stringdup(readstring));
- storedsym:=psym(stringdup(readstring));
- { now the defs: }
- readaccessdef:=readdefref;
- writeaccessdef:=readdefref;
- storeddef:=readdefref;*)
- end;
- procedure Tpropertysym.deref;
- begin
- (* resolvedef(proptype);
- resolvedef(readaccessdef);
- resolvedef(writeaccessdef);
- resolvedef(storeddef);
- { solve the hack we did in load: }
- if pstring(readaccesssym)^<>'' then
- begin
- srsym:=search_class_member(pobjectdef(owner^.defowner),pstring(readaccesssym)^);
- if not(assigned(srsym)) then
- srsym:=generrorsym;
- end
- else
- srsym:=nil;
- stringdispose(pstring(readaccesssym));
- readaccesssym:=srsym;
- if pstring(writeaccesssym)^<>'' then
- begin
- srsym:=search_class_member(pobjectdef(owner^.defowner),pstring(writeaccesssym)^);
- if not(assigned(srsym)) then
- srsym:=generrorsym;
- end
- else
- srsym:=nil;
- stringdispose(pstring(writeaccesssym));
- writeaccesssym:=srsym;
- if pstring(storedsym)^<>'' then
- begin
- srsym:=search_class_member(pobjectdef(owner^.defowner),pstring(storedsym)^);
- if not(assigned(srsym)) then
- srsym:=generrorsym;
- end
- else
- srsym:=nil;
- stringdispose(pstring(storedsym));
- storedsym:=srsym;*)
- end;
- function Tpropertysym.getsize:longint;
- begin
- getsize:=0;
- end;
- procedure Tpropertysym.store(var s:Tstream);
- begin
- Tsym.store(s);
- (* writedefref(proptype);
- writelong(options);
- writelong(index);
- writelong(default);
- if assigned(readaccesssym) then
- writestring(readaccesssym^.name)
- else
- writestring('');
- if assigned(writeaccesssym) then
- writestring(writeaccesssym^.name)
- else
- writestring('');
- if assigned(storedsym) then
- writestring(storedsym^.name)
- else
- writestring('');
- writedefref(readaccessdef);
- writedefref(writeaccessdef);
- writedefref(storeddef);
- current_ppu^.writeentry(ibpropertysym);*)
- end;
- end.
- {
- $Log$
- Revision 1.1 2000-07-13 06:30:13 michael
- + Initial import
- Revision 1.6 2000/03/16 12:52:48 daniel
- * Changed names of procedures flags
- * Changed VMT generation
- Revision 1.5 2000/03/11 21:11:25 daniel
- * Ported hcgdata to new symtable.
- * Alignment code changed as suggested by Peter
- + Usage of my is operator replacement, is_object
- Revision 1.4 2000/03/01 11:43:56 daniel
- * Some more work on the new symtable.
- + Symtable stack unit 'symstack' added.
- }
|