[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