Commit b9d06020 authored by Stefan Behnel's avatar Stefan Behnel

greg: Tests passed

parent 2dc560a7
...@@ -365,10 +365,7 @@ class ExprNode(Node): ...@@ -365,10 +365,7 @@ class ExprNode(Node):
if debug_temp_alloc: if debug_temp_alloc:
print self, "Allocated result", self.result_code print self, "Allocated result", self.result_code
else: else:
self.result_code = self.calculate_result_code_with_env(env) self.result_code = self.calculate_result_code()
def calculate_result_code_with_env(self, env):
return self.calculate_result_code()
def target_code(self): def target_code(self):
# Return code fragment for use as LHS of a C assignment. # Return code fragment for use as LHS of a C assignment.
...@@ -790,6 +787,7 @@ class NameNode(AtomicExprNode): ...@@ -790,6 +787,7 @@ class NameNode(AtomicExprNode):
error(self.pos, "Assignment to non-lvalue '%s'" error(self.pos, "Assignment to non-lvalue '%s'"
% self.name) % self.name)
self.type = PyrexTypes.error_type self.type = PyrexTypes.error_type
self.entry.used = 1
def analyse_rvalue_entry(self, env): def analyse_rvalue_entry(self, env):
#print "NameNode.analyse_rvalue_entry:", self.name ### #print "NameNode.analyse_rvalue_entry:", self.name ###
...@@ -858,20 +856,19 @@ class NameNode(AtomicExprNode): ...@@ -858,20 +856,19 @@ class NameNode(AtomicExprNode):
# Name nodes are never ephemeral, even if the # Name nodes are never ephemeral, even if the
# result is in a temporary. # result is in a temporary.
return 0 return 0
def calculate_result_code_with_env(self, env): def allocate_temp(self, env, result = None):
AtomicExprNode.allocate_temp(self, env, result)
entry = self.entry entry = self.entry
if entry: if entry:
entry.used = 1 entry.used = 1
if entry.utility_code: if entry.utility_code:
env.use_utility_code(entry.utility_code) env.use_utility_code(entry.utility_code)
return self.calculate_result_code()
def calculate_result_code(self): def calculate_result_code(self):
entry = self.entry entry = self.entry
if not entry: if not entry:
return "<error>" # There was an error earlier return "<error>" # There was an error earlier
entry.used = 1
return entry.cname return entry.cname
def generate_result_code(self, code): def generate_result_code(self, code):
......
...@@ -57,23 +57,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -57,23 +57,14 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
return 0 return 0
def generate_h_code(self, env, options, result): def generate_h_code(self, env, options, result):
public_types = [] def h_entries(entries, pxd = 0):
public_vars = [] return [entry for entry in entries
public_funcs = [] if entry.visibility == 'public' or pxd and entry.defined_in_pxd]
public_extension_types = [] h_types = h_entries(env.type_entries)
for entry in env.type_entries: h_vars = h_entries(env.var_entries)
if entry.visibility == 'public': h_funcs = h_entries(env.cfunc_entries)
public_types.append(entry) h_extension_types = h_entries(env.c_class_entries)
for entry in env.var_entries: if h_types or h_vars or h_funcs or h_extension_types:
if entry.visibility == 'public':
public_vars.append(entry)
for entry in env.cfunc_entries:
if entry.visibility == 'public' and not entry.in_cinclude:
public_funcs.append(entry)
for entry in env.c_class_entries:
if entry.visibility == 'public':
public_extension_types.append(entry)
if public_types or public_vars or public_funcs or public_extension_types:
result.h_file = replace_suffix(result.c_file, ".h") result.h_file = replace_suffix(result.c_file, ".h")
h_code = Code.CCodeWriter(open_new_file(result.h_file)) h_code = Code.CCodeWriter(open_new_file(result.h_file))
if options.generate_pxi: if options.generate_pxi:
...@@ -84,20 +75,20 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -84,20 +75,20 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
guard = Naming.h_guard_prefix + env.qualified_name.replace(".", "__") guard = Naming.h_guard_prefix + env.qualified_name.replace(".", "__")
h_code.put_h_guard(guard) h_code.put_h_guard(guard)
self.generate_extern_c_macro_definition(h_code) self.generate_extern_c_macro_definition(h_code)
self.generate_type_header_code(public_types, h_code) self.generate_type_header_code(h_types, h_code)
h_code.putln("") h_code.putln("")
h_code.putln("#ifndef %s" % Naming.api_guard_prefix + self.api_name(env)) h_code.putln("#ifndef %s" % Naming.api_guard_prefix + self.api_name(env))
if public_vars: if h_vars:
h_code.putln("") h_code.putln("")
for entry in public_vars: for entry in h_vars:
self.generate_public_declaration(entry, h_code, i_code) self.generate_public_declaration(entry, h_code, i_code)
if public_funcs: if h_funcs:
h_code.putln("") h_code.putln("")
for entry in public_funcs: for entry in h_funcs:
self.generate_public_declaration(entry, h_code, i_code) self.generate_public_declaration(entry, h_code, i_code)
if public_extension_types: if h_extension_types:
h_code.putln("") h_code.putln("")
for entry in public_extension_types: for entry in h_extension_types:
self.generate_cclass_header_code(entry.type, h_code) self.generate_cclass_header_code(entry.type, h_code)
if i_code: if i_code:
self.generate_cclass_include_code(entry.type, i_code) self.generate_cclass_include_code(entry.type, i_code)
...@@ -122,14 +113,17 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -122,14 +113,17 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
def generate_api_code(self, env, result): def generate_api_code(self, env, result):
api_funcs = [] api_funcs = []
public_extension_types = []
has_api_extension_types = 0
for entry in env.cfunc_entries: for entry in env.cfunc_entries:
if entry.api: if entry.api:
api_funcs.append(entry) api_funcs.append(entry)
public_extension_types = []
for entry in env.c_class_entries: for entry in env.c_class_entries:
if entry.visibility == 'public': if entry.visibility == 'public':
public_extension_types.append(entry) public_extension_types.append(entry)
if api_funcs or public_extension_types: if entry.api:
has_api_extension_types = 1
if api_funcs or has_api_extension_types:
result.api_file = replace_suffix(result.c_file, "_api.h") result.api_file = replace_suffix(result.c_file, "_api.h")
h_code = Code.CCodeWriter(open_new_file(result.api_file)) h_code = Code.CCodeWriter(open_new_file(result.api_file))
name = self.api_name(env) name = self.api_name(env)
...@@ -156,16 +150,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -156,16 +150,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
h_code.putln("#endif") h_code.putln("#endif")
if api_funcs: if api_funcs:
h_code.putln("") h_code.putln("")
h_code.put_h_guard(Naming.api_func_guard + "import_function")
h_code.put(function_import_utility_code[1]) h_code.put(function_import_utility_code[1])
h_code.putln("")
h_code.putln("#endif")
if public_extension_types: if public_extension_types:
h_code.putln("") h_code.putln("")
h_code.put_h_guard(Naming.api_func_guard + "import_type")
h_code.put(type_import_utility_code[1]) h_code.put(type_import_utility_code[1])
h_code.putln("")
h_code.putln("#endif")
h_code.putln("") h_code.putln("")
h_code.putln("static int import_%s(void) {" % name) h_code.putln("static int import_%s(void) {" % name)
h_code.putln("PyObject *module = 0;") h_code.putln("PyObject *module = 0;")
...@@ -207,10 +195,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -207,10 +195,8 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
else: else:
i_code.putln("pass") i_code.putln("pass")
i_code.dedent() i_code.dedent()
def generate_c_code(self, env, result): def generate_c_code(self, env, result):
# modules = []
# self.find_referenced_modules(env, modules, {})
modules = self.referenced_modules modules = self.referenced_modules
code = Code.CCodeWriter(StringIO()) code = Code.CCodeWriter(StringIO())
code.h = Code.CCodeWriter(StringIO()) code.h = Code.CCodeWriter(StringIO())
...@@ -358,9 +344,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -358,9 +344,10 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
if definition: if definition:
type_entries = env.type_entries type_entries = env.type_entries
else: else:
type_entries = [ type_entries = []
entry for entry in env.type_entries for entry in env.type_entries:
if entry.defined_in_pxd] if entry.defined_in_pxd:
type_entries.append(entry)
self.generate_type_header_code(type_entries, code) self.generate_type_header_code(type_entries, code)
for entry in env.c_class_entries: for entry in env.c_class_entries:
if not entry.in_cinclude: if not entry.in_cinclude:
...@@ -1485,12 +1472,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1485,12 +1472,6 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
objstruct = type.objstruct_cname objstruct = type.objstruct_cname
else: else:
objstruct = "struct %s" % type.objstruct_cname objstruct = "struct %s" % type.objstruct_cname
# code.putln('%s = __Pyx_ImportType("%s", "%s", sizeof(%s)); %s' % (
# type.typeptr_cname,
# type.module_name,
# type.name,
# objstruct,
# code.error_goto_if_null(type.typeptr_cname, pos)))
self.generate_type_import_call(type, code, self.generate_type_import_call(type, code,
code.error_goto_if_null(type.typeptr_cname, pos)) code.error_goto_if_null(type.typeptr_cname, pos))
self.use_type_import_utility_code(env) self.use_type_import_utility_code(env)
...@@ -1600,62 +1581,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): ...@@ -1600,62 +1581,9 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
code.put(utility_code[1]) code.put(utility_code[1])
#------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------
#
#type_import_utility_code = [ # Runtime support code
#""" #
#static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name, long size); /*proto*/
#""","""
#static PyTypeObject *__Pyx_ImportType(char *module_name, char *class_name,
# long size)
#{
# PyObject *py_module_name = 0;
# PyObject *py_class_name = 0;
# PyObject *py_name_list = 0;
# PyObject *py_module = 0;
# PyObject *result = 0;
#
# py_module_name = PyString_FromString(module_name);
# if (!py_module_name)
# goto bad;
# py_class_name = PyString_FromString(class_name);
# if (!py_class_name)
# goto bad;
# py_name_list = PyList_New(1);
# if (!py_name_list)
# goto bad;
# Py_INCREF(py_class_name);
# if (PyList_SetItem(py_name_list, 0, py_class_name) < 0)
# goto bad;
# py_module = __Pyx_Import(py_module_name, py_name_list);
# if (!py_module)
# goto bad;
# result = PyObject_GetAttr(py_module, py_class_name);
# if (!result)
# goto bad;
# if (!PyType_Check(result)) {
# PyErr_Format(PyExc_TypeError,
# "%s.%s is not a type object",
# module_name, class_name);
# goto bad;
# }
# if (((PyTypeObject *)result)->tp_basicsize != size) {
# PyErr_Format(PyExc_ValueError,
# "%s.%s does not appear to be the correct type object",
# module_name, class_name);
# goto bad;
# }
# goto done;
#bad:
# Py_XDECREF(result);
# result = 0;
#done:
# Py_XDECREF(py_module_name);
# Py_XDECREF(py_class_name);
# Py_XDECREF(py_name_list);
# return (PyTypeObject *)result;
#}
#"""]
#------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------
import_module_utility_code = [ import_module_utility_code = [
...@@ -1701,6 +1629,8 @@ type_import_utility_code = [ ...@@ -1701,6 +1629,8 @@ type_import_utility_code = [
""" """
static PyTypeObject *__Pyx_ImportType(PyObject *py_module, char *module_name, char *class_name, long size); /*proto*/ static PyTypeObject *__Pyx_ImportType(PyObject *py_module, char *module_name, char *class_name, long size); /*proto*/
""",""" ""","""
#ifndef __PYX_HAVE_RT_ImportType
#define __PYX_HAVE_RT_ImportType
static PyTypeObject *__Pyx_ImportType(PyObject *py_module, char *module_name, char *class_name, long size) { static PyTypeObject *__Pyx_ImportType(PyObject *py_module, char *module_name, char *class_name, long size) {
PyObject *result = 0; PyObject *result = 0;
...@@ -1724,6 +1654,7 @@ bad: ...@@ -1724,6 +1654,7 @@ bad:
Py_XDECREF(result); Py_XDECREF(result);
return 0; return 0;
} }
#endif
"""] """]
#------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------
...@@ -1765,6 +1696,8 @@ function_import_utility_code = [ ...@@ -1765,6 +1696,8 @@ function_import_utility_code = [
""" """
static int __Pyx_ImportFunction(PyObject *module, char *funcname, void **f, char *sig); /*proto*/ static int __Pyx_ImportFunction(PyObject *module, char *funcname, void **f, char *sig); /*proto*/
""",""" ""","""
#ifndef __PYX_HAVE_RT_ImportFunction
#define __PYX_HAVE_RT_ImportFunction
static int __Pyx_ImportFunction(PyObject *module, char *funcname, void **f, char *sig) { static int __Pyx_ImportFunction(PyObject *module, char *funcname, void **f, char *sig) {
PyObject *d = 0; PyObject *d = 0;
PyObject *cobj = 0; PyObject *cobj = 0;
...@@ -1798,4 +1731,5 @@ bad: ...@@ -1798,4 +1731,5 @@ bad:
Py_XDECREF(d); Py_XDECREF(d);
return -1; return -1;
} }
#endif
""" % dict(API = Naming.api_name)] """ % dict(API = Naming.api_name)]
...@@ -449,6 +449,7 @@ class CVarDefNode(StatNode): ...@@ -449,6 +449,7 @@ class CVarDefNode(StatNode):
# base_type CBaseTypeNode # base_type CBaseTypeNode
# declarators [CDeclaratorNode] # declarators [CDeclaratorNode]
# in_pxd boolean # in_pxd boolean
# api boolean
def analyse_declarations(self, env, dest_scope = None): def analyse_declarations(self, env, dest_scope = None):
if not dest_scope: if not dest_scope:
...@@ -470,13 +471,8 @@ class CVarDefNode(StatNode): ...@@ -470,13 +471,8 @@ class CVarDefNode(StatNode):
return return
if type.is_cfunction: if type.is_cfunction:
entry = dest_scope.declare_cfunction(name, type, declarator.pos, entry = dest_scope.declare_cfunction(name, type, declarator.pos,
cname = cname, visibility = self.visibility, in_pxd = self.in_pxd) cname = cname, visibility = self.visibility, in_pxd = self.in_pxd,
#if self.visibility <> 'extern': api = self.api)
# if self.in_pxd:
# entry.defined_in_pxd = 1
# else:
# error(declarator.pos,
# "Non-extern C function declared but not defined")
else: else:
if self.in_pxd and self.visibility != 'extern': if self.in_pxd and self.visibility != 'extern':
error(self.pos, error(self.pos,
...@@ -499,6 +495,7 @@ class CStructOrUnionDefNode(StatNode): ...@@ -499,6 +495,7 @@ class CStructOrUnionDefNode(StatNode):
# kind "struct" or "union" # kind "struct" or "union"
# typedef_flag boolean # typedef_flag boolean
# visibility "public" or "private" # visibility "public" or "private"
# in_pxd boolean
# attributes [CVarDefNode] or None # attributes [CVarDefNode] or None
# entry Entry # entry Entry
...@@ -510,9 +507,11 @@ class CStructOrUnionDefNode(StatNode): ...@@ -510,9 +507,11 @@ class CStructOrUnionDefNode(StatNode):
self.name, self.kind, scope, self.typedef_flag, self.pos, self.name, self.kind, scope, self.typedef_flag, self.pos,
self.cname, visibility = self.visibility) self.cname, visibility = self.visibility)
if self.attributes is not None: if self.attributes is not None:
if self.in_pxd and not env.in_cinclude:
self.entry.defined_in_pxd = 1
for attr in self.attributes: for attr in self.attributes:
attr.analyse_declarations(env, scope) attr.analyse_declarations(env, scope)
def analyse_expressions(self, env): def analyse_expressions(self, env):
pass pass
...@@ -525,15 +524,19 @@ class CEnumDefNode(StatNode): ...@@ -525,15 +524,19 @@ class CEnumDefNode(StatNode):
# cname string or None # cname string or None
# items [CEnumDefItemNode] # items [CEnumDefItemNode]
# typedef_flag boolean # typedef_flag boolean
# visibility "public" or "private" # visibility "public" or "private"
# in_pxd boolean
# entry Entry # entry Entry
def analyse_declarations(self, env): def analyse_declarations(self, env):
self.entry = env.declare_enum(self.name, self.pos, self.entry = env.declare_enum(self.name, self.pos,
cname = self.cname, typedef_flag = self.typedef_flag, cname = self.cname, typedef_flag = self.typedef_flag,
visibility = self.visibility) visibility = self.visibility)
for item in self.items: if self.items is not None:
item.analyse_declarations(env, self.entry) if self.in_pxd and not env.in_cinclude:
self.entry.defined_in_pxd = 1
for item in self.items:
item.analyse_declarations(env, self.entry)
def analyse_expressions(self, env): def analyse_expressions(self, env):
pass pass
...@@ -559,23 +562,23 @@ class CEnumDefItemNode(StatNode): ...@@ -559,23 +562,23 @@ class CEnumDefItemNode(StatNode):
class CTypeDefNode(StatNode): class CTypeDefNode(StatNode):
# base_type CBaseTypeNode # base_type CBaseTypeNode
# declarator CDeclaratorNode # declarator CDeclaratorNode
# visibility "public" or "private" # visibility "public" or "private"
# in_pxd boolean
def analyse_declarations(self, env): def analyse_declarations(self, env):
base = self.base_type.analyse(env) base = self.base_type.analyse(env)
name_declarator, type = self.declarator.analyse(base, env) name_declarator, type = self.declarator.analyse(base, env)
name = name_declarator.name name = name_declarator.name
cname = name_declarator.cname cname = name_declarator.cname
#if env.in_cinclude: entry = env.declare_typedef(name, type, self.pos,
# type = CTypedefType(cname, type)
env.declare_typedef(name, type, self.pos,
cname = cname, visibility = self.visibility) cname = cname, visibility = self.visibility)
if self.in_pxd and not env.in_cinclude:
entry.defined_in_pxd = 1
def analyse_expressions(self, env): def analyse_expressions(self, env):
pass pass
def generate_execution_code(self, code): def generate_execution_code(self, code):
pass pass
......
...@@ -1728,9 +1728,9 @@ def p_cdef_statement(s, level, visibility = 'private', api = 0, ...@@ -1728,9 +1728,9 @@ def p_cdef_statement(s, level, visibility = 'private', api = 0,
#if api: #if api:
# error(pos, "'api' not allowed with '%s'" % s.systring) # error(pos, "'api' not allowed with '%s'" % s.systring)
if s.systring == "enum": if s.systring == "enum":
return p_c_enum_definition(s, pos, visibility) return p_c_enum_definition(s, pos, level, visibility)
else: else:
return p_c_struct_or_union_definition(s, pos, visibility) return p_c_struct_or_union_definition(s, pos, level, visibility)
elif s.sy == 'pass': elif s.sy == 'pass':
node = p_pass_statement(s) node = p_pass_statement(s)
s.expect_newline('Expected a newline') s.expect_newline('Expected a newline')
...@@ -1758,7 +1758,7 @@ struct_union_or_enum = ( ...@@ -1758,7 +1758,7 @@ struct_union_or_enum = (
"struct", "union", "enum" "struct", "union", "enum"
) )
def p_c_enum_definition(s, pos, visibility, typedef_flag = 0): def p_c_enum_definition(s, pos, level, visibility, typedef_flag = 0):
# s.sy == ident 'enum' # s.sy == ident 'enum'
s.next() s.next()
if s.sy == 'IDENT': if s.sy == 'IDENT':
...@@ -1781,7 +1781,8 @@ def p_c_enum_definition(s, pos, visibility, typedef_flag = 0): ...@@ -1781,7 +1781,8 @@ def p_c_enum_definition(s, pos, visibility, typedef_flag = 0):
p_c_enum_line(s, items) p_c_enum_line(s, items)
s.expect_dedent() s.expect_dedent()
return Nodes.CEnumDefNode(pos, name = name, cname = cname, return Nodes.CEnumDefNode(pos, name = name, cname = cname,
items = items, typedef_flag = typedef_flag, visibility = visibility) items = items, typedef_flag = typedef_flag, visibility = visibility,
in_pxd = level == 'module_pxd')
def p_c_enum_line(s, items): def p_c_enum_line(s, items):
if s.sy <> 'pass': if s.sy <> 'pass':
...@@ -1806,7 +1807,7 @@ def p_c_enum_item(s, items): ...@@ -1806,7 +1807,7 @@ def p_c_enum_item(s, items):
items.append(Nodes.CEnumDefItemNode(pos, items.append(Nodes.CEnumDefItemNode(pos,
name = name, cname = cname, value = value)) name = name, cname = cname, value = value))
def p_c_struct_or_union_definition(s, pos, visibility, typedef_flag = 0): def p_c_struct_or_union_definition(s, pos, level, visibility, typedef_flag = 0):
# s.sy == ident 'struct' or 'union' # s.sy == ident 'struct' or 'union'
kind = s.systring kind = s.systring
s.next() s.next()
...@@ -1831,7 +1832,8 @@ def p_c_struct_or_union_definition(s, pos, visibility, typedef_flag = 0): ...@@ -1831,7 +1832,8 @@ def p_c_struct_or_union_definition(s, pos, visibility, typedef_flag = 0):
s.expect_newline("Syntax error in struct or union definition") s.expect_newline("Syntax error in struct or union definition")
return Nodes.CStructOrUnionDefNode(pos, return Nodes.CStructOrUnionDefNode(pos,
name = name, cname = cname, kind = kind, attributes = attributes, name = name, cname = cname, kind = kind, attributes = attributes,
typedef_flag = typedef_flag, visibility = visibility) typedef_flag = typedef_flag, visibility = visibility,
in_pxd = level == 'module_pxd')
def p_visibility(s, prev_visibility): def p_visibility(s, prev_visibility):
pos = s.position() pos = s.position()
...@@ -1884,7 +1886,8 @@ def p_c_func_or_var_declaration(s, level, pos, visibility = 'private', api = 0, ...@@ -1884,7 +1886,8 @@ def p_c_func_or_var_declaration(s, level, pos, visibility = 'private', api = 0,
visibility = visibility, visibility = visibility,
base_type = base_type, base_type = base_type,
declarators = declarators, declarators = declarators,
in_pxd = level == 'module_pxd') in_pxd = level == 'module_pxd',
api = api)
return result return result
def p_ctypedef_statement(s, level, visibility = 'private', api = 0): def p_ctypedef_statement(s, level, visibility = 'private', api = 0):
...@@ -1897,15 +1900,17 @@ def p_ctypedef_statement(s, level, visibility = 'private', api = 0): ...@@ -1897,15 +1900,17 @@ def p_ctypedef_statement(s, level, visibility = 'private', api = 0):
visibility = visibility, typedef_flag = 1, api = api) visibility = visibility, typedef_flag = 1, api = api)
elif s.sy == 'IDENT' and s.systring in ('struct', 'union', 'enum'): elif s.sy == 'IDENT' and s.systring in ('struct', 'union', 'enum'):
if s.systring == 'enum': if s.systring == 'enum':
return p_c_enum_definition(s, pos, visibility, typedef_flag = 1) return p_c_enum_definition(s, pos, level, visibility, typedef_flag = 1)
else: else:
return p_c_struct_or_union_definition(s, pos, visibility, typedef_flag = 1) return p_c_struct_or_union_definition(s, pos, level, visibility,
typedef_flag = 1)
else: else:
base_type = p_c_base_type(s) base_type = p_c_base_type(s)
declarator = p_c_declarator(s, is_type = 1, nonempty = 1) declarator = p_c_declarator(s, is_type = 1, nonempty = 1)
s.expect_newline("Syntax error in ctypedef statement") s.expect_newline("Syntax error in ctypedef statement")
return Nodes.CTypeDefNode(pos, return Nodes.CTypeDefNode(pos,
base_type = base_type, declarator = declarator, visibility = visibility) base_type = base_type, declarator = declarator, visibility = visibility,
in_pxd = level == 'module_pxd')
def p_def_statement(s): def p_def_statement(s):
# s.sy == 'def' # s.sy == 'def'
......
...@@ -267,6 +267,7 @@ class Scope: ...@@ -267,6 +267,7 @@ class Scope:
type = PyrexTypes.CTypedefType(cname, base_type) type = PyrexTypes.CTypedefType(cname, base_type)
entry = self.declare_type(name, type, pos, cname, visibility) entry = self.declare_type(name, type, pos, cname, visibility)
type.qualified_name = entry.qualified_name type.qualified_name = entry.qualified_name
return entry
def declare_struct_or_union(self, name, kind, scope, def declare_struct_or_union(self, name, kind, scope,
typedef_flag, pos, cname = None, visibility = 'private'): typedef_flag, pos, cname = None, visibility = 'private'):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment