summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGianni Ceccarelli <gianni.ceccarelli@net-a-porter.com>2012-01-24 10:51:25 +0000
committerGianni Ceccarelli <gianni.ceccarelli@net-a-porter.com>2012-01-24 10:51:25 +0000
commit2efedee43bcf77833037438d827643db1cde9116 (patch)
treee2c33cff90c89d3ac10935945c33fcd1e529014b
parentBuild results of e9892ef (on master) (diff)
parentcache attributes per class, makes thinks faster (diff)
downloaddata-multivalued-2efedee43bcf77833037438d827643db1cde9116.tar.gz
data-multivalued-2efedee43bcf77833037438d827643db1cde9116.tar.bz2
data-multivalued-2efedee43bcf77833037438d827643db1cde9116.zip
Build results of f74481a (on master)
-rw-r--r--Changes2
-rw-r--r--META.json4
-rw-r--r--META.yml2
-rw-r--r--Makefile.PL2
-rw-r--r--author_t/leaks.t72
-rw-r--r--lib/Data/MultiValued.pm4
-rw-r--r--lib/Data/MultiValued/AttributeAccessors.pm4
-rw-r--r--lib/Data/MultiValued/AttributeTrait.pm4
-rw-r--r--lib/Data/MultiValued/AttributeTrait/Ranges.pm6
-rw-r--r--lib/Data/MultiValued/AttributeTrait/Tags.pm6
-rw-r--r--lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm6
-rw-r--r--lib/Data/MultiValued/Exceptions.pm12
-rw-r--r--lib/Data/MultiValued/RangeContainer.pm4
-rw-r--r--lib/Data/MultiValued/Ranges.pm4
-rw-r--r--lib/Data/MultiValued/TagContainer.pm4
-rw-r--r--lib/Data/MultiValued/TagContainerForRanges.pm4
-rw-r--r--lib/Data/MultiValued/Tags.pm4
-rw-r--r--lib/Data/MultiValued/TagsAndRanges.pm4
-rw-r--r--lib/Data/MultiValued/UglySerializationHelperRole.pm62
-rw-r--r--t/moose-tagged.t3
20 files changed, 130 insertions, 83 deletions
diff --git a/Changes b/Changes
index 6d16193..b4ff3aa 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,6 @@
Revision history for Data::MultiValued
-0.0.3 2011-12-22 17:05:11 Europe/London
+0.0.1_5 2012-01-24 10:51:19 Europe/London
0.0.1_4 2011-12-20 10:02:30 Europe/London
- don't use Throwable::Error, we don't need stack traces, and they
diff --git a/META.json b/META.json
index dcb1350..dd3820b 100644
--- a/META.json
+++ b/META.json
@@ -52,7 +52,7 @@
}
}
},
- "release_status" : "stable",
- "version" : "0.0.3"
+ "release_status" : "testing",
+ "version" : "0.0.1_5"
}
diff --git a/META.yml b/META.yml
index 5b30221..6a6d0cd 100644
--- a/META.yml
+++ b/META.yml
@@ -35,4 +35,4 @@ requires:
overload: 0
strict: 0
warnings: 0
-version: 0.0.3
+version: 0.0.1_5
diff --git a/Makefile.PL b/Makefile.PL
index 07c83ff..a3aaa89 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -41,7 +41,7 @@ my %WriteMakefileArgs = (
"strict" => 0,
"warnings" => 0
},
- "VERSION" => "0.0.3",
+ "VERSION" => "0.0.1_5",
"test" => {
"TESTS" => "t/*.t"
}
diff --git a/author_t/leaks.t b/author_t/leaks.t
index f3c811b..629f141 100644
--- a/author_t/leaks.t
+++ b/author_t/leaks.t
@@ -21,53 +21,65 @@ use Test::Most 'die';
use Data::Printer;
use JSON::XS;
BEGIN { $ENV{DEBUG_MEM}=1 };
-use Dash::Leak;
+use Test::LeakTrace;
my $ropts={from=>10,to=>20};
+sub new_obj {
+ my $obj = Foo->new(rr=>'foo');
+ $obj->rr_multi($ropts,777);
+ return $obj;
+}
+
+my $LOOP=1;
+
my $json = JSON::XS->new->utf8;
-my $obj = Foo->new(rr=>'foo');
-$obj->rr_multi($ropts,777);
subtest 'serialisation memory leak' => sub {
+ my $obj = new_obj;
$obj=Foo->new_in_place($json->decode($json->encode($obj->as_hash)));
- leaksz 'start memory leak';
- for my $iter (0..2000) {
- $obj=Foo->new_in_place($json->decode($json->encode($obj->as_hash)));
- }
- leaksz 'stop memory leak';
+ leaktrace {
+ for my $iter (1..$LOOP) {
+ $obj=Foo->new_in_place($json->decode($json->encode($obj->as_hash)));
+ }
+ $obj=undef;
+ } -verbose;
ok(1,'done');
};
subtest 'accessor memory leak' => sub {
- leaksz 'start memory leak';
- for my $iter (0..1000) {
- $obj->rr_multi({at=>35});
- }
- leaksz 'stop memory leak non-exist';
- leaksz '...';
- for my $iter (0..1000) {
- $obj->rr_multi({at=>15});
- }
- leaksz 'stop memory leak exist';
+ my $obj = new_obj;
+ leaktrace {
+ for my $iter (1..$LOOP) {
+ $obj->rr_multi({at=>35});
+ }
+ $obj=undef;
+ } -verbose;
+ $obj = new_obj;
+ leaktrace {
+ for my $iter (1..$LOOP) {
+ $obj->rr_multi({at=>15});
+ }
+ $obj=undef;
+ } -verbose;
ok(1,'done');
};
subtest 'inner memory leak' => sub {
- my $cont = $obj->{rr__MULTIVALUED_STORAGE__}
- {_storage};
+ my $obj = new_obj;
+ my $cont = $obj->{rr__MULTIVALUED_STORAGE__}{_storage};
- leaksz 'start memory leak';
- for my $iter (0..1000) {
- eval { $cont->get({at=>35}) }
- }
- leaksz 'stop memory leak non-exist';
- leaksz '...';
- for my $iter (0..1000) {
- $cont->get({at=>15});
- }
- leaksz 'stop memory leak exist';
+ leaktrace {
+ for my $iter (1..$LOOP) {
+ eval { $cont->get({at=>35}) }
+ }
+ } -verbose;
+ leaktrace {
+ for my $iter (1..$LOOP) {
+ $cont->get({at=>15});
+ }
+ } -verbose;
ok(1,'done');
};
diff --git a/lib/Data/MultiValued.pm b/lib/Data/MultiValued.pm
index e7a0e3c..3f2e964 100644
--- a/lib/Data/MultiValued.pm
+++ b/lib/Data/MultiValued.pm
@@ -1,6 +1,6 @@
package Data::MultiValued;
{
- $Data::MultiValued::VERSION = '0.0.3';
+ $Data::MultiValued::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::DIST = 'Data-MultiValued';
@@ -25,7 +25,7 @@ Data::MultiValued - store tag- and range-dependant data in a scalar or Moose att
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/AttributeAccessors.pm b/lib/Data/MultiValued/AttributeAccessors.pm
index 78ba975..470dfda 100644
--- a/lib/Data/MultiValued/AttributeAccessors.pm
+++ b/lib/Data/MultiValued/AttributeAccessors.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::AttributeAccessors;
{
- $Data::MultiValued::AttributeAccessors::VERSION = '0.0.3';
+ $Data::MultiValued::AttributeAccessors::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::AttributeAccessors::DIST = 'Data-MultiValued';
@@ -130,7 +130,7 @@ Data::MultiValued::AttributeAccessors - method meta-class for multi-valued attri
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 DESCRIPTION
diff --git a/lib/Data/MultiValued/AttributeTrait.pm b/lib/Data/MultiValued/AttributeTrait.pm
index 1e90c94..24c6e03 100644
--- a/lib/Data/MultiValued/AttributeTrait.pm
+++ b/lib/Data/MultiValued/AttributeTrait.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::AttributeTrait;
{
- $Data::MultiValued::AttributeTrait::VERSION = '0.0.3';
+ $Data::MultiValued::AttributeTrait::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::AttributeTrait::DIST = 'Data-MultiValued';
@@ -287,7 +287,7 @@ Data::MultiValued::AttributeTrait - "base role" for traits of multi-valued Moose
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 DESCRIPTION
diff --git a/lib/Data/MultiValued/AttributeTrait/Ranges.pm b/lib/Data/MultiValued/AttributeTrait/Ranges.pm
index a221a20..654a78f 100644
--- a/lib/Data/MultiValued/AttributeTrait/Ranges.pm
+++ b/lib/Data/MultiValued/AttributeTrait/Ranges.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::AttributeTrait::Ranges;
{
- $Data::MultiValued::AttributeTrait::Ranges::VERSION = '0.0.3';
+ $Data::MultiValued::AttributeTrait::Ranges::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::AttributeTrait::Ranges::DIST = 'Data-MultiValued';
@@ -19,7 +19,7 @@ sub opts_to_pass_get { qw(at) }
package Moose::Meta::Attribute::Custom::Trait::MultiValued::Ranges;
{
- $Moose::Meta::Attribute::Custom::Trait::MultiValued::Ranges::VERSION = '0.0.3';
+ $Moose::Meta::Attribute::Custom::Trait::MultiValued::Ranges::VERSION = '0.0.1_5';
}
{
$Moose::Meta::Attribute::Custom::Trait::MultiValued::Ranges::DIST = 'Data-MultiValued';
@@ -40,7 +40,7 @@ Data::MultiValued::AttributeTrait::Ranges - attribute traits for attributes hold
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/AttributeTrait/Tags.pm b/lib/Data/MultiValued/AttributeTrait/Tags.pm
index 63f10ac..63572c5 100644
--- a/lib/Data/MultiValued/AttributeTrait/Tags.pm
+++ b/lib/Data/MultiValued/AttributeTrait/Tags.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::AttributeTrait::Tags;
{
- $Data::MultiValued::AttributeTrait::Tags::VERSION = '0.0.3';
+ $Data::MultiValued::AttributeTrait::Tags::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::AttributeTrait::Tags::DIST = 'Data-MultiValued';
@@ -19,7 +19,7 @@ sub opts_to_pass_get { qw(tag) }
package Moose::Meta::Attribute::Custom::Trait::MultiValued::Tags;
{
- $Moose::Meta::Attribute::Custom::Trait::MultiValued::Tags::VERSION = '0.0.3';
+ $Moose::Meta::Attribute::Custom::Trait::MultiValued::Tags::VERSION = '0.0.1_5';
}
{
$Moose::Meta::Attribute::Custom::Trait::MultiValued::Tags::DIST = 'Data-MultiValued';
@@ -40,7 +40,7 @@ Data::MultiValued::AttributeTrait::Tags - attribute traits for attributes holdin
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm b/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm
index 381c197..ab1643f 100644
--- a/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm
+++ b/lib/Data/MultiValued/AttributeTrait/TagsAndRanges.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::AttributeTrait::TagsAndRanges;
{
- $Data::MultiValued::AttributeTrait::TagsAndRanges::VERSION = '0.0.3';
+ $Data::MultiValued::AttributeTrait::TagsAndRanges::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::AttributeTrait::TagsAndRanges::DIST = 'Data-MultiValued';
@@ -19,7 +19,7 @@ sub opts_to_pass_get { qw(at tag) }
package Moose::Meta::Attribute::Custom::Trait::MultiValued::TagsAndRanges;
{
- $Moose::Meta::Attribute::Custom::Trait::MultiValued::TagsAndRanges::VERSION = '0.0.3';
+ $Moose::Meta::Attribute::Custom::Trait::MultiValued::TagsAndRanges::VERSION = '0.0.1_5';
}
{
$Moose::Meta::Attribute::Custom::Trait::MultiValued::TagsAndRanges::DIST = 'Data-MultiValued';
@@ -40,7 +40,7 @@ Data::MultiValued::AttributeTrait::TagsAndRanges - attribute traits for attribut
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/Exceptions.pm b/lib/Data/MultiValued/Exceptions.pm
index 311b1f8..84de506 100644
--- a/lib/Data/MultiValued/Exceptions.pm
+++ b/lib/Data/MultiValued/Exceptions.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::Exceptions;
{
- $Data::MultiValued::Exceptions::VERSION = '0.0.3';
+ $Data::MultiValued::Exceptions::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Exceptions::DIST = 'Data-MultiValued';
@@ -11,7 +11,7 @@ package Data::MultiValued::Exceptions;
package Data::MultiValued::Exceptions::NotFound;
{
- $Data::MultiValued::Exceptions::NotFound::VERSION = '0.0.3';
+ $Data::MultiValued::Exceptions::NotFound::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Exceptions::NotFound::DIST = 'Data-MultiValued';
@@ -44,7 +44,7 @@ sub as_string {
package Data::MultiValued::Exceptions::TagNotFound;
{
- $Data::MultiValued::Exceptions::TagNotFound::VERSION = '0.0.3';
+ $Data::MultiValued::Exceptions::TagNotFound::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Exceptions::TagNotFound::DIST = 'Data-MultiValued';
@@ -60,7 +60,7 @@ has '+message' => (
package Data::MultiValued::Exceptions::RangeNotFound;
{
- $Data::MultiValued::Exceptions::RangeNotFound::VERSION = '0.0.3';
+ $Data::MultiValued::Exceptions::RangeNotFound::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Exceptions::RangeNotFound::DIST = 'Data-MultiValued';
@@ -76,7 +76,7 @@ has '+message' => (
package Data::MultiValued::Exceptions::BadRange;
{
- $Data::MultiValued::Exceptions::BadRange::VERSION = '0.0.3';
+ $Data::MultiValued::Exceptions::BadRange::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Exceptions::BadRange::DIST = 'Data-MultiValued';
@@ -112,7 +112,7 @@ Data::MultiValued::Exceptions - exception classes
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 DESCRIPTION
diff --git a/lib/Data/MultiValued/RangeContainer.pm b/lib/Data/MultiValued/RangeContainer.pm
index 293c58b..6ee0e47 100644
--- a/lib/Data/MultiValued/RangeContainer.pm
+++ b/lib/Data/MultiValued/RangeContainer.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::RangeContainer;
{
- $Data::MultiValued::RangeContainer::VERSION = '0.0.3';
+ $Data::MultiValued::RangeContainer::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::RangeContainer::DIST = 'Data-MultiValued';
@@ -248,7 +248,7 @@ Data::MultiValued::RangeContainer - container for ranged values
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 DESCRIPTION
diff --git a/lib/Data/MultiValued/Ranges.pm b/lib/Data/MultiValued/Ranges.pm
index 1168960..9beb1a8 100644
--- a/lib/Data/MultiValued/Ranges.pm
+++ b/lib/Data/MultiValued/Ranges.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::Ranges;
{
- $Data::MultiValued::Ranges::VERSION = '0.0.3';
+ $Data::MultiValued::Ranges::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Ranges::DIST = 'Data-MultiValued';
@@ -93,7 +93,7 @@ Data::MultiValued::Ranges - Handle values with validity ranges
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/TagContainer.pm b/lib/Data/MultiValued/TagContainer.pm
index 39a3fb0..949440c 100644
--- a/lib/Data/MultiValued/TagContainer.pm
+++ b/lib/Data/MultiValued/TagContainer.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::TagContainer;
{
- $Data::MultiValued::TagContainer::VERSION = '0.0.3';
+ $Data::MultiValued::TagContainer::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::TagContainer::DIST = 'Data-MultiValued';
@@ -126,7 +126,7 @@ Data::MultiValued::TagContainer - container for tagged values
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 DESCRIPTION
diff --git a/lib/Data/MultiValued/TagContainerForRanges.pm b/lib/Data/MultiValued/TagContainerForRanges.pm
index ad50dff..5dc31ea 100644
--- a/lib/Data/MultiValued/TagContainerForRanges.pm
+++ b/lib/Data/MultiValued/TagContainerForRanges.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::TagContainerForRanges;
{
- $Data::MultiValued::TagContainerForRanges::VERSION = '0.0.3';
+ $Data::MultiValued::TagContainerForRanges::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::TagContainerForRanges::DIST = 'Data-MultiValued';
@@ -68,7 +68,7 @@ Data::MultiValued::TagContainerForRanges - container for tagged values that are
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 DESCRIPTION
diff --git a/lib/Data/MultiValued/Tags.pm b/lib/Data/MultiValued/Tags.pm
index 20ddd50..6d213d4 100644
--- a/lib/Data/MultiValued/Tags.pm
+++ b/lib/Data/MultiValued/Tags.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::Tags;
{
- $Data::MultiValued::Tags::VERSION = '0.0.3';
+ $Data::MultiValued::Tags::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::Tags::DIST = 'Data-MultiValued';
@@ -90,7 +90,7 @@ Data::MultiValued::Tags - Handle values with tags
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/TagsAndRanges.pm b/lib/Data/MultiValued/TagsAndRanges.pm
index 6aa1fbb..e75f0f5 100644
--- a/lib/Data/MultiValued/TagsAndRanges.pm
+++ b/lib/Data/MultiValued/TagsAndRanges.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::TagsAndRanges;
{
- $Data::MultiValued::TagsAndRanges::VERSION = '0.0.3';
+ $Data::MultiValued::TagsAndRanges::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::TagsAndRanges::DIST = 'Data-MultiValued';
@@ -103,7 +103,7 @@ Data::MultiValued::TagsAndRanges - Handle values with tags and validity ranges
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/lib/Data/MultiValued/UglySerializationHelperRole.pm b/lib/Data/MultiValued/UglySerializationHelperRole.pm
index 9913a7d..2ebe831 100644
--- a/lib/Data/MultiValued/UglySerializationHelperRole.pm
+++ b/lib/Data/MultiValued/UglySerializationHelperRole.pm
@@ -1,6 +1,6 @@
package Data::MultiValued::UglySerializationHelperRole;
{
- $Data::MultiValued::UglySerializationHelperRole::VERSION = '0.0.3';
+ $Data::MultiValued::UglySerializationHelperRole::VERSION = '0.0.1_5';
}
{
$Data::MultiValued::UglySerializationHelperRole::DIST = 'Data-MultiValued';
@@ -16,10 +16,8 @@ sub new_in_place {
my $self = bless $hash,$class;
- for my $attr ($class->meta->get_all_attributes) {
- if ($attr->does('Data::MultiValued::AttributeTrait')) {
- $attr->_rebless_slot($self);
- }
+ for my $attr (@{$class->_dmv_multi_attrs}) {
+ $attr->_rebless_slot($self);
}
return $self;
}
@@ -29,20 +27,54 @@ sub as_hash {
my ($self) = @_;
my %ret = %$self;
- for my $attr ($self->meta->get_all_attributes) {
- if ($attr->does('Data::MultiValued::AttributeTrait')) {
- my $st = $attr->_as_hash($self);
- if ($st) {
- $ret{$attr->full_storage_slot} = $st;
- }
- else {
- delete $ret{$attr->full_storage_slot};
- }
+ for my $attr (@{$self->_dmv_multi_attrs}) {
+ my $st = $attr->_as_hash($self);
+ if ($st) {
+ $ret{$attr->full_storage_slot} = $st;
+ }
+ else {
+ delete $ret{$attr->full_storage_slot};
}
}
return \%ret;
}
+{
+my (
+ %all_attrs_for_class,
+ %tagged_attrs_for_class,
+ %ranged_attrs_for_class,
+ %multi_attrs_for_class,
+);
+
+sub _dmv_all_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $all_attrs_for_class{$class} //= [$class->meta->get_all_attributes];
+}
+sub _dmv_tagged_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $tagged_attrs_for_class{$class} //=
+ [ grep { $_->does('Data::MultiValued::AttributeTrait::Tags') }
+ @{$class->_dmv_all_attrs} ];
+}
+sub _dmv_ranged_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $ranged_attrs_for_class{$class} //=
+ [ grep { $_->does('Data::MultiValued::AttributeTrait::Ranges') }
+ @{$class->_dmv_all_attrs} ];
+}
+sub _dmv_multi_attrs {
+ my ($class) = @_;$class=ref($class)||$class;
+
+ return $multi_attrs_for_class{$class} //=
+ [ grep { $_->does('Data::MultiValued::AttributeTrait') }
+ @{$class->_dmv_all_attrs} ];
+}
+}
+
1;
@@ -57,7 +89,7 @@ Data::MultiValued::UglySerializationHelperRole - only use this if you know what
=head1 VERSION
-version 0.0.3
+version 0.0.1_5
=head1 SYNOPSIS
diff --git a/t/moose-tagged.t b/t/moose-tagged.t
index 2493aff..1273bed 100644
--- a/t/moose-tagged.t
+++ b/t/moose-tagged.t
@@ -24,6 +24,9 @@ has other => (
predicate => 'has_other',
clearer => 'clear_other',
);
+
+#__PACKAGE__->meta->make_immutable;
+
}
package main;
use Test::Most 'die';