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/20 19:11:24 UTC
[lucy-commits] svn commit: r1072668 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs
lib/Clownfish/Class.pm src/CFCClass.c src/CFCClass.h
Author: marvin
Date: Sun Feb 20 18:11:24 2011
New Revision: 1072668
URL: http://svn.apache.org/viewvc?rev=1072668&view=rev
Log:
Move more member vars in CFCClass from Perl to C.
Modified:
incubator/lucy/trunk/clownfish/lib/Clownfish.xs
incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
incubator/lucy/trunk/clownfish/src/CFCClass.c
incubator/lucy/trunk/clownfish/src/CFCClass.h
Modified: incubator/lucy/trunk/clownfish/lib/Clownfish.xs
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish.xs?rev=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Sun Feb 20 18:11:24 2011
@@ -85,13 +85,17 @@ PPCODE:
MODULE = Clownfish PACKAGE = Clownfish::Class
SV*
-_new(klass, parcel, exposure, class_name_sv, class_cnick_sv, micro_sym_sv)
+_new(klass, parcel, exposure, class_name_sv, class_cnick_sv, micro_sym_sv, source_class_sv, parent_class_name_sv, is_final, is_inert)
const char *klass;
CFCParcel *parcel;
const char *exposure;
SV *class_name_sv;
SV *class_cnick_sv;
SV *micro_sym_sv;
+ SV *source_class_sv;
+ SV *parent_class_name_sv;
+ int is_final;
+ int is_inert;
CODE:
const char *class_name = SvOK(class_name_sv)
? SvPV_nolen(class_name_sv) : NULL;
@@ -99,8 +103,12 @@ CODE:
? SvPV_nolen(class_cnick_sv) : NULL;
const char *micro_sym = SvOK(micro_sym_sv)
? SvPV_nolen(micro_sym_sv) : NULL;
+ const char *source_class = SvOK(source_class_sv)
+ ? SvPV_nolen(source_class_sv) : NULL;
+ const char *parent_class_name = SvOK(parent_class_name_sv)
+ ? SvPV_nolen(parent_class_name_sv) : NULL;
CFCClass *self = CFCClass_new(parcel, exposure, class_name, class_cnick,
- micro_sym);
+ micro_sym, source_class, parent_class_name, is_final, is_inert);
RETVAL = newRV(CFCBase_get_perl_obj((CFCBase*)self));
CFCBase_decref((CFCBase*)self);
OUTPUT: RETVAL
@@ -122,12 +130,16 @@ void
_set_or_get(self, ...)
CFCClass *self;
ALIAS:
- get_cnick = 2
- _set_tree_grown = 3
- _tree_grown = 4
- set_parent = 5
- get_parent = 6
- get_autocode = 8
+ get_cnick = 2
+ _set_tree_grown = 3
+ _tree_grown = 4
+ set_parent = 5
+ get_parent = 6
+ get_autocode = 8
+ get_source_class = 10
+ get_parent_class_name = 12
+ final = 14
+ inert = 16
PPCODE:
{
START_SET_OR_GET_SWITCH
@@ -165,6 +177,22 @@ PPCODE:
retval = newSVpvn(value, strlen(value));
}
break;
+ case 10: {
+ const char *value = CFCClass_get_source_class(self);
+ retval = newSVpvn(value, strlen(value));
+ }
+ break;
+ case 12: {
+ const char *value = CFCClass_get_parent_class_name(self);
+ retval = value ? newSVpvn(value, strlen(value)) : newSV(0);
+ }
+ break;
+ case 14:
+ retval = newSViv(CFCClass_final(self));
+ break;
+ case 16:
+ retval = newSViv(CFCClass_inert(self));
+ break;
END_SET_OR_GET_SWITCH
}
Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm?rev=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Sun Feb 20 18:11:24 2011
@@ -32,12 +32,8 @@ use Scalar::Util qw( reftype );
our %cnick;
our %struct_sym;
-our %parent_class_name;
-our %source_class;
our %docucomment;
our %children;
-our %inert;
-our %final;
our %attributes;
our %meth_by_name;
our %func_by_name;
@@ -106,21 +102,14 @@ sub create {
$args{class_cnick} = delete $args{cnick};
my $class_name = $args{class_name};
confess("Missing required param 'class_name'") unless $class_name;
- my $parent_class_name = delete $args{parent_class_name};
my $docucomment = delete $args{docucomment};
- my $inert = delete $args{inert};
- my $final = delete $args{final};
+ $args{inert} ||= 0;
+ $args{final} ||= 0;
# Derive struct name.
$class_name =~ /(\w+)$/ or confess("Invalid class_name: '$class_name'");
my $struct_sym = $1;
- # Assume that Foo::Bar should be found in Foo/Bar.h.
- my $source_class
- = defined $args{source_class}
- ? delete $args{source_class}
- : $class_name;
-
# Verify that members of supplied arrays meet "is a" requirements.
my $functions = delete $args{functions} || [];
my $methods = delete $args{methods} || [];
@@ -155,22 +144,19 @@ sub create {
# Validate inert param.
confess("Inert classes can't have methods")
- if ( $inert and scalar @$methods );
+ if ( $args{inert} and scalar @$methods );
my $package = ref($either) || $either;
$args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
$args{exposure} ||= 'parcel';
$args{micro_sym} ||= 'class';
my $self = $either->_new(
- @args{qw( parcel exposure class_name class_cnick micro_sym )} );
+ @args{qw( parcel exposure class_name class_cnick micro_sym
+ source_class parent_class_name final inert )} );
$struct_sym{$self} = $struct_sym;
- $parent_class_name{$self} = $parent_class_name;
- $source_class{$self} = $source_class;
$docucomment{$self} = $docucomment;
$children{$self} = [];
- $inert{$self} = $inert;
- $final{$self} = $final;
$attributes{$self} = $attributes;
$meth_by_name{$self} = \%methods_by_name;
$func_by_name{$self} = \%functions_by_name;
@@ -196,12 +182,8 @@ sub create {
sub DESTROY {
my $self = shift;
delete $struct_sym{$self};
- delete $parent_class_name{$self};
- delete $source_class{$self};
delete $docucomment{$self};
delete $children{$self};
- delete $inert{$self};
- delete $final{$self};
delete $attributes{$self};
delete $meth_by_name{$self};
delete $func_by_name{$self};
@@ -232,11 +214,7 @@ sub include_h {
sub has_attribute { exists $_[0]->_get_attributes->{ $_[1] } }
sub get_struct_sym { $struct_sym{ +shift } }
-sub get_parent_class_name { $parent_class_name{ +shift } }
-sub get_source_class { $source_class{ +shift } }
sub get_docucomment { $docucomment{ +shift } }
-sub inert { $inert{ +shift } }
-sub final { $final{ +shift } }
sub _get_attributes { $attributes{ +shift } }
sub _meth_by_name { $meth_by_name{ +shift } }
sub _func_by_name { $func_by_name{ +shift } }
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Sun Feb 20 18:11:24 2011
@@ -30,36 +30,54 @@
#include "CFCSymbol.h"
#include "CFCClass.h"
#include "CFCParcel.h"
+#include "CFCUtil.h"
struct CFCClass {
CFCSymbol symbol;
int tree_grown;
struct CFCClass *parent;
char *autocode;
+ char *source_class;
+ char *parent_class_name;
+ int is_final;
+ int is_inert;
};
CFCClass*
CFCClass_new(struct CFCParcel *parcel, const char *exposure,
const char *class_name, const char *class_cnick,
- const char *micro_sym)
+ const char *micro_sym, const char *source_class,
+ const char *parent_class_name, int is_final, int is_inert)
{
CFCClass *self = (CFCClass*)CFCBase_allocate(sizeof(CFCClass),
"Clownfish::Class");
if (!self) { croak("malloc failed"); }
return CFCClass_init(self, parcel, exposure, class_name, class_cnick,
- micro_sym);
+ micro_sym, source_class, parent_class_name, is_final, is_inert);
}
CFCClass*
CFCClass_init(CFCClass *self, struct CFCParcel *parcel,
const char *exposure, const char *class_name,
- const char *class_cnick, const char *micro_sym)
+ const char *class_cnick, const char *micro_sym,
+ const char *source_class, const char *parent_class_name,
+ int is_final, int is_inert)
{
CFCSymbol_init((CFCSymbol*)self, parcel, exposure, class_name,
class_cnick, micro_sym);
self->parent = NULL;
self->tree_grown = false;
self->autocode = (char*)calloc(1, sizeof(char));
+ self->parent_class_name = CFCUtil_strdup(parent_class_name);
+
+ // Assume that Foo::Bar should be found in Foo/Bar.h.
+ self->source_class = source_class
+ ? CFCUtil_strdup(source_class)
+ : CFCUtil_strdup(class_name);
+
+ self->is_final = !!is_final;
+ self->is_inert = !!is_inert;
+
return self;
}
@@ -68,6 +86,8 @@ CFCClass_destroy(CFCClass *self)
{
CFCBase_decref((CFCBase*)self->parent);
free(self->autocode);
+ free(self->source_class);
+ free(self->parent_class_name);
CFCSymbol_destroy((CFCSymbol*)self);
}
@@ -117,3 +137,26 @@ CFCClass_get_autocode(CFCClass *self)
return self->autocode;
}
+const char*
+CFCClass_get_source_class(CFCClass *self)
+{
+ return self->source_class;
+}
+
+const char*
+CFCClass_get_parent_class_name(CFCClass *self)
+{
+ return self->parent_class_name;
+}
+
+int
+CFCClass_final(CFCClass *self)
+{
+ return self->is_final;
+}
+
+int
+CFCClass_inert(CFCClass *self)
+{
+ return self->is_inert;
+}
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1072668&r1=1072667&r2=1072668&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Sun Feb 20 18:11:24 2011
@@ -21,13 +21,17 @@ typedef struct CFCClass CFCClass;
struct CFCParcel;
CFCClass*
-CFCClass_new(struct CFCParcel *parcel, const char *exposure, const char *class_name,
- const char *class_cnick, const char *micro_sym);
+CFCClass_new(struct CFCParcel *parcel, const char *exposure,
+ const char *class_name, const char *class_cnick,
+ const char *micro_sym, const char *source_class,
+ const char *parent_class_name, int is_final, int is_inert);
CFCClass*
-CFCClass_init(CFCClass *self, struct CFCParcel *parcel, const char *exposure,
- const char *class_name, const char *class_cnick,
- const char *micro_sym);
+CFCClass_init(CFCClass *self, struct CFCParcel *parcel,
+ const char *exposure, const char *class_name,
+ const char *class_cnick, const char *micro_sym,
+ const char *source_class, const char *parent_class_name,
+ int is_final, int is_inert);
void
CFCClass_destroy(CFCClass *self);
@@ -53,5 +57,17 @@ CFCClass_append_autocode(CFCClass *self,
const char*
CFCClass_get_autocode(CFCClass *self);
+const char*
+CFCClass_get_source_class(CFCClass *self);
+
+const char*
+CFCClass_get_parent_class_name(CFCClass *self);
+
+int
+CFCClass_final(CFCClass *self);
+
+int
+CFCClass_inert(CFCClass *self);
+
#endif /* H_CFCCLASS */