Skip to content

Commit f6ed206

Browse files
authored
Change regexp flags field from uint8 to uint16 (#185)
I need the extra bits to store the 'v' flag as described in https://github.com/tc39/proposal-regexp-v-flag
1 parent 6bd3d56 commit f6ed206

File tree

2 files changed

+15
-12
lines changed

2 files changed

+15
-12
lines changed

libregexp.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,11 @@ static const REOpCode reopcode_info[REOP_COUNT] = {
101101
};
102102

103103
#define RE_HEADER_FLAGS 0
104-
#define RE_HEADER_CAPTURE_COUNT 1
105-
#define RE_HEADER_STACK_SIZE 2
106-
#define RE_HEADER_BYTECODE_LEN 3
104+
#define RE_HEADER_CAPTURE_COUNT 2
105+
#define RE_HEADER_STACK_SIZE 3
106+
#define RE_HEADER_BYTECODE_LEN 4
107107

108-
#define RE_HEADER_LEN 7
108+
#define RE_HEADER_LEN 8
109109

110110
static inline int is_digit(int c) {
111111
return c >= '0' && c <= '9';
@@ -280,16 +280,16 @@ static __maybe_unused void lre_dump_bytecode(const uint8_t *buf,
280280

281281
assert(buf_len >= RE_HEADER_LEN);
282282

283-
re_flags= buf[0];
283+
re_flags = lre_get_flags(buf);
284284
bc_len = get_u32(buf + RE_HEADER_BYTECODE_LEN);
285285
assert(bc_len + RE_HEADER_LEN <= buf_len);
286286
printf("flags: 0x%x capture_count=%d stack_size=%d\n",
287-
re_flags, buf[1], buf[2]);
287+
re_flags, buf[RE_HEADER_CAPTURE_COUNT], buf[RE_HEADER_STACK_SIZE]);
288288
if (re_flags & LRE_FLAG_NAMED_GROUPS) {
289289
const char *p;
290290
p = (char *)buf + RE_HEADER_LEN + bc_len;
291291
printf("named groups: ");
292-
for(i = 1; i < buf[1]; i++) {
292+
for(i = 1; i < buf[RE_HEADER_CAPTURE_COUNT]; i++) {
293293
if (i != 1)
294294
printf(",");
295295
printf("<%s>", p);
@@ -1850,7 +1850,7 @@ uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size,
18501850
dbuf_init2(&s->byte_code, opaque, lre_realloc);
18511851
dbuf_init2(&s->group_names, opaque, lre_realloc);
18521852

1853-
dbuf_putc(&s->byte_code, re_flags); /* first element is the flags */
1853+
dbuf_put_u16(&s->byte_code, re_flags); /* first element is the flags */
18541854
dbuf_putc(&s->byte_code, 0); /* second element is the number of captures */
18551855
dbuf_putc(&s->byte_code, 0); /* stack size */
18561856
dbuf_put_u32(&s->byte_code, 0); /* bytecode length */
@@ -1903,7 +1903,8 @@ uint8_t *lre_compile(int *plen, char *error_msg, int error_msg_size,
19031903
/* add the named groups if needed */
19041904
if (s->group_names.size > (s->capture_count - 1)) {
19051905
dbuf_put(&s->byte_code, s->group_names.buf, s->group_names.size);
1906-
s->byte_code.buf[RE_HEADER_FLAGS] |= LRE_FLAG_NAMED_GROUPS;
1906+
put_u16(s->byte_code.buf + RE_HEADER_FLAGS,
1907+
LRE_FLAG_NAMED_GROUPS | lre_get_flags(s->byte_code.buf));
19071908
}
19081909
dbuf_free(&s->group_names);
19091910

@@ -2509,7 +2510,7 @@ int lre_exec(uint8_t **capture,
25092510
int re_flags, i, alloca_size, ret;
25102511
StackInt *stack_buf;
25112512

2512-
re_flags = bc_buf[RE_HEADER_FLAGS];
2513+
re_flags = lre_get_flags(bc_buf);
25132514
s->multi_line = (re_flags & LRE_FLAG_MULTILINE) != 0;
25142515
s->ignore_case = (re_flags & LRE_FLAG_IGNORECASE) != 0;
25152516
s->is_unicode = (re_flags & LRE_FLAG_UNICODE) != 0;
@@ -2546,7 +2547,7 @@ int lre_get_capture_count(const uint8_t *bc_buf)
25462547

25472548
int lre_get_flags(const uint8_t *bc_buf)
25482549
{
2549-
return bc_buf[RE_HEADER_FLAGS];
2550+
return get_u16(bc_buf + RE_HEADER_FLAGS);
25502551
}
25512552

25522553
/* Return NULL if no group names. Otherwise, return a pointer to
@@ -2575,6 +2576,8 @@ void lre_byte_swap(uint8_t *buf, size_t len, BOOL is_byte_swapped)
25752576
// <capture group name 1>
25762577
// <capture group name 2>
25772578
// etc.
2579+
inplace_bswap16(&p[RE_HEADER_FLAGS]);
2580+
25782581
n = get_u32(&p[RE_HEADER_BYTECODE_LEN]);
25792582
inplace_bswap32(&p[RE_HEADER_BYTECODE_LEN]);
25802583
if (is_byte_swapped)

quickjs.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31851,7 +31851,7 @@ typedef enum BCTagEnum {
3185131851
BC_TAG_OBJECT_REFERENCE,
3185231852
} BCTagEnum;
3185331853

31854-
#define BC_VERSION 3
31854+
#define BC_VERSION 4
3185531855

3185631856
typedef struct BCWriterState {
3185731857
JSContext *ctx;

0 commit comments

Comments
 (0)