Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
135 changes: 102 additions & 33 deletions ext/syck/rubyext.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,75 @@ struct emitter_xtra {
VALUE port;
};

/*
* The untyped Data API (Data_Wrap_Struct / Data_Get_Struct) has been
* removed from current Ruby, so every wrapper here uses the TypedData
* API and the rb_data_type_t definitions below.
*/

static void syck_node_mark(SyckNode *n);
static void syck_mark_parser(SyckParser *parser);
void rb_syck_free_parser(SyckParser *p);
static void syck_mark_emitter(SyckEmitter *emitter);
void rb_syck_free_emitter(SyckEmitter *e);

static const rb_data_type_t syck_parser_type = {
"syck/parser",
{
(void (*)(void *))syck_mark_parser,
(void (*)(void *))rb_syck_free_parser,
0,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
};

static const rb_data_type_t syck_node_type = {
"syck/node",
{
(void (*)(void *))syck_node_mark,
(void (*)(void *))syck_free_node,
0,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
};

/*
* Nodes owned by the parser must not be freed by the GC. syck_node_type
* is set as the parent so a single &syck_node_type accepts either kind
* of node in the accessors below.
*/
static const rb_data_type_t syck_node_type_nofree = {
"syck/node",
{
(void (*)(void *))syck_node_mark,
0,
0,
},
&syck_node_type, 0, RUBY_TYPED_FREE_IMMEDIATELY,
};

static const rb_data_type_t syck_emitter_type = {
"syck/emitter",
{
(void (*)(void *))syck_mark_emitter,
(void (*)(void *))rb_syck_free_emitter,
0,
},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY,
};

/*
* The taint API (OBJ_TAINT / OBJ_TAINTED) has also been removed from
* current Ruby, while older supported versions still provide it; shim
* it to a no-op where Ruby no longer defines it.
*/
#ifndef OBJ_TAINT
#define OBJ_TAINT(obj) ((void)(obj))
#endif
#ifndef OBJ_TAINTED
#define OBJ_TAINTED(obj) (0)
#endif

/*
* Convert YAML to bytecode
*/
Expand Down Expand Up @@ -655,7 +724,7 @@ rb_syck_load_handler(SyckParser *p, SyckNode *n)
/*
* Create node,
*/
obj = rb_funcall( resolver, s_node_import, 1, Data_Wrap_Struct( cNode, syck_node_mark, NULL, n ) );
obj = rb_funcall( resolver, s_node_import, 1, TypedData_Wrap_Struct( cNode, &syck_node_type_nofree, n ) );

/*
* ID already set, let's alter the symbol table to accept the new object
Expand Down Expand Up @@ -712,7 +781,7 @@ void
syck_set_model(VALUE p, VALUE input, VALUE model)
{
SyckParser *parser;
Data_Get_Struct(p, SyckParser, parser);
TypedData_Get_Struct(p, SyckParser, &syck_parser_type, parser);
syck_parser_handler( parser, rb_syck_load_handler );
/* WARN: gonna be obsoleted soon!! */
if ( model == sym_generic )
Expand Down Expand Up @@ -791,7 +860,7 @@ syck_parser_s_alloc(VALUE class)
parser->bonus = S_ALLOC( struct parser_xtra );
S_MEMZERO( parser->bonus, struct parser_xtra, 1 );

pobj = Data_Wrap_Struct( class, syck_mark_parser, rb_syck_free_parser, parser );
pobj = TypedData_Wrap_Struct( class, &syck_parser_type, parser );

syck_parser_set_root_on_error( parser, Qnil );

Expand Down Expand Up @@ -828,7 +897,7 @@ syck_parser_bufsize_set(VALUE self, VALUE size)

if ( rb_respond_to( size, s_to_i ) ) {
int n = NUM2INT(rb_funcall(size, s_to_i, 0));
Data_Get_Struct(self, SyckParser, parser);
TypedData_Get_Struct(self, SyckParser, &syck_parser_type, parser);
parser->bufsize = n;
}
return self;
Expand All @@ -842,7 +911,7 @@ syck_parser_bufsize_get(VALUE self)
{
SyckParser *parser;

Data_Get_Struct(self, SyckParser, parser);
TypedData_Get_Struct(self, SyckParser, &syck_parser_type, parser);
return INT2FIX( parser->bufsize );
}

Expand All @@ -860,7 +929,7 @@ syck_parser_load(int argc, VALUE *argv, VALUE self)

input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input );
model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model );
Data_Get_Struct(self, SyckParser, parser);
TypedData_Get_Struct(self, SyckParser, &syck_parser_type, parser);
syck_set_model( self, input, model );

bonus = (struct parser_xtra *)parser->bonus;
Expand All @@ -887,7 +956,7 @@ syck_parser_load_documents(int argc, VALUE *argv, VALUE self)

input = rb_hash_aref( rb_attr_get( self, s_options ), sym_input );
model = rb_hash_aref( rb_attr_get( self, s_options ), sym_model );
Data_Get_Struct(self, SyckParser, parser);
TypedData_Get_Struct(self, SyckParser, &syck_parser_type, parser);
syck_set_model( self, input, model );

bonus = (struct parser_xtra *)parser->bonus;
Expand Down Expand Up @@ -973,7 +1042,7 @@ syck_resolver_node_import(VALUE self, VALUE node)
SyckNode *n;
VALUE obj = Qnil;
int i = 0;
Data_Get_Struct(node, SyckNode, n);
TypedData_Get_Struct(node, SyckNode, &syck_node_type, n);

switch (n->kind)
{
Expand Down Expand Up @@ -1264,7 +1333,7 @@ syck_defaultresolver_node_import(VALUE self, VALUE node)
{
SyckNode *n;
VALUE obj;
Data_Get_Struct( node, SyckNode, n );
TypedData_Get_Struct( node, SyckNode, &syck_node_type, n );
if ( !yaml_org_handler( n, &obj ) )
{
obj = rb_funcall( self, s_transfer, 2, rb_str_new2( n->type_id ), obj );
Expand All @@ -1281,7 +1350,7 @@ syck_genericresolver_node_import(VALUE self, VALUE node)
SyckNode *n;
int i = 0;
VALUE t = Qnil, obj = Qnil, v = Qnil, style = Qnil;
Data_Get_Struct(node, SyckNode, n);
TypedData_Get_Struct(node, SyckNode, &syck_node_type, n);

if ( n->type_id != NULL )
{
Expand Down Expand Up @@ -1448,7 +1517,7 @@ VALUE
syck_scalar_alloc(VALUE class)
{
SyckNode *node = syck_alloc_str();
VALUE obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node );
VALUE obj = TypedData_Wrap_Struct( class, &syck_node_type, node );
node->id = obj;
return obj;
}
Expand All @@ -1473,7 +1542,7 @@ VALUE
syck_scalar_style_set(VALUE self, VALUE style)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( NIL_P( style ) )
{
Expand Down Expand Up @@ -1511,7 +1580,7 @@ VALUE
syck_scalar_value_set(VALUE self, VALUE val)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

StringValue( val );
node->data.str->ptr = syck_strndup( RSTRING_PTR(val), RSTRING_LEN(val) );
Expand All @@ -1531,7 +1600,7 @@ syck_seq_alloc(VALUE class)
SyckNode *node;
VALUE obj;
node = syck_alloc_seq();
obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node );
obj = TypedData_Wrap_Struct( class, &syck_node_type, node );
node->id = obj;
return obj;
}
Expand All @@ -1543,7 +1612,7 @@ VALUE
syck_seq_initialize(VALUE self, VALUE type_id, VALUE val, VALUE style)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

rb_iv_set( self, "@kind", sym_seq );
rb_funcall( self, s_type_id_set, 1, type_id );
Expand All @@ -1559,7 +1628,7 @@ VALUE
syck_seq_value_set(VALUE self, VALUE val)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

val = rb_check_array_type( val );
if ( !NIL_P( val ) ) {
Expand All @@ -1583,7 +1652,7 @@ syck_seq_add_m(VALUE self, VALUE val)
{
SyckNode *node;
VALUE emitter = rb_ivar_get( self, s_emitter );
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( rb_respond_to( emitter, s_node_export ) ) {
val = rb_funcall( emitter, s_node_export, 1, val );
Expand All @@ -1601,7 +1670,7 @@ VALUE
syck_seq_style_set(VALUE self, VALUE style)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( style == sym_inline )
{
Expand All @@ -1625,7 +1694,7 @@ syck_map_alloc(VALUE class)
SyckNode *node;
VALUE obj;
node = syck_alloc_map();
obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node );
obj = TypedData_Wrap_Struct( class, &syck_node_type, node );
node->id = obj;
return obj;
}
Expand All @@ -1637,7 +1706,7 @@ VALUE
syck_map_initialize(VALUE self, VALUE type_id, VALUE val, VALUE style)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( !NIL_P( val ) )
{
Expand Down Expand Up @@ -1671,7 +1740,7 @@ VALUE
syck_map_value_set(VALUE self, VALUE val)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( !NIL_P( val ) )
{
Expand Down Expand Up @@ -1704,7 +1773,7 @@ syck_map_add_m(VALUE self, VALUE key, VALUE val)
{
SyckNode *node;
VALUE emitter = rb_ivar_get( self, s_emitter );
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( rb_respond_to( emitter, s_node_export ) ) {
key = rb_funcall( emitter, s_node_export, 1, key );
Expand All @@ -1723,7 +1792,7 @@ VALUE
syck_map_style_set(VALUE self, VALUE style)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

if ( style == sym_inline )
{
Expand Down Expand Up @@ -1756,8 +1825,8 @@ syck_node_init_copy(VALUE copy, VALUE orig)
rb_raise( rb_eTypeError, "wrong argument type" );
}

Data_Get_Struct( orig, SyckNode, orig_n );
Data_Get_Struct( copy, SyckNode, copy_n );
TypedData_Get_Struct( orig, SyckNode, &syck_node_type, orig_n );
TypedData_Get_Struct( copy, SyckNode, &syck_node_type, copy_n );
MEMCPY( copy_n, orig_n, SyckNode, 1 );
return copy;
}
Expand All @@ -1770,7 +1839,7 @@ VALUE
syck_node_type_id_set(VALUE self, VALUE type_id)
{
SyckNode *node;
Data_Get_Struct( self, SyckNode, node );
TypedData_Get_Struct( self, SyckNode, &syck_node_type, node );

S_FREE( node->type_id );

Expand All @@ -1792,8 +1861,8 @@ syck_node_transform(VALUE self)
VALUE t;
SyckNode *n = NULL;
SyckNode *orig_n;
Data_Get_Struct(self, SyckNode, orig_n);
t = Data_Wrap_Struct( cNode, syck_node_mark, syck_free_node, 0 );
TypedData_Get_Struct(self, SyckNode, &syck_node_type, orig_n);
t = TypedData_Wrap_Struct( cNode, &syck_node_type, 0 );

switch (orig_n->kind)
{
Expand Down Expand Up @@ -1846,7 +1915,7 @@ void
rb_syck_emitter_handler(SyckEmitter *e, st_data_t data)
{
SyckNode *n;
Data_Get_Struct((VALUE)data, SyckNode, n);
TypedData_Get_Struct((VALUE)data, SyckNode, &syck_node_type, n);

switch (n->kind)
{
Expand Down Expand Up @@ -1907,7 +1976,7 @@ syck_out_mark(VALUE emitter, VALUE node)
{
SyckEmitter *emitterPtr;
struct emitter_xtra *bonus;
Data_Get_Struct(emitter, SyckEmitter, emitterPtr);
TypedData_Get_Struct(emitter, SyckEmitter, &syck_emitter_type, emitterPtr);
bonus = (struct emitter_xtra *)emitterPtr->bonus;
rb_ivar_set( node, s_emitter, emitter );
/* syck_emitter_mark_node( emitterPtr, (st_data_t)node ); */
Expand Down Expand Up @@ -1951,7 +2020,7 @@ syck_emitter_s_alloc(VALUE class)
emitter->bonus = S_ALLOC( struct emitter_xtra );
S_MEMZERO( emitter->bonus, struct emitter_xtra, 1 );

pobj = Data_Wrap_Struct( class, syck_mark_emitter, rb_syck_free_emitter, emitter );
pobj = TypedData_Wrap_Struct( class, &syck_emitter_type, emitter );
syck_emitter_handler( emitter, rb_syck_emitter_handler );
syck_output_handler( emitter, rb_syck_output_handler );

Expand All @@ -1978,7 +2047,7 @@ syck_emitter_reset(int argc, VALUE *argv, VALUE self)
SyckEmitter *emitter;
struct emitter_xtra *bonus;

Data_Get_Struct(self, SyckEmitter, emitter);
TypedData_Get_Struct(self, SyckEmitter, &syck_emitter_type, emitter);
bonus = (struct emitter_xtra *)emitter->bonus;

bonus->oid = Qnil;
Expand Down Expand Up @@ -2024,7 +2093,7 @@ syck_emitter_emit(int argc, VALUE *argv, VALUE self)
rb_ivar_set(self, s_level, INT2FIX(level));

rb_scan_args(argc, argv, "1&", &oid, &proc);
Data_Get_Struct(self, SyckEmitter, emitter);
TypedData_Get_Struct(self, SyckEmitter, &syck_emitter_type, emitter);
bonus = (struct emitter_xtra *)emitter->bonus;

/* Calculate anchors, normalize nodes, build a simpler symbol table */
Expand Down
4 changes: 1 addition & 3 deletions ext/syck/yaml2byte.c
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,7 @@ void bytestring_extend(bytestring_t *str, bytestring_t *ext)

/* convert SyckNode into yamlbyte_buffer_t objects */
SYMID
syck_yaml2byte_handler(p, n)
SyckParser *p;
SyckNode *n;
syck_yaml2byte_handler(SyckParser *p, SyckNode *n)
{
SYMID oid;
long i;
Expand Down
Loading