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 )