From 4034dc565caa8e9869e277aaa3dcda528dc40905 Mon Sep 17 00:00:00 2001 From: Vaibhav kulkarni Date: Sat, 25 Jun 2016 10:52:14 +0530 Subject: [PATCH 1/8] added preInvokeSpecial, postInvokeSpecial constants This constants were present in ConstructorCopier class which implements Constants It makes more sence to keep all constant at same place --- .../src/main/java/org/springsource/loaded/Constants.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/springloaded/src/main/java/org/springsource/loaded/Constants.java b/springloaded/src/main/java/org/springsource/loaded/Constants.java index 24b6ca2..f7bca2e 100644 --- a/springloaded/src/main/java/org/springsource/loaded/Constants.java +++ b/springloaded/src/main/java/org/springsource/loaded/Constants.java @@ -30,6 +30,10 @@ import org.objectweb.asm.Opcodes; */ public interface Constants extends Opcodes { + public static final int preInvokeSpecial = 0; + + public static final int postInvokeSpecial = 1; + public static final Integer DEFAULT_INT = Integer.valueOf(0); public static final Byte DEFAULT_BYTE = Byte.valueOf((byte) 0); From 7efb2d9e2db04d94e87cc1ea7147fa4f7ab6e5af Mon Sep 17 00:00:00 2001 From: Vaibhav kulkarni Date: Sat, 25 Jun 2016 10:54:08 +0530 Subject: [PATCH 2/8] moved preInvokeSpecial and postInvokeSpecial constants to Constants interface Constants interface is used to keep all Constants it makes more sence to keep all Constants variables at same place. --- .../main/java/org/springsource/loaded/ConstructorCopier.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/springloaded/src/main/java/org/springsource/loaded/ConstructorCopier.java b/springloaded/src/main/java/org/springsource/loaded/ConstructorCopier.java index b8abf14..ab4c178 100644 --- a/springloaded/src/main/java/org/springsource/loaded/ConstructorCopier.java +++ b/springloaded/src/main/java/org/springsource/loaded/ConstructorCopier.java @@ -25,10 +25,6 @@ import org.objectweb.asm.MethodVisitor; */ class ConstructorCopier extends MethodVisitor implements Constants { - private final static int preInvokeSpecial = 0; - - private final static int postInvokeSpecial = 1; - // It is important to know when an INVOKESPECIAL is hit, whether it is our actual one that delegates to the super or just // one being invoked due to some early object construction prior to the real INVOKESPECIAL running. By tracking // how many unitialized objects there are (count the NEWs) and how many INVOKESPECIALs have occurred, it is possible From 0578b973392836cec54d9d0c71500c6f61d043b0 Mon Sep 17 00:00:00 2001 From: Sakalya Deshpande Date: Thu, 30 Jun 2016 18:03:39 +0530 Subject: [PATCH 3/8] Update ClassRenamer.java Removing the unnecessary Sysouts from commented code. --- .../src/main/java/org/springsource/loaded/ClassRenamer.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/springloaded/src/main/java/org/springsource/loaded/ClassRenamer.java b/springloaded/src/main/java/org/springsource/loaded/ClassRenamer.java index 1f71c12..7fa0245 100644 --- a/springloaded/src/main/java/org/springsource/loaded/ClassRenamer.java +++ b/springloaded/src/main/java/org/springsource/loaded/ClassRenamer.java @@ -206,7 +206,6 @@ public class ClassRenamer { @Override public void visitLdcInsn(Object obj) { - // System.out.println("Possibly remapping "+obj); if (obj instanceof Type) { Type t = (Type) obj; String s = t.getInternalName(); @@ -272,9 +271,6 @@ public class ClassRenamer { String owner = oldHandle.getOwner(); String name = oldHandle.getName(); String desc = oldHandle.getDesc(); - // System.out.println("handle: owner: "+owner); - // System.out.println("handle: name: "+name); - // System.out.println("handle: desc: "+desc); owner = renameRetargetIfNecessary(owner); desc = renameRetargetIfNecessary(desc); Handle newHandle = new Handle(tag, owner, name, desc); From 746732a9fc7e3fa9a3494236e1efa21b3d75cddc Mon Sep 17 00:00:00 2001 From: liuzhengyang Date: Sun, 29 Sep 2019 18:15:50 +0800 Subject: [PATCH 4/8] Fix Utils.isDoubleSlot, 'L' should be 'D'. --- .../src/main/java/org/springsource/loaded/Utils.java | 2 +- .../org/springsource/loaded/test/ReloadableTypeTests.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/springloaded/src/main/java/org/springsource/loaded/Utils.java b/springloaded/src/main/java/org/springsource/loaded/Utils.java index ca92e59..30c3bf3 100644 --- a/springloaded/src/main/java/org/springsource/loaded/Utils.java +++ b/springloaded/src/main/java/org/springsource/loaded/Utils.java @@ -1016,7 +1016,7 @@ public class Utils implements Opcodes, Constants { public boolean isDoubleSlot() { if (kind == Kind.PRIMITIVE) { char ch = descriptor.charAt(0); - return ch == 'J' || ch == 'L'; + return ch == 'J' || ch == 'D'; } return false; } diff --git a/springloaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java b/springloaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java index 4ad2538..7422ff2 100644 --- a/springloaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java +++ b/springloaded/src/test/java/org/springsource/loaded/test/ReloadableTypeTests.java @@ -564,6 +564,13 @@ public class ReloadableTypeTests extends SpringLoadedTests { assertFalse(rt.isDoubleSlot()); assertFalse(rt.isVoid()); + rt = ReturnType.getReturnType("D"); + assertEquals(ReturnType.Kind.PRIMITIVE, rt.kind); + assertEquals("D", rt.descriptor); + assertTrue(rt.isPrimitive()); + assertTrue(rt.isDoubleSlot()); + assertFalse(rt.isVoid()); + rt = ReturnType.getReturnType("[Ljava/lang/String;"); assertEquals(ReturnType.Kind.ARRAY, rt.kind); assertEquals("[Ljava/lang/String;", rt.descriptor); From 3efc0e553055aa25e09845588c6aef9d73eabaed Mon Sep 17 00:00:00 2001 From: David Estes Date: Wed, 1 Jul 2020 22:17:41 -0400 Subject: [PATCH 5/8] Fixes concurrency issue where a classload in a concurrent environment with a large number of classes can cause a loss of a TypeRegistry entry --- .../org/springsource/loaded/TypeRegistry.java | 18 ++++++++++++------ .../agent/FileSystemWatcherInterface.java | 18 ++++++++++++++++++ .../loaded/agent/MacOsFileSystemWatcher.java | 4 ++++ .../loaded/agent/PollingFileSystemWatcher.java | 4 ++++ ...java => PollingFileSystemWatcherTests.java} | 0 5 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java create mode 100644 springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java create mode 100644 springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java rename springloaded/src/test/java/org/springsource/loaded/test/{FileSystemWatcherTests.java => PollingFileSystemWatcherTests.java} (100%) diff --git a/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java b/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java index 83621ea..39eea2d 100644 --- a/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java +++ b/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java @@ -1125,10 +1125,13 @@ public class TypeRegistry { if (typeId >= reloadableTypes.length) { resizeReloadableTypeArray(typeId); } - reloadableTypes[typeId] = rtype; - if ((typeId + 1) > reloadableTypesSize) { - reloadableTypesSize = typeId + 1; + synchronized(this) { + reloadableTypes[typeId] = rtype; + if ((typeId + 1) > reloadableTypesSize) { + reloadableTypesSize = typeId + 1; + } } + // allocatedIds.put(slashname, rtype); // allocatedButNotYetRegisteredItds.remove(slashname); int cglibIndex = slashname.indexOf("$$EnhancerBy"); @@ -1196,10 +1199,13 @@ public class TypeRegistry { if (typeId >= reloadableTypes.length) { resizeReloadableTypeArray(typeId); } - reloadableTypes[typeId] = rtype; - if ((typeId + 1) > reloadableTypesSize) { - reloadableTypesSize = typeId + 1; + synchronized(this) { + reloadableTypes[typeId] = rtype; + if ((typeId + 1) > reloadableTypesSize) { + reloadableTypesSize = typeId + 1; + } } + } /** diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java b/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java new file mode 100644 index 0000000..225c729 --- /dev/null +++ b/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java @@ -0,0 +1,18 @@ +package org.springsource.loaded.agent; + +import java.io.File; + +public interface AbstractFileSystemWatcher { + /** + * Shutdown the thread. + */ + public void shutdown(); + + /** + * Add a new file to the list of those being monitored. If the file is something that can be watched, then this + * method will cause the thread to start (if it hasn't already been started). + * + * @param fileToMonitor the file to start monitor + */ + public void register(File fileToMonitor); +} diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java b/springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java new file mode 100644 index 0000000..476b38b --- /dev/null +++ b/springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java @@ -0,0 +1,4 @@ +package org.springsource.loaded.agent; + +public class MacOsFileSystemWatcher { +} diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java b/springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java new file mode 100644 index 0000000..f3e69fc --- /dev/null +++ b/springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java @@ -0,0 +1,4 @@ +package org.springsource.loaded.agent; + +public class PollingFileSystemWatcher { +} diff --git a/springloaded/src/test/java/org/springsource/loaded/test/FileSystemWatcherTests.java b/springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java similarity index 100% rename from springloaded/src/test/java/org/springsource/loaded/test/FileSystemWatcherTests.java rename to springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java From dc457700a15d1d6ade90747edee9c6aa7f76e23b Mon Sep 17 00:00:00 2001 From: David Estes Date: Wed, 1 Jul 2020 22:19:35 -0400 Subject: [PATCH 6/8] updated asm to 5.2 to fix bugs in 5.0.2 on some occasional loads. This could be updated to 8 in the future perhaps. baby steps --- springloaded/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/springloaded/build.gradle b/springloaded/build.gradle index a29a83a..ca47988 100644 --- a/springloaded/build.gradle +++ b/springloaded/build.gradle @@ -41,8 +41,8 @@ task wrapper(type: Wrapper) { dependencies { tools 'com.googlecode.jarjar:jarjar:1.3' - compile 'org.ow2.asm:asm:5.0.2' - compile 'org.ow2.asm:asm-tree:5.0.2' + compile 'org.ow2.asm:asm:5.2' + compile 'org.ow2.asm:asm-tree:5.2' testCompile 'junit:junit:4.11' From 489c5e259dc0f02a4dd5c16fb3102b5c271589e5 Mon Sep 17 00:00:00 2001 From: davydotcom Date: Thu, 27 Aug 2020 08:27:42 -0400 Subject: [PATCH 7/8] removing useless commented code --- .../src/main/java/org/springsource/loaded/ReloadableType.java | 1 - 1 file changed, 1 deletion(-) diff --git a/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java b/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java index e96c454..b7869a5 100644 --- a/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java +++ b/springloaded/src/main/java/org/springsource/loaded/ReloadableType.java @@ -450,7 +450,6 @@ public class ReloadableType { } catch(Exception e3) { //this better not blow up in my face } - // ReflectionUtils.clearCache(); typeRegistry.fireReloadEvent(this, versionsuffix); From e57bd40f757c3cce2c894d389228964436e5ea69 Mon Sep 17 00:00:00 2001 From: Bobby Warner Date: Fri, 28 Aug 2020 15:09:26 -0500 Subject: [PATCH 8/8] Fix class names to resolve build issue --- .../springsource/loaded/agent/FileSystemWatcherInterface.java | 2 +- .../springsource/loaded/test/PollingFileSystemWatcherTests.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java b/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java index 225c729..3859419 100644 --- a/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java +++ b/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java @@ -2,7 +2,7 @@ package org.springsource.loaded.agent; import java.io.File; -public interface AbstractFileSystemWatcher { +public interface FileSystemWatcherInterface { /** * Shutdown the thread. */ diff --git a/springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java b/springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java index e2f1ff7..d52db7c 100644 --- a/springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java +++ b/springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java @@ -35,7 +35,7 @@ import org.springsource.loaded.ReloadableType; import org.springsource.loaded.agent.FileSystemWatcher; -public class FileSystemWatcherTests { +public class PollingFileSystemWatcherTests { /** * Create a folder, watch it then put a couple of files in and check they are detected