Skip to content

Commit cf256a0

Browse files
committed
[GR-10941] code object support for co_??? attributes
PullRequest: graalpython/126
2 parents 12a3a15 + d1e5066 commit cf256a0

File tree

14 files changed

+548
-166
lines changed

14 files changed

+548
-166
lines changed

graalpython/com.oracle.graal.python.cext/src/codeobject.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@
4242

4343
PyTypeObject PyCode_Type = PY_TRUFFLE_TYPE("code", &PyType_Type, Py_TPFLAGS_DEFAULT, sizeof(PyTypeObject));
4444

45-
PyCodeObject* PyCode_New(int argcount, int kwonlyargcount, int nlocals,
46-
int stacksize, int flags, PyObject *code,
47-
PyObject *consts, PyObject *names, PyObject *varnames,
48-
PyObject *freevars, PyObject *cellvars,
45+
PyCodeObject* PyCode_New(int argcount, int kwonlyargcount,
46+
int nlocals, int stacksize, int flags,
47+
PyObject *code, PyObject *consts, PyObject *names,
48+
PyObject *varnames, PyObject *freevars, PyObject *cellvars,
4949
PyObject *filename, PyObject *name, int firstlineno,
5050
PyObject *lnotab) {
51-
return UPCALL_CEXT_O("PyCode_New", argcount, kwonlyargcount, nlocals,
52-
stacksize, flags, native_to_java(code),
53-
native_to_java(consts), native_to_java(names), native_to_java(varnames),
51+
return UPCALL_CEXT_O("PyCode_New", argcount, kwonlyargcount,
52+
nlocals, stacksize, flags,
53+
native_to_java(code), native_to_java(consts), native_to_java(names),
54+
native_to_java(varnames), native_to_java(freevars), native_to_java(cellvars),
5455
native_to_java(filename), native_to_java(name), firstlineno,
5556
native_to_java(lnotab));
5657
}

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_codeobject.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,12 @@
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
3939

40-
import sys
4140
import types
42-
from . import CPyExtTestCase, CPyExtFunction, CPyExtFunctionOutVars, unhandled_error_compare, GRAALPYTHON
41+
42+
import sys
43+
44+
from . import CPyExtTestCase, CPyExtFunction
45+
4346
__dir__ = __file__.rpartition("/")[0]
4447

4548

@@ -63,19 +66,23 @@ def compile_module(self, name):
6366
lambda args: args,
6467
lambda: (
6568
(
66-
1,2,3,4,0,b"",tuple(),tuple(),tuple(),
67-
tuple(),tuple(),"filename","name",1,b"",
69+
1, 2,
70+
3, 4, 0,
71+
b"", tuple(), tuple(),
72+
tuple(), tuple(), tuple(),
73+
"filename", "name", 1,
74+
b"",
6875
),
6976
),
7077
resultspec="O",
7178
argspec="iiiiiOOOOOOOOiO",
7279
arguments=[
73-
"int argcount", "int kwonlyargcount", "int nlocals",
74-
"int stacksize", "int flags", "PyObject* code",
75-
"PyObject* consts", "PyObject* names", "PyObject* varnames",
76-
"PyObject* freevars", "PyObject* cellvars",
80+
"int argcount", "int kwonlyargcount",
81+
"int nlocals", "int stacksize", "int flags",
82+
"PyObject* code", "PyObject* consts", "PyObject* names",
83+
"PyObject* varnames", "PyObject* freevars", "PyObject* cellvars",
7784
"PyObject* filename", "PyObject* name", "int firstlineno",
78-
"PyObject* lnotab"
85+
"PyObject* lnotab",
7986
],
80-
cmpfunc=lambda cr,pr: isinstance(cr, types.CodeType),
87+
cmpfunc=lambda cr, pr: isinstance(cr, types.CodeType),
8188
)

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

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,33 @@
3737
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
3838
# SOFTWARE.
3939

40+
4041
def a_function():
4142
pass
4243

4344

45+
def wrapper():
46+
values = []
47+
48+
def my_func(arg_l, kwarg_case="empty set", kwarg_other=19):
49+
loc_1 = set(values)
50+
loc_2 = set(values)
51+
loc_3 = "set()"
52+
53+
def inner_func():
54+
return kwarg_other + loc_2
55+
56+
try:
57+
loc_1 &= kwarg_other
58+
yield loc_1
59+
except TypeError:
60+
pass
61+
else:
62+
print("expected TypeError")
63+
64+
return my_func
65+
66+
4467
def test_name():
4568
assert a_function.__code__.co_name == "a_function"
4669

@@ -50,4 +73,25 @@ def test_filename():
5073

5174

5275
def test_firstlineno():
53-
assert a_function.__code__.co_firstlineno == 40
76+
assert a_function.__code__.co_firstlineno == 41
77+
78+
79+
def test_code_attributes():
80+
code = wrapper().__code__
81+
assert code.co_argcount == 3
82+
assert code.co_kwonlyargcount == 0
83+
assert code.co_nlocals == 6
84+
assert code.co_stacksize >= code.co_nlocals
85+
assert code.co_flags & (1 << 5)
86+
assert not code.co_flags & (1 << 2)
87+
assert not code.co_flags & (1 << 3)
88+
# assert code.co_code
89+
# assert code.co_consts
90+
# assert set(code.co_names) == {'set', 'TypeError', 'print'}
91+
assert set(code.co_varnames) == {'arg_l', 'kwarg_case', 'kwarg_other', 'loc_1', 'loc_3', 'inner_func'}
92+
assert code.co_filename.endswith("test_code.py")
93+
assert code.co_name == "my_func"
94+
assert code.co_firstlineno == 48
95+
# assert code.co_lnotab == b'\x00\x01\x0c\x01\x0c\x01\x06\x02\x15\x03\x03\x01\x0e\x01\r\x01\x05\x02'
96+
assert set(code.co_freevars) == {'values'}
97+
assert set(code.co_cellvars) == {'kwarg_other', 'loc_2'}

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

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,34 +1451,44 @@ Object call() {
14511451
@GenerateNodeFactory
14521452
public abstract static class CodeTypeNode extends PythonBuiltinNode {
14531453
@Specialization
1454-
Object call(PythonClass cls, int argcount, int kwonlyargcount, int nlocals, int stacksize,
1455-
int flags, String codestring, Object constants, Object names, Object varnames,
1456-
String filename, String name, int firstlineno, Object lnotab, Object freevars,
1457-
Object cellvars) {
1458-
return factory().createCode(cls, argcount, kwonlyargcount, nlocals, stacksize,
1459-
flags, codestring, constants, names, varnames,
1460-
filename, name, firstlineno, lnotab, freevars,
1461-
cellvars);
1454+
Object call(PythonClass cls, int argcount, int kwonlyargcount,
1455+
int nlocals, int stacksize, int flags,
1456+
String codestring, PTuple constants, PTuple names,
1457+
PTuple varnames, PTuple freevars, PTuple cellvars,
1458+
String filename, String name, int firstlineno,
1459+
String lnotab) {
1460+
return factory().createCode(cls, argcount, kwonlyargcount,
1461+
nlocals, stacksize, flags,
1462+
codestring, constants, names,
1463+
varnames.getArray(), freevars.getArray(), cellvars.getArray(),
1464+
filename, name, firstlineno,
1465+
lnotab);
14621466
}
14631467

14641468
@Specialization
14651469
@TruffleBoundary
1466-
Object call(PythonClass cls, int argcount, int kwonlyargcount, int nlocals, int stacksize,
1467-
int flags, PBytes codestring, Object constants, Object names, Object varnames,
1468-
PString filename, PString name, int firstlineno, Object lnotab, Object freevars,
1469-
Object cellvars) {
1470-
return factory().createCode(cls, argcount, kwonlyargcount, nlocals, stacksize,
1471-
flags, new String(codestring.getInternalByteArray()), constants, names, varnames,
1472-
filename.getValue(), name.getValue(), firstlineno, lnotab, freevars,
1473-
cellvars);
1470+
Object call(PythonClass cls, int argcount, int kwonlyargcount,
1471+
int nlocals, int stacksize, int flags,
1472+
PBytes codestring, PTuple constants, PTuple names,
1473+
PTuple varnames, PTuple freevars, PTuple cellvars,
1474+
PString filename, PString name, int firstlineno,
1475+
PBytes lnotab) {
1476+
return factory().createCode(cls, argcount, kwonlyargcount,
1477+
nlocals, stacksize, flags,
1478+
new String(codestring.getInternalByteArray()), constants, names,
1479+
varnames.getArray(), freevars.getArray(), cellvars.getArray(),
1480+
filename.getValue(), name.getValue(), firstlineno,
1481+
lnotab);
14741482
}
14751483

14761484
@SuppressWarnings("unused")
14771485
@Fallback
1478-
Object call(Object cls, Object argcount, Object kwonlyargcount, Object nlocals, Object stacksize,
1479-
Object flags, Object codestring, Object constants, Object names, Object varnames,
1480-
Object filename, Object name, Object firstlineno, Object lnotab, Object freevars,
1481-
Object cellvars) {
1486+
Object call(Object cls, Object argcount, Object kwonlyargcount,
1487+
Object nlocals, Object stacksize, Object flags,
1488+
Object codestring, Object constants, Object names,
1489+
Object varnames, Object freevars, Object cellvars,
1490+
Object filename, Object name, Object firstlineno,
1491+
Object lnotab) {
14821492
throw raise(PythonErrorType.NotImplementedError, "code object instance from generic arguments");
14831493
}
14841494
}

0 commit comments

Comments
 (0)