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/28 18:57:21 UTC
[lucy-commits] svn commit: r1075450 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs
lib/Clownfish/Class.pm src/CFCClass.c src/CFCClass.h
Author: marvin
Date: Mon Feb 28 17:57:21 2011
New Revision: 1075450
URL: http://svn.apache.org/viewvc?rev=1075450&view=rev
Log:
Port remaining inheritance-related code in CFCClass from Perl to C. Now that
it's all self-contained within one file, reduce the scope of some of the
routines by changing them to static visibility.
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=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Mon Feb 28 17:57:21 2011
@@ -210,22 +210,10 @@ CODE:
OUTPUT: RETVAL
void
-_bequeath_methods(self)
+grow_tree(self)
CFCClass *self;
PPCODE:
- CFCClass_bequeath_methods(self);
-
-void
-_bequeath_member_vars(self)
- CFCClass *self;
-PPCODE:
- CFCClass_bequeath_member_vars(self);
-
-void
-_establish_ancestry(self)
- CFCClass *self;
-PPCODE:
- CFCClass_establish_ancestry(self);
+ CFCClass_grow_tree(self);
void
add_inert_var(self, var)
@@ -278,8 +266,6 @@ _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
@@ -310,12 +296,6 @@ PPCODE:
retval = newSVpvn(value, strlen(value));
}
break;
- case 3:
- CFCClass_set_tree_grown(self, !!SvTRUE(ST(1)));
- break;
- case 4:
- retval = newSViv(CFCClass_tree_grown(self));
- break;
case 5: {
CFCClass *parent = NULL;
if ( SvOK(ST(1))
Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Mon Feb 28 17:57:21 2011
@@ -27,8 +27,6 @@ use Clownfish::Util qw(
a_isa_b
);
use Clownfish::Dumpable;
-use File::Spec::Functions qw( catfile );
-use Scalar::Util qw( reftype );
END { __PACKAGE__->_clear_registry() }
@@ -44,8 +42,6 @@ our %create_PARAMS = (
exposure => 'parcel',
);
-my $dumpable = Clownfish::Dumpable->new;
-
our %fetch_singleton_PARAMS = (
parcel => undef,
class_name => undef,
@@ -97,32 +93,6 @@ sub create {
return $self;
}
-# Create dumpable functions unless hand coded versions were supplied.
-sub _create_dumpables {
- my $self = shift;
- $dumpable->add_dumpables($self) if $self->has_attribute('dumpable');
-}
-
-sub grow_tree {
- my $self = shift;
- confess("Can't call grow_tree more than once") if $self->_tree_grown;
- $self->_establish_ancestry;
- $self->_bequeath_member_vars;
- $self->_generate_automethods;
- $self->_bequeath_methods;
- $self->_set_tree_grown(1);
-}
-
-# Create auto-generated methods. This must be called after member vars are
-# passed down but before methods are passed down.
-sub _generate_automethods {
- my $self = shift;
- $self->_create_dumpables;
- for my $child ( @{ $self->children } ) {
- $child->_generate_automethods;
- }
-}
-
1;
__END__
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Mon Feb 28 17:57:21 2011
@@ -29,6 +29,7 @@
#define CFC_NEED_SYMBOL_STRUCT_DEF
#include "CFCSymbol.h"
#include "CFCClass.h"
+#include "CFCDumpable.h"
#include "CFCFunction.h"
#include "CFCMethod.h"
#include "CFCParcel.h"
@@ -50,6 +51,7 @@ static CFCClassRegEntry *registry = NULL
static size_t registry_size = 0;
static size_t registry_cap = 0;
+
struct CFCClass {
CFCSymbol symbol;
int tree_grown;
@@ -80,6 +82,27 @@ struct CFCClass {
char *include_h;
};
+// Link up parents and kids.
+static void
+S_establish_ancestry(CFCClass *self);
+
+// Pass down member vars to from parent to children.
+static void
+S_bequeath_member_vars(CFCClass *self);
+
+// Create auto-generated methods. This must be called after member vars are
+// passed down but before methods are passed down.
+static void
+S_generate_automethods(CFCClass *self);
+
+// Create dumpable functions unless hand coded versions were supplied.
+static void
+S_create_dumpables(CFCClass *self);
+
+// Pass down methods to from parent to children.
+static void
+S_bequeath_methods(CFCClass *self);
+
CFCClass*
CFCClass_new(struct CFCParcel *parcel, const char *exposure,
const char *class_name, const char *class_cnick,
@@ -319,17 +342,6 @@ CFCClass_add_method(CFCClass *self, CFCM
}
void
-CFCClass_zap_methods(CFCClass *self)
-{
- size_t i;
- for (i = 0; self->methods[i] != NULL; i++) {
- CFCBase_decref((CFCBase*)self->methods[i]);
- }
- self->methods[0] = NULL;
- self->num_methods = 0;
-}
-
-void
CFCClass_add_member_var(CFCClass *self, CFCVariable *var)
{
CFCUTIL_NULL_CHECK(var);
@@ -440,8 +452,8 @@ CFCClass_novel_method(CFCClass *self, co
}
// Pass down member vars to from parent to children.
-void
-CFCClass_bequeath_member_vars(CFCClass *self)
+static void
+S_bequeath_member_vars(CFCClass *self)
{
size_t i;
for (i = 0; self->children[i] != NULL; i++) {
@@ -461,12 +473,12 @@ CFCClass_bequeath_member_vars(CFCClass *
}
child->num_member_vars = num_vars;
child->member_vars[num_vars] = NULL;
- CFCClass_bequeath_member_vars(child);
+ S_bequeath_member_vars(child);
}
}
-void
-CFCClass_bequeath_methods(CFCClass *self)
+static void
+S_bequeath_methods(CFCClass *self)
{
size_t child_num;
for (child_num = 0; self->children[child_num] != NULL; child_num++) {
@@ -523,14 +535,14 @@ CFCClass_bequeath_methods(CFCClass *self
child->num_methods = num_methods;
// Pass it all down to the next generation.
- CFCClass_bequeath_methods(child);
- CFCClass_set_tree_grown(child, true);
+ S_bequeath_methods(child);
+ child->tree_grown = true;
}
}
// Let the children know who their parent class is.
-void
-CFCClass_establish_ancestry(CFCClass *self)
+static void
+S_establish_ancestry(CFCClass *self)
{
size_t i;
for (i = 0; i < self->num_kids; i++) {
@@ -538,7 +550,7 @@ CFCClass_establish_ancestry(CFCClass *se
// This is a circular reference and thus a memory leak, but we don't
// care, because we have to have everything in memory at once anyway.
CFCClass_set_parent(child, self);
- CFCClass_establish_ancestry(child);
+ S_establish_ancestry(child);
}
}
@@ -553,6 +565,39 @@ S_family_tree_size(CFCClass *self)
return count;
}
+static void
+S_create_dumpables(CFCClass *self)
+{
+ if (CFCClass_has_attribute(self, "dumpable")) {
+ CFCDumpable *dumpable = CFCDumpable_new();
+ CFCDumpable_add_dumpables(dumpable, self);
+ CFCBase_decref((CFCBase*)dumpable);
+ }
+}
+
+void
+CFCClass_grow_tree(CFCClass *self)
+{
+ if (self->tree_grown) {
+ croak("Can't call grow_tree more than once");
+ }
+ S_establish_ancestry(self);
+ S_bequeath_member_vars(self);
+ S_generate_automethods(self);
+ S_bequeath_methods(self);
+ self->tree_grown = 1;
+}
+
+static void
+S_generate_automethods(CFCClass *self)
+{
+ S_create_dumpables(self);
+ size_t i;
+ for (i = 0; i < self->num_kids; i++) {
+ S_generate_automethods(self->children[i]);
+ }
+}
+
// Return value is valid only so long as object persists (elements are not
// refcounted).
CFCClass**
@@ -646,18 +691,6 @@ CFCClass_get_cnick(CFCClass *self)
}
void
-CFCClass_set_tree_grown(CFCClass *self, int tree_grown)
-{
- self->tree_grown = !!tree_grown;
-}
-
-int
-CFCClass_tree_grown(CFCClass *self)
-{
- return self->tree_grown;
-}
-
-void
CFCClass_set_parent(CFCClass *self, CFCClass *parent)
{
CFCBase_decref((CFCBase*)self->parent);
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1075450&r1=1075449&r2=1075450&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Mon Feb 28 17:57:21 2011
@@ -61,9 +61,6 @@ void
CFCClass_add_method(CFCClass *self, struct CFCMethod *method);
void
-CFCClass_zap_methods(CFCClass *self);
-
-void
CFCClass_add_member_var(CFCClass *self, struct CFCVariable *var);
void
@@ -84,19 +81,6 @@ CFCClass_method(CFCClass *self, const ch
struct CFCMethod*
CFCClass_novel_method(CFCClass *self, const char *sym);
-/** Pass down methods to from parent to children.
- */
-void
-CFCClass_bequeath_methods(CFCClass *self);
-
-/** Pass down member vars to from parent to children.
- */
-void
-CFCClass_bequeath_member_vars(CFCClass *self);
-
-void
-CFCClass_establish_ancestry(CFCClass *self);
-
CFCClass**
CFCClass_tree_to_ladder(CFCClass *self);
@@ -125,12 +109,6 @@ const char*
CFCClass_get_cnick(CFCClass *self);
void
-CFCClass_set_tree_grown(CFCClass *self, int tree_grown);
-
-int
-CFCClass_tree_grown(CFCClass *self);
-
-void
CFCClass_set_parent(CFCClass *self, CFCClass *parent);
CFCClass*