[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