Jelajahi Sumber

* fixed invokeinterface usage: must also specify the number of stack
slots used by the call

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

Jonas Maebe 14 tahun lalu
induk
melakukan
e8ec2c45af
1 mengubah file dengan 9 tambahan dan 2 penghapusan
  1. 9 2
      compiler/jvm/hlcgcpu.pas

+ 9 - 2
compiler/jvm/hlcgcpu.pas

@@ -1846,7 +1846,8 @@ implementation
     begin
     begin
       {
       {
         invoke types:
         invoke types:
-          * invokeinterface: call method from an interface
+          * invokeinterface: call method from an interface (must also specify
+              number of parameters in terms of stack slot count!)
           * invokespecial: invoke a constructor, method in a superclass,
           * invokespecial: invoke a constructor, method in a superclass,
               or private instance method
               or private instance method
           * invokestatic: invoke a class method (private or not)
           * invokestatic: invoke a class method (private or not)
@@ -1893,7 +1894,13 @@ implementation
         else
         else
           internalerror(2010122602);
           internalerror(2010122602);
       end;
       end;
-      list.concat(taicpu.op_sym(opc,current_asmdata.RefAsmSymbol(s)));
+      if (opc<>a_invokeinterface) then
+        list.concat(taicpu.op_sym(opc,current_asmdata.RefAsmSymbol(s)))
+      else
+        begin
+          pd.init_paraloc_info(calleeside);
+          list.concat(taicpu.op_sym_const(opc,current_asmdata.RefAsmSymbol(s),pd.calleeargareasize));
+        end;
     end;
     end;
 
 
   procedure thlcgjvm.g_call_system_proc(list: TAsmList; const procname: string);
   procedure thlcgjvm.g_call_system_proc(list: TAsmList; const procname: string);