[svn:parrot] r49759 - branches/gsoc_nci/config/gen/libffi
plobsing at svn.parrot.org
plobsing at svn.parrot.org
Sun Oct 31 16:27:16 UTC 2010
Author: plobsing
Date: Sun Oct 31 16:27:16 2010
New Revision: 49759
URL: https://trac.parrot.org/parrot/changeset/49759
Log:
copy nci.pmc into config files (will survive reconfig)
Modified:
branches/gsoc_nci/config/gen/libffi/nci-ffi.pmc.in
Modified: branches/gsoc_nci/config/gen/libffi/nci-ffi.pmc.in
==============================================================================
--- branches/gsoc_nci/config/gen/libffi/nci-ffi.pmc.in Sun Oct 31 16:25:36 2010 (r49758)
+++ branches/gsoc_nci/config/gen/libffi/nci-ffi.pmc.in Sun Oct 31 16:27:16 2010 (r49759)
@@ -61,11 +61,23 @@
typedef struct pmc_holder_t {
PMC* p;
union {
- INTVAL* ival;
- void** pval;
+ short s;
+ int i;
+ long l;
+ void *ptr;
+ };
+ union {
+ INTVAL *ival;
+ void **pval;
};
} pmc_holder_t;
+typedef struct {
+ INTVAL i;
+ FLOATVAL n;
+ STRING *s;
+ PMC *p;
+} parrot_var_t;
/*
@@ -144,6 +156,43 @@
}
}
+/*
+
+=item C<void sig_to_pcc_cif(PARROT_INTERP, Parrot_NCI_attributes *nci)>
+
+generate Parrot_pcc_fill_params_from_c_args dynamic call infrastructure
+
+=cut
+
+*/
+
+static void
+sig_to_pcc_cif(PARROT_INTERP, Parrot_NCI_attributes *nci)
+{
+ INTVAL argc = Parrot_str_length(interp, nci->pcc_params_signature) + 3;
+ ffi_type **arg_t = nci->pcc_arg_types =
+ mem_gc_allocate_n_zeroed_typed(interp, argc, ffi_type *);
+ int i;
+
+ arg_t[0] = &ffi_type_pointer; /* interp */
+ arg_t[1] = &ffi_type_pointer; /* call object */
+ arg_t[2] = &ffi_type_pointer; /* pcc signature */
+ for (i = 3; i < argc; i++)
+ arg_t[i] = &ffi_type_pointer; /* INSP pointer */
+
+ if (ffi_prep_cif(&nci->pcc_cif, FFI_DEFAULT_ABI, argc, &ffi_type_void, arg_t) !=
+ FFI_OK)
+ Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_JIT_ERROR, "invalid ffi signature");
+}
+
+/*
+
+=item C<void build_libffi_func(PARROT_INTERP, Parrot_NCI_attributes *nci)>
+
+=cut
+
+*/
+
static void
build_libffi_func(PARROT_INTERP, ARGMOD(Parrot_NCI_attributes *nci))
{
@@ -159,6 +208,7 @@
nci->arity = VTABLE_elements(interp, nci->signature) - 1;
sig_to_cif(interp, nci);
+ sig_to_pcc_cif(interp, nci);
}
pmclass NCI auto_attrs provides invokable {
@@ -168,14 +218,18 @@
ATTR void *func; /* Function pointer to call. */
ATTR void *orig_func;
ATTR PMC *fb_info; /* Frame-builder info */
- ATTR void *cif; /* Function interface */
- ATTR void *arg_types; /* Used for building the libffi call interface */
/* Parrot Sub-ish attributes */
ATTR STRING *pcc_params_signature;
ATTR STRING *pcc_return_signature;
ATTR INTVAL arity;
+ /* LibFFI attributes */
+ ATTR void *cif;
+ ATTR void *arg_types;
+ ATTR ffi_cif pcc_cif;
+ ATTR ffi_type **pcc_arg_types;
+
/* MMD fields */
ATTR STRING *long_signature; /* The full signature. */
ATTR PMC *multi_sig; /* type tuple array (?) */
@@ -290,9 +344,10 @@
VTABLE void destroy() {
if (PARROT_NCI(SELF)) {
- Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
- mem_sys_free(nci_info->cif);
- mem_sys_free(nci_info->arg_types);
+ Parrot_NCI_attributes *nci = PARROT_NCI(SELF);
+ mem_gc_free(INTERP, nci->cif);
+ mem_gc_free(INTERP, nci->arg_types);
+ mem_gc_free(INTERP, nci->pcc_arg_types);
}
}
@@ -362,26 +417,20 @@
Parrot_NCI_attributes * const nci_info = PARROT_NCI(SELF);
char *sig_str;
PMC *cont;
- INTVAL return_size = sizeof (void*);
PMC *ctx = CURRENT_CONTEXT(interp);
PMC *call_object = Parrot_pcc_get_signature(interp, ctx);
void (*func)(void*,void*,void*); /* a function pointer for our function to call */
- PMC *positional, *arg_iter;
- STRING *void_return;
void **values;
- void **pcc_ptr;
+ parrot_var_t *pcc_arg;
void **translation_pointers = NULL; /* Data translation pointers, used to hold values
that are passed by reference so we can update
the objects after the FFI call is over */
- void **pcc_val = NULL; /* A holder for the values passed to pcc */
void **middle_man = NULL; /* An array to hold various pointers so they are not lost if
the function changes values by reference */
void *return_data; /* Holds return data from FFI call */
- size_t count, i, j_offset;
- char *tmp_sig;
- ffi_cif *cif, pcc_cif;
- ffi_type **pcc_args;
+ int i, j;
+ ffi_cif *cif;
cif = (ffi_cif*)nci_info->cif;
func = (void (*)(void*, void*, void*))nci_info->func;
@@ -397,69 +446,65 @@
"attempt to call NULL function");
}
- if (nci_info->arity > 0) {
- size_t pcc_argc, pcc_values_offset, pcc_values_size, values_size;
- /* Function has arguments */
- pcc_args = mem_internal_allocate_n_zeroed_typed(nci_info->arity + 4, ffi_type*);
- tmp_sig = Parrot_str_to_cstring(interp, nci_info->pcc_params_signature);
-
- pcc_args[0] = &ffi_type_pointer;
- pcc_args[1] = &ffi_type_pointer;
- pcc_args[2] = &ffi_type_pointer;
- pcc_values_size = 0;
- values_size = 0;
- pcc_argc = Parrot_str_length(interp, nci_info->pcc_params_signature);
+ /* dynamic call to Parrot_pcc_fill_params_from_c_args */
+ {
+ INTVAL pcc_argc = Parrot_str_length(interp, nci_info->pcc_params_signature);
+ char *pcc_sig = Parrot_str_to_cstring(interp, nci_info->pcc_params_signature);
+
+ void **pcc_arg_ptr, **call_arg;
+
+ ffi_arg ffi_ret_dummy;
+
+ pcc_arg = mem_gc_allocate_n_zeroed_typed(interp, pcc_argc, parrot_var_t);
+ pcc_arg_ptr = mem_gc_allocate_n_zeroed_typed(interp, pcc_argc, void *);
+ call_arg = mem_gc_allocate_n_zeroed_typed(interp, pcc_argc + 3, void*);
+
+ /* setup Parrot_pcc_fill_params_from_c_args required arguments */
+ call_arg[0] = &interp;
+ call_arg[1] = &call_object;
+ call_arg[2] = &pcc_sig;
+
+ // TODO: eliminate PCC signature parsing somehow
+ for (i = 0; i < pcc_argc; i++) {
+ switch (pcc_sig[i]) {
+ case 'I':
+ pcc_arg_ptr[i] = &pcc_arg[i].i;
+ break;
+ case 'N':
+ pcc_arg_ptr[i] = &pcc_arg[i].n;
+ break;
+ case 'S':
+ pcc_arg_ptr[i] = &pcc_arg[i].s;
+ break;
+ case 'P':
+ pcc_arg_ptr[i] = &pcc_arg[i].p;
+ break;
+ }
+
+ call_arg[i + 3] = &pcc_arg_ptr[i];
+ }
+
+ ffi_call(&nci_info->pcc_cif, FFI_FN(Parrot_pcc_fill_params_from_c_args), &ffi_ret_dummy, call_arg);
+
+ mem_gc_free(interp, call_arg);
+ mem_gc_free(interp, pcc_arg_ptr);
+ Parrot_str_free_cstring(pcc_sig);
+ }
+
+ {
+ size_t values_size = 0;
/* Add up the size of memory needed for the actual call */
for (i = 0; i < (size_t)nci_info->arity; i++) {
values_size += cif->arg_types[i]->size;
}
- pcc_ptr = (void**)mem_internal_allocate_n_zeroed_typed(pcc_argc + 4, void*);
-
- /* Setup Parrot_pcc_fill_params_from_c_args required arguments */
- pcc_ptr[0] = &interp;
- pcc_ptr[1] = &call_object;
- pcc_ptr[2] = &tmp_sig;
-
- pcc_val = mem_internal_allocate_n_zeroed_typed(pcc_argc, void*);
/* Allocate enough room for the values passed to the ffi function plus add some
padding just to be sure we have enough space. */
values = mem_internal_allocate_zeroed(values_size + 2 * sizeof(void*));
/* Middle man is used to contain */
middle_man = mem_internal_allocate_n_zeroed_typed(nci_info->arity, void*);
- /* Add up the size of the pcc arguments */
- for (i = 0; i < pcc_argc; i++) {
- pcc_args[i + 3] = &ffi_type_pointer;
- if (tmp_sig[i] == 'N') {
- pcc_val[i] = mem_internal_allocate_typed(FLOATVAL);
- pcc_ptr[i+3] = &pcc_val[i];
- }
- else if (tmp_sig[i] == 'I') {
- pcc_val[i] = mem_internal_allocate_typed(INTVAL);
- pcc_ptr[i+3] = &pcc_val[i];
- }
- else if (tmp_sig[i] == 'P' || tmp_sig[i] == 'S') {
- pcc_val[i] = mem_internal_allocate_typed(void*);
- pcc_ptr[i+3] = &pcc_val[i];
- }
- }
-
- if (ffi_prep_cif(&pcc_cif, FFI_DEFAULT_ABI, 3 + pcc_argc,
- &ffi_type_void, pcc_args) != FFI_OK) {
- Parrot_ex_throw_from_c_args(INTERP, NULL,
- EXCEPTION_INVALID_OPERATION,
- "Bad signature generated for Parrot_pcc_fill_params_from_c_args in NCI");
- }
-
- {
- ffi_arg ret;
- ffi_call(&pcc_cif, FFI_FN(Parrot_pcc_fill_params_from_c_args), &ret, pcc_ptr);
- }
-
- Parrot_str_free_cstring(tmp_sig);
-
/*
* Apply Argument Transformations
* this is mostly to transform STRING* into char*
@@ -467,130 +512,122 @@
* but other transformations might apply later, like packing an
* object into a ManagedStruct
*/
- j_offset = 0;
translation_pointers = mem_internal_allocate_n_zeroed_typed(nci_info->arity, void*);
- for (i = 0; i < (size_t)nci_info->arity; i++) {
+ for (i = 0, j = 0; i < (size_t)nci_info->arity; i++) {
+ pmc_holder_t *pmc_holder;
switch (VTABLE_get_integer_keyed_int(interp, nci_info->signature, i + 1)) {
case enum_nci_sig_interp:
values[i] = &interp;
- j_offset++;
break;
case enum_nci_sig_string:
- translation_pointers[i] = *(STRING**)pcc_val[i - j_offset];
- values[i] = &translation_pointers[i];
+ translation_pointers[i] = pcc_arg[j++].s;
+ values[i] = &translation_pointers[i];
break;
case enum_nci_sig_cstring:
- if (STRING_IS_NULL(*(STRING**)pcc_val[i - j_offset])) {
- translation_pointers[i] = (char*) NULL;
- }
- else {
- translation_pointers[i] = Parrot_str_to_cstring(interp, *(STRING**)pcc_val[i - j_offset]);
- }
+ translation_pointers[i] = STRING_IS_NULL(pcc_arg[j].s) ?
+ (char *)NULL :
+ Parrot_str_to_cstring(interp, pcc_arg[j].s);
+ j++;
values[i] = &translation_pointers[i];
break;
case enum_nci_sig_bufref:
- if (STRING_IS_NULL(*(STRING**)pcc_val[i - j_offset])) {
- translation_pointers[i] = (char*) NULL;
- }
- else {
- translation_pointers[i] = Parrot_str_to_cstring(interp, *(STRING**)pcc_val[i - j_offset]);
- }
- middle_man[i] = &translation_pointers[i];
- values[i] = &middle_man[i];
+ translation_pointers[i] = STRING_IS_NULL(pcc_arg[j].s) ?
+ (char *)NULL :
+ Parrot_str_to_cstring(interp, pcc_arg[j].s);
+ j++;
+ middle_man[i] = &translation_pointers[i];
+ values[i] = &middle_man[i];
break;
case enum_nci_sig_cstringref:
- values[i] = &Buffer_bufstart(*(STRING**)pcc_val[i - j_offset]);
+ values[i] = &Buffer_bufstart(pcc_arg[j++].s);
break;
case enum_nci_sig_char:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(char);
- *((char**)translation_pointers)[i] = (char)*(INTVAL*)pcc_val[i - j_offset];
- values[i] = translation_pointers[i];
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(char);
+ *(char *)(translation_pointers[i]) = (char)pcc_arg[j++].i;
+ values[i] = translation_pointers[i];
break;
case enum_nci_sig_shortref:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(pmc_holder_t);
- ((pmc_holder_t*)translation_pointers[i])->p = *(PMC**)pcc_val[i - j_offset];
- ((pmc_holder_t*)translation_pointers[i])->ival = (INTVAL*)mem_internal_allocate_zeroed_typed(short);
- *((pmc_holder_t*)translation_pointers[i])->ival = (short)VTABLE_get_integer(interp, *(PMC**)pcc_ptr[i - j_offset]);
- values[i] = &((pmc_holder_t*)translation_pointers[i])->ival;
+ pmc_holder = translation_pointers[i]
+ = mem_internal_allocate_zeroed_typed(pmc_holder_t);
+ pmc_holder->p = pcc_arg[j].p;
+ pmc_holder->ival = &pmc_holder->s;
+ pmc_holder->s = (short)VTABLE_get_integer(interp, pcc_arg[j].p);
+ j++;
+ values[i] = &pmc_holder->ival;
break;
case enum_nci_sig_short:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(short);
- *((short**)translation_pointers)[i] = (short)*(INTVAL*)pcc_val[i - j_offset];
- values[i] = translation_pointers[i];
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(short);
+ *(short *)(translation_pointers[i]) = (short)pcc_arg[j++].i;
+ values[i] = translation_pointers[i];
break;
case enum_nci_sig_intref:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(pmc_holder_t);
- ((pmc_holder_t*)translation_pointers[i])->p = *(PMC**)pcc_val[i - j_offset];
- ((pmc_holder_t*)translation_pointers[i])->ival = (INTVAL*)mem_internal_allocate_zeroed_typed(int);
- *((pmc_holder_t*)translation_pointers[i])->ival = (int)VTABLE_get_integer(interp, *(PMC**)pcc_val[i - j_offset]);
- values[i] = &((pmc_holder_t*)translation_pointers[i])->ival;
+ pmc_holder = translation_pointers[i]
+ = mem_internal_allocate_zeroed_typed(pmc_holder_t);
+ pmc_holder->p = pcc_arg[j].p;
+ pmc_holder->ival = &pmc_holder->i;
+ pmc_holder->i = (int)VTABLE_get_integer(interp, pcc_arg[j].p);
+ j++;
+ values[i] = &pmc_holder->ival;
break;
case enum_nci_sig_int:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(int);
- *((int**)translation_pointers)[i] = (int)*(INTVAL*)pcc_val[i - j_offset];
- values[i] = translation_pointers[i];
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(int);
+ *(int *)(translation_pointers[i]) = (int)pcc_arg[j++].i;
+ values[i] = translation_pointers[i];
break;
case enum_nci_sig_longref:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(pmc_holder_t);
- ((pmc_holder_t*)translation_pointers[i])->p = *(PMC**)pcc_val[i - j_offset];
- ((pmc_holder_t*)translation_pointers[i])->ival = (INTVAL*)mem_internal_allocate_zeroed_typed(long);
- *((pmc_holder_t*)translation_pointers[i])->ival = (long)VTABLE_get_integer(interp, *(PMC**)pcc_val[i - j_offset]);
- values[i] = &((pmc_holder_t*)translation_pointers[i])->ival;
+ pmc_holder = translation_pointers[i]
+ = mem_internal_allocate_zeroed_typed(pmc_holder_t);
+ pmc_holder->p = pcc_arg[j].p;
+ pmc_holder->ival = &pmc_holder->l;
+ pmc_holder->l = (long)VTABLE_get_integer(interp, pcc_arg[j].p);
+ j++;
+ values[i] = &pmc_holder->ival;
break;
case enum_nci_sig_long:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(long);
- *((long**)translation_pointers)[i] = (long)*(INTVAL*)pcc_val[i - j_offset];
- values[i] = translation_pointers[i];
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(long);
+ *(long *)(translation_pointers[i]) = (long)pcc_arg[j++].i;
+ values[i] = translation_pointers[i];
break;
case enum_nci_sig_ptrref:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(pmc_holder_t);
- ((pmc_holder_t*)translation_pointers[i])->p = *(PMC**)pcc_val[i - j_offset];
- ((pmc_holder_t*)translation_pointers[i])->pval = (void**)mem_internal_allocate_zeroed_typed(void*);
- *((pmc_holder_t*)translation_pointers[i])->pval = PMC_IS_NULL(*(PMC**)pcc_val[i - j_offset]) ?
- (void *)NULL : (void*)VTABLE_get_pointer(interp, *(PMC**)pcc_val[i - j_offset]);
- values[i] = &((pmc_holder_t*)translation_pointers[i])->pval;
+ pmc_holder = translation_pointers[i]
+ = mem_internal_allocate_zeroed_typed(pmc_holder_t);
+ pmc_holder->p = pcc_arg[j].p;
+ pmc_holder->pval = &pmc_holder->ptr;
+ pmc_holder->ptr = PMC_IS_NULL(pcc_arg[j].p) ?
+ (void *)NULL :
+ (void *)VTABLE_get_pointer(interp, pcc_arg[j].p);
+ j++;
+ values[i] = &pmc_holder->pval;
break;
case enum_nci_sig_pmc:
- translation_pointers[i] = *(PMC**)pcc_val[i - j_offset];
- values[i] = &translation_pointers[i];
+ translation_pointers[i] = pcc_arg[j++].p;
+ values[i] = &translation_pointers[i];
break;
case enum_nci_sig_ptr:
- translation_pointers[i] = PMC_IS_NULL(*(PMC**)pcc_val[i - j_offset]) ?
- (void *)NULL : VTABLE_get_pointer(interp, *(PMC**)pcc_val[i - j_offset]);
- values[i] = &translation_pointers[i];
+ translation_pointers[i] = PMC_IS_NULL(pcc_arg[j].p) ?
+ (void *)NULL : VTABLE_get_pointer(interp, pcc_arg[j].p);
+ j++;
+ values[i] = &translation_pointers[i];
break;
case enum_nci_sig_float:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(float);
- *((float**)translation_pointers)[i] = (float)*(FLOATVAL*)pcc_val[i - j_offset];
- values[i] = translation_pointers[i];
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(float);
+ *(float *)(translation_pointers[i]) = (float)pcc_arg[j++].n;
+ values[i] = translation_pointers[i];
break;
case enum_nci_sig_double:
- translation_pointers[i] = mem_internal_allocate_zeroed_typed(double);
- *((double**)translation_pointers)[i] = *(FLOATVAL*)pcc_val[i - j_offset];
- values[i] = translation_pointers[i];
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(double);
+ *(double *)(translation_pointers[i]) = (double)pcc_arg[j++].n;
+ values[i] = translation_pointers[i];
break;
- default:
+ case enum_nci_sig_numval:
+ translation_pointers[i] = mem_internal_allocate_zeroed_typed(FLOATVAL);
+ *(FLOATVAL *)(translation_pointers[i]) = pcc_arg[j++].n;
+ values[i] = translation_pointers[i];
break;
}
}
- if (pcc_args) {
- mem_sys_free(pcc_args);
- }
- if (pcc_ptr) {
- mem_sys_free(pcc_ptr);
- }
- if (pcc_val) {
- for (i = 0; i < pcc_argc; i++) {
- mem_sys_free(pcc_val[i]);
- }
- if (pcc_val)
- mem_sys_free(pcc_val);
- }
- }
- else {
- /* No arguments */
- values = NULL;
+ mem_gc_free(interp, pcc_arg);
}
/*
@@ -602,56 +639,51 @@
ffi_call(cif, FFI_FN(func), return_data, values);
if (cif->rtype != &ffi_type_void) {
- char *s;
- PMC *ret_object;
+ char *s;
+ PMC *ret_object;
+ parrot_var_t final_destination;
s = Parrot_str_to_cstring(interp, nci_info->pcc_return_signature);
switch (VTABLE_get_integer_keyed_int(interp, nci_info->signature, 0)) {
case enum_nci_sig_ptr:
- {
- PMC *final_destination = PMCNULL;
+ final_destination.p = PMCNULL;
- if (*(void**)return_data != NULL) {
- final_destination = Parrot_pmc_new(interp, enum_class_UnManagedStruct);
- VTABLE_set_pointer(interp, final_destination, *(void**)return_data);
- }
- ret_object = Parrot_pcc_build_call_from_c_args(interp,
- call_object,
- s, final_destination);
- }
+ if (*(void **)return_data != NULL) {
+ final_destination.p = Parrot_pmc_new(interp, enum_class_UnManagedStruct);
+ VTABLE_set_pointer(interp, final_destination.p, *(void **)return_data);
+ }
+ ret_object = Parrot_pcc_build_call_from_c_args(interp,
+ call_object,
+ s, final_destination.p);
break;
case enum_nci_sig_cstring:
- {
- STRING *final_destination = Parrot_str_new(interp, *(char**)return_data, 0);
- ret_object = Parrot_pcc_build_call_from_c_args(interp,
- call_object,
- s, final_destination);
- }
+ final_destination.s = Parrot_str_new(interp, *(char **)return_data, 0);
+ ret_object = Parrot_pcc_build_call_from_c_args(interp,
+ call_object,
+ s, final_destination.s);
break;
case enum_nci_sig_float:
- {
- FLOATVAL final_destination = *(float*)return_data;
+ final_destination.n = *(float *)return_data;
- ret_object = Parrot_pcc_build_call_from_c_args(interp,
- call_object,
- s, final_destination);
- }
+ ret_object = Parrot_pcc_build_call_from_c_args(interp,
+ call_object,
+ s, final_destination.n);
break;
default:
switch (s[0]) {
case 'N':
ret_object = Parrot_pcc_build_call_from_c_args(interp,
call_object,
- s, *(FLOATVAL*)return_data);
+ s, *(FLOATVAL *)return_data);
case 'I':
ret_object = Parrot_pcc_build_call_from_c_args(interp,
call_object,
- s, *(INTVAL*)return_data);
+ s, *(INTVAL *)return_data);
case 'P':
case 'S':
default:
ret_object = Parrot_pcc_build_call_from_c_args(interp,
call_object,
- s, *(void**)return_data);
+ s, *(void **)return_data);
}
break;
}
@@ -677,34 +709,26 @@
case enum_nci_sig_shortref:
VTABLE_set_integer_native(interp,
((pmc_holder_t*)translation_pointers[i])->p,
- (INTVAL)*(short*)((pmc_holder_t*)translation_pointers[i])->ival);
- if (translation_pointers[i]) {
- mem_sys_free(translation_pointers[i]);
- }
+ ((pmc_holder_t*)translation_pointers[i])->s);
+ mem_sys_free(translation_pointers[i]);
break;
case enum_nci_sig_intref:
VTABLE_set_integer_native(interp,
((pmc_holder_t*)translation_pointers[i])->p,
- (INTVAL)*(int*)((pmc_holder_t*)translation_pointers[i])->ival);
- if (translation_pointers[i]) {
- mem_sys_free(translation_pointers[i]);
- }
+ ((pmc_holder_t*)translation_pointers[i])->i);
+ mem_sys_free(translation_pointers[i]);
break;
case enum_nci_sig_longref:
VTABLE_set_integer_native(interp,
((pmc_holder_t*)translation_pointers[i])->p,
- (INTVAL)*(long*)((pmc_holder_t*)translation_pointers[i])->ival);
- if (translation_pointers[i]) {
- mem_sys_free(translation_pointers[i]);
- }
+ ((pmc_holder_t*)translation_pointers[i])->l);
+ mem_sys_free(translation_pointers[i]);
break;
case enum_nci_sig_ptrref:
VTABLE_set_pointer(interp,
((pmc_holder_t*)translation_pointers[i])->p,
- (PMC*)*((pmc_holder_t*)translation_pointers[i])->pval);
- if (translation_pointers[i]) {
- mem_sys_free(translation_pointers[i]);
- }
+ ((pmc_holder_t*)translation_pointers[i])->ptr);
+ mem_sys_free(translation_pointers[i]);
break;
case enum_nci_sig_double:
case enum_nci_sig_char:
@@ -720,15 +744,9 @@
}
}
- if (nci_info->arity > 0 && middle_man) {
- mem_sys_free(middle_man);
- }
- if (return_data) {
- mem_sys_free(return_data);
- }
- if (values) {
- mem_sys_free(values);
- }
+ mem_sys_free(middle_man);
+ mem_sys_free(return_data);
+ mem_sys_free(values);
cont = INTERP->current_cont;
More information about the parrot-commits
mailing list