Changeset 233 for trunk/ext

Show
Ignore:
Timestamp:
05/08/2006 23:03:50 (3 years ago)
Author:
why
Message:
  • ext/python: removal of the Python extension. Please use PySyck?!
  • ext/ruby/ext/syck/rubyext.c: all patches from #1 (oceaN!), using to_f on incoming floats (strtod/rb_float_new isn't accurate).
  • ext/ruby/lib/yaml/rubytypes.rb: added anonymous Class and Module loading/dumping. Thanks, Joel!
  • ext/ruby/lib/yaml.rb: spelling error. Caught by ocean!
  • lib/bytecode.c: re2c 0.10.0 is generating now.
  • lib/token.rb: support loading of [a: 1, b: 2] inline syntax.
  • lib/emitter.c: output of complex keys.
  • lib/syck.c: fix from ocean (related to buffer overrun.)
  • lib/syck.h: no longer need the definition of sycklex.
Location:
trunk/ext
Files:
1 removed
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/ext/ruby/ext/syck/rubyext.c

    r231 r233  
    5757 * symbols and constants 
    5858 */ 
    59 static ID s_new, s_utc, s_at, s_to_f, s_to_i, s_read, s_binmode, s_call, s_cmp, s_transfer, s_update, s_dup, s_haskey, s_match, s_keys, s_unpack, s_tr_bang, s_default_set, s_tag_read_class, s_tag_subclasses, s_resolver, s_push, s_emitter, s_level, s_detect_implicit, s_node_import, s_out, s_input, s_intern, s_transform, s_yaml_new, s_yaml_initialize, s_node_export, s_to_yaml, s_write, s_set_resolver; 
    60 static ID s_tags, s_domain, s_kind, s_name, s_options, s_type_id, s_type_id_set, s_style, s_style_set, s_value, s_value_set; 
     59static ID s_new, s_utc, s_at, s_to_f, s_to_i, s_read, s_binmode, s_call, s_cmp, s_transfer, s_update, s_dup, s_haskey, s_match, s_keys, s_unpack, s_tr_bang, s_default_set, s_tag_read_class, s_tag_subclasses, s_resolver, s_push, s_emitter, s_level, s_detect_implicit, s_node_import, s_out, s_input, s_intern, s_transform, s_yaml_new, s_yaml_initialize, s_node_export, s_to_yaml, s_write, s_set_resolver, s_each; 
     60static ID s_tags, s_kind, s_name, s_options, s_type_id, s_type_id_set, s_style, s_style_set, s_value, s_value_set; 
    6161static VALUE sym_model, sym_generic, sym_input, sym_bytecode; 
    6262static VALUE sym_scalar, sym_seq, sym_map; 
     
    8383void rb_syck_output_handler _((SyckEmitter *, char *, long)); 
    8484void rb_syck_emitter_handler _((SyckEmitter *, st_data_t)); 
    85 int syck_parser_assign_io _((SyckParser *, VALUE)); 
     85int syck_parser_assign_io _((SyckParser *, VALUE *)); 
    8686VALUE syck_scalar_alloc _((VALUE class)); 
    8787VALUE syck_seq_alloc _((VALUE class)); 
     
    115115 
    116116    SyckParser *parser = syck_new_parser(); 
    117     taint = syck_parser_assign_io(parser, port); 
     117    taint = syck_parser_assign_io(parser, &port); 
    118118    syck_parser_handler( parser, syck_yaml2byte_handler ); 
    119119    syck_parser_error_handler( parser, NULL ); 
     
    123123    syck_lookup_sym( parser, oid, (char **)&sav ); 
    124124 
    125     ret = S_ALLOC_N( char, strlen( sav->buffer ) + 3 ); 
     125    ret = S_ALLOCA_N( char, strlen( sav->buffer ) + 3 ); 
    126126    ret[0] = '\0'; 
    127127    strcat( ret, "D\n" ); 
     
    172172 */ 
    173173int 
    174 syck_parser_assign_io(parser, port) 
     174syck_parser_assign_io(parser, pport) 
    175175    SyckParser *parser; 
    176     VALUE port; 
     176    VALUE *pport; 
    177177{ 
    178178    int taint = Qtrue; 
    179     VALUE tmp; 
     179    VALUE tmp, port = *pport; 
    180180    if (!NIL_P(tmp = rb_check_string_type(port))) { 
    181181        taint = OBJ_TAINTED(port); /* original taintedness */ 
     
    192192        rb_raise(rb_eTypeError, "instance of IO needed"); 
    193193    } 
     194    *pport = port; 
    194195    return taint; 
    195196} 
     
    273274    if ( len > ptr - str && *ptr == '.' ) 
    274275    { 
    275         char *padded = syck_strndup( "000000", 6 ); 
     276        char padded[] = "000000"; 
    276277        char *end = ptr + 1; 
    277278        while ( isdigit( *end ) ) end++; 
    278279        MEMCPY(padded, ptr + 1, char, end - (ptr + 1)); 
    279280        usec = strtol(padded, NULL, 10); 
    280         S_FREE(padded); 
    281281    } 
    282282    else 
     
    462462                double f; 
    463463                syck_str_blow_away_commas( n ); 
    464                 f = strtod( n->data.str->ptr, NULL ); 
    465                 obj = rb_float_new( f ); 
     464                obj = rb_str_new( n->data.str->ptr, n->data.str->len ); 
     465                obj = rb_funcall( obj, s_to_f, 0 ); 
    466466            } 
    467467            else if ( strcmp( type_id, "timestamp#iso8601" ) == 0 ) 
     
    579579                            tmp = rb_ary_reverse( tmp ); 
    580580                            rb_ary_push( tmp, obj ); 
    581                             rb_iterate( rb_each, tmp, syck_merge_i, dup ); 
     581                            rb_block_call( tmp, s_each, 0, 0, syck_merge_i, dup ); 
    582582                            obj = dup; 
    583583                            skip_aset = 1; 
     
    603603} 
    604604 
     605static void syck_node_mark( SyckNode *n ); 
     606 
    605607/* 
    606608 * {native mode} node handler 
     
    711713} 
    712714 
     715static int 
     716syck_st_mark_nodes( char *key, SyckNode *n, char *arg ) 
     717{ 
     718    if ( n != (void *)1 ) syck_node_mark( n ); 
     719    return ST_CONTINUE; 
     720} 
     721 
    713722/* 
    714723 * mark parser nodes 
     
    718727    SyckParser *parser; 
    719728{ 
    720     struct parser_xtra *bonus; 
    721     rb_gc_mark(parser->root); 
    722     rb_gc_mark(parser->root_on_error); 
    723     if ( parser->bonus != NULL ) 
    724     { 
    725         bonus = (struct parser_xtra *)parser->bonus; 
     729    struct parser_xtra *bonus = (struct parser_xtra *)parser->bonus; 
     730    rb_gc_mark_maybe(parser->root); 
     731    rb_gc_mark_maybe(parser->root_on_error); 
    726732        rb_gc_mark( bonus->data ); 
    727733        rb_gc_mark( bonus->proc ); 
     734    rb_gc_mark( bonus->resolver ); 
     735 
     736    if ( parser->anchors != NULL ) 
     737    { 
     738        st_foreach( parser->anchors, syck_st_mark_nodes, 0 ); 
     739    } 
     740    if ( parser->bad_anchors != NULL ) 
     741    { 
     742        st_foreach( parser->bad_anchors, syck_st_mark_nodes, 0 ); 
    728743    } 
    729744} 
     
    736751    SyckParser *p; 
    737752{ 
    738     struct parser_xtra *bonus = (struct parser_xtra *)p->bonus; 
    739     if ( bonus != NULL ) S_FREE( bonus ); 
     753    S_FREE( p->bonus ); 
    740754    syck_free_parser(p); 
    741755} 
     
    751765    VALUE pobj; 
    752766    SyckParser *parser = syck_new_parser(); 
     767 
     768    parser->bonus = S_ALLOC( struct parser_xtra ); 
     769    S_MEMZERO( parser->bonus, struct parser_xtra, 1 ); 
    753770 
    754771    pobj = Data_Wrap_Struct( class, syck_mark_parser, rb_syck_free_parser, parser ); 
     
    823840    VALUE port, proc, model, input; 
    824841    SyckParser *parser; 
    825     struct parser_xtra *bonus = S_ALLOC_N( struct parser_xtra, 1 ); 
    826     volatile VALUE hash;    /* protect from GC */ 
     842    struct parser_xtra *bonus; 
    827843 
    828844    rb_scan_args(argc, argv, "11", &port, &proc); 
     
    833849    syck_set_model( self, input, model ); 
    834850 
    835     bonus->taint = syck_parser_assign_io(parser, port); 
    836     bonus->data = hash = rb_hash_new(); 
     851    bonus = (struct parser_xtra *)parser->bonus; 
     852    bonus->taint = syck_parser_assign_io(parser, &port); 
     853    bonus->data = rb_hash_new(); 
    837854    bonus->resolver = rb_attr_get( self, s_resolver ); 
    838855    if ( NIL_P( proc ) ) bonus->proc = 0; 
    839856    else                 bonus->proc = proc; 
    840857     
    841     parser->bonus = (void *)bonus; 
    842  
    843858    return syck_parse( parser ); 
    844859} 
     
    855870    VALUE port, proc, v, input, model; 
    856871    SyckParser *parser; 
    857     struct parser_xtra *bonus = S_ALLOC_N( struct parser_xtra, 1 ); 
    858     volatile VALUE hash; 
     872    struct parser_xtra *bonus; 
    859873 
    860874    rb_scan_args(argc, argv, "1&", &port, &proc); 
     
    865879    syck_set_model( self, input, model ); 
    866880     
    867     bonus->taint = syck_parser_assign_io(parser, port); 
     881    bonus = (struct parser_xtra *)parser->bonus; 
     882    bonus->taint = syck_parser_assign_io(parser, &port); 
    868883    bonus->resolver = rb_attr_get( self, s_resolver ); 
    869884    bonus->proc = 0; 
    870     parser->bonus = (void *)bonus; 
    871885 
    872886    while ( 1 ) 
    873887    { 
    874888        /* Reset hash for tracking nodes */ 
    875         bonus->data = hash = rb_hash_new(); 
     889        bonus->data = rb_hash_new(); 
    876890 
    877891        /* Parse a document */ 
     
    10001014                            v = rb_ary_reverse( v ); 
    10011015                            rb_ary_push( v, obj ); 
    1002                             rb_iterate( rb_each, v, syck_merge_i, dup ); 
     1016                            rb_block_call( v, s_each, 0, 0, syck_merge_i, dup ); 
    10031017                            obj = dup; 
    10041018                            skip_aset = 1; 
     
    10371051    char *ivn; 
    10381052    StringValue( ivname ); 
    1039     ivn = S_ALLOC_N( char, RSTRING(ivname)->len + 2 ); 
     1053    ivn = S_ALLOCA_N( char, RSTRING(ivname)->len + 2 ); 
    10401054    ivn[0] = '@'; 
    10411055    ivn[1] = '\0'; 
    10421056    strncat( ivn, RSTRING(ivname)->ptr, RSTRING(ivname)->len ); 
    10431057    rb_iv_set( obj, ivn, rb_ary_entry( vars, 1 ) ); 
    1044     S_FREE( ivn ); 
    10451058    return Qnil; 
    10461059} 
     
    11291142                            subclass = cYObject; 
    11301143                        } 
     1144                        else /* workaround for SEGV. real fix please */ 
     1145                        { 
     1146                            rb_raise( rb_eTypeError, "invalid subclass" ); 
     1147                        } 
    11311148                    } 
    11321149                    break; 
     
    11511168            else if ( !NIL_P( target_class ) ) 
    11521169            { 
     1170                if ( subclass == rb_cBignum ) 
     1171                { 
     1172                    obj = rb_str2inum( val, 10 ); /* for yaml dumped by 1.8.3 [ruby-core:6159] */ 
     1173                } 
     1174                else 
     1175                { 
    11531176                obj = rb_obj_alloc( subclass ); 
     1177                } 
     1178 
    11541179                if ( rb_respond_to( obj, s_yaml_initialize ) ) 
    11551180                { 
     
    11581183                else if ( !NIL_P( obj ) && rb_obj_is_instance_of( val, rb_cHash ) ) 
    11591184                { 
    1160                     rb_iterate( rb_each, val, syck_set_ivars, obj ); 
     1185                    rb_block_call( val, s_each, 0, 0, syck_set_ivars, obj ); 
    11611186                } 
    11621187            } 
     
    11951220    if ( !NIL_P(tmp) ) 
    11961221    { 
    1197         char *taguri; 
    1198         val = tmp; 
    1199         taguri = syck_type_id_to_uri( RSTRING(val)->ptr ); 
    1200         return rb_str_new2( taguri ); 
     1222        char *taguri = syck_type_id_to_uri( RSTRING(tmp)->ptr ); 
     1223        val = rb_str_new2( taguri ); 
     1224        S_FREE( taguri ); 
    12011225    } 
    12021226 
     
    13881412{ 
    13891413    int i; 
     1414    rb_gc_mark_maybe( n->id ); 
    13901415    switch ( n->kind ) 
    13911416    { 
     
    14051430        break; 
    14061431    } 
    1407 } 
    1408  
    1409 /* 
    1410  * Don't free Ruby data, Ruby will do that 
    1411  */ 
    1412 void 
    1413 rb_syck_free_node( SyckNode *n ) 
    1414 { 
    1415     switch ( n->kind  ) 
    1416     { 
    1417         case syck_str_kind: 
    1418             S_FREE( n->data.str ); 
    1419             n->data.str = NULL; 
    1420         break; 
    1421  
    1422         case syck_seq_kind: 
    1423             if ( n->data.list != NULL ) 
    1424             { 
    1425                 S_FREE( n->data.list->items ); 
    1426                 S_FREE( n->data.list ); 
    1427                 n->data.list = NULL; 
    1428             } 
    1429         break; 
    1430  
    1431         case syck_map_kind: 
    1432             if ( n->data.pairs != NULL ) 
    1433             { 
    1434                 S_FREE( n->data.pairs->keys ); 
    1435                 S_FREE( n->data.pairs->values ); 
    1436                 S_FREE( n->data.pairs ); 
    1437                 n->data.pairs = NULL; 
    1438             } 
    1439         break; 
    1440     } 
    1441  
    1442     S_FREE( n ); 
     1432#if 0 /* maybe needed */ 
     1433    if ( n->shortcut ) syck_node_mark( n->shortcut ); /* caution: maybe cyclic */ 
     1434#endif 
    14431435} 
    14441436 
     
    14511443{ 
    14521444    SyckNode *node = syck_alloc_str(); 
    1453     VALUE obj = Data_Wrap_Struct( class, syck_node_mark, rb_syck_free_node, node ); 
     1445    VALUE obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node ); 
    14541446    node->id = obj; 
    14551447    return obj; 
     
    15201512 
    15211513    StringValue( val ); 
    1522     node->data.str->ptr = RSTRING(val)->ptr; 
     1514    node->data.str->ptr = syck_strndup( RSTRING(val)->ptr, RSTRING(val)->len ); 
    15231515    node->data.str->len = RSTRING(val)->len; 
    15241516    node->data.str->style = scalar_none; 
     
    15381530    VALUE obj; 
    15391531    node = syck_alloc_seq(); 
    1540     obj = Data_Wrap_Struct( class, syck_node_mark, rb_syck_free_node, node ); 
     1532    obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node ); 
    15411533    node->id = obj; 
    15421534    return obj; 
     
    16371629    VALUE obj; 
    16381630    node = syck_alloc_map(); 
    1639     obj = Data_Wrap_Struct( class, syck_node_mark, rb_syck_free_node, node ); 
     1631    obj = Data_Wrap_Struct( class, syck_node_mark, syck_free_node, node ); 
    16401632    node->id = obj; 
    16411633    return obj; 
     
    17671759        return copy; 
    17681760 
    1769     if ( TYPE( orig ) != T_DATA || 
    1770          RDATA( orig )->dfree != ( RUBY_DATA_FUNC )rb_syck_free_node ) 
     1761    if ( TYPE( orig ) != T_DATA ) 
    17711762    { 
    17721763        rb_raise( rb_eTypeError, "wrong argument type" ); 
     
    17891780    Data_Get_Struct( self, SyckNode, node ); 
    17901781 
    1791     if ( node->type_id != NULL ) S_FREE( node->type_id ); 
    1792  
    1793     if ( NIL_P( type_id ) ) { 
    1794         node->type_id = NULL; 
    1795     } else { 
    1796         node->type_id = StringValuePtr( type_id ); 
     1782    S_FREE( node->type_id ); 
     1783 
     1784    if ( !NIL_P( type_id ) ) { 
     1785        StringValue( type_id ); 
     1786        node->type_id = syck_strndup( RSTRING(type_id)->ptr, RSTRING(type_id)->len ); 
    17971787    } 
    17981788 
     
    18121802    SyckNode *orig_n; 
    18131803    Data_Get_Struct(self, SyckNode, orig_n); 
     1804    t = Data_Wrap_Struct( cNode, syck_node_mark, syck_free_node, 0 ); 
    18141805 
    18151806    switch (orig_n->kind) 
     
    18181809            { 
    18191810                int i; 
    1820                 n = syck_alloc_map(); 
     1811                DATA_PTR(t) = n = syck_alloc_map(); 
    18211812                for ( i = 0; i < orig_n->data.pairs->idx; i++ ) 
    18221813                { 
     
    18301821            { 
    18311822                int i; 
    1832                 n = syck_alloc_seq(); 
     1823                DATA_PTR(t) = n = syck_alloc_seq(); 
    18331824                for ( i = 0; i < orig_n->data.list->idx; i++ ) 
    18341825                { 
     
    18391830 
    18401831        case syck_str_kind: 
    1841             n = syck_new_str2( orig_n->data.str->ptr, orig_n->data.str->len, orig_n->data.str->style ); 
     1832            DATA_PTR(t) = n = syck_new_str2( orig_n->data.str->ptr, orig_n->data.str->len, orig_n->data.str->style ); 
    18421833        break; 
    18431834    } 
     
    18511842        n->anchor = syck_strndup( orig_n->anchor, strlen( orig_n->anchor ) ); 
    18521843    } 
    1853     t = Data_Wrap_Struct( cNode, NULL, NULL, n ); 
    18541844    n->id = t; 
    1855     t = rb_funcall( oDefaultResolver, s_node_import, 1, t ); 
    1856     syck_free_node( n ); 
    1857     return t; 
     1845    return rb_funcall( oDefaultResolver, s_node_import, 1, t ); 
    18581846} 
    18591847 
     
    19501938    SyckEmitter *emitter; 
    19511939{ 
    1952     struct emitter_xtra *bonus; 
    1953     if ( emitter->bonus != NULL ) 
    1954     { 
    1955         bonus = (struct emitter_xtra *)emitter->bonus; 
     1940    struct emitter_xtra *bonus = (struct emitter_xtra *)emitter->bonus; 
     1941    rb_gc_mark( bonus->oid  ); 
    19561942        rb_gc_mark( bonus->data ); 
    19571943        rb_gc_mark( bonus->port ); 
    19581944    } 
    1959 } 
    19601945 
    19611946/* 
     
    19661951    SyckEmitter *e; 
    19671952{ 
    1968     struct emitter_xtra *bonus = (struct emitter_xtra *)e->bonus; 
    1969     if ( bonus != NULL ) S_FREE( bonus ); 
     1953    S_FREE( e->bonus ); 
    19701954    syck_free_emitter(e); 
    19711955} 
     
    19821966    SyckEmitter *emitter = syck_new_emitter(); 
    19831967 
     1968    emitter->bonus = S_ALLOC( struct emitter_xtra ); 
     1969    S_MEMZERO( emitter->bonus, struct emitter_xtra, 1 ); 
     1970 
    19841971    pobj = Data_Wrap_Struct( class, syck_mark_emitter, rb_syck_free_emitter, emitter ); 
    19851972    syck_emitter_handler( emitter, rb_syck_emitter_handler ); 
     
    20021989    SyckEmitter *emitter; 
    20031990    struct emitter_xtra *bonus; 
    2004     volatile VALUE hash;    /* protect from GC */ 
    20051991 
    20061992    Data_Get_Struct(self, SyckEmitter, emitter); 
    20071993    bonus = (struct emitter_xtra *)emitter->bonus; 
    2008     if ( bonus != NULL ) S_FREE( bonus ); 
    2009  
    2010     bonus = S_ALLOC_N( struct emitter_xtra, 1 ); 
     1994 
     1995    bonus->oid = Qnil; 
    20111996    bonus->port = rb_str_new2( "" ); 
    2012     bonus->data = hash = rb_hash_new(); 
     1997    bonus->data = rb_hash_new(); 
    20131998 
    20141999    if (rb_scan_args(argc, argv, "01", &options) == 0) 
     
    20312016    } 
    20322017     
    2033     emitter->headless = 1; 
    2034     emitter->bonus = (void *)bonus; 
     2018    emitter->headless = 0; 
    20352019    rb_ivar_set(self, s_level, INT2FIX(0)); 
    20362020    rb_ivar_set(self, s_resolver, Qnil); 
     
    22182202    s_yaml_new = rb_intern("yaml_new"); 
    22192203    s_yaml_initialize = rb_intern("yaml_initialize"); 
     2204    s_each = rb_intern("each"); 
    22202205 
    22212206    s_tags = rb_intern("@tags"); 
     
    22602245    rb_define_method( cResolver, "tagurize", syck_resolver_tagurize, 1 ); 
    22612246 
     2247    rb_global_variable( &oDefaultResolver ); 
    22622248    oDefaultResolver = rb_funcall( cResolver, rb_intern( "new" ), 0 ); 
    22632249    rb_define_singleton_method( oDefaultResolver, "node_import", syck_defaultresolver_node_import, 1 ); 
    22642250    rb_define_singleton_method( oDefaultResolver, "detect_implicit", syck_defaultresolver_detect_implicit, 1 ); 
    22652251    rb_define_const( rb_syck, "DefaultResolver", oDefaultResolver ); 
     2252    rb_global_variable( &oGenericResolver ); 
    22662253    oGenericResolver = rb_funcall( cResolver, rb_intern( "new" ), 0 ); 
    22672254    rb_define_singleton_method( oGenericResolver, "node_import", syck_genericresolver_node_import, 1 ); 
  • trunk/ext/ruby/lib/yaml.rb

    r231 r233  
    312312        # Add a transfer method for a builtin type 
    313313        # 
    314         def YAML.add_ruby_type( type, &transfer_proc ) 
     314        def YAML.add_ruby_type( type_tag, &transfer_proc ) 
    315315            resolver.add_type( "tag:ruby.yaml.org,2002:#{ type_tag }", transfer_proc ) 
    316316        end 
  • trunk/ext/ruby/lib/yaml/rubytypes.rb

    r231 r233  
    33require 'yaml/compat' 
    44 
     5class Module 
     6    yaml_as "tag:ruby.yaml.org,2002:module" 
     7 
     8    def Module.yaml_new( klass, tag, val ) 
     9        if String === val 
     10            val.split(/::/).inject(Object) do |m, n| 
     11                begin 
     12                    m.const_get(n) 
     13                rescue NameError 
     14                    raise ArgumentError, "undefined class/module #{n} in #{val}" 
     15                end 
     16            end 
     17        else 
     18            raise YAML::TypeError, "Invalid Module: " + val.inspect 
     19        end 
     20    end 
     21 
     22    def to_yaml( opts = {} ) 
     23        YAML::quick_emit( nil, opts ) { |out| 
     24            out.scalar( "tag:ruby.yaml.org,2002:module", self.name, :plain ) 
     25        } 
     26    end 
     27end 
     28 
    529class Class 
    6         def to_yaml( opts = {} ) 
    7                 raise TypeError, "can't dump anonymous class %s" % self.class 
    8         end 
     30    yaml_as "tag:ruby.yaml.org,2002:class" 
     31 
     32    def Class.yaml_new( klass, tag, val ) 
     33            if String === val 
     34            val.split(/::/).inject(Object) do |m, n| 
     35                begin 
     36                    m.const_get(n) 
     37                rescue NameError 
     38                    raise ArgumentError, "undefined class/module #{n} in #{val}" 
     39                end 
     40            end 
     41        else 
     42            raise YAML::TypeError, "Invalid Class: " + val.inspect 
     43        end 
     44    end 
     45 
     46    def to_yaml( opts = {} ) 
     47        YAML::quick_emit( nil, opts ) { |out| 
     48            out.scalar( "tag:ruby.yaml.org,2002:class", self.name, :plain ) 
     49        } 
     50    end 
    951end 
    1052 
     
    355397end 
    356398 
    357 class Numeric 
     399class Integer 
     400    yaml_as "tag:yaml.org,2002:int" 
     401        def to_yaml( opts = {} ) 
     402                YAML::quick_emit( nil, opts ) do |out| 
     403            out.scalar( "tag:yaml.org,2002:int", self.to_s, :plain ) 
     404        end 
     405        end 
     406end 
     407 
     408class Float 
     409    yaml_as "tag:yaml.org,2002:float" 
    358410        def to_yaml( opts = {} ) 
    359411                YAML::quick_emit( nil, opts ) do |out| 
     
    366418                str = ".NaN" 
    367419            end 
    368             out.scalar( taguri, str, :plain ) 
    369         end 
    370         end 
    371 end 
    372  
    373 class Fixnum 
    374     yaml_as "tag:yaml.org,2002:int" 
    375 end 
    376  
    377 class Float 
    378     yaml_as "tag:yaml.org,2002:float" 
     420            out.scalar( "tag:yaml.org,2002:float", str, :plain ) 
     421        end 
     422end 
    379423end 
    380424