瀏覽代碼

* always create a new call node when replacing virtual class method calls
with wrapper calls, because the parameter nodes are already bound to the
paravarsyms of the current procdef so simply replacing the procsym and
procdef is not enough

git-svn-id: branches/jvmbackend@18739 -

Jonas Maebe 14 年之前
父節點
當前提交
72c81d9eb1
共有 1 個文件被更改,包括 9 次插入19 次删除
  1. 9 19
      compiler/jvm/njvmcal.pas

+ 9 - 19
compiler/jvm/njvmcal.pas

@@ -563,25 +563,15 @@ implementation
               if not assigned(sym) or
                  (sym.typ<>procsym) then
                 internalerror(2011072801);
-              { check whether we can simply replace the symtableprocentry, or
-                whether we have to reresolve overloads -- can never simply
-                replace in case of constructor -> class method call, because
-                constructors have a vmt parameter and class methods don't }
-              if (procdefinition.proctypeoption<>potype_constructor) and
-                 (symtableprocentry.ProcdefList.count=1) then
-                begin
-                  symtableprocentry:=tprocsym(sym);
-                  procdefinition:=tprocdef(symtableprocentry.ProcdefList[0]);
-                end
-              else
-                begin
-                  remove_hidden_paras;
-                  result:=ccallnode.create(left,tprocsym(sym),symtableproc,methodpointer,callnodeflags);
-                  result.flags:=flags;
-                  left:=nil;
-                  methodpointer:=nil;
-                  exit;
-                end;
+                { do not simply replace the procsym/procdef in case we could
+                  in theory do that, because the parameter nodes have already
+                  been bound to the current procdef's parasyms }
+                remove_hidden_paras;
+                result:=ccallnode.create(left,tprocsym(sym),symtableproc,methodpointer,callnodeflags);
+                result.flags:=flags;
+                left:=nil;
+                methodpointer:=nil;
+                exit;
             end;
           result:=inherited pass_1;
           if assigned(result) then