summaryrefslogtreecommitdiff
path: root/ext/syck/rubyext.c
diff options
context:
space:
mode:
authorwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-05-06 06:39:45 +0000
committerwhy <why@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-05-06 06:39:45 +0000
commit605014cb5544518d26e1039fa7d2de912151fb46 (patch)
tree77ab105fb4d3d964ac9b3f06b971d0c2d1a6b76f /ext/syck/rubyext.c
parent5363ed4c81916bda16b7dad0c6fe5a738bffa726 (diff)
* lib/yaml/rubytypes.rb (to_yaml): added instance variable handling
for Ranges, Strings, Structs, Regexps. * lib/yaml/rubytypes.rb (to_yaml_fold): new method for setting a String's flow style. * lib/yaml.rb (YAML::object_maker): now uses Object.allocate. * ext/syck/gram.c: fixed transfer methods on structs, broke it last commit. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/syck/rubyext.c')
-rw-r--r--ext/syck/rubyext.c67
1 files changed, 45 insertions, 22 deletions
diff --git a/ext/syck/rubyext.c b/ext/syck/rubyext.c
index 29ddccbbd9..d7219ef26a 100644
--- a/ext/syck/rubyext.c
+++ b/ext/syck/rubyext.c
@@ -15,25 +15,33 @@
typedef struct RVALUE {
union {
+ struct {
+ unsigned long flags; /* always 0 for freed obj */
+ struct RVALUE *next;
+ } free;
+ struct RBasic basic;
+ struct RObject object;
+ struct RClass klass;
+ struct RFloat flonum;
+ struct RString string;
+ struct RArray array;
+ struct RRegexp regexp;
+ struct RHash hash;
+ struct RData data;
+ struct RStruct rstruct;
+ struct RBignum bignum;
+ struct RFile file;
#if 0
- struct {
- unsigned long flags; /* always 0 for freed obj */
- struct RVALUE *next;
- } free;
+ struct RNode node;
+ struct RMatch match;
+ struct RVarmap varmap;
+ struct SCOPE scope;
#endif
- struct RBasic basic;
- struct RObject object;
- struct RClass klass;
- /*struct RFloat flonum;*/
- /*struct RString string;*/
- struct RArray array;
- /*struct RRegexp regexp;*/
- struct RHash hash;
- /*struct RData data;*/
- struct RStruct rstruct;
- /*struct RBignum bignum;*/
- /*struct RFile file;*/
} as;
+#ifdef GC_DEBUG
+ char *file;
+ int line;
+#endif
} RVALUE;
typedef struct {
@@ -49,7 +57,7 @@ typedef struct {
/*
* symbols and constants
*/
-static ID s_new, s_utc, s_at, s_to_f, s_to_i, s_read, s_binmode, s_call, s_transfer, s_update, s_dup, s_match, s_keys, s_to_str, s_unpack, s_tr_bang, s_anchors, s_default_set;
+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_match, s_keys, s_to_str, s_unpack, s_tr_bang, s_anchors, s_default_set;
static ID s_anchors, s_domain, s_families, s_kind, s_name, s_options, s_private_types, s_type_id, s_value;
static VALUE sym_model, sym_generic, sym_input, sym_bytecode;
static VALUE sym_scalar, sym_seq, sym_map;
@@ -552,10 +560,9 @@ yaml_org_handler( n, ref )
}
else if ( strncmp( n->data.str->ptr, ":", 1 ) == 0 )
{
- char *tmp;
- tmp = syck_strndup( n->data.str->ptr + 1, n->data.str->len - 1 );
- obj = ID2SYM( rb_intern( tmp ) );
- free( tmp );
+ obj = rb_funcall( oDefaultLoader, s_transfer, 2,
+ rb_str_new2( "ruby/sym" ),
+ rb_str_new( n->data.str->ptr + 1, n->data.str->len - 1 ) );
}
else if ( strcmp( type_id, "str" ) == 0 )
{
@@ -660,7 +667,7 @@ rb_syck_load_handler(p, n)
/*
* ID already set, let's alter the symbol table to accept the new object
*/
- if (n->id > 0)
+ if (n->id > 0 && !NIL_P(obj))
{
MEMCPY((void *)n->id, (void *)obj, RVALUE, 1);
MEMZERO((void *)obj, RVALUE, 1);
@@ -1147,6 +1154,19 @@ syck_badalias_initialize( self, val )
}
/*
+ * YAML::Syck::BadAlias.<=>
+ */
+VALUE
+syck_badalias_cmp( alias1, alias2 )
+ VALUE alias1, alias2;
+{
+ VALUE str1 = rb_ivar_get( alias1, s_name );
+ VALUE str2 = rb_ivar_get( alias2, s_name );
+ VALUE val = rb_funcall( str1, s_cmp, 1, str2 );
+ return val;
+}
+
+/*
* YAML::Syck::DomainType.initialize
*/
VALUE
@@ -1421,6 +1441,7 @@ Init_syck()
s_binmode = rb_intern("binmode");
s_transfer = rb_intern("transfer");
s_call = rb_intern("call");
+ s_cmp = rb_intern("<=>");
s_update = rb_intern("update");
s_dup = rb_intern("dup");
s_default_set = rb_intern("default=");
@@ -1512,6 +1533,8 @@ Init_syck()
cBadAlias = rb_define_class_under( rb_syck, "BadAlias", rb_cObject );
rb_define_attr( cBadAlias, "name", 1, 1 );
rb_define_method( cBadAlias, "initialize", syck_badalias_initialize, 1);
+ rb_define_method( cBadAlias, "<=>", syck_badalias_cmp, 1);
+ rb_include_module( cBadAlias, rb_const_get( rb_cObject, rb_intern("Comparable") ) );
/*
* Define YAML::Syck::MergeKey class