You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
11 KiB

#
# Pyrex - Builtin Definitions
#
from Symtab import BuiltinScope
from TypeSlots import Signature
from PyrexTypes import py_type_type, c_size_t_type, c_py_ssize_t_type
builtin_constant_table = [
# name, type/ctype, C API name
("buffer", "t", "(&PyBuffer_Type)"),
("enumerate", "t", "(&PyEnum_Type)"),
("file", "t", "(&PyFile_Type)"),
("float", "t", "(&PyFloat_Type)"),
("int", "t", "(&PyInt_Type)"),
("long", "t", "(&PyLong_Type)"),
("open", "t", "(&PyFile_Type)"),
("property", "t", "(&PyProperty_Type)"),
("str", "t", "(&PyString_Type)"),
("tuple", "t", "(&PyTuple_Type)"),
("xrange", "t", "(&PyRange_Type)"),
("True", "O", "Py_True"),
("False", "O", "Py_False"),
("Ellipsis", "O", "Py_Ellipsis"),
("Exception", "t/O", "PyExc_Exception"),
("StopIteration", "t/O", "PyExc_StopIteration"),
("StandardError", "t/O", "PyExc_StandardError"),
("ArithmeticError", "t/O", "PyExc_ArithmeticError"),
("LookupError", "t/O", "PyExc_LookupError"),
("AssertionError", "t/O", "PyExc_AssertionError"),
("EOFError", "t/O", "PyExc_EOFError"),
("FloatingPointError", "t/O", "PyExc_FloatingPointError"),
("EnvironmentError", "t/O", "PyExc_EnvironmentError"),
("IOError", "t/O", "PyExc_IOError"),
("OSError", "t/O", "PyExc_OSError"),
("ImportError", "t/O", "PyExc_ImportError"),
("IndexError", "t/O", "PyExc_IndexError"),
("KeyError", "t/O", "PyExc_KeyError"),
("KeyboardInterrupt", "t/O", "PyExc_KeyboardInterrupt"),
("MemoryError", "t/O", "PyExc_MemoryError"),
("NameError", "t/O", "PyExc_NameError"),
("OverflowError", "t/O", "PyExc_OverflowError"),
("RuntimeError", "t/O", "PyExc_RuntimeError"),
("NotImplementedError", "t/O", "PyExc_NotImplementedError"),
("SyntaxError", "t/O", "PyExc_SyntaxError"),
("IndentationError", "t/O", "PyExc_IndentationError"),
("TabError", "t/O", "PyExc_TabError"),
("ReferenceError", "t/O", "PyExc_ReferenceError"),
("SystemError", "t/O", "PyExc_SystemError"),
("SystemExit", "t/O", "PyExc_SystemExit"),
("TypeError", "t/O", "PyExc_TypeError"),
("UnboundLocalError", "t/O", "PyExc_UnboundLocalError"),
("UnicodeError", "t/O", "PyExc_UnicodeError"),
("UnicodeEncodeError", "t/O", "PyExc_UnicodeEncodeError"),
("UnicodeDecodeError", "t/O", "PyExc_UnicodeDecodeError"),
("UnicodeTranslateError", "t/O", "PyExc_UnicodeTranslateError"),
("ValueError", "t/O", "PyExc_ValueError"),
("ZeroDivisionError", "t/O", "PyExc_ZeroDivisionError"),
# Not including these by default because they are platform-specific
#("WindowsError", "t/O", "PyExc_WindowsError"),
#("VMSError", "t/O", "PyExc_VMSError"),
("MemoryErrorInst", "t/O", "PyExc_MemoryErrorInst"),
("Warning", "t/O", "PyExc_Warning"),
("UserWarning", "t/O", "PyExc_UserWarning"),
("DeprecationWarning", "t/O", "PyExc_DeprecationWarning"),
("PendingDeprecationWarning", "t/O", "PyExc_PendingDeprecationWarning"),
("SyntaxWarning", "t/O", "PyExc_SyntaxWarning"),
("OverflowWarning", "t/O", "PyExc_OverflowWarning"),
("RuntimeWarning", "t/O", "PyExc_RuntimeWarning"),
("FutureWarning", "t/O", "PyExc_FutureWarning"),
]
builtin_function_table = [
# name, args, return, C API func, py equiv = "*"
('abs', "O", "O", "PyNumber_Absolute"),
('bool', "O", "i", "PyObject_IsTrue"),
#('chr', "", "", ""),
#('cmp', "", "", "", ""), # int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
#('compile', "", "", ""), # PyObject* Py_CompileString( char *str, char *filename, int start)
('delattr', "OO", "r", "PyObject_DelAttr"),
('dir', "O", "O", "PyObject_Dir"),
('divmod', "OO", "O", "PyNumber_Divmod"),
#('eval', "", "", ""),
#('execfile', "", "", ""),
#('filter', "", "", ""),
('getattr', "OO", "O", "PyObject_GetAttr"),
('getattr3', "OOO", "O", "__Pyx_GetAttr3", "getattr"),
('hasattr', "OO", "i", "PyObject_HasAttr"),
('hash', "O", "l", "PyObject_Hash"),
#('hex', "", "", ""),
#('id', "", "", ""),
#('input', "", "", ""),
('cintern', "s", "O", "PyString_InternFromString"), # different name because doesn't handle null bytes
('isinstance', "OO", "i", "PyObject_IsInstance"),
('issubclass', "OO", "i", "PyObject_IsSubclass"),
('iter', "O", "O", "PyObject_GetIter"),
('iter2', "OO", "O", "PyCallIter_New"),
('len', "O", "Z", "PyObject_Length"),
#('map', "", "", ""),
#('max', "", "", ""),
#('min', "", "", ""),
#('oct', "", "", ""),
# Not worth doing open, when second argument would become mandatory
#('open', "ss", "O", "PyFile_FromString"),
#('ord', "", "", ""),
('pow', "OOO", "O", "PyNumber_Power"),
#('range', "", "", ""),
#('raw_input', "", "", ""),
#('reduce', "", "", ""),
('reload', "O", "O", "PyImport_ReloadModule"),
('repr', "O", "O", "PyObject_Repr"),
#('round', "", "", ""),
('setattr', "OOO", "r", "PyObject_SetAttr"),
#('sum', "", "", ""),
#('unichr', "", "", ""),
#('unicode', "", "", ""),
#('vars', "", "", ""),
#('zip', "", "", ""),
('typecheck', "Ot", "b", "PyObject_TypeCheck", False),
('issubtype', "tt", "b", "PyType_IsSubtype", False),
]
dict_methods = [
# name, args, return, C API func
("clear", "O", "v", "PyDict_Clear"),
("copy", "O", "O", "PyDict_Copy"),
("items", "O", "O", "PyDict_Items"),
("keys", "O", "O", "PyDict_Keys"),
("values", "O", "O", "PyDict_Values"),
("merge", "OOi", "r", "PyDict_Merge"),
("update", "OO", "r", "PyDict_Update"),
("merge_pairs", "OOi", "r", "PyDict_MergeFromSeq2"),
]
list_methods = [
# name, args, return, C API func
("insert", "OiO", "r", "PyList_Insert"),
("append", "OO", "r", "PyList_Append"),
("iappend", "OO", "i", "PyList_Append"),
("sort", "O", "r", "PyList_Sort"),
("reverse", "O", "r", "PyList_Reverse"),
("as_tuple", "O", "O", "PyList_AsTuple"),
]
slice_methods = [
# name, args, return, C API func
("indices", "O", "O", "PySlice_Indices"),
]
slice_members = [
# name, type
("start", "O"),
("stop", "O"),
("step", "O"),
]
builtin_c_type_table = [
("size_t", c_size_t_type),
("Py_ssize_t", c_py_ssize_t_type),
]
builtin_type_table = [
# name, objstruct, typeobj, methods, members, flags
# bool - function
# buffer - constant
# classmethod
("dict", "PyDictObject", "PyDict_Type", dict_methods),
# enumerate - constant
# file - constant
# float - constant
# int - constant
("list", "PyListObject", "PyList_Type", list_methods, [], ['is_sequence']),
# long - constant
# object
# property - constant
("slice", "PySliceObject", "PySlice_Type", slice_methods, slice_members),
# staticmethod
# super
# str - constant
# tuple - constant
("type", "PyTypeObject", "PyType_Type", []),
# xrange - constant
]
getattr3_utility_code = ["""
static PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); /*proto*/
""","""
static PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) {
PyObject *r = PyObject_GetAttr(o, n);
if (!r) {
if (!PyErr_ExceptionMatches(PyExc_AttributeError))
goto bad;
PyErr_Clear();
r = d;
Py_INCREF(d);
}
return r;
bad:
return 0;
}
"""]
builtin_utility_code = {
'getattr3': getattr3_utility_code,
}
builtin_scope = BuiltinScope()
def type_and_ctype(typecode, c_typecode = None):
type = Signature.format_map[typecode]
if c_typecode:
ctype = Signature.format_map[c_typecode]
else:
ctype = None
return type, ctype
def declare_builtin_constant(name, typecode, cname):
type, ctype = type_and_ctype(*typecode.split("/"))
builtin_scope.declare_builtin_constant(name, type, cname, ctype)
def declare_builtin_func(name, args, ret, cname, py_equiv = "*"):
sig = Signature(args, ret)
type = sig.function_type()
utility = builtin_utility_code.get(name)
builtin_scope.declare_builtin_cfunction(name, type, cname, py_equiv, utility)
def declare_builtin_method(self_type, name, args, ret, cname):
sig = Signature(args, ret)
meth_type = sig.function_type(self_type)
self_type.scope.declare_builtin_method(name, meth_type, cname)
def declare_builtin_member(self_type, name, typecode, cname = None):
member_type = Signature.format_map[typecode]
self_type.scope.declare_builtin_var(name, member_type, cname)
def declare_builtin_c_type(name, type):
builtin_scope.declare_builtin_c_type(name, type)
def declare_builtin_type(name, objstruct, typeobj, methods, members = [],
flags = []):
entry = builtin_scope.declare_builtin_class(name, objstruct, typeobj)
type = entry.type
for desc in methods:
declare_builtin_method(type, *desc)
for desc in members:
declare_builtin_member(type, *desc)
for flag in flags:
setattr(type, flag, 1)
def init_builtin_constants():
for desc in builtin_constant_table:
declare_builtin_constant(*desc)
def init_builtin_funcs():
for desc in builtin_function_table:
declare_builtin_func(*desc)
def init_builtin_types():
for desc in builtin_c_type_table:
declare_builtin_c_type(*desc)
for desc in builtin_type_table:
declare_builtin_type(*desc)
py_type_type.define(builtin_scope.find_type("type"))
def init_builtins():
init_builtin_constants()
init_builtin_funcs()
init_builtin_types()
init_builtins()