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

source_changes at macosforge.org source_changes at macosforge.org
Tue May 5 20:07:51 PDT 2009


Revision: 1540
          http://trac.macosforge.org/projects/ruby/changeset/1540
Author:   vincent.isambart at gmail.com
Date:     2009-05-05 20:07:51 -0700 (Tue, 05 May 2009)
Log Message:
-----------
added constant definition in multiple assignment

Modified Paths:
--------------
    MacRuby/branches/experimental/roxor.cpp
    MacRuby/branches/experimental/test_vm/assign.rb

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-05-06 03:04:33 UTC (rev 1539)
+++ MacRuby/branches/experimental/roxor.cpp	2009-05-06 03:07:51 UTC (rev 1540)
@@ -352,6 +352,7 @@
 	Value *compile_ivar_assignment(ID vid, Value *val);
 	Value *compile_cvar_assignment(ID vid, Value *val);
 	Value *compile_gvar_assignment(struct global_entry *entry, Value *val);
+	Value *compile_constant_declaration(NODE *node, Value *val);
 	Value *compile_multiple_assignment(NODE *node, Value *val);
 	void compile_multiple_assignment_element(NODE *node, Value *val);
 	Value *compile_current_class(void);
@@ -1124,6 +1125,10 @@
 	    compile_multiple_assignment(node, val);
 	    break;
 
+	case NODE_CDECL:
+	    compile_constant_declaration(node, val);
+	    break;
+
 	default:
 	    compile_node_error("unimplemented MASGN subnode",
 			       node);
@@ -1423,6 +1428,36 @@
 	    params.end(), "", bb);
 }
 
+Value *
+RoxorCompiler::compile_constant_declaration(NODE *node, Value *val)
+{
+    if (setConstFunc == NULL) {
+	// VALUE rb_vm_set_const(VALUE mod, ID id, VALUE obj);
+	setConstFunc = cast<Function>(module->getOrInsertFunction(
+		    "rb_vm_set_const",
+		    Type::VoidTy, RubyObjTy, IntTy, RubyObjTy, NULL));
+    }
+
+    std::vector<Value *> params;
+
+    if (node->nd_vid > 0) {
+	params.push_back(compile_current_class());
+	params.push_back(ConstantInt::get(IntTy, (long)node->nd_vid));
+    }
+    else {
+	assert(node->nd_else != NULL);
+	params.push_back(compile_class_path(node->nd_else));
+	assert(node->nd_else->nd_mid > 0);
+	params.push_back(ConstantInt::get(IntTy, (long)node->nd_else->nd_mid));
+    }
+
+    params.push_back(val);
+
+    CallInst::Create(setConstFunc, params.begin(), params.end(), "", bb);
+
+    return val;
+}
+
 inline Value *
 RoxorCompiler::compile_current_class(void)
 {
@@ -4034,34 +4069,8 @@
 
 	case NODE_CDECL:
 	    {
-		if (setConstFunc == NULL) {
-		    // VALUE rb_vm_set_const(VALUE mod, ID id, VALUE obj);
-		    setConstFunc = cast<Function>(module->getOrInsertFunction(
-				"rb_vm_set_const", 
-				Type::VoidTy, RubyObjTy, IntTy, RubyObjTy, NULL));
-		}
-
 		assert(node->nd_value != NULL);
-
-		std::vector<Value *> params;
-	
-		if (node->nd_vid > 0) {
-		    params.push_back(compile_current_class());
-		    params.push_back(ConstantInt::get(IntTy, (long)node->nd_vid));
-		}
-		else {
-		    assert(node->nd_else != NULL);
-		    params.push_back(compile_class_path(node->nd_else));
-		    assert(node->nd_else->nd_mid > 0);
-		    params.push_back(ConstantInt::get(IntTy, (long)node->nd_else->nd_mid));
-		}
-		
-		Value *val = compile_node(node->nd_value);
-		params.push_back(val);
-
-		CallInst::Create(setConstFunc, params.begin(), params.end(), "", bb);
-
-		return val;
+		return compile_constant_declaration(node, compile_node(node->nd_value));
 	    }
 	    break;
 

Modified: MacRuby/branches/experimental/test_vm/assign.rb
===================================================================
--- MacRuby/branches/experimental/test_vm/assign.rb	2009-05-06 03:04:33 UTC (rev 1539)
+++ MacRuby/branches/experimental/test_vm/assign.rb	2009-05-06 03:07:51 UTC (rev 1540)
@@ -95,3 +95,6 @@
 }
 
 assert ':ok', '$a, x = :ok, :ko; p $a'
+assert ':ok', 'A, b = :ok, :ko; p A'
+assert ':ok', 'class C; end; C::A, b = :ok, :ko; p C::A'
+assert ':ok', 'class C; A, $b = :ok, :ko; end; p C::A'
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090505/bc828aef/attachment.html>


More information about the macruby-changes mailing list