Commit b7a4e7ab authored by Robert Bradshaw's avatar Robert Bradshaw

Trac #80, error on unimplemented pxd cdef functions

parent b52aa7db
......@@ -84,13 +84,13 @@ class Context:
from AutoDocTransforms import EmbedSignature
from Optimize import FlattenInListTransform, SwitchTransform, FinalOptimizePhase
from Buffer import IntroduceBufferAuxiliaryVars
from ModuleNode import check_c_classes
from ModuleNode import check_c_declarations
if pxd:
_check_c_classes = None
_check_c_declarations = None
_specific_post_parse = PxdPostParse(self)
else:
_check_c_classes = check_c_classes
_check_c_declarations = check_c_declarations
_specific_post_parse = None
if py and not pxd:
......@@ -111,7 +111,7 @@ class Context:
EmbedSignature(self),
TransformBuiltinMethods(self),
IntroduceBufferAuxiliaryVars(self),
_check_c_classes,
_check_c_declarations,
AnalyseExpressionsTransform(self),
SwitchTransform(),
FinalOptimizePhase(self),
......
......@@ -26,8 +26,9 @@ from Cython.Utils import open_new_file, replace_suffix, UtilityCode
from StringEncoding import escape_byte_string, EncodedString
def check_c_classes(module_node):
def check_c_declarations(module_node):
module_node.scope.check_c_classes()
module_node.scope.check_c_functions()
return module_node
class ModuleNode(Nodes.Node, Nodes.BlockNode):
......
......@@ -135,6 +135,7 @@ class Entry:
used = 0
is_special = 0
defined_in_pxd = 0
is_implemented = 0
api = 0
utility_code = None
is_overridable = 0
......@@ -445,6 +446,8 @@ class Scope:
entry.api = 1
if not defining and not in_pxd and visibility != 'extern':
error(pos, "Non-extern C function '%s' declared but not defined" % name)
if defining:
entry.is_implemented = True
return entry
def add_cfunction(self, name, type, pos, cname, visibility):
......@@ -1093,8 +1096,8 @@ class ModuleScope(Scope):
for entry in self.c_class_entries:
if debug_check_c_classes:
print("...entry %s %s" % (entry.name, entry))
print("......type = " + entry.type)
print("......visibility = " + entry.visibility)
print("......type = ", entry.type)
print("......visibility = ", entry.visibility)
type = entry.type
name = entry.name
visibility = entry.visibility
......@@ -1117,6 +1120,17 @@ class ModuleScope(Scope):
#print "ModuleScope.check_c_classes: allocating vtable cname for", self ###
type.vtable_cname = self.mangle(Naming.vtable_prefix, entry.name)
def check_c_functions(self):
# Performs post-analysis checking making sure all
# defined c functions are actually implemented.
for name, entry in self.entries.items():
if entry.is_cfunction:
if (entry.defined_in_pxd
and entry.visibility != 'extern'
and not entry.in_cinclude
and not entry.is_implemented):
error(entry.pos, "Non-extern C function '%s' declared but not defined" % name)
def attach_var_entry_to_c_class(self, entry):
# The name of an extension class has to serve as both a type
# name and a variable name holding the type object. It is
......
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