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/16 19:15:04 UTC

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

Author: marvin
Date: Wed Feb 16 18:15:03 2011
New Revision: 1071353

URL: http://svn.apache.org/viewvc?rev=1071353&view=rev
Log:
Cache Perl objects inside CFCType structs.

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

Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1071353&r1=1071352&r2=1071353&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Wed Feb 16 18:15:03 2011
@@ -305,7 +305,7 @@ ALIAS:
     abstract           = 6
     _set_novel         = 7
     novel              = 8
-    final              = 10;
+    final              = 10
 PPCODE:
 {
     START_SET_OR_GET_SWITCH
@@ -605,8 +605,7 @@ CODE:
     }   
     CFCType *self = CFCType_new(flags, parcel, specifier, indirection, 
         c_string);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -616,8 +615,7 @@ _new_integer(klass, flags, specifier)
     const char *specifier;
 CODE:
     CFCType *self = CFCType_new_integer(flags, specifier);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -627,8 +625,7 @@ _new_float(klass, flags, specifier)
     const char *specifier;
 CODE:
     CFCType *self = CFCType_new_float(flags, specifier);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -645,8 +642,7 @@ CODE:
         parcel = INT2PTR(CFCParcel*, objint);
     }   
     CFCType *self = CFCType_new_object(flags, parcel, specifier, indirection);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -669,8 +665,7 @@ CODE:
         croak("Param 'child' not a Clownfish::Type");
     }
     CFCType *self = CFCType_new_composite(flags, child, indirection, array);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -679,8 +674,7 @@ _new_void(klass, is_const)
     int is_const;
 CODE:
     CFCType *self = CFCType_new_void(is_const);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -688,8 +682,7 @@ _new_va_list(klass)
     const char *klass;
 CODE:
     CFCType *self = CFCType_new_va_list();
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 SV*
@@ -704,8 +697,7 @@ CODE:
         parcel = INT2PTR(CFCParcel*, objint);
     }   
     CFCType *self = CFCType_new_arbitrary(parcel, specifier);
-    RETVAL = newSV(0);
-	sv_setref_pv(RETVAL, klass, (void*)self);
+    RETVAL = newRV((SV*)CFCType_get_perl_obj(self));
 OUTPUT: RETVAL
 
 void

Modified: incubator/lucy/trunk/clownfish/src/CFCType.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCType.c?rev=1071353&r1=1071352&r2=1071353&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCType.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCType.c Wed Feb 16 18:15:03 2011
@@ -27,6 +27,7 @@
 
 #include "CFCType.h"
 #include "CFCParcel.h"
+#include "CFCUtil.h"
 
 struct CFCType {
     int   flags;
@@ -37,6 +38,7 @@ struct CFCType {
     size_t width;
     char *array;
     struct CFCType *child;
+    void *perl_obj;
 };
 
 CFCType*
@@ -61,6 +63,7 @@ CFCType_init(CFCType *self, int flags, s
     self->width       = 0;
     self->array       = NULL;
     self->child       = NULL;
+    self->perl_obj    = CFCUtil_make_perl_obj(self, "Clownfish::Type");
     return self;
 }
 
@@ -303,6 +306,22 @@ CFCType_new_arbitrary(CFCParcel *parcel,
 void
 CFCType_destroy(CFCType *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;
+            }
+        }
+    }
     Safefree(self->specifier);
     Safefree(self->c_string);
     free(self);
@@ -495,3 +514,9 @@ CFCType_is_composite(CFCType *self)
     return !!(self->flags & CFCTYPE_COMPOSITE);
 }
 
+void*
+CFCType_get_perl_obj(CFCType *self)
+{
+    return self->perl_obj;
+}
+

Modified: incubator/lucy/trunk/clownfish/src/CFCType.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCType.h?rev=1071353&r1=1071352&r2=1071353&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCType.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCType.h Wed Feb 16 18:15:03 2011
@@ -134,3 +134,6 @@ CFCType_is_arbitrary(CFCType *self);
 int
 CFCType_is_composite(CFCType *self);
 
+void*
+CFCType_get_perl_obj(CFCType *self);
+