15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#   Builtin Definitions
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Symtab import BuiltinScope, StructOrUnionScope
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from Code import UtilityCode
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from TypeSlots import Signature
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import PyrexTypes
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)import Options
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# C-level implementations of builtin types, functions and methods
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)iter_next_utility_code = UtilityCode.load("IterNext", "ObjectHandling.c")
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)getattr_utility_code = UtilityCode.load("GetAttr", "ObjectHandling.c")
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)getattr3_utility_code = UtilityCode.load("GetAttr3", "Builtins.c")
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pyexec_utility_code = UtilityCode.load("PyExec", "Builtins.c")
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)pyexec_globals_utility_code = UtilityCode.load("PyExecGlobals", "Builtins.c")
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)globals_utility_code = UtilityCode.load("Globals", "Builtins.c")
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)py_set_utility_code = UtilityCode.load("pyset_compat", "Builtins.c")
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)builtin_utility_code = {
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'set'       : py_set_utility_code,
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'frozenset' : py_set_utility_code,
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# mapping from builtins to their C-level equivalents
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class _BuiltinOverride(object):
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def __init__(self, py_name, args, ret_type, cname, py_equiv="*",
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 utility_code=None, sig=None, func_type=None,
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 is_strict_signature=False, builtin_return_type=None):
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.py_name, self.cname, self.py_equiv = py_name, cname, py_equiv
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.args, self.ret_type = args, ret_type
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.func_type, self.sig = func_type, sig
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.builtin_return_type = builtin_return_type
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.is_strict_signature = is_strict_signature
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.utility_code = utility_code
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def build_func_type(self, sig=None, self_arg=None):
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if sig is None:
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            sig = Signature(self.args, self.ret_type)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            sig.exception_check = False  # not needed for the current builtins
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        func_type = sig.function_type(self_arg)
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if self.is_strict_signature:
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            func_type.is_strict_signature = True
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if self.builtin_return_type:
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            func_type.return_type = builtin_types[self.builtin_return_type]
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        return func_type
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class BuiltinAttribute(object):
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def __init__(self, py_name, cname=None, field_type=None, field_type_name=None):
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.py_name = py_name
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.cname = cname or py_name
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.field_type_name = field_type_name # can't do the lookup before the type is declared!
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self.field_type = field_type
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def declare_in_type(self, self_type):
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if self.field_type_name is not None:
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # lazy type lookup
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            field_type = builtin_scope.lookup(self.field_type_name).type
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        else:
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            field_type = self.field_type or PyrexTypes.py_object_type
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        entry = self_type.scope.declare(self.py_name, self.cname, field_type, None, 'private')
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        entry.is_variable = True
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class BuiltinFunction(_BuiltinOverride):
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def declare_in_scope(self, scope):
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        func_type, sig = self.func_type, self.sig
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if func_type is None:
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            func_type = self.build_func_type(sig)
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        scope.declare_builtin_cfunction(self.py_name, func_type, self.cname,
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        self.py_equiv, self.utility_code)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class BuiltinMethod(_BuiltinOverride):
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    def declare_in_type(self, self_type):
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        method_type, sig = self.func_type, self.sig
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if method_type is None:
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            # override 'self' type (first argument)
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self_arg = PyrexTypes.CFuncTypeArg("", self_type, None)
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self_arg.not_none = True
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self_arg.accept_builtin_subtypes = True
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            method_type = self.build_func_type(sig, self_arg)
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        self_type.scope.declare_builtin_cfunction(
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            self.py_name, method_type, self.cname, utility_code=self.utility_code)
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)builtin_function_table = [
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # name,        args,   return,  C API func,           py equiv = "*"
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('abs',        "d",    "d",     "fabs",
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    is_strict_signature = True),
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('abs',        "f",    "f",     "fabsf",
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    is_strict_signature = True),
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('abs',        None,    None,   "__Pyx_abs_int",
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = UtilityCode.load("abs_int", "Builtins.c"),
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    func_type = PyrexTypes.CFuncType(
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        PyrexTypes.c_uint_type, [
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            PyrexTypes.CFuncTypeArg("arg", PyrexTypes.c_int_type, None)
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            ],
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        is_strict_signature = True)),
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('abs',        None,    None,   "__Pyx_abs_long",
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = UtilityCode.load("abs_long", "Builtins.c"),
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    func_type = PyrexTypes.CFuncType(
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        PyrexTypes.c_ulong_type, [
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            PyrexTypes.CFuncTypeArg("arg", PyrexTypes.c_long_type, None)
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            ],
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        is_strict_signature = True)),
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('abs',        None,    None,   "__Pyx_abs_longlong",
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = UtilityCode.load("abs_longlong", "Builtins.c"),
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    func_type = PyrexTypes.CFuncType(
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        PyrexTypes.c_ulonglong_type, [
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            PyrexTypes.CFuncTypeArg("arg", PyrexTypes.c_longlong_type, None)
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        ],
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        is_strict_signature = True)),
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('abs',        "O",    "O",     "PyNumber_Absolute"),
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('callable',   "O",    "b",     "__Pyx_PyCallable_Check",
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = UtilityCode.load("CallableCheck", "ObjectHandling.c")),
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('chr',       "",     "",      ""),
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('cmp', "",   "",     "",      ""), # int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('compile',   "",     "",      ""), # PyObject* Py_CompileString(    char *str, char *filename, int start)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('delattr',    "OO",   "r",     "PyObject_DelAttr"),
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('dir',        "O",    "O",     "PyObject_Dir"),
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('divmod',     "OO",   "O",     "PyNumber_Divmod"),
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('exec',       "O",    "O",     "__Pyx_PyExecGlobals",
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = pyexec_globals_utility_code),
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('exec',       "OO",   "O",     "__Pyx_PyExec2",
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = pyexec_utility_code),
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('exec',       "OOO",  "O",     "__Pyx_PyExec3",
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = pyexec_utility_code),
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('eval',      "",     "",      ""),
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('execfile',  "",     "",      ""),
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('filter',    "",     "",      ""),
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('getattr3',   "OOO",  "O",     "__Pyx_GetAttr3",     "getattr",
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code=getattr3_utility_code),  # Pyrex legacy
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('getattr',    "OOO",  "O",     "__Pyx_GetAttr3",
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code=getattr3_utility_code),
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('getattr',    "OO",   "O",     "__Pyx_GetAttr",
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code=getattr_utility_code),
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('hasattr',    "OO",   "b",     "PyObject_HasAttr"),
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('hash',       "O",    "h",     "PyObject_Hash"),
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('hex',       "",     "",      ""),
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('id',        "",     "",      ""),
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('input',     "",     "",      ""),
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('intern',     "O",    "O",     "__Pyx_Intern",
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = UtilityCode.load("Intern", "Builtins.c")),
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('isinstance', "OO",   "b",     "PyObject_IsInstance"),
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('issubclass', "OO",   "b",     "PyObject_IsSubclass"),
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('iter',       "OO",   "O",     "PyCallIter_New"),
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('iter',       "O",    "O",     "PyObject_GetIter"),
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('len',        "O",    "z",     "PyObject_Length"),
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('locals',     "",     "O",     "__pyx_locals"),
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('map',       "",     "",      ""),
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('max',       "",     "",      ""),
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('min',       "",     "",      ""),
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('next',       "O",    "O",     "__Pyx_PyIter_Next",
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = iter_next_utility_code),   # not available in Py2 => implemented here
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('next',      "OO",    "O",     "__Pyx_PyIter_Next2",
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = iter_next_utility_code),  # not available in Py2 => implemented here
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('oct',       "",     "",      ""),
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('open',       "ss",   "O",     "PyFile_FromString"),   # not in Py3
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('ord',       "",     "",      ""),
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('pow',        "OOO",  "O",     "PyNumber_Power"),
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('pow',        "OO",   "O",     "__Pyx_PyNumber_Power2",
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    utility_code = UtilityCode.load("pow2", "Builtins.c")),
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('range',     "",     "",      ""),
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('raw_input', "",     "",      ""),
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('reduce',    "",     "",      ""),
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('reload',     "O",    "O",     "PyImport_ReloadModule"),
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('repr',       "O",    "O",     "PyObject_Repr", builtin_return_type='str'),
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('round',     "",     "",      ""),
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('setattr',    "OOO",  "r",     "PyObject_SetAttr"),
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('sum',       "",     "",      ""),
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('type',       "O",    "O",     "PyObject_Type"),
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('unichr',    "",     "",      ""),
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('unicode',   "",     "",      ""),
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('vars',      "",     "",      ""),
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('zip',       "",     "",      ""),
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #  Can't do these easily until we have builtin type entries.
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('typecheck',  "OO",   "i",     "PyObject_TypeCheck", False),
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #('issubtype',  "OO",   "i",     "PyType_IsSubtype",   False),
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # Put in namespace append optimization.
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    BuiltinFunction('__Pyx_PyObject_Append', "OO",  "O",     "__Pyx_PyObject_Append"),
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)]
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)if not Options.old_style_globals:
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    builtin_function_table.append(
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        BuiltinFunction('globals',    "",     "O",     "__Pyx_Globals",
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        utility_code=globals_utility_code))
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# Builtin types
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  bool
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  buffer
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  classmethod
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  dict
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  enumerate
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  file
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  float
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  int
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  list
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  long
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  object
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  property
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  slice
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  staticmethod
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  super
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  str
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  tuple
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  type
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#  xrange
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)builtin_types_table = [
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("type",    "PyType_Type",     []),
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# This conflicts with the C++ bool type, and unfortunately
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# C++ is too liberal about PyObject* <-> bool conversions,
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# resulting in unintuitive runtime behavior and segfaults.
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#    ("bool",    "PyBool_Type",     []),
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("int",     "PyInt_Type",      []),
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("long",    "PyLong_Type",     []),
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("float",   "PyFloat_Type",    []),
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("complex", "PyComplex_Type",  [BuiltinAttribute('cval', field_type_name = 'Py_complex'),
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinAttribute('real', 'cval.real', field_type = PyrexTypes.c_double_type),
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinAttribute('imag', 'cval.imag', field_type = PyrexTypes.c_double_type),
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("basestring", "PyBaseString_Type", [
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("join",  "TO",   "T", "__Pyx_PyBaseString_Join",
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("StringJoin", "StringTools.c")),
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("bytearray", "PyByteArray_Type", [
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("bytes",   "PyBytes_Type",    [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"),
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("join",  "TO",   "O", "__Pyx_PyBytes_Join",
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("StringJoin", "StringTools.c")),
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("str",     "PyString_Type",   [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"),
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("join",  "TO",   "O", "__Pyx_PyString_Join",
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  builtin_return_type='basestring',
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("StringJoin", "StringTools.c")),
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("unicode", "PyUnicode_Type",  [BuiltinMethod("__contains__",  "TO",   "b", "PyUnicode_Contains"),
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("join",  "TO",   "T", "PyUnicode_Join"),
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("tuple",   "PyTuple_Type",    [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"),
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("list",    "PyList_Type",     [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"),
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("insert",  "TzO",  "r", "PyList_Insert"),
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("reverse", "T",    "r", "PyList_Reverse"),
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("append",  "TO",   "r", "__Pyx_PyList_Append",
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("ListAppend", "Optimize.c")),
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("extend",  "TO",   "r", "__Pyx_PyList_Extend",
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("ListExtend", "Optimize.c")),
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("dict",    "PyDict_Type",     [BuiltinMethod("__contains__",  "TO",   "b", "PyDict_Contains"),
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("has_key",       "TO",   "b", "PyDict_Contains"),
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("items",  "T",   "O", "__Pyx_PyDict_Items",
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_items", "Builtins.c")),
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("keys",   "T",   "O", "__Pyx_PyDict_Keys",
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_keys", "Builtins.c")),
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("values", "T",   "O", "__Pyx_PyDict_Values",
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_values", "Builtins.c")),
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("iteritems",  "T",   "O", "__Pyx_PyDict_IterItems",
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_iteritems", "Builtins.c")),
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("iterkeys",   "T",   "O", "__Pyx_PyDict_IterKeys",
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_iterkeys", "Builtins.c")),
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("itervalues", "T",   "O", "__Pyx_PyDict_IterValues",
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_itervalues", "Builtins.c")),
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("viewitems",  "T",   "O", "__Pyx_PyDict_ViewItems",
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_viewitems", "Builtins.c")),
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("viewkeys",   "T",   "O", "__Pyx_PyDict_ViewKeys",
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_viewkeys", "Builtins.c")),
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("viewvalues", "T",   "O", "__Pyx_PyDict_ViewValues",
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_viewvalues", "Builtins.c")),
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("clear",  "T",   "r", "__Pyx_PyDict_Clear",
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code=UtilityCode.load("py_dict_clear", "Optimize.c")),
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("copy",   "T",   "T", "PyDict_Copy")]),
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("slice",   "PySlice_Type",    [BuiltinAttribute('start'),
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinAttribute('stop'),
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinAttribute('step'),
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    ]),
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#    ("file",    "PyFile_Type",     []),  # not in Py3
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("set",       "PySet_Type",    [BuiltinMethod("__contains__",  "TO",   "b", "PySequence_Contains"),
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("clear",   "T",  "r", "PySet_Clear",
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code = py_set_utility_code),
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    # discard() and remove() have a special treatment for unhashable values
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#                                    BuiltinMethod("discard", "TO", "r", "PySet_Discard",
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#                                                  utility_code = py_set_utility_code),
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("add",     "TO", "r", "PySet_Add",
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code = py_set_utility_code),
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    BuiltinMethod("pop",     "T",  "O", "PySet_Pop",
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                                  utility_code = py_set_utility_code)]),
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ("frozenset", "PyFrozenSet_Type", []),
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)]
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)types_that_construct_their_instance = set([
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # some builtin types do not always return an instance of
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # themselves - these do:
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'type', 'bool', 'long', 'float', 'complex',
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'bytes', 'unicode', 'bytearray',
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'tuple', 'list', 'dict', 'set', 'frozenset'
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # 'str',             # only in Py3.x
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    # 'file',            # only in Py2.x
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)])
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)builtin_structs_table = [
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ('Py_buffer', 'Py_buffer',
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     [("buf",        PyrexTypes.c_void_ptr_type),
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("obj",        PyrexTypes.py_object_type),
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("len",        PyrexTypes.c_py_ssize_t_type),
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("itemsize",   PyrexTypes.c_py_ssize_t_type),
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("readonly",   PyrexTypes.c_bint_type),
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("ndim",       PyrexTypes.c_int_type),
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("format",     PyrexTypes.c_char_ptr_type),
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("shape",      PyrexTypes.c_py_ssize_t_ptr_type),
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("strides",    PyrexTypes.c_py_ssize_t_ptr_type),
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("suboffsets", PyrexTypes.c_py_ssize_t_ptr_type),
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("smalltable", PyrexTypes.CArrayType(PyrexTypes.c_py_ssize_t_type, 2)),
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ("internal",   PyrexTypes.c_void_ptr_type),
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ]),
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ('Py_complex', 'Py_complex',
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)     [('real', PyrexTypes.c_double_type),
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ('imag', PyrexTypes.c_double_type),
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ])
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)]
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)# set up builtin scope
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)builtin_scope = BuiltinScope()
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def init_builtin_funcs():
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for bf in builtin_function_table:
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        bf.declare_in_scope(builtin_scope)
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)builtin_types = {}
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def init_builtin_types():
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    global builtin_types
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for name, cname, methods in builtin_types_table:
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        utility = builtin_utility_code.get(name)
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if name == 'frozenset':
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            objstruct_cname = 'PySetObject'
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        elif name == 'bool':
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            objstruct_cname = None
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        else:
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            objstruct_cname = 'Py%sObject' % name.capitalize()
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        the_type = builtin_scope.declare_builtin_type(name, cname, utility, objstruct_cname)
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        builtin_types[name] = the_type
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        for method in methods:
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            method.declare_in_type(the_type)
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def init_builtin_structs():
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for name, cname, attribute_types in builtin_structs_table:
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        scope = StructOrUnionScope(name)
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        for attribute_name, attribute_type in attribute_types:
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            scope.declare_var(attribute_name, attribute_type, None,
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              attribute_name, allow_pyobject=True)
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        builtin_scope.declare_struct_or_union(
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            name, "struct", scope, 1, None, cname = cname)
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def init_builtins():
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    init_builtin_structs()
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    init_builtin_types()
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    init_builtin_funcs()
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    builtin_scope.declare_var(
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '__debug__', PyrexTypes.c_const_type(PyrexTypes.c_bint_type),
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        pos=None, cname='(!Py_OptimizeFlag)', is_cdef=True)
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    global list_type, tuple_type, dict_type, set_type, frozenset_type
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    global bytes_type, str_type, unicode_type, basestring_type, slice_type
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    global float_type, bool_type, type_type, complex_type, bytearray_type
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    type_type  = builtin_scope.lookup('type').type
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    list_type  = builtin_scope.lookup('list').type
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tuple_type = builtin_scope.lookup('tuple').type
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    dict_type  = builtin_scope.lookup('dict').type
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    set_type   = builtin_scope.lookup('set').type
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    frozenset_type = builtin_scope.lookup('frozenset').type
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    slice_type   = builtin_scope.lookup('slice').type
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bytes_type = builtin_scope.lookup('bytes').type
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    str_type   = builtin_scope.lookup('str').type
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    unicode_type = builtin_scope.lookup('unicode').type
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    basestring_type = builtin_scope.lookup('basestring').type
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bytearray_type = builtin_scope.lookup('bytearray').type
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    float_type = builtin_scope.lookup('float').type
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool_type  = builtin_scope.lookup('bool').type
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    complex_type  = builtin_scope.lookup('complex').type
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)init_builtins()
405