Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jit/jit-interp.c view on Meta::CPAN
(jit_function_t func, jit_type_t signature, void **args, void *return_area)
{
struct jit_backtrace call_trace;
jit_function_interp_t entry;
jit_item interp_return_area;
jit_item *arg_buffer;
jit_item *temp_arg;
jit_type_t type;
unsigned int num_params;
unsigned int param;
jit_jmp_buf jbuf;
/* Push a "setjmp" context onto the stack, so that we can catch
any exceptions that are thrown up to this level and prevent
them from propagating further */
_jit_unwind_push_setjmp(&jbuf);
if(setjmp(jbuf.buf))
{
_jit_unwind_pop_setjmp();
return 0;
}
/* Initialize the backtrace information */
_jit_backtrace_push(&call_trace, 0);
/* Clear the exception context */
jit_exception_clear_last();
/* Bail out if the function is NULL */
if(!func)
{
jit_exception_builtin(JIT_RESULT_NULL_FUNCTION);
}
/* Make sure that the function is compiled */
if(func->is_compiled)
{
entry = (jit_function_interp_t)(func->entry_point);
}
else
{
entry = (jit_function_interp_t)(*func->context->on_demand_driver)(func);
}
/* Populate the low-level argument buffer */
if(!signature)
{
signature = func->signature;
arg_buffer = (jit_item *)alloca(entry->args_size);
}
else if(signature == func->signature)
{
arg_buffer = (jit_item *)alloca(entry->args_size);
}
else
{
arg_buffer = (jit_item *)alloca
(_jit_interp_calculate_arg_size(func, signature));
}
temp_arg = arg_buffer;
if(func->nested_parent)
{
jit_exception_builtin(JIT_RESULT_CALLED_NESTED);
}
type = jit_type_get_return(signature);
if(jit_type_return_via_pointer(type))
{
if(!return_area)
{
return_area = alloca(jit_type_get_size(type));
}
temp_arg->ptr_value = return_area;
++temp_arg;
}
num_params = jit_type_num_params(signature);
for(param = 0; param < num_params; ++param)
{
type = jit_type_normalize
(jit_type_get_param(signature, param));
if(!(args[param]))
{
jit_exception_builtin(JIT_RESULT_NULL_REFERENCE);
}
switch(type->kind)
{
case JIT_TYPE_SBYTE:
{
temp_arg->int_value = *((jit_sbyte *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_UBYTE:
{
temp_arg->int_value = *((jit_ubyte *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_SHORT:
{
temp_arg->int_value = *((jit_short *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_USHORT:
{
temp_arg->int_value = *((jit_ushort *)(args[param]));
++temp_arg;
}
break;
case JIT_TYPE_INT:
case JIT_TYPE_UINT:
{
temp_arg->int_value = *((jit_int *)(args[param]));
++temp_arg;
}
break;
( run in 0.548 second using v1.01-cache-2.11-cpan-3d66aa2751a )