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

source_changes at macosforge.org source_changes at macosforge.org
Sun Mar 22 15:35:50 PDT 2009


Revision: 1068
          http://trac.macosforge.org/projects/ruby/changeset/1068
Author:   lsansonetti at apple.com
Date:     2009-03-22 15:35:50 -0700 (Sun, 22 Mar 2009)
Log Message:
-----------
fixed multiple assignment where the left side does not exist + misc fixes

Modified Paths:
--------------
    MacRuby/branches/experimental/class.c
    MacRuby/branches/experimental/encoding.c
    MacRuby/branches/experimental/include/ruby/encoding.h
    MacRuby/branches/experimental/object.c
    MacRuby/branches/experimental/proc.c
    MacRuby/branches/experimental/re.c
    MacRuby/branches/experimental/roxor.cpp
    MacRuby/branches/experimental/roxor.h
    MacRuby/branches/experimental/string.c
    MacRuby/branches/experimental/test_roxor.rb

Modified: MacRuby/branches/experimental/class.c
===================================================================
--- MacRuby/branches/experimental/class.c	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/class.c	2009-03-22 22:35:50 UTC (rev 1068)
@@ -464,6 +464,8 @@
     return rb_define_module_id(0);
 }
 
+VALUE rb_mod_initialize(VALUE, SEL);
+
 VALUE
 rb_define_module_id(ID id)
 {
@@ -474,8 +476,7 @@
 
     if (rb_mKernel != 0) {
 	/* because Module#initialize can accept a block */
-	extern VALUE rb_mod_initialize(VALUE);
-	rb_define_method(*(VALUE *)mdl, "initialize", rb_mod_initialize, 0);
+	rb_objc_define_method(*(VALUE *)mdl, "initialize", rb_mod_initialize, 0);
     }
 
     return mdl;

Modified: MacRuby/branches/experimental/encoding.c
===================================================================
--- MacRuby/branches/experimental/encoding.c	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/encoding.c	2009-03-22 22:35:50 UTC (rev 1068)
@@ -164,7 +164,7 @@
  */
 
 VALUE
-rb_obj_encoding(VALUE obj)
+rb_obj_encoding(VALUE obj, SEL sel)
 {
     rb_encoding *enc = rb_enc_get(obj);
     if (!enc) {

Modified: MacRuby/branches/experimental/include/ruby/encoding.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/encoding.h	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/include/ruby/encoding.h	2009-03-22 22:35:50 UTC (rev 1068)
@@ -107,7 +107,7 @@
 VALUE rb_enc_vsprintf(rb_encoding *, const char*, va_list);
 long rb_enc_strlen(const char*, const char*, rb_encoding*);
 char* rb_enc_nth(const char*, const char*, int, rb_encoding*);
-VALUE rb_obj_encoding(VALUE);
+VALUE rb_obj_encoding(VALUE, SEL);
 VALUE rb_enc_str_buf_cat(VALUE str, const char *ptr, long len, rb_encoding *enc);
 
 /* index -> rb_encoding */

Modified: MacRuby/branches/experimental/object.c
===================================================================
--- MacRuby/branches/experimental/object.c	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/object.c	2009-03-22 22:35:50 UTC (rev 1068)
@@ -1556,7 +1556,7 @@
 VALUE rb_mod_module_exec(VALUE mod, SEL sel, int argc, VALUE *argv);
 
 VALUE
-rb_mod_initialize(VALUE module)
+rb_mod_initialize(VALUE module, SEL sel)
 {
     if (rb_block_given_p()) {
 	rb_mod_module_exec(module, 0, 1, &module);
@@ -1614,7 +1614,7 @@
 	rb_define_object_special_methods(klass);
 
     rb_class_inherited(super, klass);
-    rb_mod_initialize(klass);
+    rb_mod_initialize(klass, 0);
 
     return klass;
 }

Modified: MacRuby/branches/experimental/proc.c
===================================================================
--- MacRuby/branches/experimental/proc.c	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/proc.c	2009-03-22 22:35:50 UTC (rev 1068)
@@ -43,6 +43,7 @@
 {
     VALUE obj;
     obj = Data_Wrap_Struct(klass, NULL, NULL, proc);
+    proc->flags |= VM_BLOCK_PROC;
     return obj;
 }
 
@@ -192,7 +193,7 @@
     rb_vm_block_t *proc;
     GetProcPtr(procval, proc);
 
-    return proc->is_lambda ? Qtrue : Qfalse;
+    return proc->flags & VM_BLOCK_LAMBDA ? Qtrue : Qfalse;
 }
 
 /* Binding */
@@ -350,7 +351,6 @@
 	rb_raise(rb_eArgError,
 		"tried to create Proc object without a block");
     }
-    // FIXME current_block is not from autozone
     return rb_proc_alloc_with_block(klass, current_block);
 }
 

Modified: MacRuby/branches/experimental/re.c
===================================================================
--- MacRuby/branches/experimental/re.c	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/re.c	2009-03-22 22:35:50 UTC (rev 1068)
@@ -3558,7 +3558,7 @@
     rb_objc_define_method(rb_cRegexp, "source", rb_reg_source, 0);
     rb_objc_define_method(rb_cRegexp, "casefold?", rb_reg_casefold_p, 0);
     rb_objc_define_method(rb_cRegexp, "options", rb_reg_options_m, 0);
-    rb_define_method(rb_cRegexp, "encoding", rb_obj_encoding, 0); /* in encoding.c */
+    rb_objc_define_method(rb_cRegexp, "encoding", rb_obj_encoding, 0); /* in encoding.c */
     rb_objc_define_method(rb_cRegexp, "fixed_encoding?", rb_reg_fixed_encoding_p, 0);
     rb_objc_define_method(rb_cRegexp, "names", rb_reg_names, 0);
     rb_objc_define_method(rb_cRegexp, "named_captures", rb_reg_named_captures, 0);

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/roxor.cpp	2009-03-22 22:35:50 UTC (rev 1068)
@@ -2275,16 +2275,18 @@
 		NODE *rhsn = node->nd_value;
 		assert(rhsn != NULL);
 
-		NODE *splatn = node->nd_args;
-		assert(splatn == NULL); // TODO
+		Value *ary = compile_node(rhsn);
 
 		NODE *lhsn = node->nd_head;
+
+		if (lhsn == NULL) {
+		    // * = 1, 2
+		    return ary;
+		}
+
 		assert(lhsn != NULL);
 		assert(nd_type(lhsn) == NODE_ARRAY);
 
-		Value *ary = compile_node(rhsn); // XXX should always build as an array
-		NODE *l = lhsn;
-
 		if (rhsnGetFunc == NULL) {
 		    // VALUE rb_vm_rhsn_get(VALUE ary, int offset);
 		    rhsnGetFunc = cast<Function>(module->getOrInsertFunction("rb_vm_rhsn_get", 
@@ -2292,6 +2294,7 @@
 		}
 
 		int i = 0;
+		NODE *l = lhsn;
 		while (l != NULL) {
 		    NODE *ln = l->nd_head;
 
@@ -4892,7 +4895,7 @@
 	    b->imp = GET_VM()->compile((Function *)llvm_function);
 	    b->arity = rb_vm_node_arity(node);
 	}
-	b->is_lambda = true;
+	b->flags = 0;
 	b->dvars_size = dvars_size;
 
 	rb_objc_retain(b);
@@ -5354,6 +5357,16 @@
 void
 rb_vm_break(VALUE val)
 {
+#if 0
+    // XXX this doesn't work yet since break is called inside the block and
+    // we do not have a reference to it. This isn't very important though,
+    // but since 1.9 doesn't support break without Proc objects we should also
+    // raise a similar exception.
+    assert(GET_VM()->current_block != NULL);
+    if (GET_VM()->current_block->flags & VM_BLOCK_PROC) {
+	rb_raise(rb_eLocalJumpError, "break from proc-closure");
+    }
+#endif
     GET_VM()->broken_with = val;
 }
 

Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/roxor.h	2009-03-22 22:35:50 UTC (rev 1068)
@@ -94,12 +94,15 @@
     short real;
 } rb_vm_arity_t;
 
+#define VM_BLOCK_PROC	0x0001	// block is a Proc object
+#define VM_BLOCK_LAMBDA 0x0002	// block is a lambda
+
 typedef struct {
     VALUE self;
     NODE *node;
     rb_vm_arity_t arity;
     IMP imp;
-    bool is_lambda;
+    int flags;
     int dvars_size;
     VALUE *dvars[1];
 } rb_vm_block_t;

Modified: MacRuby/branches/experimental/string.c
===================================================================
--- MacRuby/branches/experimental/string.c	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/string.c	2009-03-22 22:35:50 UTC (rev 1068)
@@ -5507,7 +5507,7 @@
     rb_objc_define_method(rb_cString, "partition", rb_str_partition, 1);
     rb_objc_define_method(rb_cString, "rpartition", rb_str_rpartition, 1);
 
-    rb_define_method(rb_cString, "encoding", rb_obj_encoding, 0); /* in encoding.c */
+    rb_objc_define_method(rb_cString, "encoding", rb_obj_encoding, 0); /* in encoding.c */
     rb_objc_define_method(rb_cString, "force_encoding", rb_str_force_encoding, 1);
     rb_objc_define_method(rb_cString, "valid_encoding?", rb_str_valid_encoding_p, 0);
     rb_objc_define_method(rb_cString, "ascii_only?", rb_str_is_ascii_only_p, 0);

Modified: MacRuby/branches/experimental/test_roxor.rb
===================================================================
--- MacRuby/branches/experimental/test_roxor.rb	2009-03-22 22:12:02 UTC (rev 1067)
+++ MacRuby/branches/experimental/test_roxor.rb	2009-03-22 22:35:50 UTC (rev 1068)
@@ -317,6 +317,7 @@
   assert ':ok', "a, b, c = nil; p :ok if a == nil and b == nil and c == nil"
 
   assert ':ok', '* = 1,2; p :ok'
+  assert '[1, 2]', 'x = (* = 1,2); p x'
 
   # TODO add more multiple assignments test
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090322/0133f035/attachment-0001.html>


More information about the macruby-changes mailing list