From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, T_SCC_BODY_TEXT_LINE shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 413431F454 for ; Mon, 17 Apr 2023 23:06:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1681772764; bh=GX2361dQpoMYxL/gLLC6KOCve/C9ZHRkSQtzVqOUfPU=; h=From:To:Subject:Date:In-Reply-To:References:From; b=nxPXowy62603yUuxxYnoHMU48KjjgXEK6c+8OEdzzB0G03Y/NP6XFBMPSjKu3IUIL 2rZ/dTtXyhpKMX463QoHIF2Zf2RYIpSvMmT0oCnG30gRSFphzv/0SLNV611oSiIeP7 NiT6TU/F7jQFGen6v34IzO2mlmXKag5vTf777eyI= From: Eric Wong To: spew@80x24.org Subject: [PATCH 2/2] wip Date: Mon, 17 Apr 2023 23:06:03 +0000 Message-Id: <20230417230604.2659188-2-e@80x24.org> In-Reply-To: <20230417230604.2659188-1-e@80x24.org> References: <20230417230604.2659188-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: --- load.c | 16 +++++++++++----- ruby.c | 8 +++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/load.c b/load.c index 9025a89c87..9599b5266e 100644 --- a/load.c +++ b/load.c @@ -675,13 +675,22 @@ rb_provide(const char *feature) NORETURN(static void load_failed(VALUE)); +static void fls_close(struct ruby_file_load_state *fls) +{ + if (fls->filev == Qfalse) return; + rb_io_close(fls->filev); + fls->filev = Qfalse; +} + static inline void load_iseq_eval(rb_execution_context_t *ec, VALUE fname, struct ruby_file_load_state *fls) { const rb_iseq_t *iseq = rb_iseq_load_iseq(fname); - if (!iseq) { + if (iseq) { + fls_close(fls); + } else { rb_execution_context_t *ec = GET_EC(); VALUE v = rb_vm_push_frame_fname(ec, fname); rb_ast_t *ast; @@ -1210,10 +1219,7 @@ require_internal(rb_execution_context_t *ec, VALUE fname, int exception, bool wa break; case 's': - if (fls.filev != Qfalse) { - rb_io_close(fls.filev); - fls.filev = Qfalse; - } + fls_close(&fls); reset_ext_config = true; ext_config_push(th, &prev_ext_config); handle = (long)rb_vm_call_cfunc(rb_vm_top_self(), load_ext, diff --git a/ruby.c b/ruby.c index 057589db73..b32b845777 100644 --- a/ruby.c +++ b/ruby.c @@ -2545,19 +2545,21 @@ rb_parser_load_state(VALUE parser, VALUE fname_v, { if (fls->filev != Qfalse) { ruby_cmdline_options_t opt; + VALUE f = fls->filev; + fls->filev = Qfalse; cmdline_options_init(&opt); /* TODO: xflag for DOSISH || __CYGWIN__ */ if (fls->is_nonblock) { struct rb_io_t *fptr; - RB_IO_POINTER(fls->filev, fptr); + RB_IO_POINTER(f, fptr); disable_nonblock(fptr->fd); } if (fls->is_fifo) { - rb_io_wait(fls->filev, RB_INT2NUM(RUBY_IO_READABLE), Qnil); + rb_io_wait(f, RB_INT2NUM(RUBY_IO_READABLE), Qnil); } - return load_file(parser, fname_v, fls->filev, 0, &opt); + return load_file(parser, fname_v, f, 0, &opt); } return rb_parser_load_file(parser, fname_v); }