Skip to content

Commit c3185e5

Browse files
committed
Do not unbox PInt/PFloat/PString if they have a pointer.
1 parent 5186d9f commit c3185e5

File tree

9 files changed

+46
-19
lines changed

9 files changed

+46
-19
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/CExtNodes.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -375,33 +375,40 @@ public static ToSulongNode create() {
375375
* allocated in native code for consumption in Java.
376376
*/
377377
public abstract static class AsPythonObjectNode extends CExtBaseNode {
378+
@Child private MaterializeDelegateNode materializeNode;
379+
378380
public abstract Object execute(Object value);
379381

380382
@Specialization
381383
boolean doBoolNativeWrapper(BoolNativeWrapper object) {
382384
return object.getValue();
383385
}
384386

385-
@Specialization(guards = "!isMaterialized(object)")
387+
@Specialization(guards = "!object.isNative()")
386388
byte doByteNativeWrapper(ByteNativeWrapper object) {
387389
return object.getValue();
388390
}
389391

390-
@Specialization(guards = "!isMaterialized(object)")
392+
@Specialization(guards = "!object.isNative()")
391393
int doIntNativeWrapper(IntNativeWrapper object) {
392394
return object.getValue();
393395
}
394396

395-
@Specialization(guards = "!isMaterialized(object)")
397+
@Specialization(guards = "!object.isNative()")
396398
long doLongNativeWrapper(LongNativeWrapper object) {
397399
return object.getValue();
398400
}
399401

400-
@Specialization(guards = "!isMaterialized(object)")
402+
@Specialization(guards = "!object.isNative()")
401403
double doDoubleNativeWrapper(DoubleNativeWrapper object) {
402404
return object.getValue();
403405
}
404406

407+
@Specialization(guards = "object.isNative()")
408+
Object doPrimitiveNativeWrapper(PrimitiveNativeWrapper object) {
409+
return getMaterializeNode().execute(object);
410+
}
411+
405412
@Specialization(guards = {"!isPrimitiveNativeWrapper(object)", "object.getClass() == cachedClass"}, limit = "3")
406413
Object doNativeWrapper(PythonNativeWrapper object,
407414
@SuppressWarnings("unused") @Cached("object.getClass()") Class<? extends PythonNativeWrapper> cachedClass) {
@@ -483,6 +490,14 @@ public static Object doSlowPath(Object object) {
483490
return object;
484491
}
485492

493+
private MaterializeDelegateNode getMaterializeNode() {
494+
if (materializeNode == null) {
495+
CompilerDirectives.transferToInterpreterAndInvalidate();
496+
materializeNode = insert(MaterializeDelegateNode.create());
497+
}
498+
return materializeNode;
499+
}
500+
486501
public static AsPythonObjectNode create() {
487502
return AsPythonObjectNodeGen.create();
488503
}
@@ -495,8 +510,6 @@ public abstract static class MaterializeDelegateNode extends CExtBaseNode {
495510

496511
public abstract Object execute(PythonNativeWrapper object);
497512

498-
@Child GetClassNode getClassNode;
499-
500513
@Specialization(guards = "!isMaterialized(object)")
501514
PInt doBoolNativeWrapper(BoolNativeWrapper object) {
502515
PInt materializedInt = factory().createInt(object.getValue());
@@ -537,6 +550,7 @@ PInt doLongNativeWrapper(LongNativeWrapper object) {
537550
PFloat doDoubleNativeWrapper(DoubleNativeWrapper object) {
538551
PFloat materializedInt = factory().createFloat(object.getValue());
539552
object.setMaterializedObject(materializedInt);
553+
materializedInt.setNativeWrapper(object);
540554
return materializedInt;
541555
}
542556

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ protected void doInt(IntSequenceStorage storage, int idx, int value) {
833833
storage.setIntItemNormalized(idx, value);
834834
}
835835

836-
@Specialization
836+
@Specialization(guards = "!value.isNative()")
837837
protected void doInt(IntSequenceStorage storage, int idx, PInt value) {
838838
try {
839839
storage.setIntItemNormalized(idx, value.intValueExact());
@@ -847,7 +847,7 @@ protected void doLong(LongSequenceStorage storage, int idx, long value) {
847847
storage.setLongItemNormalized(idx, value);
848848
}
849849

850-
@Specialization
850+
@Specialization(guards = "!value.isNative()")
851851
protected void doLong(LongSequenceStorage storage, int idx, PInt value) {
852852
try {
853853
storage.setLongItemNormalized(idx, value.longValueExact());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/PFloat.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ public String toString() {
5959
return Double.toString(value);
6060
}
6161

62+
public boolean isNative() {
63+
return getNativeWrapper() != null && getNativeWrapper().isNative();
64+
}
65+
6266
public static PFloat create(double value) {
6367
return create(null, value);
6468
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,8 @@ public static boolean isIntRange(long val) {
180180
return val == (int) val;
181181
}
182182

183+
public boolean isNative() {
184+
return getNativeWrapper() != null && getNativeWrapper().isNative();
185+
}
186+
183187
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/PString.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,8 @@ public int hashCode() {
7272
public boolean equals(Object obj) {
7373
return obj != null && obj.equals(value);
7474
}
75+
76+
public boolean isNative() {
77+
return getNativeWrapper() != null && getNativeWrapper().isNative();
78+
}
7579
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/frame/WriteLocalVariableNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public int write(VirtualFrame frame, int value) {
105105
return value;
106106
}
107107

108-
@Specialization(guards = {"isLongOrObjectKind(frame)", "isPrimitiveInt(value)"}, rewriteOn = ArithmeticException.class)
108+
@Specialization(guards = {"isLongOrObjectKind(frame)", "isPrimitiveInt(value)", "!value.isNative()"}, rewriteOn = ArithmeticException.class)
109109
public PInt writePIntAsLong(VirtualFrame frame, PInt value) {
110110
frame.getFrameDescriptor().setFrameSlotKind(frameSlot, FrameSlotKind.Long);
111111
frame.setLong(frameSlot, value.longValueExact());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/generator/WriteGeneratorFrameVariableNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public int write(VirtualFrame frame, int value) {
118118
return value;
119119
}
120120

121-
@Specialization(guards = {"isLongOrObjectKind(frame)", "isPrimitiveInt(value)"}, rewriteOn = ArithmeticException.class)
121+
@Specialization(guards = {"isLongOrObjectKind(frame)", "isPrimitiveInt(value)", "!value.isNative()"}, rewriteOn = ArithmeticException.class)
122122
public PInt writePIntAsLong(VirtualFrame frame, PInt value) {
123123
Frame generatorFrame = getGeneratorFrame(frame);
124124
generatorFrame.getFrameDescriptor().setFrameSlotKind(frameSlot, FrameSlotKind.Long);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/PTypeToForeignNode.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,18 @@ Object access(Object object) {
5656

5757
public static boolean isBoxed(Object object) {
5858
if (object instanceof PFloat) {
59-
return true;
59+
return !((PFloat) object).isNative();
6060
} else if (object instanceof PInt) {
6161
try {
6262
// try to use primitive
63-
((PInt) object).longValueExact();
64-
return true;
63+
PInt boxed = (PInt) object;
64+
boxed.longValueExact();
65+
return !boxed.isNative();
6566
} catch (ArithmeticException e) {
6667
return false;
6768
}
6869
} else if (object instanceof PString) {
69-
return true;
70+
return !((PString) object).isNative();
7071
}
7172
return false;
7273
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/interop/PTypeUnboxNode.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,27 @@ public static PTypeUnboxNode create() {
5454

5555
public abstract Object execute(Object value);
5656

57-
@Specialization
57+
@Specialization(guards = "!obj.isNative()")
5858
String access(PString obj) {
5959
return obj.getValue();
6060
}
6161

62-
@Specialization
62+
@Specialization(guards = "!obj.isNative()")
6363
double access(PFloat obj) {
6464
return obj.getValue();
6565
}
6666

67-
@Specialization(rewriteOn = ArithmeticException.class)
67+
@Specialization(guards = "!obj.isNative()", rewriteOn = ArithmeticException.class)
6868
int accessInt(PInt obj) {
6969
return obj.intValueExact();
7070
}
7171

72-
@Specialization(rewriteOn = ArithmeticException.class)
72+
@Specialization(guards = "!obj.isNative()", rewriteOn = ArithmeticException.class)
7373
long accessLong(PInt obj) {
7474
return obj.longValueExact();
7575
}
7676

77-
@Specialization
77+
@Specialization(guards = "!obj.isNative()")
7878
Object accessPInt(PInt obj) {
7979
try {
8080
// try to use primitive

0 commit comments

Comments
 (0)