* move the common sequence to build a VMT for an objectdef into a separate procedure (based on a patch by Blaise.ru)

git-svn-id: trunk@43674 -
This commit is contained in:
svenbarth 2019-12-11 22:42:53 +00:00
parent a6354741e6
commit bf5d75e594
4 changed files with 20 additions and 18 deletions

View File

@ -140,7 +140,6 @@ implementation
procedure jvm_maybe_create_enum_class(const name: TIDString; def: tdef); procedure jvm_maybe_create_enum_class(const name: TIDString; def: tdef);
var var
vmtbuilder: tvmtbuilder;
arrdef: tarraydef; arrdef: tarraydef;
arrsym: ttypesym; arrsym: ttypesym;
juhashmap: tdef; juhashmap: tdef;
@ -319,9 +318,7 @@ implementation
symtablestack.pop(enumclass.symtable); symtablestack.pop(enumclass.symtable);
vmtbuilder:=TVMTBuilder.Create(enumclass); build_vmt(enumclass);
vmtbuilder.generate_vmt;
vmtbuilder.free;
restore_after_new_class(sstate,islocal,oldsymtablestack); restore_after_new_class(sstate,islocal,oldsymtablestack);
current_structdef:=old_current_structdef; current_structdef:=old_current_structdef;
@ -330,7 +327,6 @@ implementation
procedure jvm_create_procvar_class_intern(const name: TIDString; def: tdef; force_no_callback_intf: boolean); procedure jvm_create_procvar_class_intern(const name: TIDString; def: tdef; force_no_callback_intf: boolean);
var var
vmtbuilder: tvmtbuilder;
oldsymtablestack: tsymtablestack; oldsymtablestack: tsymtablestack;
pvclass, pvclass,
pvintf: tobjectdef; pvintf: tobjectdef;
@ -429,9 +425,7 @@ implementation
symtablestack.pop(pvclass.symtable); symtablestack.pop(pvclass.symtable);
vmtbuilder:=TVMTBuilder.Create(pvclass); build_vmt(pvclass);
vmtbuilder.generate_vmt;
vmtbuilder.free;
restore_after_new_class(sstate,islocal,oldsymtablestack); restore_after_new_class(sstate,islocal,oldsymtablestack);
end; end;

View File

@ -54,6 +54,12 @@ interface
end; end;
{ convenince routine to build the VMT for an objectdef
Note: also ensures that the procdefs of the objectdef have their hidden
parameters inserted }
procedure build_vmt(def:tobjectdef);
implementation implementation
uses uses
@ -979,4 +985,14 @@ implementation
end; end;
end; end;
procedure build_vmt(def:tobjectdef);
var
vmtbuilder : TVMTBuilder;
begin
vmtbuilder:=TVMTBuilder.create(def);
vmtbuilder.generate_vmt;
vmtbuilder.free;
end;
end. end.

View File

@ -661,7 +661,6 @@ implementation
istyperenaming : boolean; istyperenaming : boolean;
generictypelist : tfphashobjectlist; generictypelist : tfphashobjectlist;
generictokenbuf : tdynamicarray; generictokenbuf : tdynamicarray;
vmtbuilder : TVMTBuilder;
p:tnode; p:tnode;
gendef : tstoreddef; gendef : tstoreddef;
s : shortstring; s : shortstring;
@ -1088,11 +1087,7 @@ implementation
{ Build VMT indexes, skip for type renaming and forward classes } { Build VMT indexes, skip for type renaming and forward classes }
if (hdef.typesym=newtype) and if (hdef.typesym=newtype) and
not(oo_is_forward in tobjectdef(hdef).objectoptions) then not(oo_is_forward in tobjectdef(hdef).objectoptions) then
begin build_vmt(tobjectdef(hdef));
vmtbuilder:=TVMTBuilder.Create(tobjectdef(hdef));
vmtbuilder.generate_vmt;
vmtbuilder.free;
end;
{ In case of an objcclass, verify that all methods have a message { In case of an objcclass, verify that all methods have a message
name set. We only check this now, because message names can be set name set. We only check this now, because message names can be set

View File

@ -675,7 +675,6 @@ uses
oldcurrent_filepos : tfileposinfo; oldcurrent_filepos : tfileposinfo;
recordbuf : tdynamicarray; recordbuf : tdynamicarray;
hadtypetoken : boolean; hadtypetoken : boolean;
vmtbuilder : tvmtbuilder;
i, i,
replaydepth : longint; replaydepth : longint;
item : tobject; item : tobject;
@ -1000,9 +999,7 @@ uses
consume(_SEMICOLON); consume(_SEMICOLON);
end; end;
vmtbuilder:=TVMTBuilder.Create(tobjectdef(result)); build_vmt(tobjectdef(result));
vmtbuilder.generate_vmt;
vmtbuilder.free;
end; end;
{ handle params, calling convention, etc } { handle params, calling convention, etc }
procvardef: procvardef: