[svn:parrot] r42871 - branches/cs_csr_merge/src/call

bacek at svn.parrot.org bacek at svn.parrot.org
Thu Dec 3 11:33:31 UTC 2009


Author: bacek
Date: Thu Dec  3 11:33:26 2009
New Revision: 42871
URL: https://trac.parrot.org/parrot/changeset/42871

Log:
Fix merging CallSignature for tailcall

Modified:
   branches/cs_csr_merge/src/call/args.c

Modified: branches/cs_csr_merge/src/call/args.c
==============================================================================
--- branches/cs_csr_merge/src/call/args.c	Thu Dec  3 11:32:49 2009	(r42870)
+++ branches/cs_csr_merge/src/call/args.c	Thu Dec  3 11:33:26 2009	(r42871)
@@ -2445,25 +2445,29 @@
         ARGMOD_NULLOK(PMC * parent), ARGMOD_NULLOK(PMC * tailcall))
 {
     ASSERT_ARGS(Parrot_pcc_merge_signature_for_tailcall)
-    if (PMC_IS_NULL(parent) || PMC_IS_NULL(tailcall))
+    if (PMC_IS_NULL(parent) || PMC_IS_NULL(tailcall) || (parent == tailcall))
         return;
     else {
         /* Broke encapuslation. Direct poking into CallSignature is much faster */
-        /* FIXME We are leaking like sieve!!! We have do destroy old returns_values */
         void ** returns_values;
+        void ** tailcall_returns_values;
         INTVAL  returns_size;
-        INTVAL  returns_resize_threshold;
-
         PMC * return_flags;
-        GETATTR_CallSignature_returns_values(interp, parent, returns_values);
+
         GETATTR_CallSignature_returns_size(interp, parent, returns_size);
-        GETATTR_CallSignature_returns_resize_threshold(interp, parent, returns_resize_threshold);
-        GETATTR_CallSignature_return_flags(interp, parent, return_flags);
+        GETATTR_CallSignature_returns_values(interp, parent, returns_values);
 
-        SETATTR_CallSignature_returns_values(interp, tailcall, returns_values);
-        SETATTR_CallSignature_returns_size(interp, tailcall, returns_size);
-        SETATTR_CallSignature_returns_resize_threshold(interp, tailcall, returns_resize_threshold);
+        /* Resize tailcall.returns_values to new size */
+        csr_set_integer_native(interp, tailcall, returns_size);
+
+        /* And copy values over it */
+        GETATTR_CallSignature_returns_values(interp, tailcall, tailcall_returns_values);
+        mem_copy_n_typed(tailcall_returns_values, returns_values, returns_size, void**);
+
+        /* Store raw signature */
+        GETATTR_CallSignature_return_flags(interp, parent, return_flags);
         SETATTR_CallSignature_return_flags(interp, tailcall, return_flags);
+
     }
 }
 


More information about the parrot-commits mailing list