diff options
author | Nobuyoshi Nakada <[email protected]> | 2023-06-09 16:10:30 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2023-06-09 20:22:30 +0900 |
commit | ab6eb3786c94e69c561080cbb796c2381702a3a4 () | |
tree | 2fe551edd62566939a7760439851fd7ad90b2d13 | |
parent | d54f66d1b4ce32d78b526b1ea9e3f213a763d07c (diff) |
Optimize `Regexp#dup` and `Regexp.new(/RE/)`
When copying from another regexp, copy already built `regex_t` instead of re-compiling its source.
Notes: Merged: https://.com/ruby/ruby/pull/7922
-rw-r--r-- | benchmark/regexp_dup.yml | 6 | ||||
-rw-r--r-- | benchmark/regexp_new.yml | 7 | ||||
-rw-r--r-- | include/ruby/onigmo.h | 2 | ||||
-rw-r--r-- | re.c | 43 | ||||
-rw-r--r-- | regcomp.c | 74 |
5 files changed, 125 insertions, 7 deletions
@@ -0,0 +1,6 @@ @@ -0,0 +1,7 @@ @@ -844,6 +844,8 @@ void onig_free(OnigRegex); ONIG_EXTERN void onig_free_body(OnigRegex); ONIG_EXTERN OnigPosition onig_scan(OnigRegex reg, const OnigUChar* str, const OnigUChar* end, OnigRegion* region, OnigOptionType option, int (*scan_callback)(OnigPosition, OnigPosition, OnigRegion*, void*), void* callback_arg); ONIG_EXTERN OnigPosition onig_search(OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option); @@ -3213,6 +3213,15 @@ rb_reg_preprocess_dregexp(VALUE ary, int options) return result; } static int rb_reg_initialize(VALUE obj, const char *s, long len, rb_encoding *enc, int options, onig_errmsg_buffer err, @@ -3223,10 +3232,7 @@ rb_reg_initialize(VALUE obj, const char *s, long len, rb_encoding *enc, rb_encoding *fixed_enc = 0; rb_encoding *a_enc = rb_ascii8bit_encoding(); - rb_check_frozen(obj); - if (re->ptr) - rb_raise(rb_eTypeError, "already initialized regexp"); - re->ptr = 0; if (rb_enc_dummy_p(enc)) { errcpy(err, "can't make regexp with dummy encoding"); @@ -3862,6 +3868,24 @@ set_timeout(rb_hrtime_t *hrt, VALUE timeout) double2hrtime(hrt, timeout_d); } struct reg_init_args { VALUE str; VALUE timeout; @@ -3931,9 +3955,14 @@ static VALUE rb_reg_initialize_m(int argc, VALUE *argv, VALUE self) { struct reg_init_args args; - reg_extract_args(argc, argv, &args); - reg_init_args(self, args.str, args.enc, args.flags); set_timeout(&RREGEXP_PTR(self)->timelimit, args.timeout); @@ -4356,7 +4385,7 @@ rb_reg_init_copy(VALUE copy, VALUE re) { if (!OBJ_INIT_COPY(copy, re)) return copy; rb_reg_check(re); - return rb_reg_init_str(copy, RREGEXP_SRC(re), rb_reg_options(re)); } VALUE @@ -5671,6 +5671,80 @@ onig_free(regex_t* reg) } } #ifdef RUBY size_t onig_memsize(const regex_t *reg) |