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/07/22 21:22:05 UTC
[lucy-commits] svn commit: r1149698 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs
lib/Clownfish/Binding/Perl/Class.pm src/CFCPerlClass.c src/CFCPerlClass.h
Author: marvin
Date: Fri Jul 22 19:22:04 2011
New Revision: 1149698
URL: http://svn.apache.org/viewvc?rev=1149698&view=rev
Log:
Migrate some member vars to C.
Modified:
incubator/lucy/trunk/clownfish/lib/Clownfish.xs
incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm
incubator/lucy/trunk/clownfish/src/CFCPerlClass.c
incubator/lucy/trunk/clownfish/src/CFCPerlClass.h
Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Fri Jul 22 19:22:04 2011
@@ -1932,9 +1932,17 @@ OUTPUT: RETVAL
MODULE = Clownfish PACKAGE = Clownfish::Binding::Perl::Class
SV*
-_new()
+_new(parcel, class_name, client, xs_code_sv)
+ CFCParcel *parcel;
+ const char *class_name;
+ CFCClass *client;
+ SV *xs_code_sv;
CODE:
- CFCPerlClass *self = CFCPerlClass_new();
+ const char *xs_code = SvOK(xs_code_sv)
+ ? SvPV_nolen(xs_code_sv)
+ : NULL;
+ CFCPerlClass *self
+ = CFCPerlClass_new(parcel, class_name, client,xs_code);
RETVAL = S_cfcbase_to_perlref(self);
CFCBase_decref((CFCBase*)self);
OUTPUT: RETVAL
@@ -1945,3 +1953,34 @@ _destroy(self)
PPCODE:
CFCPerlClass_destroy(self);
+void
+_set_or_get(self, ...)
+ CFCPerlClass *self;
+ALIAS:
+ get_class_name = 2
+ get_client = 4
+ get_xs_code = 6
+PPCODE:
+{
+ START_SET_OR_GET_SWITCH
+ case 2: {
+ const char *value = CFCPerlClass_get_class_name(self);
+ retval = newSVpvn(value, strlen(value));
+ }
+ break;
+ case 4: {
+ CFCClass *value = CFCPerlClass_get_client(self);
+ retval = S_cfcbase_to_perlref(value);
+ }
+ break;
+ case 6: {
+ const char *value = CFCPerlClass_get_xs_code(self);
+ retval = value
+ ? newSVpvn(value, strlen(value))
+ : newSV(0);
+ }
+ break;
+ END_SET_OR_GET_SWITCH
+}
+
+
Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Binding/Perl/Class.pm Fri Jul 22 19:22:04 2011
@@ -33,17 +33,14 @@ our %register_PARAMS = (
client => undef,
);
-our %parcel;
-our %class_name;
our %bind_methods;
our %bind_constructors;
our %make_pod;
-our %xs_code;
-our %client;
sub register {
my ( $either, %args ) = @_;
verify_args( \%register_PARAMS, %args ) or confess $@;
+ $args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
# Validate.
confess("Missing required param 'class_name'")
@@ -66,14 +63,10 @@ sub register {
}
# Create object.
- my $self = _new();
- $parcel{$self} = $args{parcel};
- $class_name{$self} = $args{class_name};
+ my $self = _new( @args{qw( parcel class_name client xs_code ) } );
$bind_methods{$self} = $args{bind_methods};
$bind_constructors{$self} = $args{bind_constructors};
$make_pod{$self} = $args{make_pod};
- $xs_code{$self} = $args{xs_code};
- $client{$self} = $args{client};
# Add to registry.
$registry{ $args{class_name} } = $self;
@@ -83,22 +76,15 @@ sub register {
sub DESTROY {
my $self = shift;
- delete $parcel{$self};
- delete $class_name{$self};
delete $bind_methods{$self};
delete $bind_constructors{$self};
delete $make_pod{$self};
- delete $xs_code{$self};
- delete $client{$self};
_destroy($self);
}
-sub get_class_name { $class_name{ +shift } }
sub get_bind_methods { $bind_methods{ +shift } }
sub get_bind_constructors { $bind_constructors{ +shift } }
sub get_make_pod { $make_pod{ +shift } }
-sub get_client { $client{ +shift } }
-sub get_xs_code { $xs_code{ +shift } }
sub constructor_bindings {
my $self = shift;
Modified: incubator/lucy/trunk/clownfish/src/CFCPerlClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCPerlClass.c?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCPerlClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCPerlClass.c Fri Jul 22 19:22:04 2011
@@ -18,26 +18,59 @@
#include "CFCBase.h"
#include "CFCPerlClass.h"
#include "CFCUtil.h"
+#include "CFCClass.h"
+#include "CFCParcel.h"
struct CFCPerlClass {
CFCBase base;
+ CFCParcel *parcel;
+ char *class_name;
+ CFCClass *client;
+ char *xs_code;
};
CFCPerlClass*
-CFCPerlClass_new(void) {
+CFCPerlClass_new(CFCParcel *parcel, const char *class_name, CFCClass *client,
+ const char *xs_code) {
CFCPerlClass *self
= (CFCPerlClass*)CFCBase_allocate(sizeof(CFCPerlClass),
"Clownfish::Binding::Perl::Class");
- return CFCPerlClass_init(self);
+ return CFCPerlClass_init(self, parcel, class_name, client, xs_code);
}
CFCPerlClass*
-CFCPerlClass_init(CFCPerlClass *self) {
+CFCPerlClass_init(CFCPerlClass *self, CFCParcel *parcel, const char *class_name,
+ CFCClass *client, const char *xs_code) {
+ CFCUTIL_NULL_CHECK(parcel);
+ CFCUTIL_NULL_CHECK(class_name);
+ self->parcel = (CFCParcel*)CFCBase_incref((CFCBase*)parcel);
+ self->client = (CFCClass*)CFCBase_incref((CFCBase*)client);
+ self->class_name = CFCUtil_strdup(class_name);
+ self->xs_code = xs_code ? CFCUtil_strdup(xs_code) : NULL;
return self;
}
void
CFCPerlClass_destroy(CFCPerlClass *self) {
CFCBase_destroy((CFCBase*)self);
+ CFCBase_decref((CFCBase*)self->parcel);
+ CFCBase_decref((CFCBase*)self->client);
+ FREEMEM(self->class_name);
+ FREEMEM(self->xs_code);
+}
+
+CFCClass*
+CFCPerlClass_get_client(CFCPerlClass *self) {
+ return self->client;
+}
+
+const char*
+CFCPerlClass_get_class_name(CFCPerlClass *self) {
+ return self->class_name;
+}
+
+const char*
+CFCPerlClass_get_xs_code(CFCPerlClass *self) {
+ return self->xs_code;
}
Modified: incubator/lucy/trunk/clownfish/src/CFCPerlClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCPerlClass.h?rev=1149698&r1=1149697&r2=1149698&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCPerlClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCPerlClass.h Fri Jul 22 19:22:04 2011
@@ -22,16 +22,31 @@ extern "C" {
#endif
typedef struct CFCPerlClass CFCPerlClass;
+struct CFCParcel;
+struct CFCClass;
CFCPerlClass*
-CFCPerlClass_new(void);
+CFCPerlClass_new(struct CFCParcel *parcel, const char *class_name,
+ struct CFCClass *client, const char *xs_code);
CFCPerlClass*
-CFCPerlClass_init(CFCPerlClass *self);
+CFCPerlClass_init(CFCPerlClass *self, struct CFCParcel *parcel,
+ const char *class_name, struct CFCClass *client,
+ const char *xs_code);
void
CFCPerlClass_destroy(CFCPerlClass *self);
+struct CFCClass*
+CFCPerlClass_get_client(CFCPerlClass *self);
+
+const char*
+CFCPerlClass_get_class_name(CFCPerlClass *self);
+
+const char*
+CFCPerlClass_get_xs_code(CFCPerlClass *self);
+
+
#ifdef __cplusplus
}
#endif