[svn:parrot] r49757 - branches/gsoc_nci/src/pmc
plobsing at svn.parrot.org
plobsing at svn.parrot.org
Sun Oct 31 16:04:50 UTC 2010
Author: plobsing
Date: Sun Oct 31 16:04:50 2010
New Revision: 49757
URL: https://trac.parrot.org/parrot/changeset/49757
Log:
simplify, eliminate memory leak in pass by reference types
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:37:45 2010 (r49756)
+++ branches/gsoc_nci/src/pmc/nci.pmc Sun Oct 31 16:04:50 2010 (r49757)
@@ -61,6 +61,12 @@
typedef struct pmc_holder_t {
PMC* p;
union {
+ short s;
+ int i;
+ long l;
+ void *ptr;
+ };
+ union {
INTVAL *ival;
void **pval;
};
@@ -486,9 +492,7 @@
}
{
- size_t values_size;
-
- values_size = 0;
+ 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++) {
@@ -510,6 +514,7 @@
*/
translation_pointers = mem_internal_allocate_n_zeroed_typed(nci_info->arity, void*);
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;
@@ -548,12 +553,13 @@
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[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[j].p);
+ 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_t*)translation_pointers[i])->ival;
+ values[i] = &pmc_holder->ival;
break;
case enum_nci_sig_short:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(short);
@@ -561,12 +567,13 @@
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[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[j].p);
+ 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_t*)translation_pointers[i])->ival;
+ values[i] = &pmc_holder->ival;
break;
case enum_nci_sig_int:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(int);
@@ -574,12 +581,13 @@
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[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[j].p);
+ 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_t*)translation_pointers[i])->ival;
+ values[i] = &pmc_holder->ival;
break;
case enum_nci_sig_long:
translation_pointers[i] = mem_internal_allocate_zeroed_typed(long);
@@ -587,13 +595,15 @@
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[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[j].p) ?
- (void *)NULL : (void*)VTABLE_get_pointer(interp, pcc_arg[j].p);
+ 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_t*)translation_pointers[i])->pval;
+ values[i] = &pmc_holder->pval;
break;
case enum_nci_sig_pmc:
translation_pointers[i] = pcc_arg[j++].p;
@@ -710,34 +720,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:
More information about the parrot-commits
mailing list