Skip to content

Commit 6fab81b

Browse files
fangerertimfel
authored andcommitted
Implement C method flag combination 'METH_FASTCALL | METH_KEYWORDS'.
1 parent cc69e8f commit 6fab81b

File tree

3 files changed

+70
-31
lines changed

3 files changed

+70
-31
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.h

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -207,35 +207,39 @@ void* wrap_fastcall_with_keywords(_PyCFunctionFastWithKeywords fun, PyObject *
207207
void* wrap_unsupported(void *fun, ...);
208208

209209
#define TDEBUG __builtin_debugtrap()
210-
#define get_method_flags_wrapper(flags) \
211-
(((flags) < 0) ? \
212-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_DIRECT") : \
213-
(((flags) & METH_FASTCALL) ? \
214-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_FASTCALL") : \
215-
(((flags) & METH_KEYWORDS) ? \
216-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_KEYWORDS") : \
217-
(((flags) & METH_VARARGS) ? \
218-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_VARARGS") : \
219-
(((flags) & METH_NOARGS) ? \
220-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_NOARGS") : \
221-
(((flags) & METH_O) ? \
222-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_O") : \
223-
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_UNSUPPORTED")))))))
224-
225-
#define get_method_flags_cwrapper(flags) \
226-
(void*)((((flags) < 0) ? \
227-
wrap_direct : \
228-
(((flags) & METH_FASTCALL) ? \
229-
wrap_fastcall : \
230-
(((flags) & METH_KEYWORDS) ? \
231-
wrap_keywords : \
232-
(((flags) & METH_VARARGS) ? \
233-
wrap_varargs : \
234-
(((flags) & METH_NOARGS) ? \
235-
wrap_noargs : \
236-
(((flags) & METH_O) ? \
237-
wrap_direct : \
238-
wrap_unsupported)))))))
210+
#define get_method_flags_wrapper(flags) \
211+
(((flags) < 0) ? \
212+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_DIRECT") : \
213+
((((flags) & (METH_FASTCALL | METH_KEYWORDS)) == (METH_FASTCALL | METH_KEYWORDS)) ? \
214+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_FASTCALL_WITH_KEYWORDS") : \
215+
(((flags) & METH_FASTCALL) ? \
216+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_FASTCALL") : \
217+
(((flags) & METH_KEYWORDS) ? \
218+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_KEYWORDS") : \
219+
(((flags) & METH_VARARGS) ? \
220+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_VARARGS") : \
221+
(((flags) & METH_NOARGS) ? \
222+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_NOARGS") : \
223+
(((flags) & METH_O) ? \
224+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_O") : \
225+
polyglot_get_member(PY_TRUFFLE_CEXT, "METH_UNSUPPORTED"))))))))
226+
227+
#define get_method_flags_cwrapper(flags) \
228+
(void*)((((flags) < 0) ? \
229+
wrap_direct : \
230+
((((flags) & (METH_FASTCALL | METH_KEYWORDS)) == (METH_FASTCALL | METH_KEYWORDS)) ? \
231+
wrap_fastcall_with_keywords : \
232+
(((flags) & METH_FASTCALL) ? \
233+
wrap_fastcall : \
234+
(((flags) & METH_KEYWORDS) ? \
235+
wrap_keywords : \
236+
(((flags) & METH_VARARGS) ? \
237+
wrap_varargs : \
238+
(((flags) & METH_NOARGS) ? \
239+
wrap_noargs : \
240+
(((flags) & METH_O) ? \
241+
wrap_direct : \
242+
wrap_unsupported))))))))
239243

240244
#define PY_TRUFFLE_TYPE(__TYPE_NAME__, __SUPER_TYPE__, __FLAGS__, __SIZE__) {\
241245
PyVarObject_HEAD_INIT((__SUPER_TYPE__), 0)\

graalpython/com.oracle.graal.python.test/src/tests/test_re.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,6 @@ def test_ignore_case_set(self):
360360
# self.assertTrue(re.match(r'[19\ufb06]', '\ufb05', re.I))
361361

362362
def test_backreference(self):
363-
assert False
364363
compiled = re.compile(r"(.)\1")
365364
self.assertTrue(compiled.match("11"))
366365
self.assertTrue(compiled.match("22"))

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TruffleCextBuiltins.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1636,12 +1636,37 @@ public Signature getSignature() {
16361636
}
16371637

16381638
static class MethFastcallRoot extends MethodDescriptorRoot {
1639+
private static final Signature SIGNATURE = new Signature(false, 1, false, new String[]{"self"}, new String[0]);
1640+
1641+
@Child private ReadVarArgsNode readVarargsNode;
1642+
1643+
protected MethFastcallRoot(PythonLanguage language, PythonObjectFactory factory, CallTarget callTarget) {
1644+
super(language, factory, callTarget);
1645+
this.readVarargsNode = ReadVarArgsNode.create(1, true);
1646+
}
1647+
1648+
@Override
1649+
public Object execute(VirtualFrame frame) {
1650+
Object self = readSelfNode.execute(frame);
1651+
Object[] args = readVarargsNode.executeObjectArray(frame);
1652+
Object[] arguments = PArguments.create();
1653+
PArguments.setVariableArguments(arguments, self, factory.createTuple(args), args.length);
1654+
return directCallNode.call(arguments);
1655+
}
1656+
1657+
@Override
1658+
public Signature getSignature() {
1659+
return SIGNATURE;
1660+
}
1661+
}
1662+
1663+
static class MethFastcallWithKeywordsRoot extends MethodDescriptorRoot {
16391664
private static final Signature SIGNATURE = new Signature(true, 1, false, new String[]{"self"}, new String[0]);
16401665

16411666
@Child private ReadVarArgsNode readVarargsNode;
16421667
@Child private ReadVarKeywordsNode readKwargsNode;
16431668

1644-
protected MethFastcallRoot(PythonLanguage language, PythonObjectFactory factory, CallTarget callTarget) {
1669+
protected MethFastcallWithKeywordsRoot(PythonLanguage language, PythonObjectFactory factory, CallTarget callTarget) {
16451670
super(language, factory, callTarget);
16461671
this.readVarargsNode = ReadVarArgsNode.create(1, true);
16471672
this.readKwargsNode = ReadVarKeywordsNode.create(new String[0]);
@@ -1718,6 +1743,17 @@ Object call(PBuiltinFunction function) {
17181743
}
17191744
}
17201745

1746+
@Builtin(name = "METH_FASTCALL_WITH_KEYWORDS", minNumOfPositionalArgs = 1)
1747+
@GenerateNodeFactory
1748+
public abstract static class MethFastcallWithKeywordsNode extends PythonUnaryBuiltinNode {
1749+
@TruffleBoundary
1750+
@Specialization
1751+
Object call(PBuiltinFunction function) {
1752+
return factory().createBuiltinFunction(function.getName(), function.getEnclosingType(), 0,
1753+
Truffle.getRuntime().createCallTarget(new MethFastcallWithKeywordsRoot(getRootNode().getLanguage(PythonLanguage.class), factory(), function.getCallTarget())));
1754+
}
1755+
}
1756+
17211757
@Builtin(name = "PyTruffle_Bytes_EmptyWithCapacity", minNumOfPositionalArgs = 1)
17221758
@GenerateNodeFactory
17231759
abstract static class PyTruffle_Bytes_EmptyWithCapacity extends PythonUnaryBuiltinNode {

0 commit comments

Comments
 (0)