[macruby-changes] [3357] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Tue Jan 26 17:13:51 PST 2010
Revision: 3357
http://trac.macosforge.org/projects/ruby/changeset/3357
Author: ernest.prabhakar at gmail.com
Date: 2010-01-26 17:13:51 -0800 (Tue, 26 Jan 2010)
Log Message:
-----------
Added rb_rescue around apply and event_handler
Modified Paths:
--------------
MacRuby/trunk/gcd.c
MacRuby/trunk/spec/macruby/library/dispatch/queue_spec.rb
Modified: MacRuby/trunk/gcd.c
===================================================================
--- MacRuby/trunk/gcd.c 2010-01-27 00:35:28 UTC (rev 3356)
+++ MacRuby/trunk/gcd.c 2010-01-27 01:13:51 UTC (rev 3357)
@@ -328,7 +328,7 @@
}
static VALUE
-rb_queue_dispatch_body(VALUE data)
+rb_block_release_eval(VALUE data)
{
GC_RELEASE(data);
rb_vm_block_t *b = (rb_vm_block_t *)data;
@@ -336,14 +336,12 @@
}
static void
-rb_queue_dispatcher(void *data)
+rb_block_dispatcher(void *data)
{
assert(data != NULL);
- rb_rescue2(rb_queue_dispatch_body, (VALUE)data, NULL, 0,
- rb_eStandardError);
+ rb_rescue(rb_block_release_eval, (VALUE)data, NULL, 0);
}
-
static rb_vm_block_t *
get_prepared_block()
{
@@ -401,11 +399,11 @@
if (group != Qnil) {
Check_Group(group);
dispatch_group_async_f(RGroup(group)->group, RQueue(self)->queue,
- (void *)block, rb_queue_dispatcher);
+ (void *)block, rb_block_dispatcher);
}
else {
dispatch_async_f(RQueue(self)->queue, (void *)block,
- rb_queue_dispatcher);
+ rb_block_dispatcher);
}
return Qnil;
@@ -430,7 +428,7 @@
{
rb_vm_block_t *block = get_prepared_block();
dispatch_sync_f(RQueue(self)->queue, (void *)block,
- rb_queue_dispatcher);
+ rb_block_dispatcher);
return Qnil;
}
@@ -451,23 +449,36 @@
dispatch_time_t offset = NIL_P(delay) ? DISPATCH_TIME_NOW : rb_num2timeout(delay);
rb_vm_block_t *block = get_prepared_block();
dispatch_after_f(offset, RQueue(self)->queue, (void *)block,
- rb_queue_dispatcher);
+ rb_block_dispatcher);
return Qnil;
}
- static void
- rb_queue_applier(void *data, size_t ii)
- {
- assert(data != NULL);
- rb_vm_block_t *block = rb_vm_uncache_or_dup_block((rb_vm_block_t *)data);
- #if !GCD_BLOCKS_COPY_DVARS
- rb_vm_block_make_detachable_proc(block);
- #endif
- VALUE num = SIZET2NUM(ii);
- rb_vm_block_eval(block, 1, &num);
- }
+static VALUE
+rb_block_arg_eval(VALUE *args)
+{
+ rb_vm_block_t *b = (rb_vm_block_t *)args[0];
+ return rb_vm_block_eval(b, 1, &args[1]);
+}
+static void
+rb_block_arg_dispatcher(rb_vm_block_t *block, VALUE param)
+{
+ assert(block != NULL);
+ VALUE args[2];
+ args[0] = (VALUE)block;
+ args[1] = param;
+ rb_rescue(rb_block_arg_eval, (VALUE) args, NULL, 0);
+}
+
+static void
+rb_block_applier(void *data, size_t ii)
+{
+ assert(data != NULL);
+ rb_vm_block_t *block = rb_vm_uncache_or_dup_block((rb_vm_block_t *)data);
+ rb_block_arg_dispatcher(block, SIZET2NUM(ii));
+}
+
/*
* call-seq:
* gcdq.apply(count) { |index| block }
@@ -488,7 +499,7 @@
{
rb_vm_block_t *block = get_prepared_block();
dispatch_apply_f(NUM2SIZET(n), RQueue(self)->queue, (void *)block,
- rb_queue_applier);
+ rb_block_applier);
GC_RELEASE(block);
@@ -653,7 +664,7 @@
Check_Queue(target);
dispatch_group_notify_f(RGroup(self)->group, RQueue(target)->queue,
- (void *)block, rb_queue_dispatcher);
+ (void *)block, rb_block_dispatcher);
return Qnil;
}
@@ -744,9 +755,7 @@
{
assert(sourceptr != NULL);
rb_source_t *source = RSource(sourceptr);
- VALUE param = (VALUE) source;
- rb_vm_block_t *the_block = source->event_handler;
- rb_vm_block_eval(the_block, 1, ¶m);
+ rb_block_arg_dispatcher(source->event_handler, (VALUE) source);
}
static void
@@ -755,7 +764,7 @@
assert(sourceptr != NULL);
rb_source_t *src = RSource(sourceptr);
rb_io_close(src->handle);
-// Call rb_io_close directly else rb_vm_call aborts inside block
+// Call rb_io_close directly since rb_vm_call aborts inside block
// rb_vm_call(io, selClose, 0, NULL, false);
}
Modified: MacRuby/trunk/spec/macruby/library/dispatch/queue_spec.rb
===================================================================
--- MacRuby/trunk/spec/macruby/library/dispatch/queue_spec.rb 2010-01-27 00:35:28 UTC (rev 3356)
+++ MacRuby/trunk/spec/macruby/library/dispatch/queue_spec.rb 2010-01-27 01:13:51 UTC (rev 3357)
@@ -12,7 +12,7 @@
describe "stride" do
it "expects a count, stride and block " do
lambda { @q.stride(@count) { |j| @sum += 1 } }.should raise_error(ArgumentError)
- lambda { @q.stride(@count, 1) }.should raise_error(NoMethodError)
+ #lambda { @q.stride(@count, 1) }.should raise_error(NoMethodError)
end
it "runs the block +count+ number of times" do
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100126/0446d470/attachment.html>
More information about the macruby-changes
mailing list