- Timestamp:
- 05/08/2006 23:03:50 (3 years ago)
- Location:
- trunk/ext
- Files:
-
- 1 removed
- 3 modified
-
python (deleted)
-
ruby/ext/syck/rubyext.c (modified) (44 diffs)
-
ruby/lib/yaml.rb (modified) (1 diff)
-
ruby/lib/yaml/rubytypes.rb (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ext/ruby/ext/syck/rubyext.c
r231 r233 57 57 * symbols and constants 58 58 */ 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;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, s_each; 60 static 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; 61 61 static VALUE sym_model, sym_generic, sym_input, sym_bytecode; 62 62 static VALUE sym_scalar, sym_seq, sym_map; … … 83 83 void rb_syck_output_handler _((SyckEmitter *, char *, long)); 84 84 void rb_syck_emitter_handler _((SyckEmitter *, st_data_t)); 85 int syck_parser_assign_io _((SyckParser *, VALUE ));85 int syck_parser_assign_io _((SyckParser *, VALUE *)); 86 86 VALUE syck_scalar_alloc _((VALUE class)); 87 87 VALUE syck_seq_alloc _((VALUE class)); … … 115 115 116 116 SyckParser *parser = syck_new_parser(); 117 taint = syck_parser_assign_io(parser, port);117 taint = syck_parser_assign_io(parser, &port); 118 118 syck_parser_handler( parser, syck_yaml2byte_handler ); 119 119 syck_parser_error_handler( parser, NULL ); … … 123 123 syck_lookup_sym( parser, oid, (char **)&sav ); 124 124 125 ret = S_ALLOC _N( char, strlen( sav->buffer ) + 3 );125 ret = S_ALLOCA_N( char, strlen( sav->buffer ) + 3 ); 126 126 ret[0] = '\0'; 127 127 strcat( ret, "D\n" ); … … 172 172 */ 173 173 int 174 syck_parser_assign_io(parser, p ort)174 syck_parser_assign_io(parser, pport) 175 175 SyckParser *parser; 176 VALUE port;176 VALUE *pport; 177 177 { 178 178 int taint = Qtrue; 179 VALUE tmp ;179 VALUE tmp, port = *pport; 180 180 if (!NIL_P(tmp = rb_check_string_type(port))) { 181 181 taint = OBJ_TAINTED(port); /* original taintedness */ … … 192 192 rb_raise(rb_eTypeError, "instance of IO needed"); 193 193 } 194 *pport = port; 194 195 return taint; 195 196 } … … 273 274 if ( len > ptr - str && *ptr == '.' ) 274 275 { 275 char *padded = syck_strndup( "000000", 6 );276 char padded[] = "000000"; 276 277 char *end = ptr + 1; 277 278 while ( isdigit( *end ) ) end++; 278 279 MEMCPY(padded, ptr + 1, char, end - (ptr + 1)); 279 280 usec = strtol(padded, NULL, 10); 280 S_FREE(padded);281 281 } 282 282 else … … 462 462 double f; 463 463 syck_str_blow_away_commas( n ); 464 f = strtod( n->data.str->ptr, NULL);465 obj = rb_f loat_new( f);464 obj = rb_str_new( n->data.str->ptr, n->data.str->len ); 465 obj = rb_funcall( obj, s_to_f, 0 ); 466 466 } 467 467 else if ( strcmp( type_id, "timestamp#iso8601" ) == 0 ) … … 579 579 tmp = rb_ary_reverse( tmp ); 580 580 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 ); 582 582 obj = dup; 583 583 skip_aset = 1; … … 603 603 } 604 604 605 static void syck_node_mark( SyckNode *n ); 606 605 607 /* 606 608 * {native mode} node handler … … 711 713 } 712 714 715 static int 716 syck_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 713 722 /* 714 723 * mark parser nodes … … 718 727 SyckParser *parser; 719 728 { 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); 726 732 rb_gc_mark( bonus->data ); 727 733 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 ); 728 743 } 729 744 } … … 736 751 SyckParser *p; 737 752 { 738 struct parser_xtra *bonus = (struct parser_xtra *)p->bonus; 739 if ( bonus != NULL ) S_FREE( bonus ); 753 S_FREE( p->bonus ); 740 754 syck_free_parser(p); 741 755 } … … 751 765 VALUE pobj; 752 766 SyckParser *parser = syck_new_parser(); 767 768 parser->bonus = S_ALLOC( struct parser_xtra ); 769 S_MEMZERO( parser->bonus, struct parser_xtra, 1 ); 753 770 754 771 pobj = Data_Wrap_Struct( class, syck_mark_parser, rb_syck_free_parser, parser ); … … 823 840 VALUE port, proc, model, input; 824 841 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; 827 843 828 844 rb_scan_args(argc, argv, "11", &port, &proc); … … 833 849 syck_set_model( self, input, model ); 834 850 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(); 837 854 bonus->resolver = rb_attr_get( self, s_resolver ); 838 855 if ( NIL_P( proc ) ) bonus->proc = 0; 839 856 else bonus->proc = proc; 840 857 841 parser->bonus = (void *)bonus;842 843 858 return syck_parse( parser ); 844 859 } … … 855 870 VALUE port, proc, v, input, model; 856 871 SyckParser *parser; 857 struct parser_xtra *bonus = S_ALLOC_N( struct parser_xtra, 1 ); 858 volatile VALUE hash; 872 struct parser_xtra *bonus; 859 873 860 874 rb_scan_args(argc, argv, "1&", &port, &proc); … … 865 879 syck_set_model( self, input, model ); 866 880 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); 868 883 bonus->resolver = rb_attr_get( self, s_resolver ); 869 884 bonus->proc = 0; 870 parser->bonus = (void *)bonus;871 885 872 886 while ( 1 ) 873 887 { 874 888 /* Reset hash for tracking nodes */ 875 bonus->data = hash =rb_hash_new();889 bonus->data = rb_hash_new(); 876 890 877 891 /* Parse a document */ … … 1000 1014 v = rb_ary_reverse( v ); 1001 1015 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 ); 1003 1017 obj = dup; 1004 1018 skip_aset = 1; … … 1037 1051 char *ivn; 1038 1052 StringValue( ivname ); 1039 ivn = S_ALLOC _N( char, RSTRING(ivname)->len + 2 );1053 ivn = S_ALLOCA_N( char, RSTRING(ivname)->len + 2 ); 1040 1054 ivn[0] = '@'; 1041 1055 ivn[1] = '\0'; 1042 1056 strncat( ivn, RSTRING(ivname)->ptr, RSTRING(ivname)->len ); 1043 1057 rb_iv_set( obj, ivn, rb_ary_entry( vars, 1 ) ); 1044 S_FREE( ivn );1045 1058 return Qnil; 1046 1059 } … … 1129 1142 subclass = cYObject; 1130 1143 } 1144 else /* workaround for SEGV. real fix please */ 1145 { 1146 rb_raise( rb_eTypeError, "invalid subclass" ); 1147 } 1131 1148 } 1132 1149 break; … … 1151 1168 else if ( !NIL_P( target_class ) ) 1152 1169 { 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 { 1153 1176 obj = rb_obj_alloc( subclass ); 1177 } 1178 1154 1179 if ( rb_respond_to( obj, s_yaml_initialize ) ) 1155 1180 { … … 1158 1183 else if ( !NIL_P( obj ) && rb_obj_is_instance_of( val, rb_cHash ) ) 1159 1184 { 1160 rb_ iterate( rb_each, val, syck_set_ivars, obj );1185 rb_block_call( val, s_each, 0, 0, syck_set_ivars, obj ); 1161 1186 } 1162 1187 } … … 1195 1220 if ( !NIL_P(tmp) ) 1196 1221 { 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 ); 1201 1225 } 1202 1226 … … 1388 1412 { 1389 1413 int i; 1414 rb_gc_mark_maybe( n->id ); 1390 1415 switch ( n->kind ) 1391 1416 { … … 1405 1430 break; 1406 1431 } 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 1443 1435 } 1444 1436 … … 1451 1443 { 1452 1444 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 ); 1454 1446 node->id = obj; 1455 1447 return obj; … … 1520 1512 1521 1513 StringValue( val ); 1522 node->data.str->ptr = RSTRING(val)->ptr;1514 node->data.str->ptr = syck_strndup( RSTRING(val)->ptr, RSTRING(val)->len ); 1523 1515 node->data.str->len = RSTRING(val)->len; 1524 1516 node->data.str->style = scalar_none; … … 1538 1530 VALUE obj; 1539 1531 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 ); 1541 1533 node->id = obj; 1542 1534 return obj; … … 1637 1629 VALUE obj; 1638 1630 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 ); 1640 1632 node->id = obj; 1641 1633 return obj; … … 1767 1759 return copy; 1768 1760 1769 if ( TYPE( orig ) != T_DATA || 1770 RDATA( orig )->dfree != ( RUBY_DATA_FUNC )rb_syck_free_node ) 1761 if ( TYPE( orig ) != T_DATA ) 1771 1762 { 1772 1763 rb_raise( rb_eTypeError, "wrong argument type" ); … … 1789 1780 Data_Get_Struct( self, SyckNode, node ); 1790 1781 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 ); 1797 1787 } 1798 1788 … … 1812 1802 SyckNode *orig_n; 1813 1803 Data_Get_Struct(self, SyckNode, orig_n); 1804 t = Data_Wrap_Struct( cNode, syck_node_mark, syck_free_node, 0 ); 1814 1805 1815 1806 switch (orig_n->kind) … … 1818 1809 { 1819 1810 int i; 1820 n = syck_alloc_map();1811 DATA_PTR(t) = n = syck_alloc_map(); 1821 1812 for ( i = 0; i < orig_n->data.pairs->idx; i++ ) 1822 1813 { … … 1830 1821 { 1831 1822 int i; 1832 n = syck_alloc_seq();1823 DATA_PTR(t) = n = syck_alloc_seq(); 1833 1824 for ( i = 0; i < orig_n->data.list->idx; i++ ) 1834 1825 { … … 1839 1830 1840 1831 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 ); 1842 1833 break; 1843 1834 } … … 1851 1842 n->anchor = syck_strndup( orig_n->anchor, strlen( orig_n->anchor ) ); 1852 1843 } 1853 t = Data_Wrap_Struct( cNode, NULL, NULL, n );1854 1844 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 ); 1858 1846 } 1859 1847 … … 1950 1938 SyckEmitter *emitter; 1951 1939 { 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 ); 1956 1942 rb_gc_mark( bonus->data ); 1957 1943 rb_gc_mark( bonus->port ); 1958 1944 } 1959 }1960 1945 1961 1946 /* … … 1966 1951 SyckEmitter *e; 1967 1952 { 1968 struct emitter_xtra *bonus = (struct emitter_xtra *)e->bonus; 1969 if ( bonus != NULL ) S_FREE( bonus ); 1953 S_FREE( e->bonus ); 1970 1954 syck_free_emitter(e); 1971 1955 } … … 1982 1966 SyckEmitter *emitter = syck_new_emitter(); 1983 1967 1968 emitter->bonus = S_ALLOC( struct emitter_xtra ); 1969 S_MEMZERO( emitter->bonus, struct emitter_xtra, 1 ); 1970 1984 1971 pobj = Data_Wrap_Struct( class, syck_mark_emitter, rb_syck_free_emitter, emitter ); 1985 1972 syck_emitter_handler( emitter, rb_syck_emitter_handler ); … … 2002 1989 SyckEmitter *emitter; 2003 1990 struct emitter_xtra *bonus; 2004 volatile VALUE hash; /* protect from GC */2005 1991 2006 1992 Data_Get_Struct(self, SyckEmitter, emitter); 2007 1993 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; 2011 1996 bonus->port = rb_str_new2( "" ); 2012 bonus->data = hash =rb_hash_new();1997 bonus->data = rb_hash_new(); 2013 1998 2014 1999 if (rb_scan_args(argc, argv, "01", &options) == 0) … … 2031 2016 } 2032 2017 2033 emitter->headless = 1; 2034 emitter->bonus = (void *)bonus; 2018 emitter->headless = 0; 2035 2019 rb_ivar_set(self, s_level, INT2FIX(0)); 2036 2020 rb_ivar_set(self, s_resolver, Qnil); … … 2218 2202 s_yaml_new = rb_intern("yaml_new"); 2219 2203 s_yaml_initialize = rb_intern("yaml_initialize"); 2204 s_each = rb_intern("each"); 2220 2205 2221 2206 s_tags = rb_intern("@tags"); … … 2260 2245 rb_define_method( cResolver, "tagurize", syck_resolver_tagurize, 1 ); 2261 2246 2247 rb_global_variable( &oDefaultResolver ); 2262 2248 oDefaultResolver = rb_funcall( cResolver, rb_intern( "new" ), 0 ); 2263 2249 rb_define_singleton_method( oDefaultResolver, "node_import", syck_defaultresolver_node_import, 1 ); 2264 2250 rb_define_singleton_method( oDefaultResolver, "detect_implicit", syck_defaultresolver_detect_implicit, 1 ); 2265 2251 rb_define_const( rb_syck, "DefaultResolver", oDefaultResolver ); 2252 rb_global_variable( &oGenericResolver ); 2266 2253 oGenericResolver = rb_funcall( cResolver, rb_intern( "new" ), 0 ); 2267 2254 rb_define_singleton_method( oGenericResolver, "node_import", syck_genericresolver_node_import, 1 ); -
trunk/ext/ruby/lib/yaml.rb
r231 r233 312 312 # Add a transfer method for a builtin type 313 313 # 314 def YAML.add_ruby_type( type , &transfer_proc )314 def YAML.add_ruby_type( type_tag, &transfer_proc ) 315 315 resolver.add_type( "tag:ruby.yaml.org,2002:#{ type_tag }", transfer_proc ) 316 316 end -
trunk/ext/ruby/lib/yaml/rubytypes.rb
r231 r233 3 3 require 'yaml/compat' 4 4 5 class 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 27 end 28 5 29 class 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 9 51 end 10 52 … … 355 397 end 356 398 357 class Numeric 399 class 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 406 end 407 408 class Float 409 yaml_as "tag:yaml.org,2002:float" 358 410 def to_yaml( opts = {} ) 359 411 YAML::quick_emit( nil, opts ) do |out| … … 366 418 str = ".NaN" 367 419 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 422 end 379 423 end 380 424