From 0477bc6beecee28ae1c9b79278c9d221de95666f Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Sun, 20 Oct 2024 16:14:44 +0200 Subject: [PATCH] Simplify two fallback guards --- .../nodes/plugins/Float64ArrayPlugin.java | 16 ++++++++++++++-- .../nodes/plugins/FloatArrayPlugin.java | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/Float64ArrayPlugin.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/Float64ArrayPlugin.java index a5e793ec8..5850ea080 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/Float64ArrayPlugin.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/Float64ArrayPlugin.java @@ -22,11 +22,11 @@ import de.hpi.swa.trufflesqueak.model.NativeObject; import de.hpi.swa.trufflesqueak.model.NilObject; import de.hpi.swa.trufflesqueak.model.PointersObject; +import de.hpi.swa.trufflesqueak.nodes.SqueakGuards; import de.hpi.swa.trufflesqueak.nodes.accessing.AbstractPointersObjectNodes; import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveFactoryHolder; import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode; import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveFallbacks.BinaryPrimitiveFallback; -import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveFallbacks.TernaryPrimitiveFallback; import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveFallbacks.UnaryPrimitiveFallback; import de.hpi.swa.trufflesqueak.nodes.primitives.SqueakPrimitive; @@ -80,7 +80,7 @@ protected static final double doAt(final NativeObject receiver, final long index @GenerateNodeFactory @SqueakPrimitive(names = "primitiveAtPut") - public abstract static class PrimFloat64ArrayAtPutNode extends AbstractPrimitiveNode implements TernaryPrimitiveFallback { + public abstract static class PrimFloat64ArrayAtPutNode extends AbstractPrimitiveNode { @Specialization(guards = {"receiver.isLongType()", "index <= receiver.getLongLength()"}) protected static final double doDouble(final NativeObject receiver, final long index, final double value) { @@ -104,6 +104,18 @@ protected static final double doFraction(final NativeObject receiver, final long @Cached final AbstractPointersObjectNodes.AbstractPointersObjectReadNode readNode) { return doDouble(receiver, index, getContext(node).fromFraction(value, readNode, node)); } + + @SuppressWarnings("unused") + @Specialization(guards = "isFallback(node, receiver, index, value)") + protected static final Object doFail(final NativeObject receiver, final long index, final Object value, + @Bind("this") final Node node) { + throw PrimitiveFailed.GENERIC_ERROR; + } + + protected static final boolean isFallback(final Node node, final NativeObject receiver, final long index, final Object value) { + return !(receiver.isIntType() && index <= receiver.getIntLength() && (value instanceof Double || value instanceof FloatObject || value instanceof Long || + (value instanceof PointersObject pointersObject && SqueakGuards.isFraction(pointersObject, node)))); + } } @GenerateNodeFactory diff --git a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/FloatArrayPlugin.java b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/FloatArrayPlugin.java index c5b39c4f2..b10595019 100644 --- a/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/FloatArrayPlugin.java +++ b/src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/FloatArrayPlugin.java @@ -22,11 +22,11 @@ import de.hpi.swa.trufflesqueak.model.NativeObject; import de.hpi.swa.trufflesqueak.model.NilObject; import de.hpi.swa.trufflesqueak.model.PointersObject; +import de.hpi.swa.trufflesqueak.nodes.SqueakGuards; import de.hpi.swa.trufflesqueak.nodes.accessing.AbstractPointersObjectNodes; import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveFactoryHolder; import de.hpi.swa.trufflesqueak.nodes.primitives.AbstractPrimitiveNode; import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveFallbacks.BinaryPrimitiveFallback; -import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveFallbacks.TernaryPrimitiveFallback; import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveFallbacks.UnaryPrimitiveFallback; import de.hpi.swa.trufflesqueak.nodes.primitives.SqueakPrimitive; @@ -81,7 +81,7 @@ protected static final double doAt(final NativeObject receiver, final long index @GenerateNodeFactory @SqueakPrimitive(names = "primitiveAtPut") - public abstract static class PrimFloatArrayAtPutNode extends AbstractPrimitiveNode implements TernaryPrimitiveFallback { + public abstract static class PrimFloatArrayAtPutNode extends AbstractPrimitiveNode { @Specialization(guards = {"receiver.isIntType()", "index <= receiver.getIntLength()"}) protected static final double doDouble(final NativeObject receiver, final long index, final double value) { @@ -105,6 +105,18 @@ protected static final double doFraction(final NativeObject receiver, final long @Cached final AbstractPointersObjectNodes.AbstractPointersObjectReadNode readNode) { return doDouble(receiver, index, getContext(node).fromFraction(value, readNode, node)); } + + @SuppressWarnings("unused") + @Specialization(guards = "isFallback(node, receiver, index, value)") + protected static final Object doFail(final NativeObject receiver, final long index, final Object value, + @Bind("this") final Node node) { + throw PrimitiveFailed.GENERIC_ERROR; + } + + protected static final boolean isFallback(final Node node, final NativeObject receiver, final long index, final Object value) { + return !(receiver.isIntType() && index <= receiver.getIntLength() && (value instanceof Double || value instanceof FloatObject || value instanceof Long || + (value instanceof PointersObject pointersObject && SqueakGuards.isFraction(pointersObject, node)))); + } } @GenerateNodeFactory