Skip to content

Commit 1fef06e

Browse files
committed
Implement native fast path for ctx_Long_FromLong
1 parent ea08601 commit 1fef06e

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

graalpython/com.oracle.graal.python.jni/src/hpy_jni.c

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
#include "common/runtime/ctx_tracker.h"
6464

6565
static JNIEnv* jniEnv;
66-
static jobject contextInstance;
6766

6867
#define ALL_UPCALLS \
6968
UPCALL(New, SIG_HPY SIG_PTR, SIG_HPY) \
@@ -72,7 +71,8 @@ static jobject contextInstance;
7271
UPCALL(Close, SIG_HPY, SIG_VOID) \
7372
UPCALL(FloatFromDouble, SIG_DOUBLE, SIG_HPY) \
7473
UPCALL(FloatAsDouble, SIG_HPY, SIG_DOUBLE) \
75-
UPCALL(LongAsLong, SIG_LONG, SIG_HPY) \
74+
UPCALL(LongAsLong, SIG_HPY, SIG_LONG) \
75+
UPCALL(LongFromLong, SIG_LONG, SIG_HPY) \
7676
UPCALL(Dup, SIG_HPY, SIG_HPY) \
7777
UPCALL(GetItemi, SIG_HPY SIG_SIZE_T, SIG_HPY) \
7878
UPCALL(NumberCheck, SIG_HPY, SIG_INT) \
@@ -118,6 +118,10 @@ static long ctx_LongAsLong_jni(HPyContext ctx, HPy h) {
118118
return DO_UPCALL_LONG(CONTEXT_INSTANCE(ctx), LongAsLong, HPY_UP(h));
119119
}
120120

121+
static HPy ctx_LongFromLong_jni(HPyContext ctx, long l) {
122+
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), LongFromLong, l);
123+
}
124+
121125
static HPy ctx_New_jni(HPyContext ctx, HPy type, void** data) {
122126
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), New, HPY_UP(type), (SIZE_T_UP) data);
123127
}
@@ -216,6 +220,7 @@ static HPy (*original_Dup)(HPyContext ctx, HPy h);
216220
static HPy (*original_FloatFromDouble)(HPyContext ctx, double v);
217221
static double (*original_FloatAsDouble)(HPyContext ctx, HPy h);
218222
static long (*original_LongAsLong)(HPyContext ctx, HPy h);
223+
static HPy (*original_LongFromLong)(HPyContext ctx, long l);
219224
static int (*original_ListCheck)(HPyContext ctx, HPy h);
220225
static int (*original_NumberCheck)(HPyContext ctx, HPy h);
221226
static void (*original_Close)(HPyContext ctx, HPy h);
@@ -255,6 +260,15 @@ static long augment_LongAsLong(HPyContext ctx, HPy h) {
255260
}
256261
}
257262

263+
static HPy augment_LongFromLong(HPyContext ctx, long l) {
264+
int32_t i = (int32_t) l;
265+
if (l == i) {
266+
return toPtr(boxInt(i));
267+
} else {
268+
return original_LongFromLong(ctx, l);
269+
}
270+
}
271+
258272
static void augment_Close(HPyContext ctx, HPy h) {
259273
uint64_t bits = toBits(h);
260274
if (isBoxedHandle(bits)) {
@@ -302,6 +316,9 @@ void initDirectFastPaths(HPyContext context) {
302316
original_LongAsLong = context->ctx_Long_AsLong;
303317
context->ctx_Long_AsLong = augment_LongAsLong;
304318

319+
original_LongFromLong = context->ctx_Long_FromLong;
320+
context->ctx_Long_FromLong = augment_LongFromLong;
321+
305322
original_Close = context->ctx_Close;
306323
context->ctx_Close = augment_Close;
307324

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,6 +1287,7 @@ public enum Counter {
12871287
UpcallLength,
12881288
UpcallListCheck,
12891289
UpcallLongAsLong,
1290+
UpcallLongFromLong,
12901291
UpcallFloatAsDouble,
12911292
UpcallFloatFromDouble;
12921293

@@ -1357,6 +1358,15 @@ public final long ctxLongAsLong(long handle) {
13571358
}
13581359
}
13591360

1361+
public final long ctxLongFromLong(long l) {
1362+
Counter.UpcallLongFromLong.increment();
1363+
1364+
if (com.oracle.graal.python.builtins.objects.ints.PInt.isIntRange(l)) {
1365+
return GraalHPyBoxing.boxInt((int) l);
1366+
}
1367+
return createHandle(l).getId(this, ConditionProfile.getUncached());
1368+
}
1369+
13601370
public final long ctxCast(long handle) {
13611371
Counter.UpcallCast.increment();
13621372

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/resources/jni-config.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
{"name":"ctxLength","parameterTypes":["long"] },
1212
{"name":"ctxListCheck","parameterTypes":["long"] },
1313
{"name":"ctxLongAsLong","parameterTypes":["long"] },
14+
{"name":"ctxLongFromLong","parameterTypes":["long"] },
1415
{"name":"ctxNew","parameterTypes":["long","long"] },
1516
{"name":"ctxNumberCheck","parameterTypes":["long"] },
1617
{"name":"ctxTypeGenericNew","parameterTypes":["long"] }

0 commit comments

Comments
 (0)