[svn:parrot] r49755 - branches/gsoc_nci/src/pmc
plobsing at svn.parrot.org
plobsing at svn.parrot.org
Sun Oct 31 15:26:18 UTC 2010
Author: plobsing
Date: Sun Oct 31 15:26:18 2010
New Revision: 49755
URL: https://trac.parrot.org/parrot/changeset/49755
Log:
in stead of keeping track of when we don't advance in PCC wrt NCI, keep separate iterators for each
Modified:
branches/gsoc_nci/src/pmc/nci.pmc
Modified: branches/gsoc_nci/src/pmc/nci.pmc
==============================================================================
--- branches/gsoc_nci/src/pmc/nci.pmc Sun Oct 31 15:11:05 2010 (r49754)
+++ branches/gsoc_nci/src/pmc/nci.pmc Sun Oct 31 15:26:18 2010 (r49755)
@@ -426,8 +426,7 @@
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;
+ int i, j;
ffi_cif *cif;
cif = (ffi_cif*)nci_info->cif;
@@ -512,111 +511,116 @@
* 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++) {
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] = pcc_arg[i - j_offset].s;
+ translation_pointers[i] = pcc_arg[j++].s;
values[i] = &translation_pointers[i];
break;
case enum_nci_sig_cstring:
- if (STRING_IS_NULL(pcc_arg[i - j_offset].s)) {
+ if (STRING_IS_NULL(pcc_arg[j].s)) {
translation_pointers[i] = (char*) NULL;
}
else {
- translation_pointers[i] = Parrot_str_to_cstring(interp, pcc_arg[i - j_offset].s);
+ translation_pointers[i] = 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(pcc_arg[i - j_offset].s)) {
+ if (STRING_IS_NULL(pcc_arg[j].s)) {
translation_pointers[i] = (char*) NULL;
}
else {
- translation_pointers[i] = Parrot_str_to_cstring(interp, pcc_arg[i - j_offset].s);
+ translation_pointers[i] = 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(pcc_arg[i - j_offset].s);
+ 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)pcc_arg[i - j_offset].i;
+ *((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 = pcc_arg[i - j_offset].p;
+ ((pmc_holder_t*)translation_pointers[i])->p = pcc_arg[j].p;
((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, pcc_arg[i - j_offset].p);
+ *((pmc_holder_t*)translation_pointers[i])->ival = (short)VTABLE_get_integer(interp, pcc_arg[j].p);
+ j++;
values[i] = &((pmc_holder_t*)translation_pointers[i])->ival;
break;
case enum_nci_sig_short:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(short);
- *((short**)translation_pointers)[i] = (short)pcc_arg[i - j_offset].i;
+ *((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 = pcc_arg[i - j_offset].p;
+ ((pmc_holder_t*)translation_pointers[i])->p = pcc_arg[j].p;
((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, pcc_arg[i - j_offset].p);
+ *((pmc_holder_t*)translation_pointers[i])->ival = (int)VTABLE_get_integer(interp, pcc_arg[j].p);
+ j++;
values[i] = &((pmc_holder_t*)translation_pointers[i])->ival;
break;
case enum_nci_sig_int:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(int);
- *((int**)translation_pointers)[i] = (int)pcc_arg[i - j_offset].i;
+ *((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 = pcc_arg[i - j_offset].p;
+ ((pmc_holder_t*)translation_pointers[i])->p = pcc_arg[j].p;
((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, pcc_arg[i - j_offset].p);
+ *((pmc_holder_t*)translation_pointers[i])->ival = (long)VTABLE_get_integer(interp, pcc_arg[j].p);
+ j++;
values[i] = &((pmc_holder_t*)translation_pointers[i])->ival;
break;
case enum_nci_sig_long:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(long);
- *((long**)translation_pointers)[i] = (long)pcc_arg[i - j_offset].i;
+ *((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 = pcc_arg[i - j_offset].p;
+ ((pmc_holder_t*)translation_pointers[i])->p = pcc_arg[j].p;
((pmc_holder_t*)translation_pointers[i])->pval = (void**)mem_internal_allocate_zeroed_typed(void*);
- *((pmc_holder_t*)translation_pointers[i])->pval = PMC_IS_NULL(pcc_arg[i - j_offset].p) ?
- (void *)NULL : (void*)VTABLE_get_pointer(interp, pcc_arg[i - j_offset].p);
+ *((pmc_holder_t*)translation_pointers[i])->pval = PMC_IS_NULL(pcc_arg[j].p) ?
+ (void *)NULL : (void*)VTABLE_get_pointer(interp, pcc_arg[j].p);
+ j++;
values[i] = &((pmc_holder_t*)translation_pointers[i])->pval;
break;
case enum_nci_sig_pmc:
- translation_pointers[i] = pcc_arg[i - j_offset].p;
+ translation_pointers[i] = pcc_arg[j++].p;
values[i] = &translation_pointers[i];
break;
case enum_nci_sig_ptr:
- translation_pointers[i] = PMC_IS_NULL(pcc_arg[i - j_offset].p) ?
- (void *)NULL : VTABLE_get_pointer(interp, pcc_arg[i - j_offset].p);
+ 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)pcc_arg[i - j_offset].n;
+ *((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] = (double)pcc_arg[i - j_offset].n;
+ *((double**)translation_pointers)[i] = (double)pcc_arg[j++].n;
values[i] = translation_pointers[i];
break;
case enum_nci_sig_numval:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(FLOATVAL);
- *((FLOATVAL**)translation_pointers)[i] = pcc_arg[i - j_offset].n;
+ *((FLOATVAL**)translation_pointers)[i] = pcc_arg[j++].n;
values[i] = translation_pointers[i];
break;
}
More information about the parrot-commits
mailing list