[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