mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 11:29:27 +02:00
Somehow the changes regarding tf_methods_specialized weren't commited, thus here they are again:
* symconst.pas: remove tf_methods_specialized * psub.pas: remove check for/inclusion of tf_methods_specialized as this isn't needed anymore since the generic is specialized in a temporary symtable pgenutil.pas: remove merge artifacts pdecl.pas: fix compilation ("s" was duplicate) pexpr.pas: * fix calling of generate_specialization * disable the goto in sub_expr for now; this will be enabled again once right hand sides work as well git-svn-id: branches/svenbarth/generics@19675 -
This commit is contained in:
parent
461d231daa
commit
87d9714221
@ -360,7 +360,6 @@ implementation
|
||||
generictypelist : TFPObjectList;
|
||||
generictokenbuf : tdynamicarray;
|
||||
vmtbuilder : TVMTBuilder;
|
||||
s : shortstring;
|
||||
gendef : tstoreddef;
|
||||
s : shortstring;
|
||||
begin
|
||||
|
@ -3101,7 +3101,7 @@ implementation
|
||||
check_hints(parseddef.typesym,parseddef.typesym.symoptions,parseddef.typesym.deprecatedmsg);
|
||||
|
||||
{ generate the specialization }
|
||||
generate_specialization(gendef,false,parseddef,gensym.RealName);
|
||||
generate_specialization(gendef,false,'',parseddef,gensym.RealName);
|
||||
|
||||
{ we don't need the old left and right nodes anymore }
|
||||
p1.Free;
|
||||
@ -3121,8 +3121,12 @@ implementation
|
||||
{ with p1 now set we are in reality directly behind the
|
||||
call to "factor" thus we need to call down to that
|
||||
again }
|
||||
factornode:=p1;
|
||||
goto SubExprStart;
|
||||
{ This is disabled until specializations on the right
|
||||
hand side work as well, because
|
||||
"not working expressions" is better than "half working
|
||||
expressions" }
|
||||
{factornode:=p1;
|
||||
goto SubExprStart;}
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -3188,7 +3192,7 @@ implementation
|
||||
Internalerror(2011071401);
|
||||
|
||||
{ generate the specialization }
|
||||
generate_specialization(gendef,false,nil,'');
|
||||
generate_specialization(gendef,false,'',nil,'');
|
||||
|
||||
{ we don't need the old p2 anymore }
|
||||
p2.Free;
|
||||
|
@ -326,21 +326,6 @@ uses
|
||||
if assigned(hmodule.globalsymtable) then
|
||||
symtablestack.push(hmodule.globalsymtable);
|
||||
|
||||
<<<<<<< HEAD
|
||||
{ in case of a parent or an implemented interface the class needs
|
||||
to be inserted in the current unit and not in the class it's
|
||||
used in }
|
||||
{ TODO: check whether we are using the correct symtable }
|
||||
if not parse_class_parent then
|
||||
begin
|
||||
{ hacky, but necessary to insert the newly generated class properly }
|
||||
item:=oldsymtablestack.stack;
|
||||
while assigned(item) and (item^.symtable.symtablelevel>main_program_level) do
|
||||
item:=item^.next;
|
||||
if assigned(item) and (item^.symtable<>symtablestack.top) then
|
||||
symtablestack.push(item^.symtable);
|
||||
end;
|
||||
=======
|
||||
{ push the localsymtable if needed }
|
||||
if (hmodule<>current_module) or not current_module.in_interface then
|
||||
symtablestack.push(current_module.localsymtable);
|
||||
@ -351,7 +336,6 @@ uses
|
||||
influenced by symbols in the current unit }
|
||||
tempst:=tspecializesymtable.create(current_module.modulename^,current_module.moduleid);
|
||||
symtablestack.push(tempst);
|
||||
>>>>>>> unique-syms
|
||||
|
||||
{ Reparse the original type definition }
|
||||
if not err then
|
||||
@ -439,10 +423,7 @@ uses
|
||||
{ Consume the semicolon if it is also recorded }
|
||||
try_to_consume(_SEMICOLON);
|
||||
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
block_type:=old_block_type;
|
||||
>>>>>>> unique-syms
|
||||
if parse_class_parent then
|
||||
begin
|
||||
current_structdef:=old_current_structdef;
|
||||
|
@ -2010,8 +2010,6 @@ implementation
|
||||
i : longint;
|
||||
hp : tdef;
|
||||
begin
|
||||
if df_methods_specialized in def.defoptions then
|
||||
Exit;
|
||||
for i:=0 to def.symtable.DefList.Count-1 do
|
||||
begin
|
||||
hp:=tdef(def.symtable.DefList[i]);
|
||||
@ -2042,9 +2040,6 @@ implementation
|
||||
{ generate code for subtypes as well }
|
||||
process_abstractrecorddef(tabstractrecorddef(hp));
|
||||
end;
|
||||
{ we need to flag the def, so that we know the next time that we
|
||||
already specialized the methods }
|
||||
Include(def.defoptions, df_methods_specialized);
|
||||
end;
|
||||
|
||||
begin
|
||||
|
@ -184,15 +184,7 @@ type
|
||||
{ type is a specialization of a generic type }
|
||||
df_specialization,
|
||||
{ def has been copied from another def so symtable is not owned }
|
||||
df_copied_def,
|
||||
{ this flag is set when the methods for a spezialization where already
|
||||
generated; this is for example needed in case of the enumerator in the
|
||||
generic lists of fgl.pp: the enumerator is specialized as part of the
|
||||
surrounding class and if the class and the enumerator are used in the
|
||||
same unit the methods of the enumerator are generated twice, once as part
|
||||
of the class and once as part of the temporary variable that holds the
|
||||
enumerator }
|
||||
df_methods_specialized
|
||||
df_copied_def
|
||||
);
|
||||
tdefoptions=set of tdefoption;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user