19#ifdef DUK_USE_REGEXP_SUPPORT
38 return -((duk_int32_t) (t >> 1));
40 return (duk_int32_t) (t >> 1);
49 if (p < ptr_start || p > ptr_end) {
59 if ((*p & 0xc0) != 0x80) {
78 if (p < ptr_start || p >= ptr_end) {
89 if (p >= ptr_end || ((*p & 0xc0) != 0x80)) {
163 (
long) (sp - re_ctx->
input),
230 (
long) n, (
long) r1, (
long) r2, (
long) c));
231 if (c >= r1 && c <= r2) {
256 if (sp <= re_ctx->input) {
271 const duk_uint8_t *tmp_sp;
298 if (sp <= re_ctx->input) {
308 const duk_uint8_t *tmp_sp = sp;
335 const duk_uint8_t *sub_sp;
349 const duk_uint8_t *sub_sp;
361 duk_uint32_t q, qmin, qmax;
363 const duk_uint8_t *sub_sp;
369 (
unsigned long) qmin, (
unsigned long) qmax, (
long) skip));
390 duk_uint32_t q, qmin, qmax, atomlen;
392 const duk_uint8_t *sub_sp;
399 (
unsigned long) qmin, (
unsigned long) qmax, (
unsigned long) atomlen, (
long) skip));
434 const duk_uint8_t *old;
435 const duk_uint8_t *sub_sp;
438 if (idx >= re_ctx->
nsaved) {
440 DUK_D(
DUK_DPRINT(
"internal error, regexp save index insane: idx=%ld", (
long) idx));
443 old = re_ctx->
saved[idx];
444 re_ctx->
saved[idx] = sp;
450 re_ctx->
saved[idx] = old;
462 duk_uint32_t idx_start, idx_count;
463#ifdef DUK_USE_EXPLICIT_NULL_INIT
464 duk_uint32_t idx_end, idx;
466 duk_uint8_t **range_save;
467 const duk_uint8_t *sub_sp;
471 DUK_DDD(
DUK_DDDPRINT(
"wipe saved range: start=%ld, count=%ld -> [%ld,%ld] (captures [%ld,%ld])",
472 (
long) idx_start, (
long) idx_count,
473 (
long) idx_start, (
long) (idx_start + idx_count - 1),
474 (
long) (idx_start / 2), (
long) ((idx_start + idx_count - 1) / 2)));
475 if (idx_start + idx_count > re_ctx->
nsaved || idx_count == 0) {
477 DUK_D(
DUK_DPRINT(
"internal error, regexp wipe indices insane: idx_start=%ld, idx_count=%ld",
478 (
long) idx_start, (
long) idx_count));
485 sizeof(duk_uint8_t *) * idx_count);
487 DUK_MEMCPY(range_save, re_ctx->
saved + idx_start,
sizeof(duk_uint8_t *) * idx_count);
488#ifdef DUK_USE_EXPLICIT_NULL_INIT
489 idx_end = idx_start + idx_count;
490 for (idx = idx_start; idx < idx_end; idx++) {
494 DUK_MEMZERO((
void *) (re_ctx->
saved + idx_start),
sizeof(duk_uint8_t *) * idx_count);
501 (
long) idx_start, (
long) (idx_start + idx_count - 1),
502 (
long) (idx_start / 2), (
long) ((idx_start + idx_count - 1) / 2)));
510 (
long) idx_start, (
long) (idx_start + idx_count - 1),
511 (
long) (idx_start / 2), (
long) ((idx_start + idx_count - 1) / 2)));
513 (
const void *) range_save,
514 sizeof(duk_uint8_t *) * idx_count);
535 duk_uint8_t **full_save;
536 const duk_uint8_t *sub_sp;
542 sizeof(duk_uint8_t *) * re_ctx->
nsaved);
570 (
const void *) full_save,
571 sizeof(duk_uint8_t *) * re_ctx->
nsaved);
591 const duk_uint8_t *p;
595 if (idx < 2 || idx + 1 >= re_ctx->
nsaved) {
600 if (!re_ctx->
saved[idx] || !re_ctx->
saved[idx+1]) {
603 (
long) idx, (
long) (idx + 1)));
606 DUK_DDD(
DUK_DDDPRINT(
"backreference: match saved[%ld,%ld]", (
long) idx, (
long) (idx + 1)));
608 p = re_ctx->
saved[idx];
609 while (p < re_ctx->saved[idx+1]) {
629 DUK_D(
DUK_DPRINT(
"internal error, regexp opcode error: %ld", (
long) op));
667 const duk_uint8_t *pc;
668 const duk_uint8_t *sp;
673 duk_uint32_t char_offset;
744#if defined(DUK_USE_EXPLICIT_NULL_INIT)
745 for (i = 0; i < re_ctx.
nsaved; i++) {
748#elif defined(DUK_USE_ZERO_BUFFER_DATA)
754 DUK_DDD(
DUK_DDDPRINT(
"regexp ctx initialized, flags=0x%08lx, nsaved=%ld, recursion_limit=%ld, steps_limit=%ld",
789 char_offset = (duk_uint32_t) d;
796 char_offset = (duk_uint32_t) 0;
820 (
long) char_offset, (
const void *) sp,
887#ifdef DUK_USE_ASSERTIONS
890 duk_uint32_t char_end_offset = 0;
904#ifdef DUK_USE_ASSERTIONS
919 for (i = 0; i < re_ctx.
nsaved; i += 2) {
928 (
const char *) re_ctx.
saved[i],
duk_int_t duk_codepoint_t
#define DUK_USE_REGEXP_EXECUTOR_RECLIMIT
#define DUK_MEMZERO(p, n)
duk_uint32_t duk_uint_fast32_t
#define DUK_ERROR_RANGE(thr, msg)
#define DUK_HOBJECT_HAS_EXOTIC_ARRAY(h)
#define DUK_STR_REGEXP_EXECUTOR_STEP_LIMIT
#define DUK_HSTRING_GET_DATA(x)
#define DUK_REOP_ASSERT_WORD_BOUNDARY
#define DUK_HOBJECT_CLASS_REGEXP
DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
DUK_INTERNAL_DECL duk_hobject * duk_require_hobject(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx)
#define DUK_RE_EXECUTE_STEPS_LIMIT
DUK_EXTERNAL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t index)
#define duk_xdef_prop_stridx_wec(ctx, obj_index, stridx)
DUK_EXTERNAL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_idx, duk_uarridx_t arr_idx)
#define DUK_REOP_ASSERT_END
#define DUK_RE_FLAG_MULTILINE
DUK_EXTERNAL void * duk_get_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size)
DUK_INTERNAL_DECL duk_hobject * duk_require_hobject_with_class(duk_context *ctx, duk_idx_t index, duk_small_uint_t classnum)
DUK_EXTERNAL void duk_require_stack(duk_context *ctx, duk_idx_t extra)
#define DUK_HSTRING_GET_CHARLEN(x)
#define DUK_HOBJECT_CLASS_ARRAY
#define DUK_REOP_INVRANGES
#define DUK_ERROR_INTERNAL_DEFMSG(thr)
DUK_EXTERNAL const char * duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len)
#define DUK_ASSERT_DISABLE(x)
DUK_EXTERNAL void duk_push_null(duk_context *ctx)
DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val)
DUK_INTERNAL_DECL duk_uint_fast32_t duk_heap_strcache_offset_char2byte(duk_hthread *thr, duk_hstring *h, duk_uint_fast32_t char_offset)
#define DUK_REOP_SQGREEDY
#define DUK_RE_FLAG_GLOBAL
#define DUK_HSTRING_GET_BYTELEN(x)
DUK_EXTERNAL void duk_dup(duk_context *ctx, duk_idx_t from_index)
DUK_EXTERNAL void duk_insert(duk_context *ctx, duk_idx_t to_index)
DUK_INTERNAL_DECL duk_small_int_t duk_unicode_re_is_wordchar(duk_codepoint_t cp)
#define DUK_STRIDX_LAST_INDEX
DUK_EXTERNAL void duk_push_undefined(duk_context *ctx)
#define DUK_REOP_BACKREFERENCE
#define DUK_REOP_WIPERANGE
DUK_EXTERNAL void duk_pop_n(duk_context *ctx, duk_idx_t count)
#define DUK_REOP_ASSERT_START
DUK_INTERNAL_DECL duk_small_int_t duk_unicode_is_line_terminator(duk_codepoint_t cp)
DUK_EXTERNAL const char * duk_to_string(duk_context *ctx, duk_idx_t index)
#define DUK_RE_FLAG_IGNORE_CASE
DUK_EXTERNAL void duk_pop(duk_context *ctx)
#define DUK_STRIDX_INT_BYTECODE
DUK_EXTERNAL duk_idx_t duk_push_array(duk_context *ctx)
#define DUK_HOBJECT_GET_CLASS_NUMBER(h)
DUK_INTERNAL_DECL duk_codepoint_t duk_unicode_re_canonicalize_char(duk_hthread *thr, duk_codepoint_t cp)
#define DUK_REOP_ASSERT_NOT_WORD_BOUNDARY
DUK_INTERNAL_DECL duk_hstring * duk_get_hstring(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_hstring * duk_require_hstring(duk_context *ctx, duk_idx_t index)
#define DUK_HOBJECT_HAS_EXTENSIBLE(h)
#define DUK_STR_REGEXP_EXECUTOR_RECURSION_LIMIT
#define DUK_REOP_SQMINIMAL
#define duk_push_u32(ctx, val)
DUK_EXTERNAL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t index)
DUK_INTERNAL_DECL duk_ucodepoint_t duk_unicode_decode_xutf8_checked(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end)
DUK_INTERNAL_DECL duk_tval * duk_get_tval(duk_context *ctx, duk_idx_t index)
#define duk_push_fixed_buffer(ctx, size)
DUK_LOCAL duk_uint32_t duk__bc_get_u32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc)
DUK_LOCAL const duk_uint8_t * duk__utf8_backtrack(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count)
DUK_INTERNAL void duk_regexp_match(duk_hthread *thr)
DUK_LOCAL const duk_uint8_t * duk__match_regexp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *pc, const duk_uint8_t *sp)
DUK_LOCAL duk_int32_t duk__bc_get_i32(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **pc)
DUK_LOCAL duk_codepoint_t duk__inp_get_prev_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t *sp)
DUK_LOCAL const duk_uint8_t * duk__utf8_advance(duk_hthread *thr, const duk_uint8_t **ptr, const duk_uint8_t *ptr_start, const duk_uint8_t *ptr_end, duk_uint_fast32_t count)
DUK_LOCAL void duk__regexp_match_helper(duk_hthread *thr, duk_small_int_t force_global)
DUK_LOCAL duk_codepoint_t duk__inp_get_cp(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp)
DUK_INTERNAL void duk_regexp_match_force_global(duk_hthread *thr)
DUK_LOCAL const duk_uint8_t * duk__inp_backtrack(duk_re_matcher_ctx *re_ctx, const duk_uint8_t **sp, duk_uint_fast32_t count)
static const char * match(MatchState *ms, const char *s, const char *p)
const duk_uint8_t * bytecode
const duk_uint8_t ** saved
const duk_uint8_t * bytecode_end
const duk_uint8_t * input_end
duk_uint32_t recursion_depth
const duk_uint8_t * input
duk_uint32_t recursion_limit