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