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/03/01 00:45:46 UTC
[lucy-commits] svn commit: r1075593 - in /incubator/lucy/trunk/clownfish: lib/Clownfish.xs
lib/Clownfish/Class.pm src/CFCClass.c src/CFCClass.h
Author: marvin
Date: Mon Feb 28 23:45:46 2011
New Revision: 1075593
URL: http://svn.apache.org/viewvc?rev=1075593&view=rev
Log:
Finish porting 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=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish.xs (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish.xs Mon Feb 28 23:45:46 2011
@@ -100,30 +100,32 @@ PPCODE:
MODULE = Clownfish PACKAGE = Clownfish::Class
SV*
-_create(klass, parcel, exposure, class_name_sv, class_cnick_sv, micro_sym_sv, docucomment, source_class_sv, parent_class_name_sv, is_final, is_inert)
+_create(klass, parcel, exposure_sv, class_name_sv, cnick_sv, micro_sym_sv, docucomment, source_class_sv, parent_class_name_sv, is_final, is_inert)
const char *klass;
CFCParcel *parcel;
- const char *exposure;
+ SV *exposure_sv;
SV *class_name_sv;
- SV *class_cnick_sv;
+ SV *cnick_sv;
SV *micro_sym_sv;
CFCDocuComment *docucomment;
SV *source_class_sv;
SV *parent_class_name_sv;
- int is_final;
- int is_inert;
+ bool is_final;
+ bool is_inert;
CODE:
+ const char *exposure = SvOK(exposure_sv)
+ ? SvPV_nolen(exposure_sv) : NULL;
const char *class_name = SvOK(class_name_sv)
? SvPV_nolen(class_name_sv) : NULL;
- const char *class_cnick = SvOK(class_cnick_sv)
- ? SvPV_nolen(class_cnick_sv) : NULL;
+ const char *cnick = SvOK(cnick_sv)
+ ? SvPV_nolen(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_create(parcel, exposure, class_name, class_cnick,
+ CFCClass *self = CFCClass_create(parcel, exposure, class_name, cnick,
micro_sym, docucomment, source_class, parent_class_name, is_final,
is_inert);
RETVAL = newRV(CFCBase_get_perl_obj((CFCBase*)self));
@@ -137,10 +139,11 @@ PPCODE:
CFCClass_destroy(self);
SV*
-_fetch_from_registry(key)
- const char *key;
+_fetch_singleton(parcel, class_name)
+ CFCParcel *parcel;
+ const char *class_name;
CODE:
- CFCClass *klass = CFCClass_fetch_from_registry(key);
+ CFCClass *klass = CFCClass_fetch_singleton(parcel, class_name);
RETVAL = klass
? newRV(CFCBase_get_perl_obj((CFCBase*)klass))
: newSV(0);
Modified: incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm?rev=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm (original)
+++ incubator/lucy/trunk/clownfish/lib/Clownfish/Class.pm Mon Feb 28 23:45:46 2011
@@ -50,22 +50,14 @@ our %fetch_singleton_PARAMS = (
sub fetch_singleton {
my ( undef, %args ) = @_;
verify_args( \%fetch_singleton_PARAMS, %args ) or confess $@;
-
- # Start with the class identifier.
- my $class_name = $args{class_name};
- confess("Missing required param 'class_name'") unless defined $class_name;
- $class_name =~ /(\w+)$/ or confess("Invalid class name: '$class_name'");
- my $key = $1;
-
# Maybe prepend parcel prefix.
my $parcel = $args{parcel};
if ( defined $parcel ) {
if ( !a_isa_b( $parcel, "Clownfish::Parcel" ) ) {
$parcel = Clownfish::Parcel->singleton( name => $parcel );
}
- $key = $parcel->get_prefix . $key;
}
- return _fetch_from_registry($key);
+ return _fetch_singleton( $parcel, $args{class_name} );
}
sub new { confess("The constructor for Clownfish::Class is create()") }
@@ -73,24 +65,11 @@ sub new { confess("The constructor for C
sub create {
my ( $either, %args ) = @_;
verify_args( \%create_PARAMS, %args ) or confess $@;
- $args{class_cnick} = delete $args{cnick};
- my $class_name = $args{class_name};
- confess("Missing required param 'class_name'") unless $class_name;
- $args{inert} ||= 0;
- $args{final} ||= 0;
-
- my $package = ref($either) || $either;
$args{parcel} = Clownfish::Parcel->acquire( $args{parcel} );
- $args{exposure} ||= 'parcel';
- $args{micro_sym} ||= 'class';
- my $self = $either->_create(
- @args{qw( parcel exposure class_name class_cnick micro_sym
+ my $package = ref($either) || $either;
+ return _create( $package,
+ @args{qw( parcel exposure class_name cnick micro_sym
docucomment source_class parent_class_name final inert )} );
-
- # Store in registry.
- $self->_register;
-
- return $self;
}
1;
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.c
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.c?rev=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.c (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.c Mon Feb 28 23:45:46 2011
@@ -105,14 +105,14 @@ S_bequeath_methods(CFCClass *self);
CFCClass*
CFCClass_create(struct CFCParcel *parcel, const char *exposure,
- const char *class_name, const char *class_cnick,
+ const char *class_name, const char *cnick,
const char *micro_sym, CFCDocuComment *docucomment,
const char *source_class, const char *parent_class_name,
int is_final, int is_inert)
{
CFCClass *self = (CFCClass*)CFCBase_allocate(sizeof(CFCClass),
"Clownfish::Class");
- return CFCClass_do_create(self, parcel, exposure, class_name, class_cnick,
+ return CFCClass_do_create(self, parcel, exposure, class_name, cnick,
micro_sym, docucomment, source_class, parent_class_name, is_final,
is_inert);
}
@@ -120,12 +120,15 @@ CFCClass_create(struct CFCParcel *parcel
CFCClass*
CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel,
const char *exposure, const char *class_name,
- const char *class_cnick, const char *micro_sym,
+ const char *cnick, const char *micro_sym,
CFCDocuComment *docucomment, 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);
+ CFCUTIL_NULL_CHECK(class_name);
+ exposure = exposure ? exposure : "parcel";
+ micro_sym = micro_sym ? micro_sym : "class";
+ CFCSymbol_init((CFCSymbol*)self, parcel, exposure, class_name, cnick,
+ micro_sym);
self->parent = NULL;
self->tree_grown = false;
self->autocode = (char*)CALLOCATE(1, sizeof(char));
@@ -196,6 +199,9 @@ CFCClass_do_create(CFCClass *self, struc
self->is_final = !!is_final;
self->is_inert = !!is_inert;
+ // Store in registry.
+ CFCClass_register(self);
+
return self;
}
@@ -246,7 +252,6 @@ CFCClass_destroy(CFCClass *self)
void
CFCClass_register(CFCClass *self)
{
- const char *key = self->full_struct_sym;
if (registry_size == registry_cap) {
size_t new_cap = registry_cap + 10;
registry = (CFCClassRegEntry*)REALLOCATE(registry,
@@ -258,7 +263,10 @@ CFCClass_register(CFCClass *self)
}
registry_cap = new_cap;
}
- CFCClass *existing = CFCClass_fetch_from_registry(key);
+ CFCParcel *parcel = CFCSymbol_get_parcel((CFCSymbol*)self);
+ const char *class_name = CFCSymbol_get_class_name((CFCSymbol*)self);
+ CFCClass *existing = CFCClass_fetch_singleton(parcel, class_name);
+ const char *key = self->full_struct_sym;
if (existing) {
croak("New class %s conflicts with existing class %s",
CFCSymbol_get_class_name((CFCSymbol*)self),
@@ -270,9 +278,25 @@ CFCClass_register(CFCClass *self)
}
CFCClass*
-CFCClass_fetch_from_registry(const char *key)
+CFCClass_fetch_singleton(CFCParcel *parcel, const char *class_name)
{
- if (!key) { return NULL; }
+ CFCUTIL_NULL_CHECK(class_name);
+
+ // Build up the key.
+ const char *last_colon = strrchr(class_name, ':');
+ const char *struct_sym = last_colon
+ ? last_colon + 1
+ : class_name;
+ const char *prefix = parcel ? CFCParcel_get_prefix(parcel) : "";
+ size_t prefix_len = strlen(prefix);
+ size_t struct_sym_len = strlen(struct_sym);
+ const size_t MAX_LEN = 256;
+ if (prefix_len + struct_sym_len > MAX_LEN) {
+ croak("names too long: '%s', '%s'", prefix, struct_sym);
+ }
+ char key[MAX_LEN + 1];
+ int check = sprintf(key, "%s%s", prefix, struct_sym);
+ if (check < 0) { croak("sprintf failed"); }
size_t i;
for (i = 0; i < registry_size; i++) {
if (strcmp(registry[i].key, key) == 0) {
Modified: incubator/lucy/trunk/clownfish/src/CFCClass.h
URL: http://svn.apache.org/viewvc/incubator/lucy/trunk/clownfish/src/CFCClass.h?rev=1075593&r1=1075592&r2=1075593&view=diff
==============================================================================
--- incubator/lucy/trunk/clownfish/src/CFCClass.h (original)
+++ incubator/lucy/trunk/clownfish/src/CFCClass.h Mon Feb 28 23:45:46 2011
@@ -26,7 +26,7 @@ struct CFCVariable;
CFCClass*
CFCClass_create(struct CFCParcel *parcel, const char *exposure,
- const char *class_name, const char *class_cnick,
+ const char *class_name, const char *cnick,
const char *micro_sym, struct CFCDocuComment *docucomment,
const char *source_class, const char *parent_class_name,
int is_final, int is_inert);
@@ -34,7 +34,7 @@ CFCClass_create(struct CFCParcel *parcel
CFCClass*
CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel,
const char *exposure, const char *class_name,
- const char *class_cnick, const char *micro_sym,
+ const char *cnick, const char *micro_sym,
struct CFCDocuComment *docucomment,
const char *source_class, const char *parent_class_name,
int is_final, int is_inert);
@@ -43,7 +43,7 @@ void
CFCClass_destroy(CFCClass *self);
CFCClass*
-CFCClass_fetch_from_registry(const char *key);
+CFCClass_fetch_singleton(struct CFCParcel *parcel, const char *class_name);
void
CFCClass_register(CFCClass *self);