From 1a8c1d5954e704d436caa45327fa24044018b01a Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Tue, 4 Jan 2011 11:54:25 +0000 Subject: Convert tied OPEN to using S_tied_handle_method() Add a new flag ARGUMENTS_ON_STACK to S_tied_handle_method(), which methods which take a list (OPEN, PRINTF, READ and WRITE) will need. --- pp_sys.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'pp_sys.c') diff --git a/pp_sys.c b/pp_sys.c index e0c75e1ab9..d042f590b1 100644 --- a/pp_sys.c +++ b/pp_sys.c @@ -511,7 +511,8 @@ PP(pp_die) Use 0x04 rather than the next available bit, to help the compiler if the architecture can generate more efficient instructions. */ #define MORTALIZE_NOT_NEEDED 0x04 -#define TIED_HANDLE_ARGC_SHIFT 3 +#define ARGUMENTS_ON_STACK 0x08 +#define TIED_HANDLE_ARGC_SHIFT 4 static OP * S_tied_handle_method(pTHX_ const char *const methname, SV **sp, @@ -527,7 +528,9 @@ S_tied_handle_method(pTHX_ const char *const methname, SV **sp, PUSHMARK(sp); PUSHs(SvTIED_obj(MUTABLE_SV(io), mg)); - if (argc) { + if (flags & ARGUMENTS_ON_STACK) + sp += argc; + else if (argc) { const U32 mortalize_not_needed = flags & MORTALIZE_NOT_NEEDED; va_list args; va_start(args, flags); @@ -584,12 +587,9 @@ PP(pp_open) if (mg) { /* Method's args are same as ours ... */ /* ... except handle is replaced by the object */ - PUSHMARK(MARK - 1); - *MARK = SvTIED_obj(MUTABLE_SV(io), mg); - ENTER_with_name("call_OPEN"); - call_method("OPEN", G_SCALAR); - LEAVE_with_name("call_OPEN"); - return NORMAL; + return S_tied_handle_method(aTHX_ "OPEN", mark - 1, io, mg, + G_SCALAR | ARGUMENTS_ON_STACK + | (sp - mark) << TIED_HANDLE_ARGC_SHIFT); } } -- cgit v1.2.1