1 #!/bin/sh
   2 
   3 #
   4 # Copyright (c) 2002, 2014 Oracle and/or its affiliates. All rights reserved.
   5 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   6 #
   7 # This code is free software; you can redistribute it and/or modify it
   8 # under the terms of the GNU General Public License version 2 only, as
   9 # published by the Free Software Foundation.
  10 #
  11 # This code is distributed in the hope that it will be useful, but WITHOUT
  12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14 # version 2 for more details (a copy is included in the LICENSE file that
  15 # accompanied this code).
  16 #
  17 # You should have received a copy of the GNU General Public License version
  18 # 2 along with this work; if not, write to the Free Software Foundation,
  19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20 #
  21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22 # or visit www.oracle.com if you need additional information or have any
  23 # questions.
  24 #
  25 
  26 # @test
  27 # @bug 4663146
  28 # @summary Arguments match no method error
  29 # @author Jim Holmlund/Suvasis
  30 #
  31 # @run shell/timeout=300 EvalArgs.sh
  32 
  33 #  The bug is that, for example, if a String is passed
  34 #  as an arg to a func where an Object is expected,
  35 #  the above error occurs.  jdb doesnt notice that this is
  36 #  legal because String is an instance of Object.
  37 
  38 
  39 # These are variables that can be set to control execution
  40 
  41 #pkg=untitled7
  42 classname=EvalArgs
  43 #compileOptions=-g
  44 #java="java_g"
  45 
  46 createJavaFile()
  47 {
  48     cat <<EOF > $classname.java.1
  49 public class $classname {
  50 
  51     static jj1 myjj1;
  52     static jj2 myjj2;
  53     static oranges myoranges;
  54     static boolean jjboolean = true;
  55     static byte    jjbyte = 1;
  56     static char    jjchar = 'a';
  57     static double  jjdouble = 2.2;
  58     static float   jjfloat = 3.1f;
  59     static int     jjint = 4;
  60     static long    jjlong = 5;
  61     static short   jjshort = 6;
  62     static int[]   jjintArray = {7, 8};
  63     static float[] jjfloatArray = {9.1f, 10.2f};
  64 
  65 
  66     public static void main(String args[]) {
  67         myjj1 = new jj1();
  68         myjj2 = new jj2();
  69         myoranges = new oranges();
  70 
  71         // prove that these work
  72         System.out.println( ffjj1(myjj1));
  73         System.out.println( ffjj1(myjj2));
  74 
  75         System.out.println("$classname.ffoverload($classname.jjboolean) = " +
  76                             $classname.ffoverload($classname.jjboolean));
  77         System.out.println("$classname.ffoverload($classname.jjbyte) = " +
  78                             $classname.ffoverload($classname.jjbyte));
  79         System.out.println("$classname.ffoverload($classname.jjchar) = " +
  80                             $classname.ffoverload($classname.jjchar));
  81         System.out.println("$classname.ffoverload($classname.jjdouble) = " +
  82                             $classname.ffoverload($classname.jjdouble));
  83 
  84 
  85         //This doesn't even compile
  86         //System.out.println( "ffintArray(jjfloatArray) = " + ffintArray(jjfloatArray));
  87         gus();
  88     }
  89 
  90     static void gus() {
  91         int x = 0;             // @1 breakpoint
  92     }
  93 
  94     public static String ffjj1(jj1 arg) {
  95         return arg.me;
  96     }
  97 
  98     public static String ffjj2(jj2 arg) {
  99         return arg.me;
 100     }
 101 
 102     static String ffboolean(boolean p1) {
 103         return "ffbool: p1 = " + p1;
 104     }
 105 
 106     static String ffbyte(byte p1) {
 107         return "ffbyte: p1 = " + p1;
 108     }
 109 
 110     static String ffchar(char p1) {
 111         return "ffchar: p1 = " + p1;
 112     }
 113 
 114     static String ffdouble(double p1) {
 115         return "ffdouble: p1 = " + p1;
 116     }
 117 
 118     static String fffloat(float p1) {
 119         return "fffloat: p1 = " + p1;
 120     }
 121 
 122     static String ffint(int p1) {
 123         return "ffint: p1 = " + p1;
 124     }
 125 
 126     static String fflong(long p1) {
 127         return "fflong: p1 = " + p1;
 128     }
 129 
 130     static String ffshort(short p1) {
 131         return "ffshort: p1 = " + p1;
 132     }
 133 
 134     static String ffintArray(int[] p1) {
 135         return "ffintArray: p1 = " + p1;
 136     }
 137 
 138     // Overloaded funcs
 139     public static String ffoverload(jj1 arg) {
 140         return arg.me;
 141     }
 142 
 143     static String ffoverload(boolean p1) {
 144         return "ffoverload: boolean p1 = " + p1;
 145     }
 146 /***
 147     static String ffoverload(byte p1) {
 148         return "ffoverload: byte p1 = " + p1;
 149     }
 150 ***/
 151     static String ffoverload(char p1) {
 152         return "ffoverload: char p1 = " + p1;
 153     }
 154 
 155     static String ffoverload(double p1) {
 156         return "ffoverload: double p1 = " + p1;
 157     }
 158 
 159     static String ffoverload(float p1) {
 160         return "ffoverload: float p1 = " + p1;
 161     }
 162 /***
 163     static String ffoverload(int p1) {
 164         return "ffoverload: int p1 = " + p1;
 165     }
 166 ***/
 167     static String ffoverload(long p1) {
 168         return "ffoverload: long p1 = " + p1;
 169     }
 170 
 171     static String ffoverload(short p1) {
 172         return "ffoverload: short p1 = " + p1;
 173     }
 174 
 175     static String ffoverload(int[] p1) {
 176         return "ffoverload: int array p1 = " + p1;
 177     }
 178 
 179   static class jj1 {
 180     String me;
 181     jj1() {
 182         me = "jj1name";
 183     }
 184     public String toString() {
 185         return me;
 186     }
 187 
 188   }
 189 
 190   static class jj2 extends jj1 {
 191     jj2() {
 192         super();
 193         me = "jj2name";
 194     }
 195   }
 196 
 197   static class oranges {
 198     oranges() {
 199     }
 200   }
 201 }
 202 
 203 
 204 
 205 EOF
 206 }
 207 
 208 # drive jdb by sending cmds to it and examining its output
 209 dojdbCmds()
 210 {
 211     setBkpts @1
 212     runToBkpt @1
 213 
 214     # verify that it works ok when arg types are the same as
 215     # the param types
 216     cmd eval "$classname.ffboolean($classname.jjboolean)"
 217     cmd eval "$classname.ffbyte($classname.jjbyte)"
 218     cmd eval "$classname.ffchar($classname.jjchar)"
 219     cmd eval "$classname.ffdouble($classname.jjdouble)"
 220     cmd eval "$classname.fffloat($classname.jjfloat)"
 221     cmd eval "$classname.ffint($classname.jjint)"
 222     cmd eval "$classname.fflong($classname.jjlong)"
 223     cmd eval "$classname.ffshort($classname.jjshort)"
 224     cmd eval "$classname.ffintArray($classname.jjintArray)"
 225     cmd eval "$classname.ffjj1($classname.myjj1)"
 226 
 227     # Provide a visual break in the output
 228     cmd print 1
 229 
 230     # Verify mixing primitive types works ok
 231     # These should work even though the arg types are
 232     # not the same because there is only one
 233     # method with each name.
 234     cmd eval "$classname.ffbyte($classname.jjint)"
 235     cmd eval "$classname.ffchar($classname.jjdouble)"
 236     cmd eval "$classname.ffdouble($classname.jjfloat)"
 237     cmd eval "$classname.fffloat($classname.jjshort)"
 238     cmd eval "$classname.ffint($classname.jjlong)"
 239     cmd eval "$classname.fflong($classname.jjchar)"
 240     cmd eval "$classname.ffshort($classname.jjbyte)"
 241 
 242     cmd print 1
 243 
 244     # Verify that passing a subclass object works
 245     cmd eval "$classname.ffjj1($classname.myjj2)"
 246     cmd eval "$classname.myjj1.toString().equals("jj1name")"
 247 
 248     cmd print 1
 249 
 250     # Overloaded methods.  These should pass
 251     # because there is an exact  match.
 252     cmd eval "$classname.ffoverload($classname.jjboolean)"
 253 
 254     cmd eval "$classname.ffoverload($classname.jjchar)"
 255     cmd eval "$classname.ffoverload($classname.jjdouble)"
 256     cmd eval "$classname.ffoverload($classname.jjfloat)"
 257     cmd eval "$classname.ffoverload($classname.jjlong)"
 258     cmd eval "$classname.ffoverload($classname.jjshort)"
 259     cmd eval "$classname.ffoverload($classname.jjintArray)"
 260     cmd eval "$classname.ffoverload($classname.myjj1)"
 261     cmd eval "$classname.ffoverload($classname.myjj2)"
 262     jdbFailIfPresent "Arguments match no method"
 263 
 264     cmd print 1
 265     cmd print '"These should fail with msg Arguments match multiple methods"'
 266 
 267     # These overload calls should fail because ther
 268     # isn't an exact match and jdb isn't smart  enough
 269     # to figure out which of several possibilities
 270     # should be called
 271     cmd eval "$classname.ffoverload($classname.jjbyte)"
 272     jdbFailIfNotPresent "Arguments match multiple methods" 3
 273 
 274     cmd eval "$classname.ffoverload($classname.jjint)"
 275     jdbFailIfNotPresent "Arguments match multiple methods" 3
 276 
 277     cmd print 1
 278     cmd print '"These should fail with InvalidTypeExceptions"'
 279 
 280     cmd eval "$classname.ffboolean($classname.jjbyte)"
 281     jdbFailIfNotPresent "InvalidTypeException" 3
 282 
 283     cmd eval "$classname.ffintArray($classname.jjint)"
 284     jdbFailIfNotPresent "InvalidTypeException" 3
 285 
 286     cmd eval "$classname.ffintArray($classname.jjfloatArray)"
 287     jdbFailIfNotPresent "InvalidTypeException" 3
 288 
 289     cmd eval "$classname.ffjj2($classname.myjj1)"
 290     jdbFailIfNotPresent "InvalidTypeException" 3
 291 
 292     cmd eval "$classname.ffjj2($classname.myoranges)"
 293     jdbFailIfNotPresent "InvalidTypeException" 3
 294 }
 295 
 296 
 297 mysetup()
 298 {
 299     if [ -z "$TESTSRC" ] ; then
 300         TESTSRC=.
 301     fi
 302 
 303     for ii in . $TESTSRC $TESTSRC/.. ; do
 304         if [ -r "$ii/ShellScaffold.sh" ] ; then
 305             . $ii/ShellScaffold.sh
 306             break
 307         fi
 308     done
 309 }
 310 
 311 # You could replace this next line with the contents
 312 # of ShellScaffold.sh and this script will run just the same.
 313 mysetup
 314 
 315 runit
 316 pass