From 994ab4efb374f87bee21e9ffed665f300abe6cc6 Mon Sep 17 00:00:00 2001 From: Kangzhi Shi Date: Fri, 1 Jan 2021 13:10:19 +0200 Subject: [PATCH] fix Opcode::CHARSET --- extra_tests/snippets/stdlib_re.py | 7 ++++--- vm/src/stdlib/sre/interp.rs | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/extra_tests/snippets/stdlib_re.py b/extra_tests/snippets/stdlib_re.py index 0c6d5dd05..db2b9c3f1 100644 --- a/extra_tests/snippets/stdlib_re.py +++ b/extra_tests/snippets/stdlib_re.py @@ -22,14 +22,15 @@ p = re.compile('ab') idpattern = r'([_a-z][_a-z0-9]*)' mo = re.search(idpattern, '7382 _boe0+2') -print(mo) -# TODO: -# assert mo.group(0) == '_boe0' +assert mo.group(0) == '_boe0' # tes op range assert re.compile('[a-z]').match('a').span() == (0, 1) assert re.compile('[a-z]').fullmatch('z').span() == (0, 1) +# test op charset +assert re.compile('[_a-z0-9]*').match('_09az').group() == '_09az' + # test op repeat one assert re.compile('a*').match('aaa').span() == (0, 3) assert re.compile('abcd*').match('abcdddd').group() == 'abcdddd' diff --git a/vm/src/stdlib/sre/interp.rs b/vm/src/stdlib/sre/interp.rs index ad0790a31..289dbc2ec 100644 --- a/vm/src/stdlib/sre/interp.rs +++ b/vm/src/stdlib/sre/interp.rs @@ -741,7 +741,8 @@ fn charset(set: &[u32], c: char) -> bool { } SreOpcode::CHARSET => { /* */ - if ch < 256 && (set[(ch / 32) as usize] & (1 << (32 - 1))) != 0 { + let set = &set[1..]; + if ch < 256 && ((set[(ch >> 5) as usize] & (1u32 << (ch & 31))) != 0) { return ok; } i += 8;