[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