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

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 24 00:09:58 PDT 2009


Revision: 1123
          http://trac.macosforge.org/projects/ruby/changeset/1123
Author:   lsansonetti at apple.com
Date:     2009-03-24 00:09:57 -0700 (Tue, 24 Mar 2009)
Log Message:
-----------
implemented class variables compilation

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

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-03-24 06:49:27 UTC (rev 1122)
+++ MacRuby/branches/experimental/roxor.cpp	2009-03-24 07:09:57 UTC (rev 1123)
@@ -228,6 +228,8 @@
 	Function *yieldFunc;
 	Function *gvarSetFunc;
 	Function *gvarGetFunc;
+	Function *cvarSetFunc;
+	Function *cvarGetFunc;
 	Function *popExceptionFunc;
 	Function *getSpecialFunc;
 	Function *breakFunc;
@@ -550,6 +552,8 @@
     yieldFunc = NULL;
     gvarSetFunc = NULL;
     gvarGetFunc = NULL;
+    cvarSetFunc = NULL;
+    cvarGetFunc = NULL;
     popExceptionFunc = NULL;
     getSpecialFunc = NULL;
     breakFunc = NULL;
@@ -2298,7 +2302,9 @@
 
 		if (gvarSetFunc == NULL) {
 		    // VALUE rb_gvar_set(struct global_entry *entry, VALUE val);
-		    gvarSetFunc = cast<Function>(module->getOrInsertFunction("rb_gvar_set", RubyObjTy, PtrTy, RubyObjTy, NULL));
+		    gvarSetFunc = cast<Function>(module->getOrInsertFunction(
+				"rb_gvar_set", 
+				RubyObjTy, PtrTy, RubyObjTy, NULL));
 		}
 
 		std::vector<Value *> params;
@@ -2306,10 +2312,54 @@
 		params.push_back(compile_const_pointer(node->nd_entry));
 		params.push_back(compile_node(node->nd_value));
 
-		return CallInst::Create(gvarSetFunc, params.begin(), params.end(), "", bb);
+		return CallInst::Create(gvarSetFunc, params.begin(),
+			params.end(), "", bb);
 	    }
 	    break;
 
+	case NODE_CVAR:
+	    {
+		assert(node->nd_vid > 0);
+
+		if (cvarGetFunc == NULL) {
+		    // VALUE rb_vm_cvar_get(VALUE klass, ID id);
+		    cvarGetFunc = cast<Function>(module->getOrInsertFunction(
+				"rb_vm_cvar_get", 
+				RubyObjTy, RubyObjTy, IntTy, NULL));
+		}
+
+		std::vector<Value *> params;
+
+		params.push_back(compile_current_class());
+		params.push_back(ConstantInt::get(IntTy, (long)node->nd_vid));
+
+		return compile_protected_call(cvarGetFunc, params);
+	    }
+	    break;
+
+	case NODE_CVASGN:
+	    {
+		assert(node->nd_vid > 0);
+		assert(node->nd_value != NULL);
+
+		if (cvarSetFunc == NULL) {
+		    // VALUE rb_vm_cvar_set(VALUE klass, ID id, VALUE val);
+		    cvarSetFunc = cast<Function>(module->getOrInsertFunction(
+				"rb_vm_cvar_set", 
+				RubyObjTy, RubyObjTy, IntTy, RubyObjTy, NULL));
+		}
+
+		std::vector<Value *> params;
+
+		params.push_back(compile_current_class());
+		params.push_back(ConstantInt::get(IntTy, (long)node->nd_vid));
+		params.push_back(compile_node(node->nd_value));
+
+		return CallInst::Create(cvarSetFunc, params.begin(),
+			params.end(), "", bb);
+	    }
+	    break;
+
 	case NODE_MASGN:
 	    {
 		NODE *rhsn = node->nd_value;
@@ -3148,7 +3198,8 @@
 	    {
 		assert(node->nd_vid > 0);
 		assert(node->nd_value != NULL);
-		return compile_ivar_assignment(node->nd_vid, compile_node(node->nd_value));
+		return compile_ivar_assignment(node->nd_vid,
+			compile_node(node->nd_value));
 	    }
 	    break;
 
@@ -4121,6 +4172,27 @@
 
 extern "C"
 VALUE
+rb_vm_cvar_get(VALUE klass, ID id)
+{
+    if (GET_VM()->current_class != NULL) {
+	klass = (VALUE)GET_VM()->current_class;
+    }
+    return rb_cvar_get(klass, id);
+}
+
+extern "C"
+VALUE
+rb_vm_cvar_set(VALUE klass, ID id, VALUE val)
+{
+    if (GET_VM()->current_class != NULL) {
+	klass = (VALUE)GET_VM()->current_class;
+    }
+    rb_cvar_set(klass, id, val);
+    return val;
+}
+
+extern "C"
+VALUE
 rb_vm_ary_cat(VALUE ary, VALUE obj)
 {
     if (TYPE(obj) == T_ARRAY) {

Modified: MacRuby/branches/experimental/test_roxor.rb
===================================================================
--- MacRuby/branches/experimental/test_roxor.rb	2009-03-24 06:49:27 UTC (rev 1122)
+++ MacRuby/branches/experimental/test_roxor.rb	2009-03-24 07:09:57 UTC (rev 1123)
@@ -1178,6 +1178,13 @@
 
 end
 
+test "cvar" do
+
+  assert ":ok", "begin; p @@foo; rescue NameError; p :ok; end"
+  assert "42",  "@@foo = 42; p @@foo"
+
+end
+
 =begin
 test "eval" do
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090324/46c30afb/attachment.html>


More information about the macruby-changes mailing list