[svn:parrot] r43461 - in branches/libjit_framebuilder2: config/gen/libjit lib/Parrot
plobsing at svn.parrot.org
plobsing at svn.parrot.org
Fri Jan 15 03:36:15 UTC 2010
Author: plobsing
Date: Fri Jan 15 03:36:09 2010
New Revision: 43461
URL: https://trac.parrot.org/parrot/changeset/43461
Log:
add special case for NCI 'p' returns NULL => PMCNULL
fix indents for codingstd
all tests now pass when not using libjit
Modified:
branches/libjit_framebuilder2/config/gen/libjit/frame_builder_libjit_c.in
branches/libjit_framebuilder2/lib/Parrot/NativeCall.pm
Modified: branches/libjit_framebuilder2/config/gen/libjit/frame_builder_libjit_c.in
==============================================================================
--- branches/libjit_framebuilder2/config/gen/libjit/frame_builder_libjit_c.in Fri Jan 15 03:19:15 2010 (r43460)
+++ branches/libjit_framebuilder2/config/gen/libjit/frame_builder_libjit_c.in Fri Jan 15 03:36:09 2010 (r43461)
@@ -212,41 +212,41 @@
for (i = 0, j = 0; i < nargs; i++) {
char c;
switch (c = sig[i]) {
- case 'I':
- case 'c':
- case 's':
- case 'i':
- case 'l':
- reg_v[j++] = jit_value_create(f, JIT_TYPE_INTVAL);
- break;
-
- case 'N':
- case 'd':
- case 'f':
- reg_v[j++] = jit_value_create(f, JIT_TYPE_FLOATVAL);
- break;
-
- case 'S':
- case 'B':
- case 'b':
- case 't':
- reg_v[j++] = jit_value_create(f, jit_type_void_ptr);
- break;
-
- case 'p':
- case 'P':
- case 'O':
- case '@':
- case '2':
- case '3':
- case '4':
- case 'V':
- reg_v[j++] = jit_value_create(f, jit_type_void_ptr);
- break;
-
- default:
- /* don't catch errors here; fail elsewhere */
- break;
+ case 'I':
+ case 'c':
+ case 's':
+ case 'i':
+ case 'l':
+ reg_v[j++] = jit_value_create(f, JIT_TYPE_INTVAL);
+ break;
+
+ case 'N':
+ case 'd':
+ case 'f':
+ reg_v[j++] = jit_value_create(f, JIT_TYPE_FLOATVAL);
+ break;
+
+ case 'S':
+ case 'B':
+ case 'b':
+ case 't':
+ reg_v[j++] = jit_value_create(f, jit_type_void_ptr);
+ break;
+
+ case 'p':
+ case 'P':
+ case 'O':
+ case '@':
+ case '2':
+ case '3':
+ case '4':
+ case 'V':
+ reg_v[j++] = jit_value_create(f, jit_type_void_ptr);
+ break;
+
+ default:
+ /* don't catch errors here; fail elsewhere */
+ break;
}
}
@@ -278,137 +278,137 @@
jit_label_t l1;
jit_value_t v1, v2, v3, v4;
switch (c = sig[i]) {
- case 'I':
- t1 = JIT_TYPE_INTVAL;
- goto pop_reg;
- case 'c':
- t1 = jit_type_sys_char;
- goto pop_reg;
- case 's':
- t1 = jit_type_sys_short;
- goto pop_reg;
- case 'i':
- t1 = jit_type_sys_int;
- goto pop_reg;
- case 'l':
- t1 = jit_type_sys_long;
- goto pop_reg;
- case 'N':
- t1 = JIT_TYPE_FLOATVAL;
- goto pop_reg;
- case 'f':
- t1 = jit_type_sys_float;
- goto pop_reg;
- case 'd':
- t1 = jit_type_sys_double;
- goto pop_reg;
- case 'S':
- case 'P':
- case 'O':
- case '@':
- t1 = jit_type_void_ptr;
- pop_reg:
- arg_t[i] = t1;
- arg_v[i] = jit_value_create(f, t1);
- jit_insn_store(f, arg_v[i], reg_v[j]);
- j++;
- break;
-
- case 't':
- arg_t[i] = jit_type_void_ptr;
- arg_v[i] = jit_value_create(f, jit_type_void_ptr);
- jit_insn_store(f, arg_v[i],
- jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
- v1 = jit_insn_eq(f, reg_v[j],
- jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
- l1 = jit_label_undefined;
- jit_insn_branch_if(f, v1, &l1);
- jit_insn_store(f, arg_v[i], jit__Parrot_str_to_cstring(f, jit_interp, reg_v[j]));
- jit_insn_label(f, &l1);
-
- j++;
- break;
-
- case 'b':
- arg_t[i] = jit_type_void_ptr;
- arg_v[i] = jit__Buffer_bufstart(f, reg_v[j]);
- j++;
- break;
-
- case 'B':
- arg_t[i] = jit_type_void_ptr;
- arg_v[i] = jit_value_create(f, jit_type_void_ptr);
- jit_insn_store(f, arg_v[i],
- jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
- v1 = jit_insn_eq(f, reg_v[j],
- jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
- l1 = jit_label_undefined;
- jit_insn_branch_if(f, v1, &l1);
- v2 = jit__Parrot_str_to_cstring(f, jit_interp, reg_v[j]);
- v3 = jit_value_create(f, jit_type_void_ptr);
- jit_value_set_addressable(v3);
- jit_insn_store(f, v3, v2);
- jit_insn_store(f, arg_v[i], jit_insn_address_of(f, v3));
- jit_insn_label(f, &l1);
- j++;
- break;
-
- case 'p':
- arg_t[i] = jit_type_void_ptr;
- arg_v[i] = jit_value_create(f, jit_type_void_ptr);
- jit_insn_store(f, arg_v[i],
- jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
- v1 = jit__PMC_IS_NULL(f, reg_v[j]);
- l1 = jit_label_undefined;
- jit_insn_branch_if(f, v1, &l1);
- v2 = jit__vtable_get_pointer(f, jit_interp, reg_v[j]);
- jit_insn_store(f, arg_v[i], v2);
- jit_insn_label(f, &l1);
- j++;
- break;
-
- case '2':
- t1 = jit_type_sys_short;
- goto call_get_integer;
- case '3':
- t1 = jit_type_sys_int;
- goto call_get_integer;
- case '4':
- t1 = jit_type_sys_long;
- call_get_integer:
- arg_t[i] = jit_type_void_ptr;
- v1 = jit__vtable_get_integer(f, jit_interp, reg_v[j]);
- v2 = jit_value_create(f, t1);
- jit_value_set_addressable(v2);
- jit_insn_store(f, v2, v1);
- arg_v[i] = jit_insn_address_of(f, v2);
- j++;
- break;
-
- case 'V':
- arg_t[i] = jit_type_void_ptr;
- v1 = jit__vtable_get_pointer(f, jit_interp, reg_v[j]);
- v2 = jit_value_create(f, jit_type_void_ptr);
- jit_value_set_addressable(v2);
- jit_insn_store(f, v2, v1);
- arg_v[i] = jit_insn_address_of(f, v2);
- j++;
- break;
-
- case '0':
- arg_t[i] = jit_type_void_ptr;
- arg_v[i] = jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL);
- break;
-
- case 'J':
- arg_t[i] = jit_type_void_ptr;
- arg_v[i] = jit_interp;
- break;
-
- default:
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_JIT_ERROR,
- "unkown arg type '%c'", c);
- return;
+ case 'I':
+ t1 = JIT_TYPE_INTVAL;
+ goto pop_reg;
+ case 'c':
+ t1 = jit_type_sys_char;
+ goto pop_reg;
+ case 's':
+ t1 = jit_type_sys_short;
+ goto pop_reg;
+ case 'i':
+ t1 = jit_type_sys_int;
+ goto pop_reg;
+ case 'l':
+ t1 = jit_type_sys_long;
+ goto pop_reg;
+ case 'N':
+ t1 = JIT_TYPE_FLOATVAL;
+ goto pop_reg;
+ case 'f':
+ t1 = jit_type_sys_float;
+ goto pop_reg;
+ case 'd':
+ t1 = jit_type_sys_double;
+ goto pop_reg;
+ case 'S':
+ case 'P':
+ case 'O':
+ case '@':
+ t1 = jit_type_void_ptr;
+ pop_reg:
+ arg_t[i] = t1;
+ arg_v[i] = jit_value_create(f, t1);
+ jit_insn_store(f, arg_v[i], reg_v[j]);
+ j++;
+ break;
+
+ case 't':
+ arg_t[i] = jit_type_void_ptr;
+ arg_v[i] = jit_value_create(f, jit_type_void_ptr);
+ jit_insn_store(f, arg_v[i],
+ jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
+ v1 = jit_insn_eq(f, reg_v[j],
+ jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
+ l1 = jit_label_undefined;
+ jit_insn_branch_if(f, v1, &l1);
+ jit_insn_store(f, arg_v[i], jit__Parrot_str_to_cstring(f, jit_interp, reg_v[j]));
+ jit_insn_label(f, &l1);
+
+ j++;
+ break;
+
+ case 'b':
+ arg_t[i] = jit_type_void_ptr;
+ arg_v[i] = jit__Buffer_bufstart(f, reg_v[j]);
+ j++;
+ break;
+
+ case 'B':
+ arg_t[i] = jit_type_void_ptr;
+ arg_v[i] = jit_value_create(f, jit_type_void_ptr);
+ jit_insn_store(f, arg_v[i],
+ jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
+ v1 = jit_insn_eq(f, reg_v[j],
+ jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
+ l1 = jit_label_undefined;
+ jit_insn_branch_if(f, v1, &l1);
+ v2 = jit__Parrot_str_to_cstring(f, jit_interp, reg_v[j]);
+ v3 = jit_value_create(f, jit_type_void_ptr);
+ jit_value_set_addressable(v3);
+ jit_insn_store(f, v3, v2);
+ jit_insn_store(f, arg_v[i], jit_insn_address_of(f, v3));
+ jit_insn_label(f, &l1);
+ j++;
+ break;
+
+ case 'p':
+ arg_t[i] = jit_type_void_ptr;
+ arg_v[i] = jit_value_create(f, jit_type_void_ptr);
+ jit_insn_store(f, arg_v[i],
+ jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL));
+ v1 = jit__PMC_IS_NULL(f, reg_v[j]);
+ l1 = jit_label_undefined;
+ jit_insn_branch_if(f, v1, &l1);
+ v2 = jit__vtable_get_pointer(f, jit_interp, reg_v[j]);
+ jit_insn_store(f, arg_v[i], v2);
+ jit_insn_label(f, &l1);
+ j++;
+ break;
+
+ case '2':
+ t1 = jit_type_sys_short;
+ goto call_get_integer;
+ case '3':
+ t1 = jit_type_sys_int;
+ goto call_get_integer;
+ case '4':
+ t1 = jit_type_sys_long;
+ call_get_integer:
+ arg_t[i] = jit_type_void_ptr;
+ v1 = jit__vtable_get_integer(f, jit_interp, reg_v[j]);
+ v2 = jit_value_create(f, t1);
+ jit_value_set_addressable(v2);
+ jit_insn_store(f, v2, v1);
+ arg_v[i] = jit_insn_address_of(f, v2);
+ j++;
+ break;
+
+ case 'V':
+ arg_t[i] = jit_type_void_ptr;
+ v1 = jit__vtable_get_pointer(f, jit_interp, reg_v[j]);
+ v2 = jit_value_create(f, jit_type_void_ptr);
+ jit_value_set_addressable(v2);
+ jit_insn_store(f, v2, v1);
+ arg_v[i] = jit_insn_address_of(f, v2);
+ j++;
+ break;
+
+ case '0':
+ arg_t[i] = jit_type_void_ptr;
+ arg_v[i] = jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)NULL);
+ break;
+
+ case 'J':
+ arg_t[i] = jit_type_void_ptr;
+ arg_v[i] = jit_interp;
+ break;
+
+ default:
+ Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_JIT_ERROR,
+ "unkown arg type '%c'", c);
+ return;
}
}
}
@@ -431,40 +431,40 @@
Parrot_jit_parse_sig_ret_pre(PARROT_INTERP, char *sig) {
char c;
switch (c = sig[0]) {
- case 'v':
- return jit_type_void;
+ case 'v':
+ return jit_type_void;
- case 'I':
- return JIT_TYPE_INTVAL;
- case 'c':
- return jit_type_sys_char;
- case 's':
- return jit_type_sys_short;
- case 'i':
- return jit_type_sys_int;
- case 'l':
- return jit_type_sys_long;
-
- case 'N':
- return JIT_TYPE_FLOATVAL;
- case 'f':
- return jit_type_sys_float;
- case 'd':
- return jit_type_sys_double;
-
- case 'S':
- case 't':
- return jit_type_void_ptr;
-
- case 'p':
- case 'P':
- return jit_type_void_ptr;
-
- default:
- /* FAIL */
- Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_JIT_ERROR,
- "unknown return type '%c'", c);
- return NULL;
+ case 'I':
+ return JIT_TYPE_INTVAL;
+ case 'c':
+ return jit_type_sys_char;
+ case 's':
+ return jit_type_sys_short;
+ case 'i':
+ return jit_type_sys_int;
+ case 'l':
+ return jit_type_sys_long;
+
+ case 'N':
+ return JIT_TYPE_FLOATVAL;
+ case 'f':
+ return jit_type_sys_float;
+ case 'd':
+ return jit_type_sys_double;
+
+ case 'S':
+ case 't':
+ return jit_type_void_ptr;
+
+ case 'p':
+ case 'P':
+ return jit_type_void_ptr;
+
+ default:
+ /* FAIL */
+ Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_JIT_ERROR,
+ "unknown return type '%c'", c);
+ return NULL;
}
}
@@ -476,65 +476,72 @@
jit_type_t t1;
jit_value_t v1, v2, v3;
+ jit_label_t l1;
switch (sig[0]) {
- case 'v':
- break;
+ case 'v':
+ break;
- case 'I':
- case 'c':
- case 's':
- case 'i':
- case 'l':
- ret_t = JIT_TYPE_INTVAL;
- goto fill_ret;
- case 'N':
- case 'f':
- case 'd':
- ret_t = JIT_TYPE_FLOATVAL;
- goto fill_ret;
- case 'S':
- case 'P':
- ret_t = jit_type_void_ptr;
- goto fill_ret;
- case 't':
- ret_t = jit_type_void_ptr;
- ret_v = jit__Parrot_str_new(f, jit_interp, ret_v,
- jit_value_create_nint_constant(f, jit_type_sys_int, 0));
- goto fill_ret;
- case 'p':
- ret_t = jit_type_void_ptr;
- v1 = jit__pmc_new_noinit(f, jit_interp,
- jit_value_create_intval_constant(f, enum_class_UnManagedStruct));
- jit__vtable_set_pointer(f, jit_interp, v1, ret_v);
- ret_v = v1;
- goto fill_ret;
- case '2':
- t1 = jit_type_sys_short;
- goto create_int_pmc;
- case '3':
- t1 = jit_type_sys_int;
- goto create_int_pmc;
- case '4':
- t1 = jit_type_sys_long;
- create_int_pmc:
- ret_t = jit_type_void_ptr;
- v1 = jit_insn_load_relative(f, ret_v, 0, t1);
- v2 = jit__pmc_new_noinit(f, jit_interp,
- jit_value_create_intval_constant(f, enum_class_Integer));
- jit__vtable_set_integer_native(f, jit_interp, v2, v1);
- ret_v = v2;
- fill_ret:
-# ifdef PARROT_i386
+ case 'I':
+ case 'c':
+ case 's':
+ case 'i':
+ case 'l':
+ ret_t = JIT_TYPE_INTVAL;
+ goto fill_ret;
+ case 'N':
+ case 'f':
+ case 'd':
+ ret_t = JIT_TYPE_FLOATVAL;
+ goto fill_ret;
+ case 'S':
+ case 'P':
+ ret_t = jit_type_void_ptr;
+ goto fill_ret;
+ case 't':
+ ret_t = jit_type_void_ptr;
+ ret_v = jit__Parrot_str_new(f, jit_interp, ret_v,
+ jit_value_create_nint_constant(f, jit_type_sys_int, 0));
+ goto fill_ret;
+ case 'p':
+ ret_t = jit_type_void_ptr;
+ v1 = jit_value_create(f, jit_type_void_ptr);
+ jit_insn_store(f, v1,
+ jit_value_create_nint_constant(f, jit_type_void_ptr, (jit_nint)PMCNULL));
+ l1 = jit_label_undefined;
+ jit_insn_branch_if_not(f, ret_v, &l1);
+ jit_insn_store(f, v1,
+ jit__pmc_new_noinit(f, jit_interp,
+ jit_value_create_intval_constant(f, enum_class_UnManagedStruct)));
+ jit__vtable_set_pointer(f, jit_interp, v1, ret_v);
+ jit_insn_label(f, &l1);
+ ret_v = v1;
+ goto fill_ret;
+ case '2':
+ t1 = jit_type_sys_short;
+ goto create_int_pmc;
+ case '3':
+ t1 = jit_type_sys_int;
+ goto create_int_pmc;
+ case '4':
+ t1 = jit_type_sys_long;
+ create_int_pmc:
+ ret_t = jit_type_void_ptr;
+ v1 = jit_insn_load_relative(f, ret_v, 0, t1);
+ v2 = jit__pmc_new_noinit(f, jit_interp,
+ jit_value_create_intval_constant(f, enum_class_Integer));
+ jit__vtable_set_integer_native(f, jit_interp, v2, v1);
+ ret_v = v2;
+ fill_ret:
/* TODO: fix libjit native type promotion bug */
jit_value_set_volatile(ret_v);
jit__null_func(f);
-# endif
- jit__Parrot_pcc_fill_returns_from_c_args(f, jit_interp, call_object, pcc_sig, &ret_t, &ret_v, 1);
- break;
- default:
- /* ignore (failed elsewhere) */
- break;
+ jit__Parrot_pcc_fill_returns_from_c_args(f, jit_interp, call_object, pcc_sig, &ret_t, &ret_v, 1);
+ break;
+
+ default:
+ /* ignore (failed elsewhere) */
+ break;
}
}
@@ -550,56 +557,56 @@
jit_type_t t1;
jit_value_t v1;
switch (sig[i]) {
- case 't':
- jit__Parrot_str_free_cstring(f, args[i]);
- j++;
- break;
-
- case 'B':
- v1 = jit_insn_load_relative(f, args[i], 0, jit_type_void_ptr);
- jit__Parrot_str_free_cstring(f, v1);
- j++;
- break;
-
- case '2':
- t1 = jit_type_sys_short;
- goto set_integer;
- case '3':
- t1 = jit_type_sys_int;
- goto set_integer;
- case '4':
- t1 = jit_type_sys_long;
- set_integer:
- v1 = jit_insn_load_relative(f, args[i], 0, t1);
- jit__vtable_set_integer_native(f, jit_interp, regs[j], v1);
- j++;
- break;
-
- case 'V':
- v1 = jit_insn_load_relative(f, args[i], 0, jit_type_void_ptr);
- jit__vtable_set_pointer(f, jit_interp, regs[j], v1);
- j++;
- break;
-
- case 'I':
- case 'c':
- case 'i':
- case 'l':
- case 'N':
- case 'f':
- case 'd':
- case 'S':
- case 'b':
- case 'p':
- case 'P':
- case 'O':
- case '@':
- j++;
- break;
-
- default:
- /* ignore */
- break;
+ case 't':
+ jit__Parrot_str_free_cstring(f, args[i]);
+ j++;
+ break;
+
+ case 'B':
+ v1 = jit_insn_load_relative(f, args[i], 0, jit_type_void_ptr);
+ jit__Parrot_str_free_cstring(f, v1);
+ j++;
+ break;
+
+ case '2':
+ t1 = jit_type_sys_short;
+ goto set_integer;
+ case '3':
+ t1 = jit_type_sys_int;
+ goto set_integer;
+ case '4':
+ t1 = jit_type_sys_long;
+ set_integer:
+ v1 = jit_insn_load_relative(f, args[i], 0, t1);
+ jit__vtable_set_integer_native(f, jit_interp, regs[j], v1);
+ j++;
+ break;
+
+ case 'V':
+ v1 = jit_insn_load_relative(f, args[i], 0, jit_type_void_ptr);
+ jit__vtable_set_pointer(f, jit_interp, regs[j], v1);
+ j++;
+ break;
+
+ case 'I':
+ case 'c':
+ case 'i':
+ case 'l':
+ case 'N':
+ case 'f':
+ case 'd':
+ case 'S':
+ case 'b':
+ case 'p':
+ case 'P':
+ case 'O':
+ case '@':
+ j++;
+ break;
+
+ default:
+ /* ignore */
+ break;
}
}
}
Modified: branches/libjit_framebuilder2/lib/Parrot/NativeCall.pm
==============================================================================
--- branches/libjit_framebuilder2/lib/Parrot/NativeCall.pm Fri Jan 15 03:19:15 2010 (r43460)
+++ branches/libjit_framebuilder2/lib/Parrot/NativeCall.pm Fri Jan 15 03:36:09 2010 (r43461)
@@ -40,16 +40,20 @@
our %signature_table = (
p => {
as_proto => "void *",
- other_decl => "PMC * const final_destination = pmc_new(interp, enum_class_UnManagedStruct);",
+ other_decl => "PMC * final_destination = PMCNULL;",
sig_char => "P",
- ret_assign => "VTABLE_set_pointer(interp, final_destination, return_data);\n Parrot_pcc_fill_returns_from_c_args(interp, call_object, \"P\", final_destination);",
+ ret_assign => "if (return_data != NULL) {\n" .
+ " final_destination = pmc_new(interp, enum_class_UnManagedStruct);\n" .
+ " VTABLE_set_pointer(interp, final_destination, return_data);\n" .
+ " }\n" .
+ " Parrot_pcc_fill_returns_from_c_args(interp, call_object, \"P\", final_destination);",
},
- i => { as_proto => "int", sig_char => "I" },
- l => { as_proto => "long", sig_char => "I" },
- c => { as_proto => "char", sig_char => "I" },
- s => { as_proto => "short", sig_char => "I" },
- f => { as_proto => "float", sig_char => "N" },
- d => { as_proto => "double", sig_char => "N" },
+ i => { as_proto => "int", sig_char => "I", return_type => "INTVAL" },
+ l => { as_proto => "long", sig_char => "I", return_type => "INTVAL" },
+ c => { as_proto => "char", sig_char => "I", return_type => "INTVAL" },
+ s => { as_proto => "short", sig_char => "I", return_type => "INTVAL" },
+ f => { as_proto => "float", sig_char => "N", return_type => "FLOATVAL" },
+ d => { as_proto => "double", sig_char => "N", return_type => "FLOATVAL" },
t => { as_proto => "char *",
other_decl => "STRING *final_destination;",
ret_assign => "final_destination = Parrot_str_new(interp, return_data, 0);\n Parrot_pcc_fill_returns_from_c_args(interp, call_object, \"S\", final_destination);",
More information about the parrot-commits
mailing list