예제 #1
0
def check_arguments(function):
    assert isinstance(function, cpp_types.SimpleFunction)
    stmts = []
    arg_offset = 1

    if function.parent.proto.kind == cpp_types.FunctionKind.ClassMemberMethod:
        template = Template(filename = template_path + 'check_userdata_argument.cc')
        raw_cpp_type = '%s *' % function.parent.proto.fully_qualified_prefix
        stmt = template.render(arg = '__class_ptr', idx = arg_offset, hashcode = hash(raw_cpp_type))
        stmts.append(stmt)
        arg_offset += 1

    for idx, arg in enumerate([ function.parent.arguments[idx] for idx in xrange(0, function.argc) ]):
        arg_name = get_argument_name(arg, idx)
        narg = idx + arg_offset

        if type_traits.is_userdata_type(arg.type_):
            template = Template(filename = template_path + 'check_userdata_argument.cc')
            stat = template.render(arg = arg_name, idx = narg, hashcode = arg.type_.hashcode)
            stmts.append (stat)
        else:
            template = Template(filename = template_path + 'check_scalar_argument.cc')
            stat = template.render(arg = arg_name, idx = narg)
            stmts.append (stat)
    return stmts
예제 #2
0
def get_arguments_in_function_call(function):
    assert isinstance(function, cpp_types.SimpleFunction)
    args = []
    for idx, arg in enumerate([function.parent.arguments[idx] for idx in xrange(0, function.argc)]):
        assert isinstance(arg, cpp_types.FunctionArgument)
        argname = get_argument_name(arg, idx)
        if type_traits.is_c_string_type(arg.type_):
            args.append ('%s.c_str()' % argname)
        elif type_traits.is_std_string_type(arg.type_):
            args.append('%s' % argname)
        elif type_traits.is_userdata_type(arg.type_) and (arg.type_.is_ref or arg.type_.is_class):
            args.append('*%s' % argname)
        else:
            args.append('%s' % argname)
    return ', '.join(args)
예제 #3
0
def get_push_result(function, function_call):
    assert isinstance(function, cpp_types.SimpleFunction)
    type_ = function.parent.result.type_
    if type_.is_void:
        return '%s;%sreturn 0;' % (function_call, os.linesep)
    elif type_traits.is_userdata_type(type_):
        mt_name = type_.base_type_as_variable
        if type_.is_ptr:
            return Template('return PushResult(L, ${function_call}, ${is_const}, ${hashcode}, ${mt_name});').render(
                    function_call = function_call, is_const = to_cpp_bool(type_.is_const)
                    , hashcode = type_.hashcode, mt_name = mt_name)
        else:
            return Template('return PushResult(L, ${function_call}, ${needs_gc}, ${is_const}, ${hashcode}, ${mt_name});').render(
                    function_call = function_call, needs_gc = to_cpp_bool(type_.is_class), is_const = to_cpp_bool(type_.is_const)
                    , hashcode = type_.hashcode, mt_name = mt_name)
    else:
        return Template('return PushResult(L, (${function_call}));').render(function_call = function_call)