[macruby-changes] [1055] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Sat Mar 21 19:28:17 PDT 2009
Revision: 1055
http://trac.macosforge.org/projects/ruby/changeset/1055
Author: lsansonetti at apple.com
Date: 2009-03-21 19:28:17 -0700 (Sat, 21 Mar 2009)
Log Message:
-----------
do not stack blocks since this doesn't go well with the ruby semantics
Modified Paths:
--------------
MacRuby/branches/experimental/include/ruby/ruby.h
MacRuby/branches/experimental/proc.c
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
MacRuby/branches/experimental/test_roxor.rb
MacRuby/branches/experimental/vm_eval.c
Modified: MacRuby/branches/experimental/include/ruby/ruby.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/ruby.h 2009-03-22 01:17:49 UTC (rev 1054)
+++ MacRuby/branches/experimental/include/ruby/ruby.h 2009-03-22 02:28:17 UTC (rev 1055)
@@ -962,8 +962,8 @@
void rb_need_block(void);
VALUE rb_iterate(VALUE(*)(VALUE),VALUE,VALUE(*)(ANYARGS),VALUE);
VALUE rb_block_call(VALUE,ID,int,VALUE*,VALUE(*)(ANYARGS),VALUE);
-VALUE rb_objc_block_call(VALUE obj, SEL sel, int argc, VALUE *argv,
- VALUE (*bl_proc) (ANYARGS), VALUE data2);
+VALUE rb_objc_block_call(VALUE obj, SEL sel, void *cache, int argc,
+ VALUE *argv, VALUE (*bl_proc) (ANYARGS), VALUE data2);
VALUE rb_rescue(VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE);
VALUE rb_rescue2(VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE,...);
VALUE rb_ensure(VALUE(*)(ANYARGS),VALUE,VALUE(*)(ANYARGS),VALUE);
Modified: MacRuby/branches/experimental/proc.c
===================================================================
--- MacRuby/branches/experimental/proc.c 2009-03-22 01:17:49 UTC (rev 1054)
+++ MacRuby/branches/experimental/proc.c 2009-03-22 02:28:17 UTC (rev 1055)
@@ -1119,7 +1119,7 @@
}
}
- VALUE result = rb_vm_call_with_cache2(data->cache, data->recv,
+ VALUE result = rb_vm_call_with_cache2(data->cache, data->recv,
data->oclass, data->sel, argc, argv);
if (safe >= 0) {
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-03-22 01:17:49 UTC (rev 1054)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-22 02:28:17 UTC (rev 1055)
@@ -383,7 +383,6 @@
std::map<ID, struct ccache *> ccache;
std::map<Class, std::map<ID, int> *> ivar_slots;
std::map<SEL, GlobalVariable *> redefined_ops_gvars;
- std::stack<rb_vm_block_t *> current_blocks;
public:
static RoxorVM *current;
@@ -399,14 +398,11 @@
std::map<NODE *, rb_vm_block_t *> blocks;
std::map<double, struct rb_float_cache *> float_cache;
unsigned char method_missing_reason;
+ rb_vm_block_t *current_block;
+ rb_vm_block_t *previous_block; // only used for non-Ruby created blocks
RoxorVM(void);
- rb_vm_block_t *top_block(void) { return current_blocks.top(); }
- bool block_given(void) { return !current_blocks.empty(); }
- void push_block(rb_vm_block_t *b) { current_blocks.push(b); }
- void pop_block(void) { current_blocks.pop(); }
-
ExecutionEngine *execution_engine(void) { return ee; }
IMP compile(Function *func, bool optimize=true) {
@@ -1776,6 +1772,9 @@
backref = Qnil;
broken_with = Qundef;
+ current_block = NULL;
+ previous_block = NULL;
+
load_path = rb_ary_new();
rb_objc_retain((void *)load_path);
loaded_features = rb_ary_new();
@@ -4744,10 +4743,11 @@
if (block != NULL) {
rb_vm_block_t *b = (rb_vm_block_t *)block;
- GET_VM()->push_block(b);
+ rb_vm_block_t *old_b = GET_VM()->current_block;
+ GET_VM()->current_block = b;
VALUE retval =
__rb_vm_dispatch(cache, self, NULL, sel, opt, argc, argv);
- GET_VM()->pop_block();
+ GET_VM()->current_block = old_b;
return retval;
}
@@ -4947,8 +4947,8 @@
extern "C"
VALUE
-rb_vm_call_with_cache2(void *cache, VALUE self, VALUE klass, SEL sel, int argc,
- const VALUE *argv)
+rb_vm_call_with_cache2(void *cache, VALUE self, VALUE klass, SEL sel,
+ int argc, const VALUE *argv)
{
return __rb_vm_dispatch((struct mcache *)cache, self, (Class)klass, sel,
0, argc, argv);
@@ -4965,28 +4965,30 @@
int
rb_block_given_p(void)
{
- return GET_VM()->block_given() ? Qtrue : Qfalse;
+ return GET_VM()->current_block != NULL ? Qtrue : Qfalse;
}
extern "C"
rb_vm_block_t *
rb_vm_current_block(void)
{
- return GET_VM()->top_block();
+ return GET_VM()->current_block;
}
extern "C"
void
-rb_vm_push_block(rb_vm_block_t *block)
+rb_vm_change_current_block(rb_vm_block_t *block)
{
- GET_VM()->push_block(block);
+ GET_VM()->previous_block = GET_VM()->current_block;
+ GET_VM()->current_block = block;
}
extern "C"
void
-rb_vm_pop_block(void)
+rb_vm_restore_current_block(void)
{
- GET_VM()->pop_block();
+ GET_VM()->current_block = GET_VM()->previous_block;
+ GET_VM()->previous_block = NULL;
}
extern "C" VALUE rb_proc_alloc_with_block(VALUE klass, rb_vm_block_t *proc);
@@ -4995,8 +4997,8 @@
VALUE
rb_vm_current_block_object(void)
{
- if (GET_VM()->block_given()) {
- return rb_proc_alloc_with_block(rb_cProc, GET_VM()->top_block());
+ if (GET_VM()->current_block != NULL) {
+ return rb_proc_alloc_with_block(rb_cProc, GET_VM()->current_block);
}
return Qnil;
}
@@ -5158,11 +5160,15 @@
static inline VALUE
rb_vm_yield0(int argc, const VALUE *argv)
{
- rb_vm_block_t *b = GET_VM()->top_block();
+ rb_vm_block_t *b = GET_VM()->current_block;
- GET_VM()->pop_block();
+ if (b == NULL) {
+ rb_raise(rb_eLocalJumpError, "no block given");
+ }
+
+ GET_VM()->current_block = GET_VM()->previous_block;
VALUE retval = rb_vm_block_eval0(b, argc, argv);
- GET_VM()->push_block(b);
+ GET_VM()->current_block = b;
return retval;
}
@@ -5178,9 +5184,9 @@
VALUE
rb_vm_yield_under(VALUE klass, VALUE self, int argc, const VALUE *argv)
{
- rb_vm_block_t *b = GET_VM()->top_block();
+ rb_vm_block_t *b = GET_VM()->current_block;
- GET_VM()->pop_block();
+ GET_VM()->current_block = NULL;
VALUE old_self = b->self;
b->self = self;
@@ -5189,7 +5195,7 @@
VALUE retval = rb_vm_block_eval0(b, argc, argv);
b->self = old_self;
- GET_VM()->push_block(b);
+ GET_VM()->current_block = b;
return retval;
}
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-03-22 01:17:49 UTC (rev 1054)
+++ MacRuby/branches/experimental/roxor.h 2009-03-22 02:28:17 UTC (rev 1055)
@@ -112,8 +112,8 @@
rb_vm_block_t *rb_vm_prepare_block(void *llvm_function, NODE *node, VALUE self, int dvars_size, ...);
rb_vm_block_t *rb_vm_current_block(void);
-void rb_vm_push_block(rb_vm_block_t *block);
-void rb_vm_pop_block(void);
+void rb_vm_change_current_block(rb_vm_block_t *block);
+void rb_vm_restore_current_block(void);
VALUE rb_vm_block_eval(rb_vm_block_t *block, int argc, const VALUE *argv);
struct rb_float_cache {
Modified: MacRuby/branches/experimental/test_roxor.rb
===================================================================
--- MacRuby/branches/experimental/test_roxor.rb 2009-03-22 01:17:49 UTC (rev 1054)
+++ MacRuby/branches/experimental/test_roxor.rb 2009-03-22 02:28:17 UTC (rev 1055)
@@ -847,10 +847,12 @@
foo { |a = 42, *rest| p [a, rest] }
}
- assert ":ok", "def foo; p :ok if block_given?; end; foo {}"
- assert ":ok", "def foo; p :ok unless block_given?; end; foo"
- assert ":ok", "def foo; p block_given?; end; def bar; foo; end; bar {}"
+ assert "true", "def foo; p block_given?; end; foo {}"
+ assert "false", "def foo; p block_given?; end; foo"
+ assert "true", "def foo; p block_given?; end; def bar; foo; end; bar {}"
+ assert ':ok', "def foo; yield; end; begin; foo; rescue LocalJumpError; p :ok; end"
+
assert ":ok", "def foo(&m); m.call; end; foo { p :ok }"
assert ":ok", "def foo(&m); p :ok if m == nil; end; foo"
Modified: MacRuby/branches/experimental/vm_eval.c
===================================================================
--- MacRuby/branches/experimental/vm_eval.c 2009-03-22 01:17:49 UTC (rev 1054)
+++ MacRuby/branches/experimental/vm_eval.c 2009-03-22 02:28:17 UTC (rev 1055)
@@ -274,16 +274,17 @@
}
VALUE
-rb_objc_block_call(VALUE obj, SEL sel, int argc, VALUE *argv,
+rb_objc_block_call(VALUE obj, SEL sel, void *cache, int argc, VALUE *argv,
VALUE (*bl_proc) (ANYARGS), VALUE data2)
{
NODE *node = NEW_IFUNC(bl_proc, data2);
rb_vm_block_t *b = rb_vm_prepare_block(NULL, node, obj, 0);
-
- rb_vm_push_block(b);
- VALUE val = rb_vm_call(obj, sel, argc, argv, false);
- rb_vm_pop_block();
-
+ rb_vm_change_current_block(b);
+ if (cache == NULL) {
+ cache = rb_vm_get_call_cache(sel);
+ }
+ VALUE val = rb_vm_call_with_cache2(cache, obj, 0, sel, argc, argv);
+ rb_vm_restore_current_block();
return val;
}
@@ -300,7 +301,7 @@
snprintf(buf, sizeof buf, "%s:", rb_id2name(mid));
sel = sel_registerName(buf);
}
- return rb_objc_block_call(obj, sel, argc, argv, bl_proc, data2);
+ return rb_objc_block_call(obj, sel, NULL, argc, argv, bl_proc, data2);
}
VALUE
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090321/7f9041ce/attachment-0001.html>
More information about the macruby-changes
mailing list