aboutsummaryrefslogtreecommitdiffstats
path: root/dcevm
diff options
context:
space:
mode:
authorIvan Dubrov <idubrov@guidewire.com>2014-05-01 19:10:33 -0700
committerIvan Dubrov <idubrov@guidewire.com>2014-05-01 19:10:33 -0700
commit366783cbb49c4b71b2a1805fc3d1552fe7498802 (patch)
tree7070e75939da75b8e8b151022f11db517fd5fa80 /dcevm
parent9797ba2f6e8b51b9ab7963f894169540269d7fbb (diff)
downloaddcevm-366783cbb49c4b71b2a1805fc3d1552fe7498802.tar.gz
dcevm-366783cbb49c4b71b2a1805fc3d1552fe7498802.zip
Fixing MH's in case of instance fields swapping
Same fix as for static fields, update offset directly in the DirectMethodHandle$Accessor.
Diffstat (limited to 'dcevm')
-rw-r--r--dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java113
-rw-r--r--dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java4
2 files changed, 115 insertions, 2 deletions
diff --git a/dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java b/dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java
new file mode 100644
index 00000000..48f3f46f
--- /dev/null
+++ b/dcevm/src/test/java7/com/github/dcevm/test/fields/InstanceFieldHandleTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2010, 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.
+ *
+ */
+package com.github.dcevm.test.fields;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+
+import static com.github.dcevm.test.util.HotSwapTestHelper.__toVersion__;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Test for replacing field with MethodHandle pointing to it.
+ *
+ * @author Ivan Dubrov
+ */
+public class InstanceFieldHandleTest {
+
+ // Version 0
+ public static class A {
+ public int fieldA;
+ public int fieldB;
+ }
+
+ // Version 1 (fields swapped and new one is added)
+ public static class A___1 {
+ public String fieldC;
+ public int fieldB;
+ public int fieldA;
+ }
+
+ // Version 2 (fields removed)
+ public static class A___2 {
+ }
+
+ // Version 3 (field type changed)
+ public static class A___3 {
+ public String fieldA;
+ public int fieldB;
+ }
+
+ @Before
+ @After
+ public void setUp() throws Exception {
+ __toVersion__(0);
+ }
+
+ @Test
+ public void testFieldChangeOrder() throws Throwable {
+ A a = new A();
+ MethodHandle handle = MethodHandles.publicLookup().findGetter(A.class, "fieldA", int.class);
+
+ a.fieldA = 3;
+ assertEquals(3, handle.invoke(a));
+
+ // Swap fields
+ __toVersion__(1);
+ assertEquals(3, handle.invoke(a));
+ }
+
+ @Test
+ @Ignore
+ public void testStaticFieldRemoved() throws Throwable {
+ MethodHandle handle = MethodHandles.publicLookup().findGetter(A.class, "fieldA", int.class);
+ A a = new A();
+ a.fieldA = 3;
+ assertEquals(3, handle.invoke(a));
+
+ // Remove fieldA
+ __toVersion__(2);
+
+ handle.invoke(a);
+ }
+
+ @Test
+ @Ignore
+ public void testStaticFieldTypeChange() throws Throwable {
+ MethodHandle handle = MethodHandles.publicLookup().findGetter(A.class, "fieldA", int.class);
+ A a = new A();
+ a.fieldA = 3;
+ assertEquals(3, handle.invoke(a));
+
+ // Remove fieldA
+ __toVersion__(3);
+
+ handle.invoke(a);
+ }
+} \ No newline at end of file
diff --git a/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java b/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java
index 7dee50d9..6f565252 100644
--- a/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java
+++ b/dcevm/src/test/java7/com/github/dcevm/test/fields/StaticFieldHandleTest.java
@@ -63,8 +63,8 @@ public class StaticFieldHandleTest {
// Version 3 (field type changed)
public static class A___3 {
- public String fieldA;
- public int fieldB;
+ public static String fieldA;
+ public static int fieldB;
}
@Before