Revision: 1913 http://trac.macosforge.org/projects/ruby/changeset/1913 Author: lsansonetti@apple.com Date: 2009-06-20 16:43:28 -0700 (Sat, 20 Jun 2009) Log Message: ----------- Symbol#to_proc: implemented Modified Paths: -------------- MacRuby/branches/experimental/include/ruby/intern.h MacRuby/branches/experimental/proc.c MacRuby/branches/experimental/string.c MacRuby/branches/experimental/test_vm/block.rb MacRuby/branches/experimental/vm.cpp MacRuby/branches/experimental/vm.h Modified: MacRuby/branches/experimental/include/ruby/intern.h =================================================================== --- MacRuby/branches/experimental/include/ruby/intern.h 2009-06-20 22:17:42 UTC (rev 1912) +++ MacRuby/branches/experimental/include/ruby/intern.h 2009-06-20 23:43:28 UTC (rev 1913) @@ -274,7 +274,6 @@ VALUE rb_class_new_instance(int, VALUE*, VALUE); VALUE rb_block_proc(void); VALUE rb_f_lambda(void); -VALUE rb_proc_new(VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE); VALUE rb_proc_call(VALUE, VALUE); int rb_proc_arity(VALUE); VALUE rb_binding_new(void); Modified: MacRuby/branches/experimental/proc.c =================================================================== --- MacRuby/branches/experimental/proc.c 2009-06-20 22:17:42 UTC (rev 1912) +++ MacRuby/branches/experimental/proc.c 2009-06-20 23:43:28 UTC (rev 1913) @@ -1350,16 +1350,6 @@ } #endif -VALUE -rb_proc_new( - VALUE (*func)(ANYARGS), /* VALUE yieldarg[, VALUE procarg] */ - VALUE val) -{ -// VALUE procval = rb_iterate(mproc, 0, func, val); -// return procval; - return Qnil; -} - /* * call-seq: * meth.to_proc => prc @@ -1432,11 +1422,14 @@ return Data_Wrap_Struct(rb_cBinding, NULL, NULL, binding); } -static VALUE curry(VALUE dummy, VALUE args, int argc, VALUE *argv); +//static VALUE curry(VALUE dummy, VALUE args, int argc, VALUE *argv); static VALUE make_curry_proc(VALUE proc, VALUE passed, VALUE arity) { + // TODO + return Qnil; +#if 0 #if WITH_OBJC VALUE args = rb_ary_new3(3, proc, passed, arity); #else @@ -1449,8 +1442,10 @@ rb_ary_freeze(passed); rb_ary_freeze(args); return rb_proc_new(curry, args); +#endif } +#if 0 static VALUE curry(VALUE dummy, VALUE args, int argc, VALUE *argv) { @@ -1468,9 +1463,10 @@ arity = rb_proc_call(proc, passed); return arity; } +#endif /* - * call-seq: + curry* call-seq: * prc.curry => a_proc * prc.curry(arity) => a_proc * Modified: MacRuby/branches/experimental/string.c =================================================================== --- MacRuby/branches/experimental/string.c 2009-06-20 22:17:42 UTC (rev 1912) +++ MacRuby/branches/experimental/string.c 2009-06-20 23:43:28 UTC (rev 1913) @@ -5065,18 +5065,6 @@ return sym; } -static VALUE -sym_call(VALUE args, VALUE sym, int argc, VALUE *argv) -{ - VALUE obj; - - if (argc < 1) { - rb_raise(rb_eArgError, "no receiver given"); - } - obj = argv[0]; - return rb_funcall3(obj, (ID)sym, argc - 1, argv + 1); -} - /* * call-seq: * sym.to_proc @@ -5089,7 +5077,9 @@ static VALUE sym_to_proc(VALUE sym, SEL sel) { - return rb_proc_new(sym_call, (VALUE)SYM2ID(sym)); + SEL msel = sel_registerName(rb_id2name(SYM2ID(sym))); + rb_vm_block_t *b = rb_vm_create_block_calling_sel(msel); + return rb_proc_alloc_with_block(rb_cProc, b); } ID Modified: MacRuby/branches/experimental/test_vm/block.rb =================================================================== --- MacRuby/branches/experimental/test_vm/block.rb 2009-06-20 22:17:42 UTC (rev 1912) +++ MacRuby/branches/experimental/test_vm/block.rb 2009-06-20 23:43:28 UTC (rev 1913) @@ -521,3 +521,14 @@ p :ok if foo == 42 p :ok if $!.nil? } + +assert ':ok', %{ + b = :foo.to_proc + begin + b.call + rescue ArgumentError + p :ok + end +} + +assert '[2, 3, 4]', "p [1, 2, 3].map(&:succ)" Modified: MacRuby/branches/experimental/vm.cpp =================================================================== --- MacRuby/branches/experimental/vm.cpp 2009-06-20 22:17:42 UTC (rev 1912) +++ MacRuby/branches/experimental/vm.cpp 2009-06-20 23:43:28 UTC (rev 1913) @@ -3088,8 +3088,6 @@ return GET_VM()->current_block(); } -extern "C" VALUE rb_proc_alloc_with_block(VALUE klass, rb_vm_block_t *proc); - extern "C" VALUE rb_vm_current_block_object(void) @@ -3187,6 +3185,31 @@ return b; } +static VALUE +rb_vm_block_call_sel(VALUE rcv, SEL sel, VALUE **dvars, rb_vm_block_t *b, + VALUE x) +{ + if (x == Qnil) { + rb_raise(rb_eArgError, "no receiver given"); + } + return rb_vm_call(x, (SEL)dvars[0], 0, NULL, false); +} + +extern "C" +rb_vm_block_t * +rb_vm_create_block_calling_sel(SEL sel) +{ + rb_vm_block_t *b = (rb_vm_block_t *)xmalloc(sizeof(rb_vm_block_t) + + sizeof(VALUE *)); + + b->arity = rb_vm_arity(1); + b->flags = VM_BLOCK_PROC; + b->imp = (IMP)rb_vm_block_call_sel; + b->dvars[0] = (VALUE *)sel; + + return b; +} + static inline VALUE rb_vm_block_eval0(rb_vm_block_t *b, VALUE self, int argc, const VALUE *argv) { Modified: MacRuby/branches/experimental/vm.h =================================================================== --- MacRuby/branches/experimental/vm.h 2009-06-20 22:17:42 UTC (rev 1912) +++ MacRuby/branches/experimental/vm.h 2009-06-20 23:43:28 UTC (rev 1913) @@ -285,8 +285,12 @@ GC_WB(&robj->slots[slot], val); } +// Defined in proc.c +VALUE rb_proc_alloc_with_block(VALUE klass, rb_vm_block_t *proc); + rb_vm_method_t *rb_vm_get_method(VALUE klass, VALUE obj, ID mid, int scope); rb_vm_block_t *rb_vm_create_block_from_method(rb_vm_method_t *method); +rb_vm_block_t *rb_vm_create_block_calling_sel(SEL sel); static inline rb_vm_block_t * rb_proc_get_block(VALUE proc)
participants (1)
-
source_changes@macosforge.org