[macruby-changes] [2186] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 3 12:31:32 PDT 2009


Revision: 2186
          http://trac.macosforge.org/projects/ruby/changeset/2186
Author:   pthomson at apple.com
Date:     2009-08-03 12:31:31 -0700 (Mon, 03 Aug 2009)
Log Message:
-----------
Ensured that Ranges are constructed correctly from provided YAML - the inner members of a tagged hash were not having the correct attributes applied to them."

Modified Paths:
--------------
    MacRuby/branches/experimental/ext/libyaml/rubyext.c
    MacRuby/branches/experimental/lib/yaml/rubytypes.rb

Modified: MacRuby/branches/experimental/ext/libyaml/rubyext.c
===================================================================
--- MacRuby/branches/experimental/ext/libyaml/rubyext.c	2009-08-03 19:31:30 UTC (rev 2185)
+++ MacRuby/branches/experimental/ext/libyaml/rubyext.c	2009-08-03 19:31:31 UTC (rev 2186)
@@ -233,7 +233,8 @@
 	const char *tag = RSTRING_PTR(tagstr);
 	if ((strcmp(tag, "tag:yaml.org,2002:int") == 0) ||
 		(strcmp(tag, "tag:yaml.org,2002:float") == 0) ||
-		(strcmp(tag, "tag:ruby.yaml.org,2002:symbol") == 0))
+		(strcmp(tag, "tag:ruby.yaml.org,2002:symbol") == 0) ||
+		(strcmp(tag, "tag:yaml.org,2002:bool") == 0))
 	{
 		return NULL;	
 	}
@@ -416,17 +417,21 @@
 static VALUE
 rb_yaml_resolve_node(yaml_node_t *node, yaml_document_t *document, VALUE tags)
 {
+	VALUE tag = rb_str_new2((const char*)node->tag);
+	VALUE handler = rb_hash_lookup(tags, tag);
 	switch(node->type)
 	{
 		case YAML_SCALAR_NODE:
 		{
+			printf("Tag is %s\n", node->tag);
 			if (node->data.scalar.style == YAML_PLAIN_SCALAR_STYLE)
 			{
 				rb_yaml_guess_type_of_plain_node(node);
+				tag = rb_str_new2((const char*)node->tag);
+				handler = rb_hash_lookup(tags, tag);
+				printf("Tag is now %s\n", node->tag);
 			}
-			VALUE tag = rb_str_new2((const char*)node->tag);
 			VALUE scalarval = rb_str_new((const char*)node->data.scalar.value, node->data.scalar.length);
-			VALUE handler = rb_hash_lookup(tags, tag);
 			if (rb_respond_to(handler, rb_intern("call")))
 			{
 				return rb_funcall(handler, rb_intern("call"), 1, scalarval);
@@ -449,6 +454,14 @@
 				VALUE new_obj = rb_yaml_resolve_node(subnode, document, tags);
 				rb_ary_push(arr, new_obj);
 			}
+			if (rb_respond_to(handler, rb_intern("call")))
+			{
+				return rb_funcall(handler, rb_intern("call"), 1, arr);
+			}
+			else if (rb_respond_to(handler, rb_intern("yaml_new")))
+			{
+				return rb_funcall(handler, rb_intern("yaml_new"), 1, arr);
+			}
 			return arr;
 		}
 		break;
@@ -463,6 +476,14 @@
 				VALUE v = rb_yaml_resolve_node(yaml_document_get_node(document, pair->value), document, tags);
 				rb_hash_aset(hash, k, v);
 			}
+			if (rb_respond_to(handler, rb_intern("call")))
+			{
+				return rb_funcall(handler, rb_intern("call"), 1, hash);
+			}
+			else if (rb_respond_to(handler, rb_intern("yaml_new")))
+			{
+				return rb_funcall(handler, rb_intern("yaml_new"), 1, hash);
+			}
 			return hash;
 		}
 		

Modified: MacRuby/branches/experimental/lib/yaml/rubytypes.rb
===================================================================
--- MacRuby/branches/experimental/lib/yaml/rubytypes.rb	2009-08-03 19:31:30 UTC (rev 2185)
+++ MacRuby/branches/experimental/lib/yaml/rubytypes.rb	2009-08-03 19:31:31 UTC (rev 2186)
@@ -67,6 +67,7 @@
 
 class Array
   yaml_as "tag:yaml.org,2002:seq"
+  
   def to_yaml(doc = nil)
     YAML::quick_emit(self, doc) do |out|
       out.seq(taguri, to_yaml_style) do |seq|
@@ -78,6 +79,7 @@
 
 class Hash
   yaml_as "tag:yaml.org,2002:map"
+  
   def to_yaml(doc = nil)
     YAML::quick_emit(self, doc) do |out|
       out.map(taguri, to_yaml_style) do |map| 
@@ -135,6 +137,24 @@
   end
 end
 
+class Range
+  yaml_as "tag:ruby.yaml.org,2002:range"
+  
+  def Range.yaml_new(attrs)
+    Range.new(attrs['begin'], attrs['end'], attrs['excl'])
+  end
+  
+  def to_yaml(doc=nil)
+    YAML::quick_emit(self, doc) do |out|
+      out.map(taguri, to_yaml_style) do |map|
+        map.add('begin', self.begin)
+        map.add('end', self.end)
+        map.add('excl', self.exclude_end?)
+      end
+    end
+  end
+end
+
 class Regexp
   yaml_as "tag:ruby.yaml.org,2002:regexp"
   def to_yaml(doc = nil)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090803/89212007/attachment-0001.html>


More information about the macruby-changes mailing list