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/24 21:27:54 UTC
[lucy-commits] svn commit: r1074287 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs
lib/Clownfish/Class.pm src/CFCClass.c src/CFCClass.h
Author: marvin
Date: Thu Feb 24 20:27:54 2011
New Revision: 1074287
URL: http://svn.apache.org/viewvc?rev=1074287&view=rev
Log:
Move "children" member of CFCClass 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=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Thu Feb 24 20:27:54 2011
@@ -129,6 +129,13 @@ PPCODE:
CFCClass_append_autocode(self, autocode);
void
+add_child(self, child)
+ CFCClass *self;
+ CFCClass *child;
+PPCODE:
+ CFCClass_add_child(self, child);
+
+void
_set_or_get(self, ...)
CFCClass *self;
ALIAS:
@@ -149,6 +156,7 @@ ALIAS:
full_vtable_type = 26
include_h = 28
get_docucomment = 30
+ children = 32
PPCODE:
{
START_SET_OR_GET_SWITCH
@@ -239,6 +247,18 @@ PPCODE:
: newSV(0);
}
break;
+ case 32: {
+ AV *av = newAV();
+ CFCClass **children = CFCClass_children(self);
+ size_t i;
+ for (i = 0; children[i] != NULL; i++) {
+ SV *val = newRV(CFCBase_get_perl_obj((CFCBase*)children[i]));
+ av_store(av, i, val);
+ }
+ retval = newRV((SV*)av);
+ SvREFCNT_dec(av);
+ 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=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Thu Feb 24 20:27:54 2011
@@ -31,7 +31,6 @@ use File::Spec::Functions qw( catfile );
use Scalar::Util qw( reftype );
our %cnick;
-our %children;
our %attributes;
our %meth_by_name;
our %func_by_name;
@@ -147,7 +146,6 @@ sub create {
@args{qw( parcel exposure class_name class_cnick micro_sym
docucomment source_class parent_class_name final inert )} );
- $children{$self} = [];
$attributes{$self} = $attributes;
$meth_by_name{$self} = \%methods_by_name;
$func_by_name{$self} = \%functions_by_name;
@@ -172,7 +170,6 @@ sub create {
sub DESTROY {
my $self = shift;
- delete $children{$self};
delete $attributes{$self};
delete $meth_by_name{$self};
delete $func_by_name{$self};
@@ -196,7 +193,6 @@ sub functions { $functions{ +shift } }
sub methods { $methods{ +shift } }
sub member_vars { $member_vars{ +shift } }
sub inert_vars { $inert_vars{ +shift } }
-sub children { $children{ +shift } }
sub novel_methods {
my $self = shift;
@@ -236,12 +232,6 @@ sub novel_method {
}
}
-sub add_child {
- my ( $self, $child ) = @_;
- confess("Can't call add_child after grow_tree") if $self->_tree_grown;
- push @{ $self->children }, $child;
-}
-
sub add_method {
my ( $self, $method ) = @_;
confess("Not a Method") unless a_isa_b( $method, "Clownfish::Method" );
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Thu Feb 24 20:27:54 2011
@@ -38,6 +38,8 @@ struct CFCClass {
int tree_grown;
CFCDocuComment *docucomment;
struct CFCClass *parent;
+ struct CFCClass **children;
+ size_t num_kids;
char *autocode;
char *source_class;
char *parent_class_name;
@@ -77,6 +79,8 @@ CFCClass_init(CFCClass *self, struct CFC
self->parent = NULL;
self->tree_grown = false;
self->autocode = (char*)CALLOCATE(1, sizeof(char));
+ self->children = (CFCClass**)CALLOCATE(1, sizeof(CFCClass*));
+ self->num_kids = 0;
self->parent_class_name = CFCUtil_strdup(parent_class_name);
self->docucomment
= (CFCDocuComment*)CFCBase_incref((CFCBase*)docucomment);
@@ -140,6 +144,11 @@ CFCClass_destroy(CFCClass *self)
{
CFCBase_decref((CFCBase*)self->docucomment);
CFCBase_decref((CFCBase*)self->parent);
+ size_t i;
+ for (i = 0; self->children[i] != NULL; i++) {
+ CFCBase_decref((CFCBase*)self->children[i]);
+ }
+ FREEMEM(self->children);
FREEMEM(self->autocode);
FREEMEM(self->source_class);
FREEMEM(self->parent_class_name);
@@ -151,6 +160,25 @@ CFCClass_destroy(CFCClass *self)
CFCSymbol_destroy((CFCSymbol*)self);
}
+void
+CFCClass_add_child(CFCClass *self, CFCClass *child)
+{
+ CFCUTIL_NULL_CHECK(child);
+ if (self->tree_grown) { croak("Can't call add_child after grow_tree"); }
+ self->num_kids++;
+ size_t size = (self->num_kids + 1) * sizeof(CFCClass*);
+ self->children = (CFCClass**)REALLOCATE(self->children, size);
+ self->children[self->num_kids - 1]
+ = (CFCClass*)CFCBase_incref((CFCBase*)child);
+ self->children[self->num_kids] = NULL;
+}
+
+CFCClass**
+CFCClass_children(CFCClass *self)
+{
+ return self->children;
+}
+
const char*
CFCClass_get_cnick(CFCClass *self)
{
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1074287&r1=1074286&r2=1074287&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Thu Feb 24 20:27:54 2011
@@ -39,6 +39,12 @@ CFCClass_init(CFCClass *self, struct CFC
void
CFCClass_destroy(CFCClass *self);
+void
+CFCClass_add_child(CFCClass *self, CFCClass *child);
+
+CFCClass**
+CFCClass_children(CFCClass *self);
+
const char*
CFCClass_get_cnick(CFCClass *self);