소스 검색

* 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