From ed25273444c5542e4865fbe422e026b78ba33b80 Mon Sep 17 00:00:00 2001 From: Nicholas Clark Date: Sun, 9 Feb 2003 23:00:09 +0000 Subject: COW regexps: Subject: [PATCH] Copy on write for $& and $1... Message-ID: <20030209230008.GF299@Bagpuss.unfortu.net> p4raw-id: //depot/perl@18726 --- regexp.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'regexp.h') diff --git a/regexp.h b/regexp.h index 05640548b1..36c03a4c17 100644 --- a/regexp.h +++ b/regexp.h @@ -36,6 +36,9 @@ typedef struct regexp { struct reg_data *data; /* Additional data. */ char *subbeg; /* saved or original string so \digit works forever. */ +#ifdef PERL_COPY_ON_WRITE + SV *saved_copy; /* If non-NULL, SV which is COW from original */ +#endif U32 *offsets; /* offset annotations 20001228 MJD */ I32 sublen; /* Length of string pointed by subbeg */ I32 refcnt; @@ -100,6 +103,23 @@ typedef struct regexp { ? RX_MATCH_COPIED_on(prog) \ : RX_MATCH_COPIED_off(prog)) +#ifdef PERL_COPY_ON_WRITE +#define RX_MATCH_COPY_FREE(rx) \ + STMT_START {if (rx->saved_copy) { \ + SV_CHECK_THINKFIRST_COW_DROP(rx->saved_copy); \ + } \ + if (RX_MATCH_COPIED(rx)) { \ + Safefree(rx->subbeg); \ + RX_MATCH_COPIED_off(rx); \ + }} STMT_END +#else +#define RX_MATCH_COPY_FREE(rx) \ + STMT_START {if (RX_MATCH_COPIED(rx)) { \ + Safefree(rx->subbeg); \ + RX_MATCH_COPIED_off(rx); \ + }} STMT_END +#endif + #define RX_MATCH_UTF8(prog) ((prog)->reganch & ROPT_MATCH_UTF8) #define RX_MATCH_UTF8_on(prog) ((prog)->reganch |= ROPT_MATCH_UTF8) #define RX_MATCH_UTF8_off(prog) ((prog)->reganch &= ~ROPT_MATCH_UTF8) -- cgit v1.2.1