From: Dave Rolsky Date: Fri, 20 Feb 2009 17:40:29 +0000 (+0000) Subject: Revert back to checking for code compilation failure at the caller. X-Git-Tag: 0.77_01~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=a6eef5a3605109cfdc47a0b74fe67e72cf7036cf;p=gitmo%2FClass-MOP.git Revert back to checking for code compilation failure at the caller. Fixed some error messages along the way. --- diff --git a/lib/Class/MOP/Method/Accessor.pm b/lib/Class/MOP/Method/Accessor.pm index 3b4e5d8..05ef811 100644 --- a/lib/Class/MOP/Method/Accessor.pm +++ b/lib/Class/MOP/Method/Accessor.pm @@ -67,7 +67,8 @@ sub initialize_body { ($self->is_inline ? 'inline' : ()) ); - $self->{'body'} = $self->$method_name(); + eval { $self->{'body'} = $self->$method_name() }; + die $@ if $@; } ## generators @@ -118,14 +119,17 @@ sub generate_accessor_method_inline { my $attr_name = $attr->name; my $meta_instance = $attr->associated_class->instance_metaclass; - return $self->_eval_closure( + my $code = $self->_eval_closure( {}, 'sub {' - . $meta_instance->inline_set_slot_value('$_[0]', $attr_name, '$_[1]') + . $meta_instance->inline_set_slot_value('$_[0]', "'$attr_name'", '$_[1]') . ' if scalar(@_) == 2; ' - . $meta_instance->inline_get_slot_value('$_[0]', $attr_name) + . $meta_instance->inline_get_slot_value('$_[0]', "'$attr_name'") . '}' ); + confess "Could not generate inline accessor because : $@" if $@; + + return $code; } sub generate_reader_method_inline { @@ -134,13 +138,16 @@ sub generate_reader_method_inline { my $attr_name = $attr->name; my $meta_instance = $attr->associated_class->instance_metaclass; - return $self->_eval_closure( + my $code = $self->_eval_closure( {}, 'sub {' . 'confess "Cannot assign a value to a read-only accessor" if @_ > 1;' . $meta_instance->inline_get_slot_value('$_[0]', $attr_name) . '}' ); + confess "Could not generate inline reader because : $@" if $@; + + return $code; } sub generate_writer_method_inline { @@ -149,12 +156,15 @@ sub generate_writer_method_inline { my $attr_name = $attr->name; my $meta_instance = $attr->associated_class->instance_metaclass; - return $self->_eval_closure( + my $code = $self->_eval_closure( {}, 'sub {' . $meta_instance->inline_set_slot_value('$_[0]', $attr_name, '$_[1]') . '}' ); + confess "Could not generate inline writer because : $@" if $@; + + return $code; } @@ -164,12 +174,15 @@ sub generate_predicate_method_inline { my $attr_name = $attr->name; my $meta_instance = $attr->associated_class->instance_metaclass; - return $self->_eval_closure( + my $code = $self->_eval_closure( {}, 'sub {' . $meta_instance->inline_is_slot_initialized('$_[0]', $attr_name) . '}' ); + confess "Could not generate inline predicate because : $@" if $@; + + return $code; } sub generate_clearer_method_inline { @@ -178,12 +191,15 @@ sub generate_clearer_method_inline { my $attr_name = $attr->name; my $meta_instance = $attr->associated_class->instance_metaclass; - return $self->_eval_closure( + my $code = $self->_eval_closure( {}, 'sub {' . $meta_instance->inline_deinitialize_slot('$_[0]', $attr_name) . '}' ); + confess "Could not generate inline clearer because : $@" if $@; + + return $code; } 1; diff --git a/lib/Class/MOP/Method/Constructor.pm b/lib/Class/MOP/Method/Constructor.pm index 1f19627..77910e9 100644 --- a/lib/Class/MOP/Method/Constructor.pm +++ b/lib/Class/MOP/Method/Constructor.pm @@ -107,10 +107,13 @@ sub generate_constructor_method_inline { $source .= ";\n" . '}'; warn $source if $self->options->{debug}; - return $self->_eval_closure( + my $code = $self->_eval_closure( $close_over, $source ); + confess "Could not eval the constructor :\n\n$source\n\nbecause :\n\n$@" if $@; + + return $code; } sub _generate_slot_initializer { diff --git a/lib/Class/MOP/Method/Generated.pm b/lib/Class/MOP/Method/Generated.pm index 3466747..4d13d7a 100644 --- a/lib/Class/MOP/Method/Generated.pm +++ b/lib/Class/MOP/Method/Generated.pm @@ -49,9 +49,7 @@ sub initialize_body { sub _eval_closure { # my ($self, $captures, $sub_body) = @_; my $__captures = $_[1]; - - local $@; - my $code = join( + eval join( "\n", ( map { @@ -67,11 +65,6 @@ sub _eval_closure { ), $_[2] ); - my $sub = eval $code; - - die "$@\n$code" if $@; - - return $sub; } sub _add_line_directive {