Merge pull request #21 from laanwj/2012_09_metadata_none

Thanks!
This commit is contained in:
Siu Kwan Lam 2012-09-14 18:18:03 -07:00
commit f9efc23e2d
3 changed files with 16 additions and 4 deletions

View file

@ -62,6 +62,11 @@ def unpack_gen(objlist, check_fn):
for obj in objlist: check_fn(obj) for obj in objlist: check_fn(obj)
return [ obj.ptr for obj in objlist ] return [ obj.ptr for obj in objlist ]
def unpack_gen_allow_none(objlist, check_fn):
for obj in objlist:
if obj is not None:
check_fn(obj)
return [ (obj.ptr if obj is not None else None) for obj in objlist ]
#===----------------------------------------------------------------------=== #===----------------------------------------------------------------------===
# Helper to wrap over iterables (LLVMFirstXXX, LLVMNextXXX). This used # Helper to wrap over iterables (LLVMFirstXXX, LLVMNextXXX). This used

View file

@ -296,6 +296,9 @@ def unpack_types(objlst): return _util.unpack_gen(objlst, check_is_type)
def unpack_values(objlst): return _util.unpack_gen(objlst, check_is_value) def unpack_values(objlst): return _util.unpack_gen(objlst, check_is_value)
def unpack_constants(objlst): return _util.unpack_gen(objlst, check_is_constant) def unpack_constants(objlst): return _util.unpack_gen(objlst, check_is_constant)
def unpack_values_or_none(objlst):
return _util.unpack_gen_allow_none(objlst, check_is_value)
def check_is_callable(obj): def check_is_callable(obj):
if isinstance(obj, Function): if isinstance(obj, Function):
return return
@ -1453,7 +1456,7 @@ class Function(GlobalValue):
class MetaData(Value): class MetaData(Value):
@staticmethod @staticmethod
def get(module, values): def get(module, values):
vs = unpack_values(values) vs = unpack_values_or_none(values)
ptr = _core.LLVMMetaDataGet(module.ptr, vs) ptr = _core.LLVMMetaDataGet(module.ptr, vs)
return MetaData(ptr) return MetaData(ptr)
@ -1476,7 +1479,9 @@ class MetaData(Value):
return [self._get_operand(i) for i in range(self.operand_count)] return [self._get_operand(i) for i in range(self.operand_count)]
def _get_operand(self, i): def _get_operand(self, i):
return _make_value(_core.LLVMMetaDataGetOperand(self.ptr, i)) val = _core.LLVMMetaDataGetOperand(self.ptr, i)
if val: # metadata operands can be None
return _make_value(val)
class MetaDataString(Value): class MetaDataString(Value):
@staticmethod @staticmethod

View file

@ -558,13 +558,15 @@ class TestMetaData(unittest.TestCase):
m = Module.new('a') m = Module.new('a')
t = Type.int() t = Type.int()
metadata = MetaData.get(m, [Constant.int(t, 100), metadata = MetaData.get(m, [Constant.int(t, 100),
MetaDataString.get(m, 'abcdef')]) MetaDataString.get(m, 'abcdef'),
None])
MetaData.add_named_operand(m, 'foo', metadata) MetaData.add_named_operand(m, 'foo', metadata)
self.assertEqual(MetaData.get_named_operands(m, 'foo'), [metadata]) self.assertEqual(MetaData.get_named_operands(m, 'foo'), [metadata])
self.assertEqual(MetaData.get_named_operands(m, 'bar'), []) self.assertEqual(MetaData.get_named_operands(m, 'bar'), [])
self.assertEqual(len(metadata.operands), 2) self.assertEqual(len(metadata.operands), 3)
self.assertEqual(metadata.operands[0].z_ext_value, 100) self.assertEqual(metadata.operands[0].z_ext_value, 100)
self.assertEqual(metadata.operands[1].string, 'abcdef') self.assertEqual(metadata.operands[1].string, 'abcdef')
self.assertTrue(metadata.operands[2] is None)
tests.append(TestMetaData) tests.append(TestMetaData)