You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2011/02/17 18:42:57 UTC

[lucy-commits] svn commit: r1071721 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs src/CFCParamList.c src/CFCParamList.h

Author: marvin
Date: Thu Feb 17 17:42:56 2011
New Revision: 1071721

URL: http://svn.apache.org/viewvc?rev=1071721&view=rev
Log:
Cache Perl object inside CFCParamList struct.

Modified:
    incubator/lucy/trunk/clownfish/lib/Clownfish.xs
    incubator/lucy/trunk/clownfish/src/CFCParamList.c
    incubator/lucy/trunk/clownfish/src/CFCParamList.h

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1071721&r1=1071720&r2=1071721&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Thu Feb 17 17:42:56 2011
@@ -357,8 +357,8 @@ _new(klass, variadic)
     int variadic;
 CODE:
     CFCParamList *self = CFCParamList_new(variadic);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCParamList_get_perl_obj(self));
+    SvREFCNT_dec(SvRV(RETVAL));
 OUTPUT: RETVAL
 
 void

Modified: incubator/lucy/trunk/clownfish/src/CFCParamList.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCParamList.c?rev=1071721&r1=1071720&r2=1071721&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCParamList.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCParamList.c Thu Feb 17 17:42:56 2011
@@ -28,6 +28,7 @@ struct CFCParamList {
     char        **values;
     int           variadic;
     size_t        num_vars;
+    void         *perl_obj;
 };
 
 CFCParamList*
@@ -45,6 +46,7 @@ CFCParamList_init(CFCParamList *self, in
     self->num_vars  = 0;
     self->variables = (CFCVariable**)calloc(1, sizeof(void*));
     self->values    = (char**)calloc(1, sizeof(char*));
+    self->perl_obj  = CFCUtil_make_perl_obj(self, "Clownfish::ParamList");
     return self;
 }
 
@@ -69,6 +71,22 @@ CFCParamList_add_param(CFCParamList *sel
 void
 CFCParamList_destroy(CFCParamList *self)
 {
+    if (self->perl_obj) {
+        int refcount = SvREFCNT((SV*)self->perl_obj);
+        if (refcount > 0) {
+            if (refcount == 1) {
+                // Trigger Perl destructor, which causes recursion.
+                SV *perl_obj = (SV*)self->perl_obj;
+                self->perl_obj = NULL;
+                SvREFCNT_dec((SV*)self->perl_obj);
+                return;
+            }
+            else {
+                SvREFCNT_dec((SV*)self->perl_obj);
+                return;
+            }
+        }
+    }
     size_t i;
     for (i = 0; i < self->num_vars; i++) {
         SvREFCNT_dec(CFCVariable_get_perl_obj(self->variables[i]));
@@ -103,3 +121,9 @@ CFCParamList_variadic(CFCParamList *self
     return self->variadic;
 }
 
+void*
+CFCParamList_get_perl_obj(CFCParamList *self)
+{
+    return self->perl_obj;
+}
+

Modified: incubator/lucy/trunk/clownfish/src/CFCParamList.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCParamList.h?rev=1071721&r1=1071720&r2=1071721&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCParamList.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCParamList.h Thu Feb 17 17:42:56 2011
@@ -42,3 +42,6 @@ CFCParamList_variadic(CFCParamList *self
 size_t
 CFCParamList_num_vars(CFCParamList *self);
 
+void*
+CFCParamList_get_perl_obj(CFCParamList *self);
+