From 43842f8faf226d99a54ac304d74abab22d704670 Mon Sep 17 00:00:00 2001 From: Brian Ford Date: Fri, 26 Nov 2010 18:43:56 -0800 Subject: [PATCH] Fixed propagating block passed to native method. --- vm/builtin/nativemethod.cpp | 3 +++ vm/capi/capi.cpp | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/vm/builtin/nativemethod.cpp b/vm/builtin/nativemethod.cpp index 2e287b507c..fc3a48bab4 100644 --- a/vm/builtin/nativemethod.cpp +++ b/vm/builtin/nativemethod.cpp @@ -636,6 +636,9 @@ namespace rubinius { env->get_handle(msg.method), env->get_handle(msg.module)); + // Propagate the block passed to the native function. + env->set_outgoing_block(env->get_handle(args.block())); + Object* ret; ExceptionPoint ep(env); diff --git a/vm/capi/capi.cpp b/vm/capi/capi.cpp index 5b1d817899..09eda10c7c 100644 --- a/vm/capi/capi.cpp +++ b/vm/capi/capi.cpp @@ -372,15 +372,24 @@ extern "C" { Object* blk = RBX_Qnil; - if(VALUE blk_handle = env->outgoing_block()) { + VALUE blk_handle = env->outgoing_block(); + if(blk_handle) { blk = env->get_object(blk_handle); env->set_outgoing_block(0); } - return capi_funcall_backend_native(env, "", 0, + VALUE result = capi_funcall_backend_native(env, "", 0, env->get_object(receiver), reinterpret_cast(method_name), arg_count, args, blk); + + // Ensure we reset the block in the NativeMethodFrame because + // another call may be made from a C-API function. + if(blk_handle) { + env->set_outgoing_block(blk_handle); + } + + return result; } VALUE rb_funcall2(VALUE receiver, ID method_name, int arg_count, const VALUE* v_args) {