From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Sat, 19 Nov 2022 19:46:44 +0100 Subject: [PATCH] Add /paper dumplisteners command diff --git a/src/main/java/co/aikar/timings/TimedEventExecutor.java b/src/main/java/co/aikar/timings/TimedEventExecutor.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/co/aikar/timings/TimedEventExecutor.java +++ b/src/main/java/co/aikar/timings/TimedEventExecutor.java @@ -0,0 +0,0 @@ public class TimedEventExecutor implements EventExecutor { executor.execute(listener, event); } } + + @Override + @NotNull + public String toString() { + return "TimedEventExecutor['" + this.executor.toString() + "']"; + } } diff --git a/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/MethodHandleEventExecutor.java @@ -0,0 +0,0 @@ public class MethodHandleEventExecutor implements EventExecutor { private final Class eventClass; private final MethodHandle handle; + private final @Nullable Method method; public MethodHandleEventExecutor(final Class eventClass, final MethodHandle handle) { this.eventClass = eventClass; this.handle = handle; + this.method = null; } public MethodHandleEventExecutor(final Class eventClass, final Method m) { @@ -0,0 +0,0 @@ public class MethodHandleEventExecutor implements EventExecutor { } catch (final IllegalAccessException e) { throw new AssertionError("Unable to set accessible", e); } + this.method = m; } @Override @@ -0,0 +0,0 @@ public class MethodHandleEventExecutor implements EventExecutor { SneakyThrow.sneaky(t); } } + + @Override + public String toString() { + return "MethodHandleEventExecutor['" + this.method + "']"; + } } diff --git a/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java b/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java +++ b/src/main/java/com/destroystokyo/paper/event/executor/StaticMethodHandleEventExecutor.java @@ -0,0 +0,0 @@ public class StaticMethodHandleEventExecutor implements EventExecutor { private final Class eventClass; private final MethodHandle handle; + private final Method method; public StaticMethodHandleEventExecutor(final Class eventClass, final Method m) { Preconditions.checkArgument(Modifier.isStatic(m.getModifiers()), "Not a static method: %s", m); @@ -0,0 +0,0 @@ public class StaticMethodHandleEventExecutor implements EventExecutor { } catch (final IllegalAccessException e) { throw new AssertionError("Unable to set accessible", e); } + this.method = m; } @Override @@ -0,0 +0,0 @@ public class StaticMethodHandleEventExecutor implements EventExecutor { SneakyThrow.sneaky(throwable); } } + + @Override + public String toString() { + return "StaticMethodHandleEventExecutor['" + this.method + "']"; + } } diff --git a/src/main/java/org/bukkit/event/HandlerList.java b/src/main/java/org/bukkit/event/HandlerList.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/event/HandlerList.java +++ b/src/main/java/org/bukkit/event/HandlerList.java @@ -0,0 +0,0 @@ public class HandlerList { */ private static ArrayList allLists = new ArrayList(); + // Paper start + /** + * Event types which have instantiated a {@link HandlerList}. + */ + private static final java.util.Set EVENT_TYPES = java.util.concurrent.ConcurrentHashMap.newKeySet(); + // Paper end + /** * Bake all handler lists. Best used just after all normal event * registration is complete, ie just after all plugins are loaded if @@ -0,0 +0,0 @@ public class HandlerList { * The HandlerList is then added to meta-list for use in bakeAll() */ public HandlerList() { + // Paper start + java.lang.StackWalker.getInstance(java.util.EnumSet.of(java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE), 4) + .walk(s -> s.filter(f -> Event.class.isAssignableFrom(f.getDeclaringClass())).findFirst()) + .map(f -> f.getDeclaringClass().getName()) + .ifPresent(EVENT_TYPES::add); + // Paper end handlerslots = new EnumMap>(EventPriority.class); for (EventPriority o : EventPriority.values()) { handlerslots.put(o, new ArrayList()); diff --git a/src/main/java/org/bukkit/plugin/EventExecutor.java b/src/main/java/org/bukkit/plugin/EventExecutor.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/plugin/EventExecutor.java +++ b/src/main/java/org/bukkit/plugin/EventExecutor.java @@ -0,0 +0,0 @@ public interface EventExecutor { try { EventExecutor asmExecutor = executorClass.newInstance(); // Define a wrapper to conform to bukkit stupidity (passing in events that don't match and wrapper exception) - return (listener, event) -> { - if (!eventClass.isInstance(event)) return; - asmExecutor.execute(listener, event); + return new EventExecutor() { + @Override + public void execute(@NotNull Listener listener, @NotNull Event event) throws EventException { + if (!eventClass.isInstance(event)) return; + asmExecutor.execute(listener, event); + } + + @Override + @NotNull + public String toString() { + return "ASMEventExecutor['" + m + "']"; + } }; } catch (InstantiationException | IllegalAccessException e) { throw new AssertionError("Unable to initialize generated event executor", e); diff --git a/src/main/java/org/bukkit/plugin/RegisteredListener.java b/src/main/java/org/bukkit/plugin/RegisteredListener.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/plugin/RegisteredListener.java +++ b/src/main/java/org/bukkit/plugin/RegisteredListener.java @@ -0,0 +0,0 @@ public class RegisteredListener { public boolean isIgnoringCancelled() { return ignoreCancelled; } + + // Paper start + /** + * Get the executor for this registration. + * + * @return executor + */ + @NotNull + public EventExecutor getExecutor() { + return this.executor; + } + + @Override + public String toString() { + return "RegisteredListener{" + + "plugin=\"" + this.plugin.getName() + + "\", listener=\"" + this.listener + + "\", executor=\"" + this.executor + + "\", priority=\"" + this.priority.name() + " (" + this.priority.getSlot() + ")" + + "\", ignoringCancelled=" + this.ignoreCancelled + + "}"; + } + // Paper end }