| /* |
| * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /* |
| * @test |
| * @bug 4102566 |
| * @summary Test access methods for assignment targets. |
| * @author William Maddox (maddox) |
| * |
| * @compile AccessMethodsLHS.java |
| * @run main AccessMethodsLHS |
| */ |
| |
| public class AccessMethodsLHS { |
| |
| static void fail(String msg) throws Exception { |
| throw new Exception("FAIL: " + msg); |
| } |
| |
| static int arg = 123456; |
| |
| private int i; |
| private double d; |
| |
| private void m(int x) throws Exception { |
| System.out.println("called AccessMethodsLHS.m"); |
| if (x != 123456) |
| AccessMethodsLHS.fail("bad argument"); |
| } |
| |
| public static class Bar { |
| private int i; |
| private double d; |
| private String s; |
| |
| private void m(int x) throws Exception { |
| System.out.println("called AccessMethodsLHS.Bar.m"); |
| if (x != 123456) |
| AccessMethodsLHS.fail("bad argument"); |
| } |
| |
| // Static members are permitted in a static inner class. |
| |
| static private int si; |
| static private double sd; |
| static private String ss; |
| |
| static private void sm(int x) throws Exception { |
| System.out.println("called AccessMethodsLHS.Bar.sm"); |
| if (x != 123456) |
| AccessMethodsLHS.fail("bad argument"); |
| } |
| } |
| |
| public static class Baz { |
| private int i; |
| private double d; |
| private String s; |
| |
| private void m(int x) throws Exception { |
| System.out.println("called Baz.m"); |
| if (x != 123456) |
| AccessMethodsLHS.fail("bad argument"); |
| } |
| |
| // Compiler rejects static members here correctly. |
| |
| // static private int si; |
| // static private double sd; |
| // static private String ss; |
| } |
| |
| public class Quux { |
| void DoIt () throws Exception { |
| m(arg); |
| i = 1; |
| d = 1.0; |
| i += 5; |
| i--; |
| } |
| void DoMore(AccessMethodsLHS f) throws Exception { |
| f.m(arg); |
| } |
| } |
| |
| public static class Quem { |
| void DoIt () { |
| // Illegal static refs to non-static vars |
| // i = 1; |
| // d = 1.0; |
| // i += 5; |
| // i--; |
| } |
| } |
| |
| static int effects = 0; |
| |
| static Bar iBar(Bar x) { effects++; return x; } |
| |
| static Baz iBaz(Baz x) { effects++; return x; } |
| |
| static void checkEffects(int i) throws Exception { |
| if (effects != 1) { |
| AccessMethodsLHS.fail("incorrect side-effect behavior (" + effects + "): " + i); |
| } |
| effects = 0; |
| } |
| |
| static public void main(String args[]) throws Exception { |
| |
| Bar b = new Bar(); |
| Baz c = new Baz(); |
| |
| System.out.println("testing assignment"); |
| |
| AccessMethodsLHS f = new AccessMethodsLHS(); |
| |
| Quux q1 = f.new Quux(); |
| q1.DoIt(); |
| q1.DoMore(f); |
| |
| Quem q2 = new Quem(); |
| q2.DoIt(); |
| |
| // *** Static class, Non-static members *** |
| |
| b.m(arg); |
| |
| // Integer (1 word) |
| |
| b.i = 5; |
| System.out.println(b.i); |
| if (b.i != 5) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(b.i); |
| |
| |
| if ((b.i += 10) != 15) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(b.i); |
| |
| if (b.i != 15) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(b.i); |
| |
| b.s = "foo"; |
| if (!(b.s += "bar").equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign result"); |
| System.out.println(b.s); |
| |
| if (!b.s.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect"); |
| System.out.println(b.s); |
| |
| b.s = "foo"; |
| b.s += "bar"; |
| if (!b.s.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect (novalue)"); |
| System.out.println(b.s); |
| |
| b.i = 0; |
| b.i++; |
| if (b.i != 1) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(b.i); |
| |
| b.i = 5; |
| if (b.i++ != 5) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (b.i != 6) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(b.i); |
| |
| b.i = 1; |
| --b.i; |
| if (b.i != 0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| b.i = 5; |
| if (--b.i != 4) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (b.i != 4) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(b.i); |
| |
| // Double (2 word) |
| |
| b.d = 5.0; |
| System.out.println(b.d); |
| if (b.d != 5.0) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(b.d); |
| |
| if ((b.d += 10) != 15.0) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(b.d); |
| |
| if (b.d != 15.0) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(b.d); |
| |
| b.d = 0.0; |
| b.d++; |
| if (b.d != 1.0) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(b.d); |
| |
| b.d = 5.0; |
| if (b.d++ != 5.0) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (b.d != 6.0) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(b.d); |
| |
| b.d = 1.0; |
| --b.d; |
| if (b.d != 0.0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| b.d = 5.0; |
| if (--b.d != 4.0) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (b.d != 4.0) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(b.d); |
| |
| // Integer (1 word) with side-effects in object reference |
| |
| iBar(b).i = 5; |
| checkEffects(1); |
| System.out.println(b.i); |
| if (b.i != 5) |
| AccessMethodsLHS.fail("simple assignment"); |
| |
| System.out.println(b.i); |
| |
| if ((iBar(b).i += 10) != 15) |
| AccessMethodsLHS.fail("add-assign result"); |
| checkEffects(2); |
| System.out.println(b.i); |
| |
| if (b.i != 15) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(b.i); |
| |
| b.i = 0; |
| iBar(b).i++; |
| checkEffects(3); |
| if (b.i != 1) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(b.i); |
| |
| b.i = 5; |
| if (iBar(b).i++ != 5) |
| AccessMethodsLHS.fail("post-increment result"); |
| checkEffects(4); |
| if (b.i != 6) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(b.i); |
| |
| b.i = 1; |
| --iBar(b).i; |
| checkEffects(5); |
| if (b.i != 0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| b.i = 5; |
| if (--iBar(b).i != 4) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| checkEffects(6); |
| if (b.i != 4) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(b.i); |
| |
| |
| // *** Static class, Static members *** |
| |
| Bar.sm(arg); |
| |
| // Integer (1 word) |
| |
| Bar.si = 5; |
| System.out.println(Bar.si); |
| if (Bar.si != 5) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(Bar.si); |
| |
| if ((Bar.si += 10) != 15) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(Bar.si); |
| |
| if (Bar.si != 15) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(Bar.si); |
| |
| Bar.ss = "foo"; |
| if (!(Bar.ss += "bar").equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign result"); |
| System.out.println(Bar.ss); |
| |
| if (!Bar.ss.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect"); |
| System.out.println(Bar.ss); |
| |
| Bar.ss = "foo"; |
| Bar.ss += "bar"; |
| if (!Bar.ss.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect (novalue)"); |
| System.out.println(Bar.ss); |
| |
| Bar.si = 0; |
| Bar.si++; |
| if (Bar.si != 1) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(Bar.si); |
| |
| Bar.si = 5; |
| if (Bar.si++ != 5) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (Bar.si != 6) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(Bar.si); |
| |
| Bar.si = 1; |
| --Bar.si; |
| if (Bar.si != 0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| Bar.si = 5; |
| if (--Bar.si != 4) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (Bar.si != 4) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(Bar.si); |
| |
| // Double (2 word) |
| |
| Bar.sd = 5.0; |
| System.out.println(Bar.sd); |
| if (Bar.sd != 5.0) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(Bar.sd); |
| |
| if ((Bar.sd += 10) != 15.0) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(Bar.sd); |
| |
| if (Bar.sd != 15.0) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(Bar.sd); |
| |
| Bar.sd = 0.0; |
| Bar.sd++; |
| if (Bar.sd != 1.0) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(Bar.sd); |
| |
| Bar.sd = 5.0; |
| if (Bar.sd++ != 5.0) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (Bar.sd != 6.0) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(Bar.sd); |
| |
| Bar.sd = 1.0; |
| --Bar.sd; |
| if (Bar.sd != 0.0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| Bar.sd = 5.0; |
| if (--Bar.sd != 4.0) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (Bar.sd != 4.0) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(Bar.sd); |
| |
| |
| // *** Static class, Static members (invoked via object reference) *** |
| |
| b.sm(arg); |
| |
| iBar(b).sm(arg); |
| checkEffects(101); |
| |
| // Integer (1 word) |
| |
| b.si = 5; |
| System.out.println(b.si); |
| if (b.si != 5) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(b.si); |
| |
| if ((b.si += 10) != 15) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(b.si); |
| |
| if (b.si != 15) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(b.si); |
| |
| b.ss = "foo"; |
| if (!(b.ss += "bar").equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign result"); |
| System.out.println(b.ss); |
| |
| if (!b.ss.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect"); |
| System.out.println(b.ss); |
| |
| b.ss = "foo"; |
| b.ss += "bar"; |
| if (!b.ss.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect (novalue)"); |
| System.out.println(b.ss); |
| |
| b.si = 0; |
| b.si++; |
| if (b.si != 1) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(b.si); |
| |
| b.si = 5; |
| if (b.si++ != 5) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (b.si != 6) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(b.si); |
| |
| b.si = 1; |
| --b.si; |
| if (b.si != 0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| b.si = 5; |
| if (--b.si != 4) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (b.si != 4) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(b.si); |
| |
| // Double (2 word) |
| |
| b.sd = 5.0; |
| System.out.println(b.sd); |
| if (b.sd != 5.0) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(b.sd); |
| |
| if ((b.sd += 10) != 15.0) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(b.sd); |
| |
| if (b.sd != 15.0) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(b.sd); |
| |
| b.sd = 0.0; |
| b.sd++; |
| if (b.sd != 1.0) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(b.sd); |
| |
| b.sd = 5.0; |
| if (b.sd++ != 5.0) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (b.sd != 6.0) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(b.sd); |
| |
| b.sd = 1.0; |
| --b.sd; |
| if (b.sd != 0.0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| b.sd = 5.0; |
| if (--b.sd != 4.0) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (b.sd != 4.0) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(b.sd); |
| |
| // Integer (1 word) with side-effects in object reference |
| |
| iBar(b).si = 5; |
| checkEffects(7); |
| System.out.println(b.si); |
| if (b.si != 5) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(b.si); |
| |
| if ((iBar(b).si += 10) != 15) |
| AccessMethodsLHS.fail("add-assign result"); |
| checkEffects(8); |
| System.out.println(b.si); |
| |
| if (b.si != 15) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(b.si); |
| |
| iBar(b).si = 0; |
| checkEffects(9); |
| iBar(b).si++; |
| checkEffects(10); |
| if (b.si != 1) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(b.si); |
| |
| b.si = 5; |
| if (iBar(b).si++ != 5) |
| AccessMethodsLHS.fail("post-increment result"); |
| checkEffects(11); |
| if (b.si != 6) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(b.si); |
| |
| b.si = 1; |
| --iBar(b).si; |
| checkEffects(12); |
| if (b.si != 0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| b.si = 5; |
| if (--iBar(b).si != 4) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| checkEffects(13); |
| if (b.si != 4) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(b.si); |
| |
| |
| // *** Non-static class, Non-static members *** |
| |
| c.m(arg); |
| |
| iBaz(c).m(arg); |
| checkEffects(102); |
| |
| // Integer (1 word) |
| |
| c.i = 5; |
| System.out.println(c.i); |
| if (c.i != 5) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(c.i); |
| |
| if ((c.i += 10) != 15) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(c.i); |
| |
| if (c.i != 15) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(c.i); |
| |
| c.s = "foo"; |
| if (!(c.s += "bar").equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign result"); |
| System.out.println(c.s); |
| |
| if (!c.s.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect"); |
| System.out.println(c.s); |
| |
| c.s = "foo"; |
| c.s += "bar"; |
| if (!c.s.equals("foobar")) |
| AccessMethodsLHS.fail("concat-assign effect (novalue)"); |
| System.out.println(c.s); |
| |
| c.i = 0; |
| c.i++; |
| if (c.i != 1) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(c.i); |
| |
| c.i = 5; |
| if (c.i++ != 5) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (c.i != 6) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(c.i); |
| |
| c.i = 1; |
| --c.i; |
| if (c.i != 0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| c.i = 5; |
| if (--c.i != 4) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (c.i != 4) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(c.i); |
| |
| // Double (2 word) |
| |
| c.d = 5.0; |
| System.out.println(c.d); |
| if (c.d != 5.0) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(c.d); |
| |
| if ((c.d += 10) != 15.0) |
| AccessMethodsLHS.fail("add-assign result"); |
| System.out.println(c.d); |
| |
| if (c.d != 15.0) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(c.d); |
| |
| c.d = 0.0; |
| c.d++; |
| if (c.d != 1.0) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(c.d); |
| |
| c.d = 5.0; |
| if (c.d++ != 5.0) |
| AccessMethodsLHS.fail("post-increment result"); |
| if (c.d != 6.0) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(c.d); |
| |
| c.d = 1.0; |
| --c.d; |
| if (c.d != 0.0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| c.d = 5.0; |
| if (--c.d != 4.0) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| if (c.d != 4.0) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(c.d); |
| |
| // Double (2 word) with side-effects in object reference |
| |
| iBaz(c).d = 5.0; |
| checkEffects(14); |
| System.out.println(c.d); |
| if (c.d != 5.0) |
| AccessMethodsLHS.fail("simple assignment"); |
| System.out.println(c.d); |
| |
| if ((iBaz(c).d += 10) != 15.0) |
| AccessMethodsLHS.fail("add-assign result"); |
| checkEffects(15); |
| System.out.println(c.d); |
| |
| if (c.d != 15.0) |
| AccessMethodsLHS.fail("add-assign effect"); |
| System.out.println(c.d); |
| |
| c.d = 0.0; |
| iBaz(c).d++; |
| checkEffects(16); |
| if (c.d != 1.0) |
| AccessMethodsLHS.fail("post-increment effect"); |
| System.out.println(c.d); |
| |
| c.d = 5.0; |
| if (iBaz(c).d++ != 5.0) |
| AccessMethodsLHS.fail("post-increment result"); |
| checkEffects(17); |
| if (c.d != 6.0) |
| AccessMethodsLHS.fail("post-increment effect (embedded)"); |
| System.out.println(c.d); |
| |
| c.d = 1.0; |
| --iBaz(c).d; |
| checkEffects(18); |
| if (c.d != 0.0) |
| AccessMethodsLHS.fail("pre-decrement effect"); |
| |
| c.d = 5.0; |
| if (--iBaz(c).d != 4.0) |
| AccessMethodsLHS.fail("pre-decrement result"); |
| checkEffects(19); |
| if (c.d != 4.0) |
| AccessMethodsLHS.fail("pre-decrement effect (embedded)"); |
| System.out.println(c.d); |
| |
| // All done. |
| |
| System.out.println("done"); |
| } |
| } |