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