Skip to content

Commit 03330a3

Browse files
committed
Implement JNI upcall for ctx_GetAttr_s
1 parent 1110c94 commit 03330a3

File tree

3 files changed

+41
-11
lines changed

3 files changed

+41
-11
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ ALL_FIELDS
106106
UPCALL(Is, SIG_HPY SIG_HPY, SIG_INT) \
107107
UPCALL(IsG, SIG_HPY SIG_HPYGLOBAL, SIG_INT) \
108108
UPCALL(CapsuleNew, SIG_PTR SIG_PTR SIG_PTR, SIG_HPY) \
109-
UPCALL(CapsuleGet, SIG_HPY SIG_INT SIG_PTR, SIG_PTR)
109+
UPCALL(CapsuleGet, SIG_HPY SIG_INT SIG_PTR, SIG_PTR) \
110+
UPCALL(GetAttrs, SIG_HPY SIG_STRING, SIG_HPY)
110111

111112

112113
#define UPCALL(name, jniSigArgs, jniSigRet) static jmethodID jniMethod_ ## name;
@@ -374,6 +375,11 @@ static HPy ctx_GetItem_s_jni(HPyContext *ctx, HPy target, const char *name) {
374375
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), GetItems, target, jname);
375376
}
376377

378+
static HPy ctx_GetAttr_s_jni(HPyContext *ctx, HPy target, const char *name) {
379+
jstring jname = (*jniEnv)->NewStringUTF(jniEnv, name);
380+
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), GetAttrs, target, jname);
381+
}
382+
377383
static HPy ctx_Type_jni(HPyContext *ctx, HPy obj) {
378384
return DO_UPCALL_HPY(CONTEXT_INSTANCE(ctx), Type, HPY_UP(obj));
379385
}
@@ -888,6 +894,7 @@ JNIEXPORT jint JNICALL Java_com_oracle_graal_python_builtins_objects_cext_hpy_Gr
888894
context->ctx_Is_g = ctx_Is_g_jni;
889895
context->ctx_Capsule_New = ctx_Capsule_New_jni;
890896
context->ctx_Capsule_Get = ctx_Capsule_Get_jni;
897+
context->ctx_GetAttr_s = ctx_GetAttr_s_jni;
891898

892899
graal_hpy_context_get_native_context(context)->jni_context = (void *) (*env)->NewGlobalRef(env, ctx);
893900
assert(clazz != NULL);

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

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
import java.util.concurrent.atomic.AtomicReference;
8484
import java.util.logging.Level;
8585

86+
import com.oracle.graal.python.lib.PyObjectGetAttr;
8687
import org.graalvm.nativeimage.ImageInfo;
8788

8889
import com.oracle.graal.python.PythonLanguage;
@@ -1723,7 +1724,8 @@ public enum Counter {
17231724
UpcallGlobalStore,
17241725
UpcallType,
17251726
UpcallTypeGetName,
1726-
UpcallContextVarGet;
1727+
UpcallContextVarGet,
1728+
UpcallGetAttrS;
17271729

17281730
@CompilationFinal(dimensions = 1) private static final Counter[] VALUES = values();
17291731
}
@@ -1811,17 +1813,11 @@ public long ctxAsStruct(long handle) {
18111813

18121814
// Note: assumes that receiverHandle is not a boxed primitive value
18131815
@SuppressWarnings("try")
1814-
public final int ctxSetItems(long receiverHandle, String name, long valueHandle) {
1816+
public int ctxSetItems(long receiverHandle, String name, long valueHandle) {
18151817
increment(Counter.UpcallSetItemS);
18161818
Object receiver = getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(receiverHandle));
1817-
Object value;
1818-
if (GraalHPyBoxing.isBoxedHandle(valueHandle)) {
1819-
value = getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(valueHandle));
1820-
} else if (GraalHPyBoxing.isBoxedInt(valueHandle)) {
1821-
value = GraalHPyBoxing.unboxInt(valueHandle);
1822-
} else if (GraalHPyBoxing.isBoxedDouble(valueHandle)) {
1823-
value = GraalHPyBoxing.unboxDouble(valueHandle);
1824-
} else {
1819+
Object value = bitsAsPythonObject(valueHandle);
1820+
if (value == GraalHPyHandle.NULL_HANDLE_DELEGATE) {
18251821
HPyRaiseNode.raiseIntUncached(this, -1, SystemError, ErrorMessages.HPY_UNEXPECTED_HPY_NULL);
18261822
return -1;
18271823
}
@@ -2449,6 +2445,32 @@ public long ctxCapsuleGet(long capsuleBits, int key, long namePtr) {
24492445
}
24502446
}
24512447

2448+
public long ctxGetAttrs(long receiverHandle, String name) {
2449+
increment(Counter.UpcallGetAttrS);
2450+
Object receiver = bitsAsPythonObject(receiverHandle);
2451+
TruffleString tsName = toTruffleStringUncached(name);
2452+
Object result;
2453+
try {
2454+
result = PyObjectGetAttr.getUncached().execute(null, receiver, tsName);
2455+
} catch (PException e) {
2456+
HPyTransformExceptionToNativeNode.executeUncached(this, e);
2457+
return 0;
2458+
}
2459+
return GraalHPyBoxing.boxHandle(getHPyHandleForObject(result));
2460+
}
2461+
2462+
private Object bitsAsPythonObject(long bits) {
2463+
if (GraalHPyBoxing.isBoxedNullHandle(bits)) {
2464+
return GraalHPyHandle.NULL_HANDLE_DELEGATE;
2465+
} else if (GraalHPyBoxing.isBoxedInt(bits)) {
2466+
return GraalHPyBoxing.unboxInt(bits);
2467+
} else if (GraalHPyBoxing.isBoxedDouble(bits)) {
2468+
return GraalHPyBoxing.unboxDouble(bits);
2469+
}
2470+
assert GraalHPyBoxing.isBoxedHandle(bits);
2471+
return getObjectForHPyHandle(GraalHPyBoxing.unboxHandle(bits));
2472+
}
2473+
24522474
@ExportMessage
24532475
@SuppressWarnings("static-method")
24542476
boolean hasMembers() {

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
@@ -39,6 +39,7 @@
3939
{"name":"ctxIsG","parameterTypes":["long", "long"] },
4040
{"name":"ctxCapsuleNew","parameterTypes":["long", "long", "long"] },
4141
{"name":"ctxCapsuleGet","parameterTypes":["long", "int", "long"] },
42+
{"name":"ctxGetAttrs","parameterTypes":["long", "java.lang.String"] },
4243
{"name":"getHPyDebugContext","parameterTypes":[] }
4344
],
4445
"fields":[

0 commit comments

Comments
 (0)