Ticket #2655: trac_2655_cython_9612.2.patch
| File trac_2655_cython_9612.2.patch, 22.5 KB (added by gfurnish, 2 years ago) |
|---|
-
Compiler/Code.py
# HG changeset patch # User Gary Furnish <gfurnish@gfurnish.net> # Date 1206288126 21600 # Node ID 9611bac649351947262a8c6075d88bddbbb81735 # Parent eb2d12f543448f7aa24c449cd4053f92228c811e Circular cdef's diff -r eb2d12f54344 -r 9611bac64935 Compiler/Code.py
a b 326 326 def error_goto(self, pos): 327 327 lbl = self.error_label 328 328 self.use_label(lbl) 329 return "{%s = %s[%s]; %s = %s; goto %s;}" % (329 return "{%s = %s[%s]; %s = %s; %s = %s; goto %s;}" % ( 330 330 Naming.filename_cname, 331 331 Naming.filetable_cname, 332 332 self.lookup_filename(pos[0]), 333 333 Naming.lineno_cname, 334 334 pos[1], 335 Naming.clineno_cname, 336 Naming.line_c_macro, 335 337 lbl) 336 338 337 339 def error_goto_if(self, cond, pos): -
Compiler/Main.py
diff -r eb2d12f54344 -r 9611bac64935 Compiler/Main.py
a b 306 306 #------------------------------------------------------------------------ 307 307 308 308 def main(command_line = 0): 309 309 310 args = sys.argv[1:] 310 311 any_failures = 0 311 312 if command_line: -
Compiler/ModuleNode.py
diff -r eb2d12f54344 -r 9611bac64935 Compiler/ModuleNode.py
a b 18 18 from Errors import error 19 19 from PyrexTypes import py_object_type 20 20 from Cython.Utils import open_new_file, replace_suffix 21 22 23 def recurse_vtab_check_inheritance(entry,b, dict): 24 base = entry 25 while base is not None: 26 if base.type.base_type is None or base.type.base_type.vtabstruct_cname is None: 27 return False 28 if base.type.base_type.vtabstruct_cname == b.type.vtabstruct_cname: 29 return True 30 base = dict[base.type.base_type.vtabstruct_cname] 31 return False 32 33 def recurse_vtabslot_check_inheritance(entry,b, dict): 34 base = entry 35 while base is not None: 36 if base.type.base_type is None: 37 return False 38 if base.type.base_type.objstruct_cname == b.type.objstruct_cname: 39 return True 40 base = dict[base.type.base_type.objstruct_cname] 41 return False 42 43 21 44 22 45 class ModuleNode(Nodes.Node, Nodes.BlockNode): 23 46 # doc string or None … … 224 247 self.generate_method_table(env, code) 225 248 self.generate_filename_init_prototype(code) 226 249 self.generate_module_init_func(modules[:-1], env, code) 250 self.generate_module_init2_func(modules[:-1], env, code) 227 251 code.mark_pos(None) 228 252 self.generate_module_cleanup_func(env, code) 229 253 self.generate_filename_table(code) 230 254 self.generate_utility_functions(env, code) 231 255 232 for module in modules: 233 self.generate_declarations_for_module(module, code.h, 234 definition = module is env) 256 self.generate_declarations_for_module(env, modules, code.h) 235 257 236 258 f = open_new_file(result.c_file) 237 259 f.write(code.h.f.getvalue()) … … 242 264 if Options.annotate: 243 265 self.annotate(code) 244 266 code.save_annotation(result.c_file[:-1] + "pyx") # change? 267 268 269 245 270 246 271 def find_referenced_modules(self, env, module_list, modules_seen): 247 272 if env not in modules_seen: … … 290 315 if Options.pre_import is not None: 291 316 code.putln('static PyObject *%s;' % Naming.preimport_cname) 292 317 code.putln('static int %s;' % Naming.lineno_cname) 318 code.putln('static int %s;' % Naming.clineno_cname) 319 code.putln('static char * %s= %s;' % (Naming.cfilenm_cname, Naming.file_c_macro)) 293 320 code.putln('static char *%s;' % Naming.filename_cname) 294 321 code.putln('static char **%s;' % Naming.filetable_cname) 295 322 if env.doc: … … 327 354 code.putln("0") 328 355 code.putln("};") 329 356 330 def generate_declarations_for_module(self, env, code, definition): 357 def generate_vtab_dict(self, module_list): 358 vtab_dict = {} 359 for module in module_list: 360 for entry in module.c_class_entries: 361 if not entry.in_cinclude: 362 type = entry.type 363 scope = type.scope 364 if type.vtabstruct_cname: 365 vtab_dict[type.vtabstruct_cname]=entry 366 return vtab_dict 367 def generate_vtab_list(self, vtab_dict): 368 vtab_list = list() 369 for entry in vtab_dict.itervalues(): 370 vtab_list.append(entry) 371 for i in range(0,len(vtab_list)): 372 for j in range(0,len(vtab_list)): 373 if(recurse_vtab_check_inheritance(vtab_list[j],vtab_list[i], vtab_dict)==1): 374 if i > j: 375 vtab_list.insert(j,vtab_list[i]) 376 if i > j: 377 vtab_list.pop(i+1) 378 else: 379 vtab_list.pop(i) 380 #for entry in vtab_list: 381 #print entry.type.vtabstruct_cname 382 return vtab_list 383 384 def generate_vtabslot_dict(self, module_list, env): 385 vtab_dict={} 386 type_entries=[] 387 for module in module_list: 388 definition = module is env 389 if definition: 390 type_entries.extend( env.type_entries) 391 else: 392 for entry in module.type_entries: 393 if entry.defined_in_pxd: 394 type_entries.append(entry) 395 for entry in type_entries: 396 type = entry.type 397 if type.is_extension_type: 398 if not entry.in_cinclude: 399 type = entry.type 400 scope = type.scope 401 vtab_dict[type.objstruct_cname]=entry 402 return vtab_dict 403 def generate_vtabslot_list(self, vtab_dict): 404 vtab_list = list() 405 for entry in vtab_dict.itervalues(): 406 vtab_list.append(entry) 407 for i in range(0,len(vtab_list)): 408 for j in range(0,len(vtab_list)): 409 if(recurse_vtabslot_check_inheritance(vtab_list[j],vtab_list[i], vtab_dict)==1): 410 if i > j: 411 vtab_list.insert(j,vtab_list[i]) 412 if i > j: 413 vtab_list.pop(i+1) 414 else: 415 vtab_list.pop(i) 416 #for entry in vtab_list: 417 #print entry.type.vtabstruct_cname 418 return vtab_list 419 420 421 def generate_type_definitions(self, env, modules, vtab_list, vtabslot_list, code): 422 for module in modules: 423 definition = module is env 424 if definition: 425 type_entries = module.type_entries 426 else: 427 type_entries = [] 428 for entry in module.type_entries: 429 if entry.defined_in_pxd: 430 type_entries.append(entry) 431 self.generate_type_header_code(type_entries, code) 432 for entry in vtabslot_list: 433 self.generate_obj_struct_definition(entry.type, code) 434 for entry in vtab_list: 435 self.generate_typeobject_predeclaration(entry, code) 436 self.generate_exttype_vtable_struct(entry, code) 437 self.generate_exttype_vtabptr_declaration(entry, code) 438 439 def generate_declarations_for_module(self, env, modules, code): 331 440 code.putln("") 332 code.putln("/* Declarations from %s */" % env.qualified_name) 333 self.generate_type_predeclarations(env, code) 334 self.generate_type_definitions(env, code, definition) 335 self.generate_global_declarations(env, code, definition) 336 self.generate_cfunction_predeclarations(env, code, definition) 337 338 def generate_type_predeclarations(self, env, code): 339 pass 441 code.putln("/* Declarations */") 442 vtab_dict = self.generate_vtab_dict(modules) 443 vtab_list = self.generate_vtab_list(vtab_dict) 444 vtabslot_dict = self.generate_vtabslot_dict(modules,env) 445 vtabslot_list = self.generate_vtabslot_list(vtabslot_dict) 446 self.generate_type_definitions(env, modules, vtab_list, vtabslot_list, code) 447 for module in modules: 448 definition = module is env 449 self.generate_global_declarations(module, code, definition) 450 self.generate_cfunction_predeclarations(module, code, definition) 340 451 341 452 def generate_type_header_code(self, type_entries, code): 342 453 # Generate definitions of structs/unions/enums/typedefs/objstructs. … … 352 463 self.generate_struct_union_definition(entry, code) 353 464 elif type.is_enum: 354 465 self.generate_enum_definition(entry, code) 355 elif type.is_extension_type:356 self.generate_obj_struct_definition(type, code)357 358 def generate_type_definitions(self, env, code, definition):359 if definition:360 type_entries = env.type_entries361 else:362 type_entries = []363 for entry in env.type_entries:364 if entry.defined_in_pxd:365 type_entries.append(entry)366 self.generate_type_header_code(type_entries, code)367 for entry in env.c_class_entries:368 if not entry.in_cinclude:369 self.generate_typeobject_predeclaration(entry, code)370 self.generate_exttype_vtable_struct(entry, code)371 self.generate_exttype_vtabptr_declaration(entry, code)372 466 373 467 def generate_gcc33_hack(self, env, code): 374 468 # Workaround for spurious warning generation in gcc 3.3 … … 1278 1372 1279 1373 def generate_module_init_func(self, imported_modules, env, code): 1280 1374 code.putln("") 1375 code.putln("PyMODINIT_FUNC init2%s(void);" % env.module_name) 1376 code.putln("") 1281 1377 header = "PyMODINIT_FUNC init%s(void)" % env.module_name 1282 1378 code.putln("%s; /*proto*/" % header) 1283 1379 code.putln("%s {" % header) 1380 code.putln("PyObject* __pyx_internal1;") 1381 code.putln("PyObject* __pyx_internal2;") 1284 1382 code.put_var_declarations(env.temp_entries) 1285 1383 1286 1384 code.putln("/*--- Libary function declarations ---*/") … … 1309 1407 code.putln("/*--- Function export code ---*/") 1310 1408 self.generate_c_function_export_code(env, code) 1311 1409 1410 env.use_utility_code(function_export_utility_code) 1411 #code.putln('printf("foo");') 1412 code.putln('if (__Pyx_ExportFunction("init2%s", (void*)init2%s, "int (void)") < 0) %s' % (env.module_name, env.module_name, code.error_goto((env.qualified_name,0,0) ) ) ) 1413 #code.putln('printf("foo2");') 1414 code.putln("/*--- Type init code ---*/") 1415 self.generate_type_init_code(env, code) 1416 #code.putln('printf("foo3");') 1417 code.putln("/*--- Type import code ---*/") 1418 for module in imported_modules: 1419 self.generate_type_import_code_for_module(module, env, code) 1420 #code.putln('printf("foo4");') 1312 1421 code.putln("/*--- Function import code ---*/") 1313 1422 for module in imported_modules: 1314 1423 self.generate_c_function_import_code_for_module(module, env, code) 1424 #code.putln('printf("foo5");') 1425 #code.putln("/*--- Execution code ---*/") 1426 #code.mark_pos(None) 1427 #self.body.generate_execution_code(code) 1428 env.use_utility_code(function_import_utility_code) 1429 code.putln('void (*__Pyx_internal4)(void);') 1430 code.putln('PyObject* __Pyx_internal5;') 1431 #code.putln('printf("foo6");') 1432 #for module in imported_modules: 1433 #module_abs = module.qualified_name 1434 #code.putln('if ( ( __Pyx_internal5 = __Pyx_ImportModule("%s") ) == 0) %s' % ( module_abs , code.error_goto((env.qualified_name,0,0) ) ) ) 1435 #code.putln('if ( ( __Pyx_ImportFunction(__Pyx_internal5,"init2%s", (void**)(&__Pyx_internal4), "int (void)" ) ) == 0 ) %s' % (module.name, code.error_goto((env.qualified_name,0,0) ) ) ) 1436 #code.putln('__Pyx_internal4();') 1437 #code.putln('printf("foo7");') 1438 code.putln('init2%s();' % env.module_name) 1439 #code.putln('printf("foo8");') 1440 if Options.generate_cleanup_code: 1441 code.putln("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos)) 1442 code.putln("return;") 1443 code.put_label(code.error_label) 1444 code.put_var_xdecrefs(env.temp_entries) 1445 #code.putln('printf("fooError");') 1446 code.putln('__Pyx_AddTraceback("%s",%s,%s);' % (env.qualified_name,Naming.cfilenm_cname,Naming.clineno_cname)) 1447 env.use_utility_code(Nodes.traceback_utility_code) 1448 code.putln('}') 1315 1449 1316 code.putln("/*--- Type init code ---*/") 1317 self.generate_type_init_code(env, code) 1318 1319 code.putln("/*--- Type import code ---*/") 1320 for module in imported_modules: 1321 self.generate_type_import_code_for_module(module, env, code) 1322 1450 def generate_module_init2_func(self, imported_modules, env, code): 1451 code.putln("") 1452 header = "PyMODINIT_FUNC init2%s(void)" % env.module_name 1453 code.putln("%s; /*proto*/" % header) 1454 code.putln("%s {" % header) 1455 #code.putln('printf("gamma1");') 1456 code.putln("static int __Pyx_unique = 0;") 1457 code.putln("if (__Pyx_unique==1) return;") 1458 code.putln("__Pyx_unique = 1;") 1459 #code.putln('printf("gamma2");') 1460 code.put_var_declarations(env.temp_entries) 1461 #code.putln('printf("gamma3");') 1323 1462 code.putln("/*--- Execution code ---*/") 1324 1463 code.mark_pos(None) 1325 1464 self.body.generate_execution_code(code) 1326 1465 #code.putln('printf("gamma4");') 1327 1466 if Options.generate_cleanup_code: 1328 1467 code.putln("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos)) 1329 1468 # code.putln('printf("gamma5");') 1330 1469 code.putln("return;") 1331 1470 code.put_label(code.error_label) 1332 1471 code.put_var_xdecrefs(env.temp_entries) 1333 code.putln('__Pyx_AddTraceback("%s");' % (env.qualified_name)) 1472 # code.putln('printf("gammaError");') 1473 code.putln('__Pyx_AddTraceback("%s",%s,%s);' % (env.qualified_name,Naming.cfilenm_cname,Naming.clineno_cname)) 1334 1474 env.use_utility_code(Nodes.traceback_utility_code) 1335 code.putln('}') 1475 code.putln('}') 1336 1476 1337 1477 def generate_module_cleanup_func(self, env, code): 1338 1478 if not Options.generate_cleanup_code: … … 1517 1657 self.generate_exttype_vtable_init_code(entry, code) 1518 1658 self.generate_type_ready_code(env, entry, code) 1519 1659 self.generate_typeptr_assignment_code(entry, code) 1520 1660 1521 1661 def generate_base_type_import_code(self, env, entry, code): 1522 1662 base_type = entry.type.base_type 1523 1663 if base_type and base_type.module_name <> env.qualified_name: … … 1652 1792 # 1653 1793 #------------------------------------------------------------------------------------ 1654 1794 1795 1796 call_module_function_code = [ 1797 """ 1798 static PyObject *__Pyx_CallModuleFunction(char* module, char *name); /*proto*/ 1799 """,""" 1800 static PyObject *__Pyx_CallModuleFunction(char* module, char *name) 1801 { 1802 PyObject* py_name = 0; 1803 PyObject* py_module_name = 0; 1804 PyObject* py_module = 0; 1805 PyObject* py_dict = 0; 1806 PyObject* py_func = 0; 1807 PyObject* py_tuple = PyTuple_New(0); 1808 PyObject* ret = 0; 1809 py_dict = PyImport_GetModuleDict(); 1810 if(py_dict == 0) 1811 goto bad; 1812 if(py_tuple == 0) 1813 goto bad; 1814 py_name = PyString_FromString(name); 1815 if(py_name == 0) 1816 goto bad; 1817 py_module_name = PyString_FromString(module); 1818 if(py_module_name == 0) 1819 goto bad; 1820 py_module = PyObject_GetItem(py_dict, py_module); 1821 if(py_module == 0) 1822 goto bad; 1823 if ( (py_func = PyObject_GetAttr(py_module, py_name) ) == 0) 1824 goto bad; 1825 if ( (ret = PyObject_Call(py_func, py_tuple,NULL) ) == 0) 1826 goto bad; 1827 return ret; 1828 bad: 1829 Py_XDECREF(py_name); 1830 Py_XDECREF(py_module_name); 1831 Py_XDECREF(py_module); 1832 Py_XDECREF(py_dict); 1833 Py_XDECREF(py_func); 1834 return 0; 1835 } 1836 """] 1837 1655 1838 import_module_utility_code = [ 1656 1839 """ 1657 1840 static PyObject *__Pyx_ImportModule(char *name); /*proto*/ … … 1688 1871 { 1689 1872 PyObject *py_module = 0; 1690 1873 PyObject *result = 0; 1874 PyObject *py_name = 0; 1691 1875 1876 py_name = PyString_FromString(module_name); 1877 if (!py_name) 1878 goto bad; 1879 1692 1880 py_module = __Pyx_ImportModule(module_name); 1693 1881 if (!py_module) 1694 1882 goto bad; … … 1709 1897 } 1710 1898 return (PyTypeObject *)result; 1711 1899 bad: 1900 Py_XDECREF(py_name); 1712 1901 Py_XDECREF(result); 1713 1902 return 0; 1714 1903 } … … 1721 1910 """ 1722 1911 static int __Pyx_ExportFunction(char *n, void *f, char *s); /*proto*/ 1723 1912 """,r""" 1724 static int __Pyx_ExportFunction(char *n , void *f, char *s) {1913 static int __Pyx_ExportFunction(char *name, void *f, char *sig) { 1725 1914 PyObject *d = 0; 1726 1915 PyObject *p = 0; 1727 1916 d = PyObject_GetAttrString(%(MODULE)s, "%(API)s"); … … 1734 1923 if (PyModule_AddObject(%(MODULE)s, "%(API)s", d) < 0) 1735 1924 goto bad; 1736 1925 } 1737 p = PyCObject_FromVoidPtrAndDesc(f, s , 0);1926 p = PyCObject_FromVoidPtrAndDesc(f, sig, 0); 1738 1927 if (!p) 1739 1928 goto bad; 1740 if (PyDict_SetItemString(d, n , p) < 0)1929 if (PyDict_SetItemString(d, name, p) < 0) 1741 1930 goto bad; 1742 1931 Py_DECREF(d); 1743 1932 return 0; -
Compiler/Naming.py
diff -r eb2d12f54344 -r 9611bac64935 Compiler/Naming.py
a b 48 48 intern_tab_cname = pyrex_prefix + "intern_tab" 49 49 kwds_cname = pyrex_prefix + "kwds" 50 50 lineno_cname = pyrex_prefix + "lineno" 51 clineno_cname = pyrex_prefix + "clineno" 52 cfilenm_cname = pyrex_prefix + "cfilenm" 51 53 module_cname = pyrex_prefix + "m" 52 54 moddoc_cname = pyrex_prefix + "mdoc" 53 55 methtable_cname = pyrex_prefix + "methods" … … 64 66 optional_args_cname = pyrex_prefix + "optional_args" 65 67 no_opt_args = pyrex_prefix + "no_opt_args" 66 68 69 line_c_macro = "__LINE__" 70 71 file_c_macro = "__FILE__" 67 72 68 73 extern_c_macro = pyrex_prefix.upper() + "EXTERN_C" 69 74 -
Compiler/Nodes.py
diff -r eb2d12f54344 -r 9611bac64935 Compiler/Nodes.py
a b 742 742 exc_check = self.caller_will_check_exceptions() 743 743 if err_val is not None or exc_check: 744 744 code.putln( 745 '__Pyx_AddTraceback("%s" );' %746 self.entry.qualified_name)745 '__Pyx_AddTraceback("%s",%s,%s);' % 746 (self.entry.qualified_name,Naming.cfilenm_cname,Naming.clineno_cname)) 747 747 if err_val is not None: 748 748 code.putln( 749 749 "%s = %s;" % ( … … 3039 3039 code.putln( 3040 3040 "/*except:*/ {") 3041 3041 code.putln( 3042 '__Pyx_AddTraceback("%s" );' % (self.function_name))3042 '__Pyx_AddTraceback("%s",%s,%s);' % (self.function_name, Naming.cfilenm_cname,Naming.clineno_cname)) 3043 3043 # We always have to fetch the exception value even if 3044 3044 # there is no target, because this also normalises the 3045 3045 # exception and stores it in the thread state. … … 3807 3807 3808 3808 traceback_utility_code = [ 3809 3809 """ 3810 static void __Pyx_AddTraceback(char *funcname ); /*proto*/3810 static void __Pyx_AddTraceback(char *funcname, char* cfilename, unsigned int cfileline); /*proto*/ 3811 3811 """,""" 3812 3812 #include "compile.h" 3813 3813 #include "frameobject.h" 3814 3814 #include "traceback.h" 3815 3815 3816 static void __Pyx_AddTraceback(char *funcname ) {3816 static void __Pyx_AddTraceback(char *funcname, char* cfilename, unsigned int cfileline) { 3817 3817 PyObject *py_srcfile = 0; 3818 3818 PyObject *py_funcname = 0; 3819 3819 PyObject *py_globals = 0; … … 3823 3823 3824 3824 py_srcfile = PyString_FromString(%(FILENAME)s); 3825 3825 if (!py_srcfile) goto bad; 3826 py_funcname = PyString_From String(funcname);3826 py_funcname = PyString_FromFormat( "%%s, %%s, %%u", funcname, cfilename, cfileline); 3827 3827 if (!py_funcname) goto bad; 3828 3828 py_globals = PyModule_GetDict(%(GLOBALS)s); 3829 3829 if (!py_globals) goto bad; -
Compiler/ModuleNode.py
# HG changeset patch # User Gary Furnish <gfurnish@gfurnish.net> # Date 1206288533 21600 # Node ID b5cdfa9a1264cd8d6597a096ba2484c15f6bd790 # Parent 9611bac649351947262a8c6075d88bddbbb81735 Removed bad print statements diff -r 9611bac64935 -r b5cdfa9a1264 Compiler/ModuleNode.py
a b 1452 1452 header = "PyMODINIT_FUNC init2%s(void)" % env.module_name 1453 1453 code.putln("%s; /*proto*/" % header) 1454 1454 code.putln("%s {" % header) 1455 #code.putln('printf("gamma1");')1456 1455 code.putln("static int __Pyx_unique = 0;") 1457 1456 code.putln("if (__Pyx_unique==1) return;") 1458 1457 code.putln("__Pyx_unique = 1;") 1459 #code.putln('printf("gamma2");')1460 1458 code.put_var_declarations(env.temp_entries) 1461 #code.putln('printf("gamma3");')1462 1459 code.putln("/*--- Execution code ---*/") 1463 1460 code.mark_pos(None) 1464 1461 self.body.generate_execution_code(code) 1465 #code.putln('printf("gamma4");')1466 1462 if Options.generate_cleanup_code: 1467 1463 code.putln("if (__Pyx_RegisterCleanup()) %s;" % code.error_goto(self.pos)) 1468 # code.putln('printf("gamma5");')1469 1464 code.putln("return;") 1470 1465 code.put_label(code.error_label) 1471 1466 code.put_var_xdecrefs(env.temp_entries) 1472 # code.putln('printf("gammaError");')1473 1467 code.putln('__Pyx_AddTraceback("%s",%s,%s);' % (env.qualified_name,Naming.cfilenm_cname,Naming.clineno_cname)) 1474 1468 env.use_utility_code(Nodes.traceback_utility_code) 1475 1469 code.putln('}')
