Beispiel #1
0
/* Emit jit instructions to set the current sourceline and sourcefile.
 */
static VALUE function_set_ruby_source(VALUE self, VALUE node_v)
{
#ifndef RUBY_VM
  NODE * n;
  jit_function_t function;

  Data_Get_Struct(self, struct _jit_function, function);
  Data_Get_Struct(node_v, NODE, n); // TODO: type check

  VALUE value_objects = (VALUE)jit_function_get_meta(function, RJT_VALUE_OBJECTS);

  jit_constant_t c;

  c.type = jit_type_int;
  c.un.int_value = nd_line(n);
  jit_value_t line = jit_value_create_constant(function, &c);

  c.type = jit_type_void_ptr;
  c.un.ptr_value = n->nd_file;
  jit_value_t file = jit_value_create_constant(function, &c);

  c.type = jit_type_void_ptr;
  c.un.ptr_value = n;
  jit_value_t node = jit_value_create_constant(function, &c);

  c.type = jit_type_void_ptr;
  c.un.ptr_value = &ruby_sourceline;
  jit_value_t ruby_sourceline_ptr = jit_value_create_constant(function, &c);

  c.type = jit_type_void_ptr;
  c.un.ptr_value = &ruby_sourcefile;
  jit_value_t ruby_sourcefile_ptr = jit_value_create_constant(function, &c);

  c.type = jit_type_void_ptr;
  c.un.ptr_value = &ruby_current_node;
  jit_value_t ruby_current_node_ptr = jit_value_create_constant(function, &c);

  jit_insn_store_relative(function, ruby_sourceline_ptr, 0, line);
  jit_insn_store_relative(function, ruby_sourcefile_ptr, 0, file);
  jit_insn_store_relative(function, ruby_current_node_ptr, 0, node);

  rb_ary_push(value_objects, node_v);

#else
  /* TODO: Not sure what to do on 1.9 yet */
#endif

  return Qnil;
}
static jit_value_t
apply_opcode(jit_function_t func, const _jit_intrinsic_info_t *opcode_info,
	     jit_type_t dest_type, jit_value_t value1, jit_value_t value2)
{
	jit_constant_t const_result;
	int result = 0;

	const_result.type = dest_type;
	switch(opcode_info->signature)
	{
		case JIT_SIG_i_i:
		{
			result = apply_i_i
				 (&const_result, value1,
				 (jit_cf_i_i_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_ii:
		{
			result = apply_i_ii
				 (&const_result, value1, value2,
				 (jit_cf_i_ii_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_piii:
		{
			result = apply_i_piii
				 (&const_result, value1, value2,
				 (jit_cf_i_piii_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_iI:
		{
			result = apply_i_iI
				 (&const_result, value1, value2,
				 (jit_cf_i_iI_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_II:
		{
			result = apply_i_II
				 (&const_result, value1, value2,
				 (jit_cf_i_II_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_I_I:
		{
			result = apply_I_I
				 (&const_result, value1,
				 (jit_cf_I_I_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_I_II:
		{
			result = apply_I_II
				 (&const_result, value1, value2,
				 (jit_cf_I_II_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_pIII:
		{
			result = apply_i_pIII
				 (&const_result, value1, value2,
				 (jit_cf_i_pIII_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_l_l:
		{
			result = apply_l_l
				 (&const_result, value1,
				 (jit_cf_l_l_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_l_ll:
		{
			result = apply_l_ll
				 (&const_result, value1, value2,
				 (jit_cf_l_ll_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_plll:
		{
			result = apply_i_plll
				 (&const_result, value1, value2,
				 (jit_cf_i_plll_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_l:
		{
			result = apply_i_l
				 (&const_result, value1,
				 (jit_cf_i_l_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_ll:
		{
			result = apply_i_ll
				 (&const_result, value1, value2,
				 (jit_cf_i_ll_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_l_lI:
		{
			result = apply_l_lI
				 (&const_result, value1, value2,
				 (jit_cf_l_lI_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_L_L:
		{
			result = apply_L_L
				 (&const_result, value1,
				 (jit_cf_L_L_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_L_LL:
		{
			result = apply_L_LL
				 (&const_result, value1, value2,
				 (jit_cf_L_LL_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_pLLL:
		{
			result = apply_i_pLLL
				 (&const_result, value1, value2,
				 (jit_cf_i_pLLL_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_LL:
		{
			result = apply_i_LL
				 (&const_result, value1, value2,
				 (jit_cf_i_LL_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_L_LI:
		{
			result = apply_L_LI
				 (&const_result, value1, value2,
				 (jit_cf_L_LI_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_f_f:
		{
			result = apply_f_f
				 (&const_result, value1,
				 (jit_cf_f_f_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_f_ff:
		{
			result = apply_f_ff
				 (&const_result, value1, value2,
				 (jit_cf_f_ff_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_f:
		{
			result = apply_i_f
				 (&const_result, value1,
				 (jit_cf_i_f_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_ff:
		{
			result = apply_i_ff
				 (&const_result, value1, value2,
				 (jit_cf_i_ff_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_d_d:
		{
			result = apply_d_d
				 (&const_result, value1,
				 (jit_cf_d_d_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_d_dd:
		{
			result = apply_d_dd
				 (&const_result, value1, value2,
				 (jit_cf_d_dd_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_d:
		{
			result = apply_i_d
				 (&const_result, value1,
				 (jit_cf_i_d_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_dd:
		{
			result = apply_i_dd
				 (&const_result, value1, value2,
				 (jit_cf_i_dd_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_D_D:
		{
			result = apply_D_D
				 (&const_result, value1,
				 (jit_cf_D_D_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_D_DD:
		{
			result = apply_D_DD
				 (&const_result, value1, value2,
				 (jit_cf_D_DD_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_D:
		{
			result = apply_i_D
				 (&const_result, value1,
				 (jit_cf_i_D_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_i_DD:
		{
			result = apply_i_DD
				 (&const_result, value1, value2,
				 (jit_cf_i_DD_func)opcode_info->intrinsic);
		}
		break;

		case JIT_SIG_conv:
		{
			result = apply_conv(&const_result, value1, 0);
		}
		break;

		case JIT_SIG_conv_ovf:
		{
			result = apply_conv(&const_result, value1, 1);
		}
		break;
	}
	if(result)
	{
		return jit_value_create_constant(func, &const_result);
	}
	return 0;
}
Beispiel #3
0
jit_value jit_function::new_constant(const jit_constant_t& value)
{
	value_wrap(jit_value_create_constant(func, &value));
}