You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/05/30 13:27:43 UTC
[04/12] lucy-clownfish git commit: Avoid unwanted calls to To_Host
Avoid unwanted calls to To_Host
Make sure that Perl constructors and XSBind_cfish_obj_to_sv don't
invoke To_Host but always return a reference to a Clownfish::Obj.
Don't call To_Host when mortalizing objects converted from Perl arrays
and hashes.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/7a4aeb99
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/7a4aeb99
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/7a4aeb99
Branch: refs/heads/master
Commit: 7a4aeb9989c9b15e23cec8298233aac2ba355b22
Parents: e702b27
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Fri May 29 13:49:42 2015 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Fri May 29 17:44:47 2015 +0200
----------------------------------------------------------------------
compiler/src/CFCPerlConstructor.c | 2 +-
runtime/perl/xs/XSBind.c | 23 +++++++++++++++--------
runtime/perl/xs/XSBind.h | 11 +++++------
3 files changed, 21 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7a4aeb99/compiler/src/CFCPerlConstructor.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlConstructor.c b/compiler/src/CFCPerlConstructor.c
index c1b9839..9dfce1f 100644
--- a/compiler/src/CFCPerlConstructor.c
+++ b/compiler/src/CFCPerlConstructor.c
@@ -133,7 +133,7 @@ CFCPerlConstructor_xsub_def(CFCPerlConstructor *self, CFCClass *klass) {
"\n"
" retval = %s(%s);\n"
" if (retval) {\n"
- " ST(0) = (SV*)CFISH_Obj_To_Host((cfish_Obj*)retval);\n"
+ " ST(0) = CFISH_OBJ_TO_SV(retval);\n"
" CFISH_DECREF_NN(retval);\n"
" }\n"
" else {\n"
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7a4aeb99/runtime/perl/xs/XSBind.c
----------------------------------------------------------------------
diff --git a/runtime/perl/xs/XSBind.c b/runtime/perl/xs/XSBind.c
index ab2d8ae..fa571f9 100644
--- a/runtime/perl/xs/XSBind.c
+++ b/runtime/perl/xs/XSBind.c
@@ -130,7 +130,7 @@ XSBind_maybe_sv_to_cfish_obj(pTHX_ SV *sv, cfish_Class *klass,
// Mortalize the converted object -- which is somewhat
// dangerous, but is the only way to avoid requiring that the
// caller take responsibility for a refcount.
- SV *mortal = (SV*)CFISH_Obj_To_Host(retval);
+ SV *mortal = XSBind_cfish_obj_to_sv(aTHX_ retval);
CFISH_DECREF(retval);
sv_2mortal(mortal);
}
@@ -757,20 +757,21 @@ cfish_dec_refcount(void *vself) {
return modified_refcount;
}
-void*
-CFISH_Obj_To_Host_IMP(cfish_Obj *self) {
- dTHX;
+SV*
+XSBind_cfish_obj_to_sv(pTHX_ cfish_Obj *obj) {
+ if (obj == NULL) { return newSV(0); }
+
SV *perl_obj;
- if (self->ref.count & XSBIND_REFCOUNT_FLAG) {
- perl_obj = S_lazy_init_host_obj(aTHX_ self);
+ if (obj->ref.count & XSBIND_REFCOUNT_FLAG) {
+ perl_obj = S_lazy_init_host_obj(aTHX_ obj);
}
else {
- perl_obj = newRV_inc((SV*)self->ref.host_obj);
+ perl_obj = newRV_inc((SV*)obj->ref.host_obj);
}
// Enable overloading for Perl 5.8.x
#if PERL_VERSION <= 8
- HV *stash = SvSTASH((SV*)self->ref.host_obj);
+ HV *stash = SvSTASH((SV*)obj->ref.host_obj);
if (Gv_AMG(stash)) {
SvAMAGIC_on(perl_obj);
}
@@ -779,6 +780,12 @@ CFISH_Obj_To_Host_IMP(cfish_Obj *self) {
return perl_obj;
}
+void*
+CFISH_Obj_To_Host_IMP(cfish_Obj *self) {
+ dTHX;
+ return XSBind_cfish_obj_to_sv(aTHX_ self);
+}
+
/*************************** Clownfish::Class ******************************/
cfish_Obj*
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7a4aeb99/runtime/perl/xs/XSBind.h
----------------------------------------------------------------------
diff --git a/runtime/perl/xs/XSBind.h b/runtime/perl/xs/XSBind.h
index 976d3da..e75b948 100644
--- a/runtime/perl/xs/XSBind.h
+++ b/runtime/perl/xs/XSBind.h
@@ -80,15 +80,14 @@ cfish_XSBind_maybe_sv_to_cfish_obj(pTHX_ SV *sv, cfish_Class *klass,
/** Derive an SV from a Clownfish object. If the Clownfish object is NULL, the SV
- * will be undef.
+ * will be undef. Doesn't invoke To_Host and always returns a reference to a
+ * Clownfish::Obj.
*
* The new SV has single refcount for which the caller must take
* responsibility.
*/
-static CFISH_INLINE SV*
-cfish_XSBind_cfish_obj_to_sv(pTHX_ cfish_Obj *obj) {
- return obj ? (SV*)CFISH_Obj_To_Host(obj) : newSV(0);
-}
+CFISH_VISIBLE SV*
+cfish_XSBind_cfish_obj_to_sv(pTHX_ cfish_Obj *obj);
/** XSBind_cfish_obj_to_sv, with a cast.
*/
@@ -103,7 +102,7 @@ static CFISH_INLINE SV*
cfish_XSBind_cfish_obj_to_sv_noinc(pTHX_ cfish_Obj *obj) {
SV *retval;
if (obj) {
- retval = (SV*)CFISH_Obj_To_Host(obj);
+ retval = cfish_XSBind_cfish_obj_to_sv(aTHX_ obj);
CFISH_DECREF_NN(obj);
}
else {