From 93e5d8752b261ee275151b425a74bb7d59278731 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Sat, 28 Dec 2024 18:24:54 +0100 Subject: [PATCH] Create singleton primitives without reflection --- .../trufflesqueak/nodes/plugins/DSAPrims.java | 4 ++-- .../nodes/plugins/NullPlugin.java | 4 ++-- .../nodes/plugins/SecurityPlugin.java | 4 ++-- .../AbstractPrimitiveFactoryHolder.java | 2 +- .../AbstractSingletonPrimitiveNode.java | 23 ++----------------- .../primitives/PrimitiveNodeFactory.java | 14 +++++------ .../primitives/impl/ControlPrimitives.java | 22 +++++++++--------- .../impl/MiscellaneousPrimitives.java | 12 +++++----- .../primitives/impl/StoragePrimitives.java | 4 ++-- 9 files changed, 34 insertions(+), 55 deletions(-) diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/DSAPrims.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/DSAPrims.java index 4b992f640..9ef35da0c 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/DSAPrims.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/DSAPrims.java @@ -121,7 +121,7 @@ public List> getFactories } @Override - public List> getSingletonPrimitives() { - return List.of(PrimHasSecureHashPrimitiveNode.class); + public List getSingletonPrimitives() { + return List.of(new PrimHasSecureHashPrimitiveNode()); } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/NullPlugin.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/NullPlugin.java index 75d196c11..d89a8c4bc 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/NullPlugin.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/NullPlugin.java @@ -118,7 +118,7 @@ public List> getFactories } @Override - public List> getSingletonPrimitives() { - return List.of(PrimScreenScaleFactorNode.class, PrimHighResClockNode.class, PrimMultipleBytecodeSetsActive0Node.class, PrimUtcWithOffset1Node.class); + public List getSingletonPrimitives() { + return List.of(new PrimScreenScaleFactorNode(), new PrimHighResClockNode(), new PrimMultipleBytecodeSetsActive0Node(), new PrimUtcWithOffset1Node()); } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/SecurityPlugin.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/SecurityPlugin.java index b3c5b5af3..ccb46088b 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/SecurityPlugin.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/SecurityPlugin.java @@ -64,7 +64,7 @@ public List> getFactories } @Override - public List> getSingletonPrimitives() { - return List.of(PrimCanWriteImageNode.class, PrimGetUntrustedUserDirectoryNode.class); + public List getSingletonPrimitives() { + return List.of(new PrimCanWriteImageNode(), new PrimGetUntrustedUserDirectoryNode()); } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractPrimitiveFactoryHolder.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractPrimitiveFactoryHolder.java index d77e803d6..69320d87b 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractPrimitiveFactoryHolder.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractPrimitiveFactoryHolder.java @@ -14,7 +14,7 @@ public abstract class AbstractPrimitiveFactoryHolder { public abstract List> getFactories(); - public List> getSingletonPrimitives() { + public List getSingletonPrimitives() { return Collections.emptyList(); } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractSingletonPrimitiveNode.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractSingletonPrimitiveNode.java index 838191f74..d95279bc5 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractSingletonPrimitiveNode.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/AbstractSingletonPrimitiveNode.java @@ -6,25 +6,11 @@ */ package de.hpi.swa.trufflesqueak.nodes.primitives; -import java.lang.reflect.InvocationTargetException; - -import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.frame.VirtualFrame; import com.oracle.truffle.api.nodes.Node; import com.oracle.truffle.api.nodes.UnadoptableNode; public abstract class AbstractSingletonPrimitiveNode extends AbstractPrimitiveNode implements UnadoptableNode { - private AbstractSingletonPrimitiveNode instance; - - public static AbstractSingletonPrimitiveNode getInstance(final Class primitiveClass) { - try { - final AbstractSingletonPrimitiveNode node = primitiveClass.getDeclaredConstructor().newInstance(); - node.setInstance(node); - return node; - } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { - throw CompilerDirectives.shouldNotReachHere(e); - } - } @Override public final Object executeWithArguments(final VirtualFrame frame, final Object... receiverAndArguments) { @@ -35,16 +21,11 @@ public final Object executeWithArguments(final VirtualFrame frame, final Object. @Override public final Node copy() { - return instance; + return this; } @Override public final Node deepCopy() { - return instance; - } - - private void setInstance(final AbstractSingletonPrimitiveNode node) { - assert instance == null; - instance = node; + return this; } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/PrimitiveNodeFactory.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/PrimitiveNodeFactory.java index 14851e2a9..fe96fbfa5 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/PrimitiveNodeFactory.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/PrimitiveNodeFactory.java @@ -239,12 +239,11 @@ private static void fillPrimitiveTable(final AbstractPrimitiveFactoryHolder[] pr addEntryToPrimitiveTable(index, nodeFactory); } } - for (final Class primitiveClass : primitiveFactory.getSingletonPrimitives()) { - final SqueakPrimitive primitive = primitiveClass.getAnnotation(SqueakPrimitive.class); + for (final AbstractSingletonPrimitiveNode singletonPrimitiveNode : primitiveFactory.getSingletonPrimitives()) { + final SqueakPrimitive primitive = singletonPrimitiveNode.getClass().getAnnotation(SqueakPrimitive.class); for (final int index : primitive.indices()) { assert !SINGLETON_PRIMITIVE_TABLE.containsKey(index) && !PRIMITIVE_TABLE.containsKey(index); - final AbstractSingletonPrimitiveNode singleton = AbstractSingletonPrimitiveNode.newInstance(primitiveClass); - SINGLETON_PRIMITIVE_TABLE.put(index, singleton); + SINGLETON_PRIMITIVE_TABLE.put(index, singletonPrimitiveNode); } } } @@ -272,12 +271,11 @@ private static void fillPluginMap(final AbstractPrimitiveFactoryHolder[] plugins PLUGIN_MAP.put(pluginName, functionNameToNodeFactory); final EconomicMap functionNameToSingletonNode = EconomicMap.create(plugin.getSingletonPrimitives().size()); - for (final Class primitiveClass : plugin.getSingletonPrimitives()) { - final SqueakPrimitive primitive = primitiveClass.getAnnotation(SqueakPrimitive.class); + for (final AbstractSingletonPrimitiveNode singletonPrimitiveNode : plugin.getSingletonPrimitives()) { + final SqueakPrimitive primitive = singletonPrimitiveNode.getClass().getAnnotation(SqueakPrimitive.class); for (final String name : primitive.names()) { - final AbstractSingletonPrimitiveNode singleton = AbstractSingletonPrimitiveNode.newInstance(primitiveClass); assert !functionNameToSingletonNode.containsKey(name); - functionNameToSingletonNode.put(name, singleton); + functionNameToSingletonNode.put(name, singletonPrimitiveNode); } } SINGLETON_PLUGIN_MAP.put(pluginName, functionNameToSingletonNode); diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/ControlPrimitives.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/ControlPrimitives.java index 2e24a0d26..eb1563180 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/ControlPrimitives.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/ControlPrimitives.java @@ -1369,17 +1369,17 @@ public List> getFactories() { } @Override - public List> getSingletonPrimitives() { + public List getSingletonPrimitives() { return List.of( - PrimQuickReturnTrueNode.class, - PrimQuickReturnFalseNode.class, - PrimQuickReturnNilNode.class, - PrimQuickReturnMinusOneNode.class, - PrimQuickReturnZeroNode.class, - PrimQuickReturnOneNode.class, - PrimQuickReturnTwoNode.class, - PrimBytesLeftNode.class, - PrimFullGCNode.class, - PrimIncrementalGCNode.class); + new PrimQuickReturnTrueNode(), + new PrimQuickReturnFalseNode(), + new PrimQuickReturnNilNode(), + new PrimQuickReturnMinusOneNode(), + new PrimQuickReturnZeroNode(), + new PrimQuickReturnOneNode(), + new PrimQuickReturnTwoNode(), + new PrimBytesLeftNode(), + new PrimFullGCNode(), + new PrimIncrementalGCNode()); } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/MiscellaneousPrimitives.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/MiscellaneousPrimitives.java index 515432b32..263282cd4 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/MiscellaneousPrimitives.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/MiscellaneousPrimitives.java @@ -1108,12 +1108,12 @@ public List> getFactories() { } @Override - public List> getSingletonPrimitives() { + public List getSingletonPrimitives() { return List.of( - PrimSecondClockNode.class, - PrimVMPathNode.class, - PrimMaxIdentityHashNode.class, - PrimUTCClockNode.class, - PrimLocalMicrosecondsClockNode.class); + new PrimSecondClockNode(), + new PrimVMPathNode(), + new PrimMaxIdentityHashNode(), + new PrimUTCClockNode(), + new PrimLocalMicrosecondsClockNode()); } } diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/StoragePrimitives.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/StoragePrimitives.java index 3e7053d79..7868b2dc5 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/StoragePrimitives.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/primitives/impl/StoragePrimitives.java @@ -698,7 +698,7 @@ public List> getFactories() { } @Override - public List> getSingletonPrimitives() { - return List.of(PrimSpecialObjectsArrayNode.class, PrimSomeObjectNode.class); + public List getSingletonPrimitives() { + return List.of(new PrimSpecialObjectsArrayNode(), new PrimSomeObjectNode()); } }