diff -r c401c536cea1 -r a181612f0715 src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java --- a/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java Tue Oct 30 15:17:58 2018 -0700 +++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/Utils.java Wed Oct 31 02:10:21 2018 +0100 @@ -267,7 +267,7 @@ return (long) (nanos * JVM.getJVM().getTimeConversionFactor()); } - static synchronized EventHandler getHandler(Class eventClass) { + static synchronized EventHandler getHandler(Class eventClass) { Utils.ensureValidEventSubclass(eventClass); try { Field f = eventClass.getDeclaredField(EventInstrumentation.FIELD_EVENT_HANDLER); @@ -278,7 +278,7 @@ } } - static synchronized void setHandler(Class eventClass, EventHandler handler) { + static synchronized void setHandler(Class eventClass, EventHandler handler) { Utils.ensureValidEventSubclass(eventClass); try { Field field = eventClass.getDeclaredField(EventInstrumentation.FIELD_EVENT_HANDLER); @@ -322,7 +322,7 @@ static List getVisibleEventFields(Class clazz) { Utils.ensureValidEventSubclass(clazz); List fields = new ArrayList<>(); - for (Class c = clazz; c != Event.class; c = c.getSuperclass()) { + for (Class c = clazz; c != jdk.internal.event.Event.class; c = c.getSuperclass()) { for (Field field : c.getDeclaredFields()) { // skip private field in base classes if (c == clazz || !Modifier.isPrivate(field.getModifiers())) { @@ -334,10 +334,10 @@ } public static void ensureValidEventSubclass(Class eventClass) { - if (Event.class.isAssignableFrom(eventClass) && Modifier.isAbstract(eventClass.getModifiers())) { + if (jdk.internal.event.Event.class.isAssignableFrom(eventClass) && Modifier.isAbstract(eventClass.getModifiers())) { throw new IllegalArgumentException("Abstract event classes are not allowed"); } - if (eventClass == Event.class || !Event.class.isAssignableFrom(eventClass)) { + if (eventClass == Event.class || eventClass == jdk.internal.event.Event.class || !jdk.internal.event.Event.class.isAssignableFrom(eventClass)) { throw new IllegalArgumentException("Must be a subclass to " + Event.class.getName()); } } @@ -366,7 +366,7 @@ } } - public static void ensureInitialized(Class eventClass) { + public static void ensureInitialized(Class eventClass) { SecuritySupport.ensureClassIsInitialized(eventClass); } @@ -499,6 +499,50 @@ return eventName; } + public static void verifyMirror(Class mirror, Class real) { + Class cMirror = Objects.requireNonNull(mirror); + Class cReal = Objects.requireNonNull(real); + + while (cReal != null) { + Map mirrorFields = new HashMap<>(); + if (cMirror != null) { + for (Field f : cMirror.getDeclaredFields()) { + if (isSupportedType(f.getType())) { + mirrorFields.put(f.getName(), f); + } + } + } + for (Field realField : cReal.getDeclaredFields()) { + if (isSupportedType(realField.getType())) { + String fieldName = realField.getName(); + Field mirrorField = mirrorFields.get(fieldName); + if (mirrorField == null) { + throw new InternalError("Missing mirror field for " + cReal.getName() + "#" + fieldName); + } + if (realField.getModifiers() != mirrorField.getModifiers()) { + throw new InternalError("Incorrect modifier for mirror field "+ cMirror.getName() + "#" + fieldName); + } + mirrorFields.remove(fieldName); + } + } + if (!mirrorFields.isEmpty()) { + throw new InternalError( + "Found additional fields in mirror class " + cMirror.getName() + " " + mirrorFields.keySet()); + } + if (cMirror != null) { + cMirror = cMirror.getSuperclass(); + } + cReal = cReal.getSuperclass(); + } + } + + private static boolean isSupportedType(Class type) { + if (Modifier.isTransient(type.getModifiers()) || Modifier.isStatic(type.getModifiers())) { + return false; + } + return Type.isValidJavaFieldType(type.getName()); + } + public static String makeFilename(Recording recording) { String pid = JVM.getJVM().getPid(); String date = Repository.REPO_DATE_FORMAT.format(LocalDateTime.now());