提交 6d851334 authored 作者: Arnaud Bergeron's avatar Arnaud Bergeron

Add c_init_code_apply().

上级 03bb1866
...@@ -484,6 +484,7 @@ class CLinker(link.Linker): ...@@ -484,6 +484,7 @@ class CLinker(link.Linker):
self.consts = [] self.consts = []
c_support_code_apply = [] c_support_code_apply = []
c_init_code_apply = []
symbol = {} symbol = {}
...@@ -630,7 +631,15 @@ class CLinker(link.Linker): ...@@ -630,7 +631,15 @@ class CLinker(link.Linker):
# The following will be executed if the "try" block succeeds # The following will be executed if the "try" block succeeds
assert isinstance(c_support_code_apply[-1], basestring), ( assert isinstance(c_support_code_apply[-1], basestring), (
str(node.op) + str(node.op) +
" didn't returned a string for c_support_code_apply") " didn't return a string for c_support_code_apply")
try:
c_init_code_apply.append(op.c_init_code_apply(node, name))
except utils.MethodNotDefined:
pass
else:
assert isinstance(c_init_code_apply[-1], basestring), (
str(node.op) +
" didn't return a string for c_init_code_apply")
# emit c_code # emit c_code
try: try:
...@@ -638,7 +647,7 @@ class CLinker(link.Linker): ...@@ -638,7 +647,7 @@ class CLinker(link.Linker):
except utils.MethodNotDefined: except utils.MethodNotDefined:
raise NotImplementedError("%s cannot produce C code" % op) raise NotImplementedError("%s cannot produce C code" % op)
assert isinstance(behavior, basestring), ( assert isinstance(behavior, basestring), (
str(node.op) + " didn't returned a string for c_code") str(node.op) + " didn't return a string for c_code")
try: try:
cleanup = op.c_code_cleanup(node, name, isyms, osyms, sub) cleanup = op.c_code_cleanup(node, name, isyms, osyms, sub)
...@@ -677,6 +686,7 @@ class CLinker(link.Linker): ...@@ -677,6 +686,7 @@ class CLinker(link.Linker):
self.tasks = tasks self.tasks = tasks
all_info = self.inputs + self.outputs + self.orphans all_info = self.inputs + self.outputs + self.orphans
self.c_support_code_apply = c_support_code_apply self.c_support_code_apply = c_support_code_apply
self.c_init_code_apply = c_init_code_apply
if (self.init_tasks, self.tasks) != self.get_init_tasks(): if (self.init_tasks, self.tasks) != self.get_init_tasks():
print >> sys.stderr, "init_tasks\n", self.init_tasks print >> sys.stderr, "init_tasks\n", self.init_tasks
...@@ -1292,7 +1302,7 @@ class CLinker(link.Linker): ...@@ -1292,7 +1302,7 @@ class CLinker(link.Linker):
mod.add_function(instantiate) mod.add_function(instantiate)
for header in self.headers(): for header in self.headers():
mod.add_include(header) mod.add_include(header)
for init_code_block in self.init_code(): for init_code_block in self.init_code() + self.c_init_code_apply:
mod.add_init_code(init_code_block) mod.add_init_code(init_code_block)
return mod return mod
......
...@@ -187,6 +187,18 @@ class CLinkerObject(object): ...@@ -187,6 +187,18 @@ class CLinkerObject(object):
self.__class__.__name__) self.__class__.__name__)
def c_init_code_apply(self, node, name):
"""
Optional: return a list of code snippets specific to the apply
to be inserted in module initialization.
:Exceptions:
- `MethodNotDefined`: the subclass does not override this method
"""
raise utils.MethodNotDefined("c_init_code_apply", type(self),
self.__class__.__name__)
class CLinkerOp(CLinkerObject): class CLinkerOp(CLinkerObject):
""" """
Interface definition for `Op` subclasses compiled by `CLinker`. Interface definition for `Op` subclasses compiled by `CLinker`.
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论