Accept function pointers for call/invoke (thanks to Jonathan Bastien-Filiatrault)

git-svn-id: http://llvm-py.googlecode.com/svn/trunk@41 8d1e9007-1d4e-0410-b67e-1979fd6579aa
This commit is contained in:
mdevan.foobar 2008-09-14 08:58:05 +00:00
commit b873cb8bea
2 changed files with 19 additions and 4 deletions

View file

@ -698,7 +698,6 @@ INTR_X86_SSSE3_PSIGN_W_128 = 594
def check_is_type(obj): check_gen(obj, Type)
def check_is_value(obj): check_gen(obj, Value)
def check_is_pointer(obj): check_gen(obj, Pointer)
def check_is_constant(obj): check_gen(obj, Constant)
def check_is_function(obj): check_gen(obj, Function)
def check_is_basic_block(obj): check_gen(obj, BasicBlock)
@ -709,6 +708,15 @@ def unpack_types(objlist): return unpack_gen(objlist, check_is_type)
def unpack_values(objlist): return unpack_gen(objlist, check_is_value)
def unpack_constants(objlist): return unpack_gen(objlist, check_is_constant)
def check_is_callable(obj):
if isinstance(obj, Function):
return
type = obj.type
if isinstance(type, PointerType) and \
isinstance(type.pointee, FunctionType):
return
raise TypeError, "argument is neither a function nor a function pointer"
#===----------------------------------------------------------------------===
# Module
@ -1166,6 +1174,12 @@ class PointerType(Type):
Use one of the static methods of the *base* class (Type) instead."""
Type.__init__(self, ptr, kind)
@property
def pointee(self):
ptr = _core.LLVMGetElementType(self.ptr)
kind = _core.LLVMGetTypeKind(ptr)
return _make_type(ptr, kind)
@property
def address_space(self):
return _core.LLVMGetPointerAddressSpace(self.ptr)
@ -1827,7 +1841,7 @@ class Builder(object):
return SwitchInstruction(_core.LLVMBuildSwitch(self.ptr, value.ptr, else_blk.ptr, n))
def invoke(self, func, args, then_blk, catch_blk, name=""):
check_is_function(func)
check_is_callable(func)
check_is_basic_block(then_blk)
check_is_basic_block(catch_blk)
args2 = unpack_values(args)
@ -2058,7 +2072,7 @@ class Builder(object):
return PHINode(_core.LLVMBuildPhi(self.ptr, ty.ptr, name))
def call(self, fn, args, name=""):
check_is_function(fn)
check_is_callable(fn)
arg_ptrs = unpack_values(args)
return CallOrInvokeInstruction(_core.LLVMBuildCall(self.ptr, fn.ptr, arg_ptrs, name))

View file

@ -94,7 +94,8 @@ def do_type():
Type.struct([ti]*100)
Type.packed_struct([ti]*100)
Type.array(ti, 100)
Type.pointer(ti, 4)
ptr = Type.pointer(ti, 4)
pte = ptr.pointee
Type.vector(ti, 100)
Type.void()
Type.label()