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);
+