-
Notifications
You must be signed in to change notification settings - Fork 601
Closed as not planned
Closed as not planned
Copy link
Labels
Description
This is not a bug ticket but archiving binary attachments/very long reference materials for a P5P ML post.
The ML post connected with this ticket number, does describe a very tiny bug/defect in p5p/.git in it, but its too tiny IMO for me to call it a "bug".
If I had moderator perms on this bug tracker, I would click "won't fix" "closed" on this ticket myself.
References materials used to make this post
Orig Src Code for Godbolt Demo
#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/stat.h>
typedef char I8;
typedef unsigned char U8;
typedef short I16;
typedef unsigned short U16;
typedef long I32;
typedef unsigned long U32;
typedef int64_t I64;
typedef uint64_t U64;
typedef ssize_t IV;
typedef size_t UV;
typedef intmax_t PERL_INTMAX_T;
typedef uintmax_t PERL_UINTMAX_T;
typedef struct stat_t PerlInterpreter; /* junk definition*/
struct sv {
void *sv_any;
U32 sv_refcnt;
U32 sv_flags;
union {
char *svu_pv;
} sv_u;
};
typedef struct sv SV;
typedef struct sv AV;
typedef struct sv HV;
typedef struct p5rx REGEXP;
typedef I64 regnode_offset;
typedef struct RExC_state_t RExC_state_t;
extern const unsigned char PL_utf8skip[];
struct RExC_state_t {
U32 flags;
U32 pm_flags;
char *precomp;
char *precomp_end;
char *rx_sv;
char *rx;
char *rxi;
char *start;
char *end;
char *parse;
char *copy_start;
char *save_copy_start;
char *copy_start_in_input;
I64 whilem_seen;
char *emit_start;
regnode_offset emit;
I32 naughty;
I32 sawback;
I64 size;
size_t sets_depth;
U32 seen;
I32 parens_buf_size;
regnode_offset *open_parens;
regnode_offset *close_parens;
HV *paren_names;
size_t latest_warn_offset;
I32 *logical_to_parno;
I32 *parno_to_logical;
I32 *parno_to_logical_next;
I32 npar;
I32 logical_npar;
I32 total_par;
I32 logical_total_par;
I32 nestroot;
I32 seen_zerolen;
char *end_op;
I32 utf8;
I32 orig_utf8;
I32 uni_semantics;
I32 recurse_count;
char **recurse;
U8 *study_chunk_recursed;
U32 study_chunk_recursed_bytes;
I32 in_lookaround;
I32 contains_locale;
I32 override_recoding;
I32 recode_x_to_native;
I32 in_multi_char_class;
int code_index;
struct reg_code_blocks *code_blocks;
I64 maxlen;
char *frame_head;
char *frame_last;
U32 frame_count;
AV *warn_text;
HV *unlexed_names;
SV *runtime_code_qr;
_Bool seen_d_op;
_Bool strict;
_Bool study_started;
_Bool in_script_run;
_Bool use_BRANCHJ;
_Bool sWARN_EXPERIMENTAL__VLB;
_Bool sWARN_EXPERIMENTAL__REGEX_SETS;
};
SV *Perl_get_sv(PerlInterpreter *my_perl, const char *name, I32 flags);
__attribute__((noreturn)) void Perl_croak(PerlInterpreter *my_perl,
const char *pat, ...);
_Bool Perl_grok_atoUV(const char *pv, UV *valptr, const char **endptr);
regnode_offset S_reg2node(PerlInterpreter *my_perl, RExC_state_t *pRExC_state,
const U8 op, const U32 arg1, const I32 arg2);
void S_nextchar(PerlInterpreter *my_perl, RExC_state_t *pRExC_state);
void S_parse_lparen_question_flags(PerlInterpreter *my_perl,
RExC_state_t *pRExC_state);
extern regnode_offset S_regXXXX(PerlInterpreter *my_perl,
RExC_state_t *pRExC_state, I32 paren,
I32 *flagp, U32 depth) {
regnode_offset ret = 0;
regnode_offset br;
regnode_offset lastbr;
regnode_offset ender = 0;
I32 logical_parno = 0;
I32 parno = 0;
I32 flags;
U32 oregflags = (pRExC_state->flags);
_Bool have_branch = 0;
_Bool is_open = 0;
I32 freeze_paren = 0;
I32 after_freeze = 0;
I32 num;
SV *max_open;
I32 was_in_lookaround = (pRExC_state->in_lookaround);
I32 fake_eval = 0;
char *const reg_parse_start = (pRExC_state->parse);
char *segment_parse_start = (pRExC_state->parse);
max_open = Perl_get_sv(my_perl, "\022E_COMPILE_RECURSION_LIMIT", 0x01);
*flagp = 0;
if (paren) {
_Bool has_intervening_patws =
(paren == 2) && *((pRExC_state->parse) - 1) != '(';
if (paren == 'r') {
paren = '>';
goto parse_rest;
} else if (*(pRExC_state->parse) == '?') {
handle_qmark:;
_Bool is_logical = 0, is_optimistic = 0;
const char *const seqstart = (pRExC_state->parse);
const char *endptr;
const char non_existent_group_msg[] = "Reference to nonexistent group";
const char impossible_group[] = "Invalid reference to group";
if (has_intervening_patws) {
do {
(pRExC_state->parse) += (1);
} while (0);
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%" "I64u"
"%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
"In '(?...)', the '(' and '?' must be adjacent",
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) - (pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %" "I64d"
" trying to output message for "
" pattern %.*s",
"..\\regcomp.c", 3492,
(IV)(((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
}
do {
(pRExC_state->parse) += (1);
} while (0);
if (!fake_eval) {
paren = *(pRExC_state->parse);
is_optimistic = 0;
} else {
is_optimistic = 1;
paren = fake_eval;
}
do {
(pRExC_state->parse) +=
(((_Bool)((pRExC_state->utf8))))
? PL_utf8skip[*(const U8 *)((((pRExC_state->parse))))]
: 1;
} while (0);
if ((pRExC_state->parse) > (pRExC_state->end)) {
paren = '\0';
}
ret = 0;
switch (paren) {
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
do {
(pRExC_state->parse) = ((char *)seqstart + 1);
} while (0);
parse_recursion : {
_Bool is_neg = 0;
UV unum;
segment_parse_start = (pRExC_state->parse) - 1;
if (*(pRExC_state->parse) == '-') {
do {
(pRExC_state->parse) += (1);
} while (0);
is_neg = 1;
}
endptr = (pRExC_state->end);
if (Perl_grok_atoUV((pRExC_state->parse), &unum, &endptr) &&
unum <= 2147483647) {
num = (I32)unum;
do {
(pRExC_state->parse) = ((char *)endptr);
} while (0);
} else {
while (
(pRExC_state->parse) < (pRExC_state->end) &&
(((sizeof(*(pRExC_state->parse)) == sizeof(U8))
? ((((PERL_UINTMAX_T)(((U8)((*(pRExC_state->parse)))))) -
(((('0'))) | 0)) <=
((PERL_UINTMAX_T)(((((('9'))) - (('0')))) | 0)))
: (sizeof(*(pRExC_state->parse)) == sizeof(U16))
? ((((PERL_UINTMAX_T)(((U16)((*(pRExC_state->parse)))))) -
(((('0'))) | 0)) <=
((PERL_UINTMAX_T)(((((('9'))) - (('0')))) | 0)))
: (sizeof(*(pRExC_state->parse)) == sizeof(U32))
? ((((PERL_UINTMAX_T)(((U32)((*(pRExC_state->parse)))))) -
(((('0'))) | 0)) <=
((PERL_UINTMAX_T)(((((('9'))) - (('0')))) | 0)))
: (((((PERL_UINTMAX_T)((
(PERL_UINTMAX_T)((*(pRExC_state->parse)))))) -
(((('0'))) | 0)) <=
((PERL_UINTMAX_T)(((((('9'))) - (('0')))) | 0))))))) {
do {
(pRExC_state->parse) += (1);
} while (0);
}
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%" "I64u"
"%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
impossible_group,
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) - (pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %"
"I64d" " trying to output message for "
" pattern %.*s",
"..\\regcomp.c", 3725,
(IV)(((pRExC_state
->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
}
if (is_neg) {
num = -num;
}
}
if (*(pRExC_state->parse) != ')')
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%" "I64u"
"%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
"Expecting close bracket",
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) - (pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %"
"I64d" " trying to output message for " " pattern %.*s",
"..\\regcomp.c", 3734,
(IV)(((pRExC_state
->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
if (paren == '-' || paren == '+') {
if ((((_Bool)(2147483647 - (pRExC_state->npar) < num)))) {
do {
(pRExC_state->parse) += (1);
} while (0);
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%"
"I64u" "%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
impossible_group,
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) - (pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %"
"I64d" " trying to output message for "
" pattern %.*s",
"..\\regcomp.c", 3741,
(IV)(((pRExC_state
->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
}
if (paren == '+') {
num--;
}
num += (pRExC_state->npar);
if (paren == '-' && num < 1) {
do {
(pRExC_state->parse) += (1);
} while (0);
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%"
"I64u" "%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
non_existent_group_msg,
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) - (pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %"
"I64d" " trying to output message for " " pattern %.*s",
"..\\regcomp.c", 3769,
(IV)(((pRExC_state
->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
}
} else if (num && num < (pRExC_state->logical_npar)) {
num = (pRExC_state->logical_to_parno)[num];
} else if (((pRExC_state->total_par) > 0)) {
if (num < (pRExC_state->logical_total_par)) {
num = (pRExC_state->logical_to_parno)[num];
} else {
do {
(pRExC_state->parse) += (1);
} while (0);
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%"
"I64u" "%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
non_existent_group_msg,
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) - (pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %"
"I64d" " trying to output message for "
" pattern %.*s",
"..\\regcomp.c", 3783,
(IV)(((pRExC_state
->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
}
} else {
do {
if (!((pRExC_state->total_par) > 0))
(pRExC_state->total_par) = -1;
} while (0);
}
gen_recurse_regop:
if (num >= (pRExC_state->npar)) {
if (((pRExC_state->total_par) > 0)) {
if (num >= (pRExC_state->total_par)) {
do {
(pRExC_state->parse) += (1);
} while (0);
do {
Perl_croak(
my_perl,
"%s" " in regex; marked by " "<-- HERE" " in m/%" "d%"
"I64u" "%4p" " <-- HERE " "%" "d%" "I64u" "%4p" "/",
non_existent_group_msg,
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end) -
(pRExC_state->precomp)
: (((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)) >= 0)
? (((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp))
: (Perl_croak(
my_perl,
"panic: %s: %d: negative offset: %"
"I64d" " trying to output message for " " pattern %.*s",
"..\\regcomp.c", 3800,
(IV)(((pRExC_state
->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) -
(pRExC_state->precomp)),
((int)((pRExC_state->end) -
(pRExC_state->start))),
(pRExC_state->start)),
0))),
(void *)((pRExC_state->precomp)),
(int)((_Bool)(((_Bool)((pRExC_state->utf8))))),
(UV)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) - (pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? 0
: (pRExC_state->precomp_end) -
((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))),
(void *)((((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start))) >
(pRExC_state->precomp_end))
? (pRExC_state->precomp_end)
: ((pRExC_state->copy_start_in_input) +
((pRExC_state->parse) -
(pRExC_state->copy_start)))));
} while (0);
}
}
}
ret = S_reg2node(my_perl, pRExC_state, 94, num,
(pRExC_state->recurse_count));
(pRExC_state->recurse_count)++;
;
(pRExC_state->seen) |= 0x00000020;
*flagp |= 0x08;
((void)0);
S_nextchar(my_perl, pRExC_state);
return ret;
case '*':
default:
do {
(pRExC_state->parse) = ((char *)seqstart + 1);
} while (0);
parse_flags:
S_parse_lparen_question_flags(my_perl, pRExC_state);
if (((int)*(const U8 *)((pRExC_state->parse))) != ':') {
if ((pRExC_state->parse) < (pRExC_state->end))
S_nextchar(my_perl, pRExC_state);
*flagp = 0x10;
return 0;
}
paren = ':';
S_nextchar(my_perl, pRExC_state);
ret = 0;
goto parse_rest;
}
}
}
parse_rest:
return ret;
}
Godbolt "GCC 15.1 x64" -O2 Asm Code output, probably on Linux/SysV, the outgoing registers are totally wrong for the x64 Win64 ABI
.LC0:
.string "\022E_COMPILE_RECURSION_LIMIT"
.LC1:
.string "..\\regcomp.c"
.LC2:
.string "panic: %s: %d: negative offset: %I64d trying to output message for pattern %.*s"
.LC3:
.string "In '(?...)', the '(' and '?' must be adjacent"
.LC4:
.string "%s in regex; marked by <-- HERE in m/%d%I64u%4p <-- HERE %d%I64u%4p/"
.LC5:
.string "Expecting close bracket"
S_regXXXX:
push r13
mov r13, rcx
push r12
mov r12, rdi
push rbp
mov rbp, rsi
mov esi, OFFSET FLAT:.LC0
push rbx
mov rbx, rdx
mov edx, 1
sub rsp, 104
call Perl_get_sv
mov QWORD PTR [r13+0], 0
test rbx, rbx
je .L66
cmp rbx, 2
je .L70
cmp rbx, 114
je .L66
mov rax, QWORD PTR [rbp+72]
cmp BYTE PTR [rax], 63
je .L71
.L66:
xor eax, eax
.L1:
add rsp, 104
pop rbx
pop rbp
pop r12
pop r13
ret
.L70:
mov rax, QWORD PTR [rbp+72]
cmp BYTE PTR [rax], 63
jne .L66
movdqa xmm0, XMMWORD PTR .LC6[rip]
movzx edx, BYTE PTR [rax-1]
lea rdi, [rax+1]
mov rcx, QWORD PTR [rbp+288]
movaps XMMWORD PTR [rsp+64], xmm0
movdqa xmm0, XMMWORD PTR .LC7[rip]
movups XMMWORD PTR [rsp+79], xmm0
movdqa xmm0, XMMWORD PTR .LC8[rip]
movaps XMMWORD PTR [rsp+32], xmm0
movdqa xmm0, XMMWORD PTR .LC9[rip]
movups XMMWORD PTR [rsp+43], xmm0
cmp dl, 40
je .L7
mov rax, QWORD PTR [rbp+24]
mov r9, QWORD PTR [rbp+16]
mov QWORD PTR [rbp+72], rdi
sub rdi, QWORD PTR [rbp+80]
add rdi, QWORD PTR [rbp+96]
cmp rax, rdi
jb .L72
mov r8, rdi
sub r8, r9
js .L10
mov rdx, rax
sub rdx, rdi
.L9:
test rcx, rcx
mov esi, OFFSET FLAT:.LC4
setne cl
sub rsp, 8
cmp rdi, rax
cmova rdi, rax
movzx ecx, cl
xor eax, eax
push rdi
mov rdi, r12
push rdx
mov edx, OFFSET FLAT:.LC3
push rcx
call Perl_croak
.L71:
movdqa xmm0, XMMWORD PTR .LC6[rip]
lea rdi, [rax+1]
movaps XMMWORD PTR [rsp+64], xmm0
movdqa xmm0, XMMWORD PTR .LC7[rip]
movups XMMWORD PTR [rsp+79], xmm0
movdqa xmm0, XMMWORD PTR .LC8[rip]
movaps XMMWORD PTR [rsp+32], xmm0
movdqa xmm0, XMMWORD PTR .LC9[rip]
movups XMMWORD PTR [rsp+43], xmm0
.L7:
mov QWORD PTR [rbp+72], rdi
mov edx, 1
movzx eax, BYTE PTR [rax+1]
cmp QWORD PTR [rbp+288], 0
je .L11
movzx edx, al
movzx edx, BYTE PTR PL_utf8skip[rdx]
.L11:
mov rcx, QWORD PTR [rbp+64]
add rdx, rdi
cmp rcx, rdx
jb .L12
movsx rax, al
sub rax, 49
cmp rax, 8
ja .L12
lea rdx, [rsp+16]
lea rsi, [rsp+24]
mov QWORD PTR [rsp+16], rcx
call Perl_grok_atoUV
test al, al
je .L13
mov rdx, QWORD PTR [rsp+24]
cmp rdx, 2147483647
ja .L13
mov rax, QWORD PTR [rsp+16]
mov QWORD PTR [rbp+72], rax
cmp BYTE PTR [rax], 41
je .L73
mov rdx, QWORD PTR [rbp+24]
sub rax, QWORD PTR [rbp+80]
add rax, QWORD PTR [rbp+96]
mov r9, QWORD PTR [rbp+16]
cmp rdx, rax
jnb .L22
mov r8, rdx
xor esi, esi
sub r8, r9
.L23:
xor ecx, ecx
cmp QWORD PTR [rbp+288], 0
mov rdi, r12
setne cl
sub rsp, 8
cmp rax, rdx
cmova rax, rdx
mov edx, OFFSET FLAT:.LC5
push rax
xor eax, eax
push rsi
mov esi, OFFSET FLAT:.LC4
push rcx
call Perl_croak
.L72:
mov r8, rax
xor edx, edx
sub r8, r9
jmp .L9
.L12:
mov rsi, rbp
mov rdi, r12
call S_parse_lparen_question_flags
mov rax, QWORD PTR [rbp+72]
cmp BYTE PTR [rax], 58
je .L37
cmp rax, QWORD PTR [rbp+64]
jb .L74
.L38:
mov QWORD PTR [r13+0], 16
jmp .L66
.L10:
mov rax, QWORD PTR [rbp+56]
sub rsp, 8
mov r9, QWORD PTR [rbp+64]
mov ecx, 3492
push rax
sub r9d, eax
.L67:
mov edx, OFFSET FLAT:.LC1
mov esi, OFFSET FLAT:.LC2
mov rdi, r12
xor eax, eax
call Perl_croak
.L13:
mov rax, QWORD PTR [rbp+72]
mov rcx, QWORD PTR [rbp+64]
cmp rax, rcx
jb .L16
jmp .L17
.L18:
add rax, 1
mov QWORD PTR [rbp+72], rax
cmp rax, rcx
je .L17
.L16:
movzx edx, BYTE PTR [rax]
sub rdx, 48
cmp rdx, 9
jbe .L18
.L17:
mov rsi, QWORD PTR [rbp+24]
sub rax, QWORD PTR [rbp+80]
add rax, QWORD PTR [rbp+96]
mov r9, QWORD PTR [rbp+16]
cmp rsi, rax
jnb .L19
mov r8, rsi
xor edi, edi
sub r8, r9
.L20:
xor ecx, ecx
cmp QWORD PTR [rbp+288], 0
lea rdx, [rsp+32]
setne cl
sub rsp, 8
cmp rax, rsi
cmova rax, rsi
mov esi, OFFSET FLAT:.LC4
push rax
xor eax, eax
push rdi
mov rdi, r12
push rcx
call Perl_croak
.L19:
mov r8, rax
sub r8, r9
js .L21
mov rdi, rsi
sub rdi, rax
jmp .L20
.L74:
mov rsi, rbp
mov rdi, r12
call S_nextchar
jmp .L38
.L37:
mov rsi, rbp
mov rdi, r12
call S_nextchar
jmp .L66
.L21:
mov rax, QWORD PTR [rbp+56]
mov r9d, ecx
sub rsp, 8
mov ecx, 3725
push rax
sub r9d, eax
jmp .L67
.L22:
mov r8, rax
sub r8, r9
js .L24
mov rsi, rdx
sub rsi, rax
jmp .L23
.L73:
mov rcx, rdx
test rdx, rdx
je .L25
cmp QWORD PTR [rbp+240], rdx
jle .L25
mov rdx, QWORD PTR [rbp+208]
mov rcx, QWORD PTR [rdx+rcx*8]
.L26:
cmp QWORD PTR [rbp+232], rcx
jg .L32
mov rdx, QWORD PTR [rbp+248]
test rdx, rdx
jle .L32
cmp rdx, rcx
jg .L32
add rax, 1
mov rcx, QWORD PTR [rbp+24]
mov r9, QWORD PTR [rbp+16]
mov QWORD PTR [rbp+72], rax
sub rax, QWORD PTR [rbp+80]
add rax, QWORD PTR [rbp+96]
cmp rcx, rax
jnb .L75
.L33:
mov r8, rcx
xor esi, esi
sub r8, r9
.L35:
xor edi, edi
cmp QWORD PTR [rbp+288], 0
lea rdx, [rsp+64]
push r10
setne dil
cmp rax, rcx
cmova rax, rcx
mov ecx, edi
push rax
xor eax, eax
push rsi
mov esi, OFFSET FLAT:.LC4
push rdi
mov rdi, r12
call Perl_croak
.L25:
cmp QWORD PTR [rbp+248], 0
jle .L27
cmp QWORD PTR [rbp+256], rdx
jle .L28
mov rcx, QWORD PTR [rbp+208]
mov rcx, QWORD PTR [rcx+rdx*8]
jmp .L26
.L24:
mov rax, QWORD PTR [rbp+56]
mov r9, QWORD PTR [rbp+64]
mov ecx, 3734
push rbp
sub r9d, eax
push rax
jmp .L67
.L27:
mov QWORD PTR [rbp+248], -1
.L32:
mov r8, QWORD PTR [rbp+312]
mov edx, 94
mov rsi, rbp
mov rdi, r12
call S_reg2node
add QWORD PTR [rbp+312], 1
mov rsi, rbp
mov rdi, r12
or QWORD PTR [rbp+160], 32
or QWORD PTR [r13+0], 8
mov QWORD PTR [rsp+8], rax
call S_nextchar
mov rax, QWORD PTR [rsp+8]
jmp .L1
.L75:
mov r8, rax
sub r8, r9
js .L34
.L68:
mov rsi, rcx
sub rsi, rax
jmp .L35
.L28:
add rax, 1
mov rcx, QWORD PTR [rbp+24]
mov r9, QWORD PTR [rbp+16]
mov QWORD PTR [rbp+72], rax
sub rax, QWORD PTR [rbp+80]
add rax, QWORD PTR [rbp+96]
cmp rcx, rax
jb .L33
mov r8, rax
sub r8, r9
jns .L68
mov rax, QWORD PTR [rbp+56]
mov r9, QWORD PTR [rbp+64]
mov ecx, 3783
push rbx
sub r9d, eax
push rax
jmp .L67
.L34:
mov rax, QWORD PTR [rbp+56]
mov r9, QWORD PTR [rbp+64]
mov ecx, 3800
push r11
sub r9d, eax
push rax
jmp .L67
.LC6:
.quad 7164775599194924370
.quad 7957700152174846053
.LC7:
.quad 7954892355859408238
.quad 31654318912774260
.LC8:
.quad 2334106421097295433
.quad 7164775599194924402
.LC9:
.quad 8367799585382691429
.quad 31654318912774255
very short and very easy VC IDE C and Asm single step guide
local public library Sci/non-fiction section







