[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