def process_function(function, context): logging.debug('translating:' + repr(function)) method = function.translation #adding an index value to each positional parameter for i, parameter in enumerate(function.parameters): parameter.index = i if function.is_constructor else i + 2 #firstly we add the default initializers for each mapped type for parameter in function.parameters: method.initialization.append(lua_context_builder.apply_variable_initialization(parameter, context)) #this additional step will ensure that the amount of parameters is correct method.validation.append('assert(lua_gettop(L) == %d)' % (len(function.parameters) + (0 if function.is_constructor else 1))) #then we add type checking for parameter in function.parameters: method.validation.append(lua_context_builder.apply_variable_check(parameter, context)) #then we get the variables from LUA if function.parent: if function.is_virtual: cif = cpp.cpp_if(['lua_self != nullptr']) cif.body.append('lua_self = lua_munch_%s::get(L)' % (function.parent.identifier_name)) method.recover.append(cif) else: method.initialization.append('{0}* lua_self = lua_munch_{1}::get(L)'.format(function.parent.qualname, function.parent.identifier_name)) for parameter in function.parameters: method.recover.append(lua_context_builder.apply_variable_conversion_from_target(parameter, context)) applied_parameters = [] for parameter in function.parameters: applied_parameters.append(cpp.cpp_dereference(parameter)) #then we call the original method! method.execution.append(cpp.cpp_method_call(function.name if not function.parent else 'lua_self->' + function.name, applied_parameters)) if function.returns != cpp.cpp_type('void'): #if the function is not void, we recover the method execution method_execution = method.execution[0] #create a variable assignment assign = cpp.cpp_assignment(cpp.cpp_variable('lua_return', function.returns), method_execution) #put id back to the execution method.execution[0] = assign #push the value to lua method.lua_return.append(lua_context_builder.apply_variable_conversion_to_target(assign.expr_a, context)) #and then change the call function to 1 so LUA knows it has one value to unpack method.return_value = cpp.cpp_return(1) method.exprs += method.initialization + method.validation + method.recover + method.execution + method.lua_return
def anytype_variable_dereference(variable, ctype): return cpp.cpp_dereference(variable.name)