cvsuser 03/11/19 07:44:06
Added: include/parrot pmc_freeze.h
t/pmc freeze.t
Log:
First draft of freeze -- Leo's base code
Revision Changes Path
1.1 parrot/include/parrot/pmc_freeze.h
Index: pmc_freeze.h
===================================================================
/* pmc_freeze.h
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
* $Id: pmc_freeze.h,v 1.1 2003/11/19 15:44:04 dan Exp $
* Overview:
* PMC freeze and thaw interface
* Data Structure and Algorithms:
* History:
* Notes:
* References:
*/
#if !defined(PARROT_PMC_FREEZE_H_GUARD)
#define PARROT_PMC_FREEZE_H_GUARD
struct _visit_info;
typedef void (*visit_child_f)(Parrot_Interp, PMC*, struct _visit_info*);
typedef void (*visit_f)(Parrot_Interp, PMC*, struct _visit_info*);
typedef enum {
VISIT_FREEZE_NORMAL,
VISIT_FREEZE_AT_DESTRUCT,
VISIT_FREEZE_SIZE,
VISIT_THAW_NORMAL,
VISIT_THAW_CONSTANTS,
VISIT_CLONE,
VISIT_DESTRUCTION_ORDER
} visit_enum_type;
struct _image_io;
#define IMAGE_IO struct _image_io
typedef void (*push_integer_f) (Parrot_Interp, IMAGE_IO*, INTVAL);
typedef void (*push_pmc_f) (Parrot_Interp, IMAGE_IO*, PMC*);
typedef INTVAL (*shift_integer_f) (Parrot_Interp, IMAGE_IO*);
typedef PMC* (*shift_pmc_f) (Parrot_Interp, IMAGE_IO*);
typedef struct _image_funcs {
push_integer_f push_integer;
push_pmc_f push_pmc;
shift_integer_f shift_integer;
shift_pmc_f shift_pmc;
} image_funcs;
typedef struct _image_io {
STRING *image;
image_funcs *vtable;
} image_io;
typedef struct _visit_info {
visit_child_f visit_child_function;
visit_f visit_function; /* freeze, thaw ... */
visit_enum_type what;
STRING* image;
PMC* mark_ptr;
PMC** thaw_ptr; /* where to thaw aa new PMC */
INTVAL last_type;
PMC* seen; /* seen hash */
PMC* todo; /* todo list */
PMC* id_list; /* used by thaw */
UINTVAL id; /* freze ID of PMC */
IMAGE_IO *image_io;
} visit_info;
/*
* public interfaces
*/
STRING* Parrot_freeze(Parrot_Interp, PMC*);
STRING* Parrot_freeze_at_destruct(Parrot_Interp, PMC*);
PMC* Parrot_thaw(Parrot_Interp, STRING*);
PMC* Parrot_thaw_constants(Parrot_Interp, STRING*);
PMC* Parrot_clone(Parrot_Interp, PMC*);
#endif
/*
* Local variables:
* c-indentation-style: bsd
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*
* vim: expandtab shiftwidth=4:
*/
1.1 parrot/t/pmc/freeze.t
Index: freeze.t
===================================================================
#! perl -w
use Parrot::Test tests => 5;
use Test::More;
output_like(<<'CODE', <<'OUTPUT', "freeze/thaw a PerlInt");
new P1, .PerlInt
set P1, 777
freeze S0, P1
print S0
print ":\n"
thaw P10, S0
typeof S10, P10
print S10
print " "
print P10
print "\n"
end
CODE
/0x[0-9a-f]+ \d+ 777 :
PerlInt 777
/
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "freeze/thaw a PerlArray");
new P0, .PerlArray
new P1, .PerlInt
set P1, 666
push P0, P1
new P1, .PerlInt
set P1, 777
push P0, P1
freeze S0, P0
thaw P10, S0
typeof S10, P10 # type
print S10
print " "
set I11, P10 # elements
print I11
print "\n"
set P12, P10[0]
print P12
print "\n"
set P12, P10[1]
print P12
print "\n"
end
CODE
PerlArray 2
666
777
OUTPUT
output_like(<<'CODE', <<'OUTPUT', "freeze PerlArray self-ref");
new P0, .PerlArray
new P1, .PerlInt
set P1, 666
push P0, P1
push P0, P0
freeze S0, P0
print S0
print ":\n"
end
CODE
/(0x[0-9a-f]*)[048c] \d+ 2 0x[0-9a-f]+ \d+ 666 \1[159d] :
/
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "freeze/thaw PerlArray self-ref");
new P1, .PerlInt
set P1, 666
new P0, .PerlArray
push P0, P1
new P1, .PerlInt
set P1, 777
push P0, P1
push P0, P0
freeze S0, P0
thaw P10, S0
typeof S10, P10
print S10
print " "
set I11, P10
print I11
print "\n"
set P12, P10[0]
print P12
print "\n"
set P12, P10[1]
print P12
print "\n"
set P12, P10[2]
set P13, P12[0]
print P13
print "\n"
end
CODE
PerlArray 3
666
777
666
OUTPUT
output_is(<<'CODE', <<'OUTPUT', "freeze/thaw PerlArray self-ref, contained Arrray");
new P1, .PerlInt
set P1, 666
new P0, .PerlArray
push P0, P1
new P1, .PerlInt
set P1, 777
push P0, P1
new P2, .PerlArray
new P4, .PerlInt
set P4, 4
push P2, P4
push P2, P0
push P0, P2
push P0, P1
freeze S0, P0
thaw P10, S0
typeof S10, P10
print S10
print " "
set I11, P10
print I11
print "\n"
set P12, P10[0]
print P12
print "\n"
set P12, P10[1]
print P12
print "\n"
set P12, P10[2]
set P13, P12[0]
print P13
print "\n"
set P13, P12[1]
set P14, P13[0]
print P14
print "\n"
set P12, P10[3]
print P12
print "\n"
end
CODE
PerlArray 4
666
777
4
666
777
OUTPUT