3 #include "structmember.h"
6 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
8 /* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
11 all_name_chars(unsigned char *s
)
13 static char ok_name_char
[256];
14 static unsigned char *name_chars
= (unsigned char *)NAME_CHARS
;
16 if (ok_name_char
[*name_chars
] == 0) {
18 for (p
= name_chars
; *p
; p
++)
22 if (ok_name_char
[*s
++] == 0)
29 intern_strings(PyObject
*tuple
)
33 for (i
= PyTuple_GET_SIZE(tuple
); --i
>= 0; ) {
34 PyObject
*v
= PyTuple_GET_ITEM(tuple
, i
);
35 if (v
== NULL
|| !PyString_CheckExact(v
)) {
36 Py_FatalError("non-string found in code slot");
38 PyString_InternInPlace(&PyTuple_GET_ITEM(tuple
, i
));
44 PyCode_New(int argcount
, int nlocals
, int stacksize
, int flags
,
45 PyObject
*code
, PyObject
*consts
, PyObject
*names
,
46 PyObject
*varnames
, PyObject
*freevars
, PyObject
*cellvars
,
47 PyObject
*filename
, PyObject
*name
, int firstlineno
,
52 /* Check argument types */
53 if (argcount
< 0 || nlocals
< 0 ||
55 consts
== NULL
|| !PyTuple_Check(consts
) ||
56 names
== NULL
|| !PyTuple_Check(names
) ||
57 varnames
== NULL
|| !PyTuple_Check(varnames
) ||
58 freevars
== NULL
|| !PyTuple_Check(freevars
) ||
59 cellvars
== NULL
|| !PyTuple_Check(cellvars
) ||
60 name
== NULL
|| !PyString_Check(name
) ||
61 filename
== NULL
|| !PyString_Check(filename
) ||
62 lnotab
== NULL
|| !PyString_Check(lnotab
) ||
63 !PyObject_CheckReadBuffer(code
)) {
64 PyErr_BadInternalCall();
67 intern_strings(names
);
68 intern_strings(varnames
);
69 intern_strings(freevars
);
70 intern_strings(cellvars
);
71 /* Intern selected string constants */
72 for (i
= PyTuple_Size(consts
); --i
>= 0; ) {
73 PyObject
*v
= PyTuple_GetItem(consts
, i
);
74 if (!PyString_Check(v
))
76 if (!all_name_chars((unsigned char *)PyString_AS_STRING(v
)))
78 PyString_InternInPlace(&PyTuple_GET_ITEM(consts
, i
));
80 co
= PyObject_NEW(PyCodeObject
, &PyCode_Type
);
82 co
->co_argcount
= argcount
;
83 co
->co_nlocals
= nlocals
;
84 co
->co_stacksize
= stacksize
;
89 co
->co_consts
= consts
;
93 co
->co_varnames
= varnames
;
95 co
->co_freevars
= freevars
;
97 co
->co_cellvars
= cellvars
;
99 co
->co_filename
= filename
;
102 co
->co_firstlineno
= firstlineno
;
104 co
->co_lnotab
= lnotab
;
105 co
->co_zombieframe
= NULL
;
111 PyCode_NewEmpty(const char *filename
, const char *funcname
, int firstlineno
)
113 static PyObject
*emptystring
= NULL
;
114 static PyObject
*nulltuple
= NULL
;
115 PyObject
*filename_ob
= NULL
;
116 PyObject
*funcname_ob
= NULL
;
117 PyCodeObject
*result
= NULL
;
118 if (emptystring
== NULL
) {
119 emptystring
= PyString_FromString("");
120 if (emptystring
== NULL
)
123 if (nulltuple
== NULL
) {
124 nulltuple
= PyTuple_New(0);
125 if (nulltuple
== NULL
)
128 funcname_ob
= PyString_FromString(funcname
);
129 if (funcname_ob
== NULL
)
131 filename_ob
= PyString_FromString(filename
);
132 if (filename_ob
== NULL
)
135 result
= PyCode_New(0, /* argcount */
139 emptystring
, /* code */
140 nulltuple
, /* consts */
141 nulltuple
, /* names */
142 nulltuple
, /* varnames */
143 nulltuple
, /* freevars */
144 nulltuple
, /* cellvars */
145 filename_ob
, /* filename */
146 funcname_ob
, /* name */
147 firstlineno
, /* firstlineno */
148 emptystring
/* lnotab */
152 Py_XDECREF(funcname_ob
);
153 Py_XDECREF(filename_ob
);
157 #define OFF(x) offsetof(PyCodeObject, x)
159 static PyMemberDef code_memberlist
[] = {
160 {"co_argcount", T_INT
, OFF(co_argcount
), READONLY
},
161 {"co_nlocals", T_INT
, OFF(co_nlocals
), READONLY
},
162 {"co_stacksize",T_INT
, OFF(co_stacksize
), READONLY
},
163 {"co_flags", T_INT
, OFF(co_flags
), READONLY
},
164 {"co_code", T_OBJECT
, OFF(co_code
), READONLY
},
165 {"co_consts", T_OBJECT
, OFF(co_consts
), READONLY
},
166 {"co_names", T_OBJECT
, OFF(co_names
), READONLY
},
167 {"co_varnames", T_OBJECT
, OFF(co_varnames
), READONLY
},
168 {"co_freevars", T_OBJECT
, OFF(co_freevars
), READONLY
},
169 {"co_cellvars", T_OBJECT
, OFF(co_cellvars
), READONLY
},
170 {"co_filename", T_OBJECT
, OFF(co_filename
), READONLY
},
171 {"co_name", T_OBJECT
, OFF(co_name
), READONLY
},
172 {"co_firstlineno", T_INT
, OFF(co_firstlineno
), READONLY
},
173 {"co_lnotab", T_OBJECT
, OFF(co_lnotab
), READONLY
},
174 {NULL
} /* Sentinel */
177 /* Helper for code_new: return a shallow copy of a tuple that is
178 guaranteed to contain exact strings, by converting string subclasses
179 to exact strings and complaining if a non-string is found. */
181 validate_and_copy_tuple(PyObject
*tup
)
187 len
= PyTuple_GET_SIZE(tup
);
188 newtuple
= PyTuple_New(len
);
189 if (newtuple
== NULL
)
192 for (i
= 0; i
< len
; i
++) {
193 item
= PyTuple_GET_ITEM(tup
, i
);
194 if (PyString_CheckExact(item
)) {
197 else if (!PyString_Check(item
)) {
200 "name tuples must contain only "
201 "strings, not '%.500s'",
202 item
->ob_type
->tp_name
);
207 item
= PyString_FromStringAndSize(
208 PyString_AS_STRING(item
),
209 PyString_GET_SIZE(item
));
215 PyTuple_SET_ITEM(newtuple
, i
, item
);
221 PyDoc_STRVAR(code_doc
,
222 "code(argcount, nlocals, stacksize, flags, codestring, constants, names,\n\
223 varnames, filename, name, firstlineno, lnotab[, freevars[, cellvars]])\n\
225 Create a code object. Not for the faint of heart.");
228 code_new(PyTypeObject
*type
, PyObject
*args
, PyObject
*kw
)
237 PyObject
*names
, *ournames
= NULL
;
238 PyObject
*varnames
, *ourvarnames
= NULL
;
239 PyObject
*freevars
= NULL
, *ourfreevars
= NULL
;
240 PyObject
*cellvars
= NULL
, *ourcellvars
= NULL
;
246 if (!PyArg_ParseTuple(args
, "iiiiSO!O!O!SSiS|O!O!:code",
247 &argcount
, &nlocals
, &stacksize
, &flags
,
249 &PyTuple_Type
, &consts
,
250 &PyTuple_Type
, &names
,
251 &PyTuple_Type
, &varnames
,
253 &firstlineno
, &lnotab
,
254 &PyTuple_Type
, &freevars
,
255 &PyTuple_Type
, &cellvars
))
261 "code: argcount must not be negative");
268 "code: nlocals must not be negative");
272 ournames
= validate_and_copy_tuple(names
);
273 if (ournames
== NULL
)
275 ourvarnames
= validate_and_copy_tuple(varnames
);
276 if (ourvarnames
== NULL
)
279 ourfreevars
= validate_and_copy_tuple(freevars
);
281 ourfreevars
= PyTuple_New(0);
282 if (ourfreevars
== NULL
)
285 ourcellvars
= validate_and_copy_tuple(cellvars
);
287 ourcellvars
= PyTuple_New(0);
288 if (ourcellvars
== NULL
)
291 co
= (PyObject
*)PyCode_New(argcount
, nlocals
, stacksize
, flags
,
292 code
, consts
, ournames
, ourvarnames
,
293 ourfreevars
, ourcellvars
, filename
,
294 name
, firstlineno
, lnotab
);
296 Py_XDECREF(ournames
);
297 Py_XDECREF(ourvarnames
);
298 Py_XDECREF(ourfreevars
);
299 Py_XDECREF(ourcellvars
);
304 code_dealloc(PyCodeObject
*co
)
306 Py_XDECREF(co
->co_code
);
307 Py_XDECREF(co
->co_consts
);
308 Py_XDECREF(co
->co_names
);
309 Py_XDECREF(co
->co_varnames
);
310 Py_XDECREF(co
->co_freevars
);
311 Py_XDECREF(co
->co_cellvars
);
312 Py_XDECREF(co
->co_filename
);
313 Py_XDECREF(co
->co_name
);
314 Py_XDECREF(co
->co_lnotab
);
315 if (co
->co_zombieframe
!= NULL
)
316 PyObject_GC_Del(co
->co_zombieframe
);
321 code_repr(PyCodeObject
*co
)
325 char *filename
= "???";
328 if (co
->co_firstlineno
!= 0)
329 lineno
= co
->co_firstlineno
;
330 if (co
->co_filename
&& PyString_Check(co
->co_filename
))
331 filename
= PyString_AS_STRING(co
->co_filename
);
332 if (co
->co_name
&& PyString_Check(co
->co_name
))
333 name
= PyString_AS_STRING(co
->co_name
);
334 PyOS_snprintf(buf
, sizeof(buf
),
335 "<code object %.100s at %p, file \"%.300s\", line %d>",
336 name
, co
, filename
, lineno
);
337 return PyString_FromString(buf
);
341 code_compare(PyCodeObject
*co
, PyCodeObject
*cp
)
344 cmp
= PyObject_Compare(co
->co_name
, cp
->co_name
);
346 cmp
= co
->co_argcount
- cp
->co_argcount
;
347 if (cmp
) goto normalize
;
348 cmp
= co
->co_nlocals
- cp
->co_nlocals
;
349 if (cmp
) goto normalize
;
350 cmp
= co
->co_flags
- cp
->co_flags
;
351 if (cmp
) goto normalize
;
352 cmp
= co
->co_firstlineno
- cp
->co_firstlineno
;
353 if (cmp
) goto normalize
;
354 cmp
= PyObject_Compare(co
->co_code
, cp
->co_code
);
356 cmp
= PyObject_Compare(co
->co_consts
, cp
->co_consts
);
358 cmp
= PyObject_Compare(co
->co_names
, cp
->co_names
);
360 cmp
= PyObject_Compare(co
->co_varnames
, cp
->co_varnames
);
362 cmp
= PyObject_Compare(co
->co_freevars
, cp
->co_freevars
);
364 cmp
= PyObject_Compare(co
->co_cellvars
, cp
->co_cellvars
);
377 code_richcompare(PyObject
*self
, PyObject
*other
, int op
)
379 PyCodeObject
*co
, *cp
;
383 if ((op
!= Py_EQ
&& op
!= Py_NE
) ||
384 !PyCode_Check(self
) ||
385 !PyCode_Check(other
)) {
387 /* Py3K warning if types are not equal and comparison
389 if (PyErr_WarnPy3k("code inequality comparisons not supported "
394 Py_INCREF(Py_NotImplemented
);
395 return Py_NotImplemented
;
398 co
= (PyCodeObject
*)self
;
399 cp
= (PyCodeObject
*)other
;
401 eq
= PyObject_RichCompareBool(co
->co_name
, cp
->co_name
, Py_EQ
);
402 if (eq
<= 0) goto unequal
;
403 eq
= co
->co_argcount
== cp
->co_argcount
;
404 if (!eq
) goto unequal
;
405 eq
= co
->co_nlocals
== cp
->co_nlocals
;
406 if (!eq
) goto unequal
;
407 eq
= co
->co_flags
== cp
->co_flags
;
408 if (!eq
) goto unequal
;
409 eq
= co
->co_firstlineno
== cp
->co_firstlineno
;
410 if (!eq
) goto unequal
;
411 eq
= PyObject_RichCompareBool(co
->co_code
, cp
->co_code
, Py_EQ
);
412 if (eq
<= 0) goto unequal
;
413 eq
= PyObject_RichCompareBool(co
->co_consts
, cp
->co_consts
, Py_EQ
);
414 if (eq
<= 0) goto unequal
;
415 eq
= PyObject_RichCompareBool(co
->co_names
, cp
->co_names
, Py_EQ
);
416 if (eq
<= 0) goto unequal
;
417 eq
= PyObject_RichCompareBool(co
->co_varnames
, cp
->co_varnames
, Py_EQ
);
418 if (eq
<= 0) goto unequal
;
419 eq
= PyObject_RichCompareBool(co
->co_freevars
, cp
->co_freevars
, Py_EQ
);
420 if (eq
<= 0) goto unequal
;
421 eq
= PyObject_RichCompareBool(co
->co_cellvars
, cp
->co_cellvars
, Py_EQ
);
422 if (eq
<= 0) goto unequal
;
444 code_hash(PyCodeObject
*co
)
446 long h
, h0
, h1
, h2
, h3
, h4
, h5
, h6
;
447 h0
= PyObject_Hash(co
->co_name
);
448 if (h0
== -1) return -1;
449 h1
= PyObject_Hash(co
->co_code
);
450 if (h1
== -1) return -1;
451 h2
= PyObject_Hash(co
->co_consts
);
452 if (h2
== -1) return -1;
453 h3
= PyObject_Hash(co
->co_names
);
454 if (h3
== -1) return -1;
455 h4
= PyObject_Hash(co
->co_varnames
);
456 if (h4
== -1) return -1;
457 h5
= PyObject_Hash(co
->co_freevars
);
458 if (h5
== -1) return -1;
459 h6
= PyObject_Hash(co
->co_cellvars
);
460 if (h6
== -1) return -1;
461 h
= h0
^ h1
^ h2
^ h3
^ h4
^ h5
^ h6
^
462 co
->co_argcount
^ co
->co_nlocals
^ co
->co_flags
;
467 /* XXX code objects need to participate in GC? */
469 PyTypeObject PyCode_Type
= {
470 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
472 sizeof(PyCodeObject
),
474 (destructor
)code_dealloc
, /* tp_dealloc */
478 (cmpfunc
)code_compare
, /* tp_compare */
479 (reprfunc
)code_repr
, /* tp_repr */
480 0, /* tp_as_number */
481 0, /* tp_as_sequence */
482 0, /* tp_as_mapping */
483 (hashfunc
)code_hash
, /* tp_hash */
486 PyObject_GenericGetAttr
, /* tp_getattro */
488 0, /* tp_as_buffer */
489 Py_TPFLAGS_DEFAULT
, /* tp_flags */
490 code_doc
, /* tp_doc */
493 code_richcompare
, /* tp_richcompare */
494 0, /* tp_weaklistoffset */
498 code_memberlist
, /* tp_members */
502 0, /* tp_descr_get */
503 0, /* tp_descr_set */
504 0, /* tp_dictoffset */
507 code_new
, /* tp_new */
510 /* Use co_lnotab to compute the line number from a bytecode index, addrq. See
511 lnotab_notes.txt for the details of the lnotab representation.
515 PyCode_Addr2Line(PyCodeObject
*co
, int addrq
)
517 int size
= PyString_Size(co
->co_lnotab
) / 2;
518 unsigned char *p
= (unsigned char*)PyString_AsString(co
->co_lnotab
);
519 int line
= co
->co_firstlineno
;
521 while (--size
>= 0) {
530 /* Update *bounds to describe the first and one-past-the-last instructions in
531 the same line as lasti. Return the number of that line. */
533 _PyCode_CheckLineNumber(PyCodeObject
* co
, int lasti
, PyAddrPair
*bounds
)
535 int size
, addr
, line
;
538 p
= (unsigned char*)PyString_AS_STRING(co
->co_lnotab
);
539 size
= PyString_GET_SIZE(co
->co_lnotab
) / 2;
542 line
= co
->co_firstlineno
;
545 /* possible optimization: if f->f_lasti == instr_ub
546 (likely to be a common case) then we already know
547 instr_lb -- if we stored the matching value of p
548 somwhere we could skip the first while loop. */
550 /* See lnotab_notes.txt for the description of
551 co_lnotab. A point to remember: increments to p
552 come in (addr, line) pairs. */
554 bounds
->ap_lower
= 0;
556 if (addr
+ *p
> lasti
)
560 bounds
->ap_lower
= addr
;
566 while (--size
>= 0) {
571 bounds
->ap_upper
= addr
;
574 bounds
->ap_upper
= INT_MAX
;