diff --git a/vm.c b/vm.c index 1a328fb63c..6d63a5eeaf 100644 --- a/vm.c +++ b/vm.c @@ -142,10 +142,10 @@ static inline VALUE VM_CF_BLOCK_HANDLER(const rb_control_frame_t * const cfp) { const VALUE *ep; - if (VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_TOP) { + if (VM_ENV_NAMESPACED_P(cfp->ep)) { VM_ASSERT(VM_ENV_LOCAL_P(cfp->ep)); - /* Never set black_handler for VM_FRAME_MAGIC_TOP - * and the specval is used for namespace (rb_namespace_t) in the case + /* Never set black_handler for VM_FRAME_MAGIC_TOP or VM_FRAME_MAGIC_CLASS + * and the specval is used for namespace (rb_namespace_t) in these case */ return VM_BLOCK_HANDLER_NONE; } diff --git a/vm_core.h b/vm_core.h index fab440f1fd..51898f56f9 100644 --- a/vm_core.h +++ b/vm_core.h @@ -1559,10 +1559,16 @@ VM_ENV_PREV_EP(const VALUE *ep) return VM_ENV_PREV_EP_UNCHECKED(ep); } +static inline bool +VM_ENV_NAMESPACED_P(const VALUE *ep) +{ + return VM_ENV_FRAME_TYPE_P(ep, VM_FRAME_MAGIC_CLASS) || VM_ENV_FRAME_TYPE_P(ep, VM_FRAME_MAGIC_TOP); +} + static inline VALUE VM_ENV_BLOCK_HANDLER(const VALUE *ep) { - if (VM_ENV_FRAME_TYPE_P(ep, VM_FRAME_MAGIC_CLASS) || VM_ENV_FRAME_TYPE_P(ep, VM_FRAME_MAGIC_TOP)) { + if (VM_ENV_NAMESPACED_P(ep)) { VM_ASSERT(VM_ENV_LOCAL_P(ep)); return VM_BLOCK_HANDLER_NONE; } @@ -1574,7 +1580,7 @@ VM_ENV_BLOCK_HANDLER(const VALUE *ep) static inline const rb_namespace_t * VM_ENV_NAMESPACE(const VALUE *ep) { - VM_ASSERT(VM_ENV_FRAME_TYPE_P(ep, VM_FRAME_MAGIC_CLASS) || VM_ENV_FRAME_TYPE_P(ep, VM_FRAME_MAGIC_TOP)); + VM_ASSERT(VM_ENV_NAMESPACED_P(ep)); VM_ASSERT(VM_ENV_LOCAL_P(ep)); return (const rb_namespace_t *)GC_GUARDED_PTR_REF(ep[VM_ENV_DATA_INDEX_SPECVAL]); }