cvsuser 05/03/29 11:41:03
Modified: classes fixedbooleanarray.pmc resizablebooleanarray.pmc
t/pmc freeze.t
Log:
Use calloc when allocating memory for FixedBooleanArray or
ResizableBooleanArray.
Get started on freeze/thaw.
Revision Changes Path
1.7 +45 -3 parrot/classes/fixedbooleanarray.pmc
Index: fixedbooleanarray.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/fixedbooleanarray.pmc,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- fixedbooleanarray.pmc 27 Mar 2005 12:35:21 -0000 1.6
+++ fixedbooleanarray.pmc 29 Mar 2005 19:41:00 -0000 1.7
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2005 The Perl Foundation. All Rights Reserved.
-$Id: fixedbooleanarray.pmc,v 1.6 2005/03/27 12:35:21 bernhard Exp $
+$Id: fixedbooleanarray.pmc,v 1.7 2005/03/29 19:41:00 bernhard Exp $
=head1 NAME
@@ -315,8 +315,7 @@
PMC_int_val(SELF) = size;
PMC_int_val2(SELF) = (size / BITS_PER_CHAR + 1) * BITS_PER_CHAR;
- PMC_data(SELF) = mem_sys_allocate(PMC_int_val2(SELF) /
BITS_PER_CHAR);
- PObj_active_destroy_SET(SELF);
+ PMC_data(SELF) = mem_sys_allocate_zeroed(PMC_int_val2(SELF) /
BITS_PER_CHAR);
}
/*
@@ -475,6 +474,49 @@
DYNSELF.set_integer_keyed_int(nextix, value);
}
+/*
+
+=back
+
+=head2 Freeze/thaw Interface
+
+=over 4
+
+=item C<void freeze(visit_info *info)>
+
+Used to archive the string.
+
+=cut
+
+*/
+ void freeze(visit_info *info) {
+ IMAGE_IO *io = info->image_io;
+ io->vtable->push_integer(INTERP, io, PMC_int_val(SELF));
+ STRING * s = string_from_cstring(INTERP, PMC_data(SELF),
PMC_int_val2(SELF)/BITS_PER_CHAR);
+ io->vtable->push_string(INTERP, io, s);
+ }
+
+/*
+
+=item C<void thaw(visit_info *info)>
+
+Used to unarchive the string.
+
+=cut
+
+*/
+ void thaw(visit_info *info) {
+ IMAGE_IO *io = info->image_io;
+ SUPER(info);
+ if (info->extra_flags == EXTRA_IS_NULL) {
+ INTVAL size = io->vtable->shift_integer(INTERP, io);
+ STRING * s = io->vtable->shift_string(INTERP, io);
+ PMC_int_val(SELF) = size;
+ PMC_int_val2(pmc) = s->bufused * BITS_PER_CHAR;
+ PMC_data(pmc) = mem_sys_allocate_zeroed(s->bufused);
+ mem_sys_memcopy(PMC_data(SELF), s->strstart, s->bufused);
+ }
+ }
}
/*
1.8 +1 -3 parrot/classes/resizablebooleanarray.pmc
Index: resizablebooleanarray.pmc
===================================================================
RCS file: /cvs/public/parrot/classes/resizablebooleanarray.pmc,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- resizablebooleanarray.pmc 27 Mar 2005 18:20:04 -0000 1.7
+++ resizablebooleanarray.pmc 29 Mar 2005 19:41:00 -0000 1.8
@@ -1,6 +1,6 @@
/*
Copyright: 2001-2005 The Perl Foundation. All Rights Reserved.
-$Id: resizablebooleanarray.pmc,v 1.7 2005/03/27 18:20:04 leo Exp $
+$Id: resizablebooleanarray.pmc,v 1.8 2005/03/29 19:41:00 bernhard Exp $
=head1 NAME
@@ -107,8 +107,6 @@
PMC_int_val(SELF) = size;
return;
}
-
- PObj_active_destroy_SET(SELF);
}
}
1.23 +67 -5 parrot/t/pmc/freeze.t
Index: freeze.t
===================================================================
RCS file: /cvs/public/parrot/t/pmc/freeze.t,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- freeze.t 26 Mar 2005 13:22:35 -0000 1.22
+++ freeze.t 29 Mar 2005 19:41:03 -0000 1.23
@@ -1,7 +1,5 @@
-#! perl -w
-
-# Copyright: 2001-2004 The Perl Foundation. All Rights Reserved.
-# $Id: freeze.t,v 1.22 2005/03/26 13:22:35 leo Exp $
+# Copyright: 2001-2005 The Perl Foundation. All Rights Reserved.
+# $Id: freeze.t,v 1.23 2005/03/29 19:41:03 bernhard Exp $
=head1 NAME
@@ -17,7 +15,7 @@
=cut
-use Parrot::Test tests => 25;
+use Parrot::Test tests => 26;
use Test::More;
END { unlink "temp.fpmc"; };
@@ -763,3 +761,67 @@
ok
OUTPUT
+pir_output_is(<<'CODE', <<'OUTPUT', "freeze/thaw a ResizableBooleanArray");
+.sub test @MAIN
+ .local pmc original_arr, thawed_arr
+ .local string frozen_arr
+ original_arr = new ResizableBooleanArray
+ set original_arr, 666
+ original_arr[555] = 777
+
+ # Dump some data before freezing
+ print "Before freezing:\n"
+ typeof S10, original_arr # type
+ print S10
+ print "\n"
+ set I12, original_arr # elements
+ print I12
+ print "\n"
+ I12 = original_arr[554]
+ print I12
+ print "\n"
+ I12 = original_arr[555]
+ print I12
+ print "\n"
+ I12 = original_arr[556]
+ print I12
+ print "\n"
+
+ frozen_arr = freeze original_arr
+ thawed_arr = thaw frozen_arr
+
+ # Dump the same data after freeze/thaw
+ print "\nAfter freeze/thaw:\n"
+ typeof S10, thawed_arr # type
+ print S10
+ print "\n"
+ set I12, thawed_arr # elements
+ print I12
+ print "\n"
+ I12 = thawed_arr[554]
+ print I12
+ print "\n"
+ I12 = thawed_arr[555]
+ print I12
+ print "\n"
+ I12 = thawed_arr[556]
+ print I12
+ print "\n"
+
+.end
+CODE
+Before freezing:
+ResizableBooleanArray
+666
+0
+1
+0
+
+After freeze/thaw:
+ResizableBooleanArray
+666
+0
+1
+0
+OUTPUT
+