Commit c14da739 authored by Robert Bradshaw's avatar Robert Bradshaw

Templating utility code

parent 65abcc7f
...@@ -89,6 +89,12 @@ def long_literal(value): ...@@ -89,6 +89,12 @@ def long_literal(value):
value = int(value) value = int(value)
return not -2**31 <= value < 2**31 return not -2**31 <= value < 2**31
def none_or_sub(s, data):
if s is None:
return s
else:
return s % data
# a simple class that simplifies the usage of utility code # a simple class that simplifies the usage of utility code
class UtilityCode(object): class UtilityCode(object):
...@@ -98,6 +104,7 @@ class UtilityCode(object): ...@@ -98,6 +104,7 @@ class UtilityCode(object):
self.init = init self.init = init
self.cleanup = cleanup self.cleanup = cleanup
self.requires = requires self.requires = requires
self._cache = {}
def write_init_code(self, writer, pos): def write_init_code(self, writer, pos):
if not self.init: if not self.init:
...@@ -114,3 +121,21 @@ class UtilityCode(object): ...@@ -114,3 +121,21 @@ class UtilityCode(object):
self.cleanup(writer, pos) self.cleanup(writer, pos)
else: else:
writer.put(self.cleanup) writer.put(self.cleanup)
def specialize(self, **data):
# Dicts aren't hashable...
key = data.items(); key.sort(); key = tuple(key)
try:
return self._cache[key]
except KeyError:
if self.requires is None:
requires = None
else:
requires = [r.specialize(data) for r in self.requires]
s = self._cache[key] = UtilityCode(
none_or_sub(self.proto, data),
none_or_sub(self.impl, data),
none_or_sub(self.init, data),
none_or_sub(self.cleanup, data),
requires)
return s
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