Values are now restricted to only legal values (hash and array references that aren...
rkinyon [Mon, 4 Dec 2006 03:51:13 +0000 (03:51 +0000)]
lib/DBM/Deep/Engine3.pm
t/26_scalar_ref.t [moved from t/26_scalar_ref.todo with 100% similarity]
t/30_already_tied.t [moved from t/30_already_tied.todo with 100% similarity]
t/31_references.t

index 5213030..114066e 100644 (file)
@@ -190,12 +190,27 @@ sub write_value {
     }) or die "How did write_value fail (no blist)?!\n";
 
     my $r = Scalar::Util::reftype( $value ) || '';
-    #XXX Throw an error here on illegal values
+    {
+        last if $r eq '';
+        last if $r eq 'HASH';
+        last if $r eq 'ARRAY';
+
+        DBM::Deep->_throw_error(
+            "Storage of references of type '$r' is not supported."
+        );
+    }
+
     my ($class, $type);
     if ( !defined $value ) {
         $class = 'DBM::Deep::Engine::Sector::Null';
     }
     elsif ( $r eq 'ARRAY' || $r eq 'HASH' ) {
+        if ( $r eq 'ARRAY' && tied(@$value) ) {
+            DBM::Deep->_throw_error( "Cannot store something that is tied" );
+        }
+        if ( $r eq 'HASH' && tied(%$value) ) {
+            DBM::Deep->_throw_error( "Cannot store something that is tied" );
+        }
         $class = 'DBM::Deep::Engine::Sector::Reference';
         $type = substr( $r, 0, 1 );
     }
similarity index 100%
rename from t/26_scalar_ref.todo
rename to t/26_scalar_ref.t
similarity index 100%
rename from t/30_already_tied.todo
rename to t/30_already_tied.t
index da588b2..6d91aef 100644 (file)
@@ -55,6 +55,9 @@ is( $db->{array}[2]{b}, 'floober' );
 
 my %hash2 = ( abc => [ 1 .. 3 ] );
 $array[3] = \%hash2;
-$hash2{ def } = \%hash;
+SKIP: {
+    skip "Internal references are currently unsupported", 1;
+    $hash2{ def } = \%hash;
 
-is( $array[3]{def}{foo}, 2 );
+    is( $array[3]{def}{foo}, 2 );
+}