[kaffe] CVS kaffe-extras (guilhem): Last update was containing a class cast misbehaviour when using 'super'. That on

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Sun Sep 28 12:07:02 2003


PatchSet 16 
Date: 2003/09/28 19:06:50
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Last update was containing a class cast misbehaviour when using 'super'. That one should be
right (hopefully ;-) ).

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

Index: kaffe-extras/patches/kjc-method-call.diff
diff -u kaffe-extras/patches/kjc-method-call.diff:1.2 kaffe-extras/patches/kjc-method-call.diff:1.3
--- kaffe-extras/patches/kjc-method-call.diff:1.2	Sun Sep 28 18:04:23 2003
+++ kaffe-extras/patches/kjc-method-call.diff	Sun Sep 28 19:06:50 2003
@@ -1,5 +1,59 @@
---- 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
+--- kjc-suite-2.1B/src/kjc/CMethod.java	2003-09-28 21:02:42.000000000 +0200
++++ kjc-suite-2.1B.new/src/kjc/CMethod.java	2003-09-28 20:46:29.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 " + prefixClass + " doesn't descends from the owner " + owner + " of the method " + getIdent());
+ 
+     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());
+     }
+--- kjc-suite-2.1B/src/kjc/JMethodCallExpression.java	2003-09-28 21:02:42.000000000 +0200
++++ kjc-suite-2.1B.new/src/kjc/JMethodCallExpression.java	2003-09-28 20:58:09.000000000 +0200
 @@ -40,7 +40,7 @@
     */
    public JMethodCallExpression(TokenReference where,
@@ -18,7 +72,7 @@
      CReferenceType[]	exceptions = method.getThrowables();
  
      for (int i = 0; i < exceptions.length; i++) {
-@@ -281,6 +283,20 @@
+@@ -281,6 +283,21 @@
      return this; 
    }
  
@@ -26,12 +80,13 @@
 +  {
 +    prefixClass = null;
 +
-+    if (prefix != null && !method.isStatic() && 
-+        !method.getOwner().getJavaName().equals("java.lang.Object"))
-+      prefixClass = prefixType.getCClass();
++    // Case already handled by findMethod.
++    if (method.getOwner().getJavaName().equals("java.lang.Object") ||
++	prefix instanceof JSuperExpression)
++      return;
 +
-+    if (prefix instanceof JSuperExpression)
-+      prefixClass = prefixType.getCClass().getSuperClass();
++    if (prefix != null && !method.isStatic())
++      prefixClass = prefixType.getCClass();
 +    else if (prefix instanceof JTypeNameExpression)
 +      prefixClass = ((JTypeNameExpression)prefix).getClassType().getCClass();
 +  }
@@ -39,7 +94,7 @@
    protected void findMethod(CExpressionContext context, CClass local, CType[] argTypes)  throws PositionedError {
      TypeFactory         factory = context.getTypeFactory();
  
-@@ -316,9 +332,20 @@
+@@ -316,9 +333,20 @@
  
        try {
          if (! prefix.getType(factory).isTypeVariable()) {
@@ -63,7 +118,7 @@
          } else {
            // find method in a type of the bound;
            CReferenceType[]        bound =  ((CTypeVariable) prefix.getType(factory)).getBounds();
-@@ -364,7 +391,7 @@
+@@ -364,7 +392,7 @@
        }
        throw new CMethodNotFoundError(getTokenReference(), this, prefixName + ident, argTypes);
      }
@@ -72,7 +127,7 @@
    // ----------------------------------------------------------------------
    // CODE GENERATION
    // ----------------------------------------------------------------------
-@@ -403,7 +430,7 @@
+@@ -403,7 +431,7 @@
      for (int i = 0; i < args.length; i++) {
        args[i].genCode(context, false);
      }
@@ -81,63 +136,9 @@
  
      if (discardValue) {
        code.plantPopInstruction(getType(factory));
-@@ -421,4 +448,5 @@
+@@ -421,4 +449,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());
-     }