YAML: workaround deep-copy structs

db4
Jon Harper 2014-03-17 21:39:49 +01:00 committed by John Benediktsson
parent 7925686dbc
commit c7613e62a0
1 changed files with 22 additions and 1 deletions

View File

@ -21,11 +21,32 @@ SYMBOL: anchors
[ construct-scalar ]
[ ?register-anchor ] bi ;
! TODO simplify this ?!?
TUPLE: factor_sequence_start_event_data anchor tag implicit style ;
TUPLE: factor_mapping_start_event_data anchor tag implicit style ;
TUPLE: factor_event_data sequence_start mapping_start ;
TUPLE: factor_yaml_event_t type data start_mark end_mark ;
: deep-copy-seq ( data -- data' )
{ [ anchor>> clone ] [ tag>> clone ] [ implicit>> ] [ style>> ] } cleave
factor_sequence_start_event_data boa ;
: deep-copy-map ( data -- data' )
{ [ anchor>> clone ] [ tag>> clone ] [ implicit>> ] [ style>> ] } cleave
factor_mapping_start_event_data boa ;
: deep-copy-data ( event -- data )
[ data>> ] [ type>> ] bi {
{ YAML_SEQUENCE_START_EVENT [ sequence_start>> deep-copy-seq f ] }
{ YAML_MAPPING_START_EVENT [ mapping_start>> deep-copy-map f swap ] }
[ throw ]
} case factor_event_data boa ;
: deep-copy-event ( event -- event' )
{ [ type>> ] [ deep-copy-data ] [ start_mark>> ] [ end_mark>> ] } cleave
factor_yaml_event_t boa ;
: ?scalar-value ( event -- scalar/event scalar? )
dup type>> {
{ YAML_SCALAR_EVENT [ event>scalar t ] }
{ YAML_ALIAS_EVENT [ deref-anchor t ] }
[ drop clone f ]
[ drop deep-copy-event f ]
} case ;
! Must not reuse the event struct before with-destructors scope ends