[kaffe] CVS kaffe-extras (guilhem): Updated KJC method call patch.

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Sun Sep 28 11:05:03 2003


PatchSet 15 
Date: 2003/09/28 18:04:23
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Updated KJC method call patch.

To ensure compatibility we must follow JLS 13.1: java.lang.Object method
should be called directly, if a Typename is precised use it, if super is used
use super class type to call the method.

Members: 
	patches/kjc-method-call.diff:1.1->1.2 

Index: kaffe-extras/patches/kjc-method-call.diff
diff -u kaffe-extras/patches/kjc-method-call.diff:1.1 kaffe-extras/patches/kjc-method-call.diff:1.2
--- kaffe-extras/patches/kjc-method-call.diff:1.1	Sat Sep 27 12:26:40 2003
+++ kaffe-extras/patches/kjc-method-call.diff	Sun Sep 28 18:04:23 2003
@@ -1,61 +1,5 @@
-diff -x KjcScanner.java -ur kopi-2.1B/src/kjc/CMethod.java kjc-suite-2.1B.new/src/kjc/CMethod.java
---- kopi-2.1B/src/kjc/CMethod.java	2003-09-26 19:29:48.000000000 +0200
-+++ kjc-suite-2.1B.new/src/kjc/CMethod.java	2003-09-25 17:48:51.000000000 +0200
-@@ -550,6 +550,7 @@
-   // ----------------------------------------------------------------------
-   // CODE GENERATION
-   // ----------------------------------------------------------------------
-+  //
- 
-   /**
-    * Generates a sequence of bytecode
-@@ -557,7 +558,25 @@
-    * @param	nonVirtual	force non-virtual dispatching
-    */
-   public void genCode(GenerationContext context, boolean nonVirtual) {
-+    genCode(context, null, nonVirtual);
-+  }
-+
-+  /**
-+   * Generates a sequence of bytecode
-+   * @param	code		the code sequence
-+   * @param     prefixClass     the class that should be used as a prefix in the method call.
-+   * @param	nonVirtual	force non-virtual dispatching
-+   */
-+  public void genCode(GenerationContext context, CClass prefixClass,
-+		      boolean nonVirtual) {
-     CodeSequence code = context.getCodeSequence();
-+    
-+    if (prefixClass == null)
-+      prefixClass = owner;
-+
-+    if (!prefixClass.descendsFrom(owner))
-+      throw new IllegalArgumentException(
-+	    "prefixClass doesn't descends from the owner of the method");
- 
-     if (getOwner().isInterface()) {
-       int		size = 0;
-@@ -566,7 +585,7 @@
- 	size += parameters[i].getSize();
-       }
- 
--      code.plantInstruction(new InvokeinterfaceInstruction(getPrefixName(),
-+      code.plantInstruction(new InvokeinterfaceInstruction(prefixClass.getQualifiedName(),
- 							   getIdent(),
- 							   getSignature(),
- 							   size + 1)); // this
-@@ -583,7 +602,7 @@
-       }
- 
-       code.plantMethodRefInstruction(opcode,
--				     getPrefixName(),
-+				     prefixClass.getQualifiedName(),
- 				     getIdent(),
- 				     getSignature());
-     }
-diff -x KjcScanner.java -ur kopi-2.1B/src/kjc/JMethodCallExpression.java kjc-suite-2.1B.new/src/kjc/JMethodCallExpression.java
---- kopi-2.1B/src/kjc/JMethodCallExpression.java	2002-07-15 20:53:33.000000000 +0200
-+++ kjc-suite-2.1B.new/src/kjc/JMethodCallExpression.java	2003-09-26 19:05:46.000000000 +0200
+--- kjc-suite-2.1B/src/kjc/JMethodCallExpression.java	2003-09-28 19:54:48.000000000 +0200
++++ kjc-suite-2.1B.new/src/kjc/JMethodCallExpression.java	2003-09-28 19:48:12.000000000 +0200
 @@ -40,7 +40,7 @@
     */
    public JMethodCallExpression(TokenReference where,
@@ -74,21 +18,28 @@
      CReferenceType[]	exceptions = method.getThrowables();
  
      for (int i = 0; i < exceptions.length; i++) {
-@@ -281,6 +283,13 @@
+@@ -281,6 +283,20 @@
      return this; 
    }
  
 +  protected void adjustMethodCall(CExpressionContext context, CClass local)
 +  {
-+    // Make a stupid decision. Take the class in the prefix to build the call prefix.
-+    if (prefix != null)
++    prefixClass = null;
++
++    if (prefix != null && !method.isStatic() && 
++        !method.getOwner().getJavaName().equals("java.lang.Object"))
 +      prefixClass = prefixType.getCClass();
++
++    if (prefix instanceof JSuperExpression)
++      prefixClass = prefixType.getCClass().getSuperClass();
++    else if (prefix instanceof JTypeNameExpression)
++      prefixClass = ((JTypeNameExpression)prefix).getClassType().getCClass();
 +  }
 +
    protected void findMethod(CExpressionContext context, CClass local, CType[] argTypes)  throws PositionedError {
      TypeFactory         factory = context.getTypeFactory();
  
-@@ -316,9 +325,20 @@
+@@ -316,9 +332,20 @@
  
        try {
          if (! prefix.getType(factory).isTypeVariable()) {
@@ -112,7 +63,7 @@
          } else {
            // find method in a type of the bound;
            CReferenceType[]        bound =  ((CTypeVariable) prefix.getType(factory)).getBounds();
-@@ -364,7 +384,7 @@
+@@ -364,7 +391,7 @@
        }
        throw new CMethodNotFoundError(getTokenReference(), this, prefixName + ident, argTypes);
      }
@@ -121,7 +72,7 @@
    // ----------------------------------------------------------------------
    // CODE GENERATION
    // ----------------------------------------------------------------------
-@@ -403,7 +423,7 @@
+@@ -403,7 +430,7 @@
      for (int i = 0; i < args.length; i++) {
        args[i].genCode(context, false);
      }
@@ -130,9 +81,63 @@
  
      if (discardValue) {
        code.plantPopInstruction(getType(factory));
-@@ -421,4 +441,5 @@
+@@ -421,4 +448,5 @@
    protected CMethod		method;
    protected CType               type;
    protected CType               prefixType;
 +  protected CClass              prefixClass;
  }
+--- kjc-suite-2.1B/src/kjc/CMethod.java	2003-09-28 19:54:48.000000000 +0200
++++ kjc-suite-2.1B.new/src/kjc/CMethod.java	2003-09-25 17:48:51.000000000 +0200
+@@ -550,6 +550,7 @@
+   // ----------------------------------------------------------------------
+   // CODE GENERATION
+   // ----------------------------------------------------------------------
++  //
+ 
+   /**
+    * Generates a sequence of bytecode
+@@ -557,7 +558,25 @@
+    * @param	nonVirtual	force non-virtual dispatching
+    */
+   public void genCode(GenerationContext context, boolean nonVirtual) {
++    genCode(context, null, nonVirtual);
++  }
++
++  /**
++   * Generates a sequence of bytecode
++   * @param	code		the code sequence
++   * @param     prefixClass     the class that should be used as a prefix in the method call.
++   * @param	nonVirtual	force non-virtual dispatching
++   */
++  public void genCode(GenerationContext context, CClass prefixClass,
++		      boolean nonVirtual) {
+     CodeSequence code = context.getCodeSequence();
++    
++    if (prefixClass == null)
++      prefixClass = owner;
++
++    if (!prefixClass.descendsFrom(owner))
++      throw new IllegalArgumentException(
++	    "prefixClass doesn't descends from the owner of the method");
+ 
+     if (getOwner().isInterface()) {
+       int		size = 0;
+@@ -566,7 +585,7 @@
+ 	size += parameters[i].getSize();
+       }
+ 
+-      code.plantInstruction(new InvokeinterfaceInstruction(getPrefixName(),
++      code.plantInstruction(new InvokeinterfaceInstruction(prefixClass.getQualifiedName(),
+ 							   getIdent(),
+ 							   getSignature(),
+ 							   size + 1)); // this
+@@ -583,7 +602,7 @@
+       }
+ 
+       code.plantMethodRefInstruction(opcode,
+-				     getPrefixName(),
++				     prefixClass.getQualifiedName(),
+ 				     getIdent(),
+ 				     getSignature());
+     }