瀏覽代碼

* pdecvar.pas, refactoring: don't create storedprocdef unless it is actually required.
+ Added statement to dispose storedprocdef after use, it was missing.

git-svn-id: trunk@16809 -

sergei 14 年之前
父節點
當前提交
ba74d47081
共有 1 個文件被更改,包括 17 次插入10 次删除
  1. 17 10
      compiler/pdecvar.pas

+ 17 - 10
compiler/pdecvar.pas

@@ -282,7 +282,7 @@ implementation
                 p.dispid:=tobjectdef(astruct).get_next_dispid;
             end;
 
-          procedure add_index_parameter(var paranr: word; p: tpropertysym; readprocdef, writeprocdef, storedprocdef: tprocvardef);
+          procedure add_index_parameter(var paranr: word; p: tpropertysym; readprocdef, writeprocdef: tprocvardef);
             var
               hparavs: tparavarsym;
             begin
@@ -291,8 +291,6 @@ implementation
               readprocdef.parast.insert(hparavs);
               hparavs:=tparavarsym.create('$index',10*paranr,vs_value,p.indexdef,[]);
               writeprocdef.parast.insert(hparavs);
-              hparavs:=tparavarsym.create('$index',10*paranr,vs_value,p.indexdef,[]);
-              storedprocdef.parast.insert(hparavs);
             end;
 
       var
@@ -321,19 +319,14 @@ implementation
          paranr:=0;
          readprocdef:=tprocvardef.create(normal_function_level);
          writeprocdef:=tprocvardef.create(normal_function_level);
-         storedprocdef:=tprocvardef.create(normal_function_level);
 
          { make them method pointers }
          if assigned(astruct) and not is_classproperty then
            begin
              include(readprocdef.procoptions,po_methodpointer);
              include(writeprocdef.procoptions,po_methodpointer);
-             include(storedprocdef.procoptions,po_methodpointer);
            end;
 
-         { method for stored must return boolean }
-         storedprocdef.returndef:=booltype;
-
          if token<>_ID then
            begin
               consume(_ID);
@@ -448,7 +441,7 @@ implementation
                    p.indexdef:=pt.resultdef;
                    include(p.propoptions,ppo_indexed);
                    { concat a longint to the para templates }
-                   add_index_parameter(paranr,p,readprocdef,writeprocdef,storedprocdef);
+                   add_index_parameter(paranr,p,readprocdef,writeprocdef);
                    pt.free;
                 end;
            end
@@ -471,7 +464,7 @@ implementation
                   p.default:=tpropertysym(overridden).default;
                   p.propoptions:=tpropertysym(overridden).propoptions;
                   if ppo_indexed in p.propoptions then
-                    add_index_parameter(paranr,p,readprocdef,writeprocdef,storedprocdef);
+                    add_index_parameter(paranr,p,readprocdef,writeprocdef);
                 end
               else
                 begin
@@ -641,11 +634,25 @@ implementation
                             case sym.typ of
                               procsym :
                                 begin
+                                   { Create a temporary procvardef to handle parameters }
+                                   storedprocdef:=tprocvardef.create(normal_function_level);
+                                   include(storedprocdef.procoptions,po_methodpointer);
+                                   { Return type must be boolean }
+                                   storedprocdef.returndef:=booltype;
+                                   { Add index parameter if needed }
+                                   if ppo_indexed in p.propoptions then
+                                     begin
+                                       hparavs:=tparavarsym.create('$index',10,vs_value,p.indexdef,[]);
+                                       storedprocdef.parast.insert(hparavs);
+                                     end;
+
                                    { Insert hidden parameters }
                                    handle_calling_convention(storedprocdef);
                                    p.propaccesslist[palt_stored].procdef:=Tprocsym(sym).Find_procdef_bypara(storedprocdef.paras,storedprocdef.returndef,[cpo_allowdefaults,cpo_ignorehidden]);
                                    if not assigned(p.propaccesslist[palt_stored].procdef) then
                                      message(parser_e_ill_property_storage_sym);
+                                   { Not needed anymore }
+                                   storedprocdef.owner.deletedef(storedprocdef);
                                 end;
                               fieldvarsym :
                                 begin