From a680d04306253a48b280c1e9010d5ad966f3a890 Mon Sep 17 00:00:00 2001 From: Christoph Otto Date: Wed, 8 Jun 2011 18:03:45 -0700 Subject: [PATCH] Revert "add experimental fix for a bug found by jnthn++" This reverts commit ee17ddde9f878e9d90a896cefcf871bceea27824. --- src/call/pcc.c | 44 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/src/call/pcc.c b/src/call/pcc.c index 14f766131b..401b833617 100644 --- a/src/call/pcc.c +++ b/src/call/pcc.c @@ -34,6 +34,12 @@ static int do_run_ops(PARROT_INTERP, ARGIN(PMC *sub_obj)) __attribute__nonnull__(1) __attribute__nonnull__(2); +PARROT_INLINE +PARROT_WARN_UNUSED_RESULT +static int is_invokable(PARROT_INTERP, ARGIN(PMC *sub_obj)) + __attribute__nonnull__(1) + __attribute__nonnull__(2); + static void Parrot_pcc_add_invocant(PARROT_INTERP, ARGIN(PMC *call_obj), ARGIN(PMC *pmc)) @@ -44,6 +50,9 @@ static void Parrot_pcc_add_invocant(PARROT_INTERP, #define ASSERT_ARGS_do_run_ops __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ PARROT_ASSERT_ARG(interp) \ , PARROT_ASSERT_ARG(sub_obj)) +#define ASSERT_ARGS_is_invokable __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ + PARROT_ASSERT_ARG(interp) \ + , PARROT_ASSERT_ARG(sub_obj)) #define ASSERT_ARGS_Parrot_pcc_add_invocant __attribute__unused__ int _ASSERT_ARGS_CHECK = (\ PARROT_ASSERT_ARG(interp) \ , PARROT_ASSERT_ARG(call_obj) \ @@ -215,6 +224,29 @@ Parrot_pcc_invoke_method_from_c_args(PARROT_INTERP, ARGIN(PMC* pmc), } +/* + +=item C + +Check if the PMC is a Sub or does invokable. Helper for do_run_ops. + +=cut + +*/ + +PARROT_INLINE +PARROT_WARN_UNUSED_RESULT +static int +is_invokable(PARROT_INTERP, ARGIN(PMC *sub_obj)) +{ + ASSERT_ARGS(is_invokable) + + if (VTABLE_isa(interp, sub_obj, CONST_STRING(interp, "Sub"))) + return 1; + else + return VTABLE_does(interp, sub_obj, CONST_STRING(interp, "invokable")); +} + /* =item C @@ -234,13 +266,17 @@ do_run_ops(PARROT_INTERP, ARGIN(PMC *sub_obj)) if (sub_obj->vtable->base_type < enum_class_core_max) { switch (sub_obj->vtable->base_type) { - case enum_class_NCI: - case enum_class_NativePCCMethod: - return 0; - default: + case enum_class_Sub: + case enum_class_MultiSub: + case enum_class_Eval: return 1; + case enum_class_Object: + break; + default: + return 0; } } + return is_invokable(interp, sub_obj); } /*