module Object::Syck
Constants
- DefaultResolver
- GenericResolver
Public Class Methods
Source
VALUE
rb_syck_compile(VALUE self, VALUE port)
{
SYMID oid;
int taint;
char *ret;
long blen;
VALUE bc;
bytestring_t *sav = NULL;
void *data = NULL;
SyckParser *parser = syck_new_parser();
taint = syck_parser_assign_io(parser, &port);
syck_parser_handler( parser, syck_yaml2byte_handler );
syck_parser_error_handler( parser, NULL );
syck_parser_implicit_typing( parser, 0 );
syck_parser_taguri_expansion( parser, 0 );
oid = syck_parse( parser );
if (!syck_lookup_sym( parser, oid, &data )) {
syck_free_parser( parser );
rb_raise(rb_eSyntaxError, "root node <%p> not found", (void *)oid);
}
sav = data;
/*
* Steal the buffer from the parser's symbol table (S_FREE ignores
* the NULLed pointer) so the parser can be freed before rb_str_new,
* which may raise and would otherwise leak the parser.
*/
ret = sav->buffer;
sav->buffer = NULL;
syck_free_parser( parser );
blen = (long)strlen( ret );
bc = rb_str_new( 0, blen + 2 );
memcpy( RSTRING_PTR(bc), "D\n", 2 );
memcpy( RSTRING_PTR(bc) + 2, ret, (size_t)blen );
S_FREE( ret );
if ( taint ) OBJ_TAINT( bc );
return bc;
}
Convert YAML to bytecode