[macruby-changes] [1085] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sun Mar 22 22:36:13 PDT 2009
Revision: 1085
http://trac.macosforge.org/projects/ruby/changeset/1085
Author: lsansonetti at apple.com
Date: 2009-03-22 22:36:11 -0700 (Sun, 22 Mar 2009)
Log Message:
-----------
implemented const setting using the colon syntax
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-23 05:14:21 UTC (rev 1084)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-23 05:36:11 UTC (rev 1085)
@@ -281,6 +281,7 @@
Value *compile_ivar_read(ID vid);
Value *compile_ivar_assignment(ID vid, Value *val);
Value *compile_current_class(void);
+ Value *compile_class_path(NODE *node);
Value *compile_const(ID id, Value *outer);
Value *compile_singleton_class(Value *obj);
Value *compile_defined_expression(NODE *node);
@@ -1200,6 +1201,22 @@
return CallInst::Create(newStringFunc, params.begin(), params.end(), "", bb);
}
+Value *
+RoxorCompiler::compile_class_path(NODE *node)
+{
+ if (nd_type(node) == NODE_COLON3) {
+ // ::Foo
+ return ConstantInt::get(RubyObjTy, (long)rb_cObject);
+ }
+ else if (node->nd_head != NULL) {
+ // Bar::Foo
+ return compile_node(node->nd_head);
+ }
+
+ // XXX not sure about that...
+ return compile_current_class();
+}
+
void
RoxorCompiler::compile_dead_branch(void)
{
@@ -3088,17 +3105,25 @@
{
if (setConstFunc == NULL) {
// VALUE rb_vm_set_const(VALUE mod, ID id, VALUE obj);
- setConstFunc = cast<Function>(module->getOrInsertFunction("rb_vm_set_const",
+ setConstFunc = cast<Function>(module->getOrInsertFunction(
+ "rb_vm_set_const",
Type::VoidTy, RubyObjTy, IntTy, RubyObjTy, NULL));
}
- assert(node->nd_vid > 0);
assert(node->nd_value != NULL);
std::vector<Value *> params;
- params.push_back(compile_current_class());
- params.push_back(ConstantInt::get(IntTy, (long)node->nd_vid));
+ 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);
Modified: MacRuby/branches/experimental/test_roxor.rb
===================================================================
--- MacRuby/branches/experimental/test_roxor.rb 2009-03-23 05:14:21 UTC (rev 1084)
+++ MacRuby/branches/experimental/test_roxor.rb 2009-03-23 05:36:11 UTC (rev 1085)
@@ -367,6 +367,7 @@
assert '42', "FOO=42; p FOO"
assert '42', "FOO=42; p Object::FOO"
assert '42', "class X; FOO=42; end; p X::FOO"
+ assert '42', "class X; end; X::FOO=42; p X::FOO"
assert ':ok', %q{
class X; FOO=123; end
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090322/4f26cd7a/attachment.html>
More information about the macruby-changes
mailing list