Ticket #422: fix_T422.patch

File fix_T422.patch, 5.0 KB (added by haoyu, 5 years ago)

Revised version of the patch which using PyStringConst?

  • Cython/Compiler/ExprNodes.py

    # HG changeset patch
    # User Haoyu Bai <baihaoyu@gmail.com>
    # Date 1273834582 -28800
    # Branch T422
    # Node ID f9703a7c50c3a2857038cefb4939f2405fccefd9
    # Parent  92d1eb8aa41e99950ce8bbb070af69e18a85df2f
    Fix T422 by making module name as a StringConst
    
    diff -r 92d1eb8aa41e -r f9703a7c50c3 Cython/Compiler/ExprNodes.py
    a b  
    42074207        if self.doc: 
    42084208            self.doc.analyse_types(env) 
    42094209            self.doc = self.doc.coerce_to_pyobject(env) 
    4210         self.module_name = env.global_scope().qualified_name 
     4210        self.module_name = env.global_scope().module_name 
    42114211        self.type = py_object_type 
    42124212        self.is_temp = 1 
    42134213        env.use_utility_code(create_class_utility_code); 
     
    42244224                'PyDict_SetItemString(%s, "__doc__", %s)' % ( 
    42254225                    self.dict.py_result(), 
    42264226                    self.doc.py_result())) 
     4227        py_mod_name = code.globalstate.get_py_string_const( 
     4228                 self.module_name, identifier=True) 
    42274229        code.putln( 
    4228             '%s = __Pyx_CreateClass(%s, %s, %s, "%s"); %s' % ( 
     4230            '%s = __Pyx_CreateClass(%s, %s, %s, %s); %s' % ( 
    42294231                self.result(), 
    42304232                self.bases.py_result(), 
    42314233                self.dict.py_result(), 
    42324234                cname, 
    4233                 self.module_name, 
     4235                py_mod_name.cname, 
    42344236                code.error_goto_if_null(self.result(), self.pos))) 
    42354237        code.put_gotref(self.py_result()) 
    42364238 
     
    43004302    #  pymethdef_cname   string   PyMethodDef structure 
    43014303    #  self_object       ExprNode or None 
    43024304    #  binding           bool 
     4305    #  module_name       str 
    43034306 
    43044307    subexprs = [] 
    43054308    self_object = None 
     
    43114314    def analyse_types(self, env): 
    43124315        if self.binding: 
    43134316            env.use_utility_code(binding_cfunc_utility_code) 
     4317        self.module_name = env.global_scope().module_name 
    43144318 
    43154319    def may_be_none(self): 
    43164320        return False 
     
    43264330 
    43274331    def generate_result_code(self, code): 
    43284332        if self.binding: 
    4329             constructor = "%s_New" % Naming.binding_cfunc 
     4333            constructor = "%s_NewEx" % Naming.binding_cfunc 
    43304334        else: 
    4331             constructor = "PyCFunction_New" 
     4335            constructor = "PyCFunction_NewEx" 
     4336        py_mod_name = code.globalstate.get_py_string_const( 
     4337                 self.module_name, identifier=True) 
    43324338        code.putln( 
    4333             "%s = %s(&%s, %s); %s" % ( 
     4339            '%s = %s(&%s, %s, %s); %s' % ( 
    43344340                self.result(), 
    43354341                constructor, 
    43364342                self.pymethdef_cname, 
    43374343                self.self_result_code(), 
     4344                py_mod_name.cname, 
    43384345                code.error_goto_if_null(self.result(), self.pos))) 
    43394346        code.put_gotref(self.py_result()) 
    43404347 
     
    67906797 
    67916798create_class_utility_code = UtilityCode( 
    67926799proto = """ 
    6793 static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name, const char *modname); /*proto*/ 
     6800static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name, PyObject *modname); /*proto*/ 
    67946801""", 
    67956802impl = """ 
    67966803static PyObject *__Pyx_CreateClass( 
    6797     PyObject *bases, PyObject *dict, PyObject *name, const char *modname) 
     6804    PyObject *bases, PyObject *dict, PyObject *name, PyObject *modname) 
    67986805{ 
    6799     PyObject *py_modname; 
    68006806    PyObject *result = 0; 
    68016807 
    6802     #if PY_MAJOR_VERSION < 3 
    6803     py_modname = PyString_FromString(modname); 
    6804     #else 
    6805     py_modname = PyUnicode_FromString(modname); 
    6806     #endif 
    6807     if (!py_modname) 
    6808         goto bad; 
    6809     if (PyDict_SetItemString(dict, "__module__", py_modname) < 0) 
     6808    if (PyDict_SetItemString(dict, "__module__", modname) < 0) 
    68106809        goto bad; 
    68116810    #if PY_MAJOR_VERSION < 3 
    68126811    result = PyClass_New(bases, dict, name); 
     
    68146813    result = PyObject_CallFunctionObjArgs((PyObject *)&PyType_Type, name, bases, dict, NULL); 
    68156814    #endif 
    68166815bad: 
    6817     Py_XDECREF(py_modname); 
    68186816    return result; 
    68196817} 
    68206818""") 
  • Cython/Compiler/Symtab.py

    diff -r 92d1eb8aa41e -r f9703a7c50c3 Cython/Compiler/Symtab.py
    a b  
    800800            # Treat Spam/__init__.pyx specially, so that when Python loads 
    801801            # Spam/__init__.so, initSpam() is defined. 
    802802            self.module_name = parent_module.module_name 
     803        self.module_name = EncodedString(self.module_name) 
    803804        self.context = context 
    804805        self.module_cname = Naming.module_cname 
    805806        self.module_dict_cname = Naming.moddict_cname 
  • new file tests/run/method_module_name_T422.pyx

    diff -r 92d1eb8aa41e -r f9703a7c50c3 tests/run/method_module_name_T422.pyx
    - +  
     1""" 
     2>>> Foo.incr.__module__ is not None 
     3True 
     4>>> Foo.incr.__module__ == Foo.__module__ == bar.__module__ 
     5True 
     6 
     7""" 
     8class Foo(object): 
     9   def incr(self,x): 
     10       return x+1 
     11 
     12def bar(): 
     13    pass