Skip to content

Commit 065785b

Browse files
committed
Fix RegExp constructor and add new tests.
JerryScript-DCO-1.0-Signed-off-by: László Langó [email protected]
1 parent 7e9f45c commit 065785b

File tree

6 files changed

+377
-5
lines changed

6 files changed

+377
-5
lines changed

jerry-core/ecma/base/ecma-magic-strings.inc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_EXEC, "exec")
213213
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_TEST, "test")
214214
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_NAME, "name")
215215
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_MESSAGE, "message")
216+
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_EMPTY_NON_CAPTURE_GROUP, "(?:)")
216217
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_LEFT_SQUARE_CHAR, "[")
217218
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_RIGHT_SQUARE_CHAR, "]")
218219
ECMA_MAGIC_STRING_DEF (ECMA_MAGIC_STRING_COLON_CHAR, ":")

jerry-core/ecma/builtin-objects/ecma-builtin-regexp.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@ ecma_builtin_regexp_dispatch_construct (const ecma_value_t *arguments_list_p, /*
6565
{
6666
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
6767

68-
if (ecma_is_value_object (arguments_list_p[0])
68+
if (arguments_list_len == 0)
69+
{
70+
ecma_string_t *magic_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_EMPTY_NON_CAPTURE_GROUP);
71+
ret_value = ecma_op_create_regexp_object (magic_str_p, NULL);
72+
ecma_deref_ecma_string (magic_str_p);
73+
}
74+
else if (ecma_is_value_object (arguments_list_p[0])
6975
&& ecma_object_get_class_name (ecma_get_object_from_value (arguments_list_p[0])) == ECMA_MAGIC_STRING_REGEXP_UL)
7076
{
7177
if (arguments_list_len == 1

tests/jerry/regexp-alternatives.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright 2015 Samsung Electronics Co., Ltd.
2+
// Copyright 2015 University of Szeged.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
16+
var r;
17+
18+
r = new RegExp ("a|b");
19+
assert (r.exec("a") == "a");
20+
21+
r = new RegExp ("a|b");
22+
assert (r.exec("b") == "b");
23+
24+
r = new RegExp ("a|b|c");
25+
assert (r.exec("b") == "b");
26+
27+
r = new RegExp ("a|b|c");
28+
assert (r.exec("c") == "c");
29+
30+
r = new RegExp ("a|b|c|d");
31+
assert (r.exec("") == undefined);
32+
33+
r = new RegExp ("a|b|c|d");
34+
assert (r.exec("a") == "a");
35+
36+
r = new RegExp ("a|b|c|d");
37+
assert (r.exec("b") == "b");
38+
39+
r = new RegExp ("a|b|c|d");
40+
assert (r.exec("c") == "c");
41+
42+
r = new RegExp ("a|b|c|d");
43+
assert (r.exec("d") == "d");
44+
45+
r = new RegExp ("a|bb|c|d");
46+
assert (r.exec("e") == undefined);
47+
48+
r = new RegExp ("a|bb|c|d");
49+
assert (r.exec("bb") == "bb");
50+
51+
r = new RegExp ("a|bb|c|d");
52+
assert (r.exec("bba") == "bb");
53+
54+
r = new RegExp ("a|bb|c|d");
55+
assert (r.exec("bbbb") == "bb");
56+
57+
r = new RegExp ("a|bb|c|d");
58+
assert (r.exec("a") == "a");
59+
60+
r = new RegExp ("a|bb|c|d");
61+
assert (r.exec("b") == undefined);

tests/jerry/regexp-capture-groups.js

Lines changed: 148 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,153 @@ assert (r.exec ("b")[0] == "");
4747
assert (r.exec ("b")[1] == undefined);
4848

4949
// Test greedy iterations
50-
// FIXME: Add testcases
50+
r = new RegExp ("(a){1,3}a");
51+
assert (r.exec("aa") == "aa,a");
52+
53+
r = new RegExp ("(a){1,3}a");
54+
assert (r.exec("aaa") == "aaa,a");
55+
56+
r = new RegExp ("(a){1,3}");
57+
assert (r.exec("a") == "a,a");
58+
59+
r = new RegExp ("(a){1,3}");
60+
assert (r.exec("aaa") == "aaa,a");
61+
62+
r = new RegExp ("(a){1,3}");
63+
assert (r.exec("aaaa") == "aaa,a");
64+
65+
r = new RegExp ("(a){1,5}");
66+
assert (r.exec("aaaa") == "aaaa,a");
67+
68+
r = new RegExp ("(a|b){1,2}");
69+
assert (r.exec("a") == "a,a");
70+
71+
r = new RegExp ("(a|b){1,3}a");
72+
assert (r.exec("aaa") == "aaa,a");
73+
74+
r = new RegExp ("(a|b){1,3}a");
75+
assert (r.exec("aba") == "aba,b");
76+
77+
r = new RegExp ("(a|b){1,3}a");
78+
assert (r.exec("b") == undefined);
79+
80+
r = new RegExp ("(a|b){1,3}a");
81+
assert (r.exec("bbb") == undefined);
82+
83+
r = new RegExp ("(a|b){1,3}");
84+
assert (r.exec("a") == "a,a");
85+
86+
r = new RegExp ("(a|b){1,3}");
87+
assert (r.exec("aa") == "aa,a");
88+
89+
r = new RegExp ("(a|b){1,3}");
90+
assert (r.exec("aaa") == "aaa,a");
91+
92+
r = new RegExp ("(a|b){1,3}");
93+
assert (r.exec("ab") == "ab,b");
94+
95+
r = new RegExp ("(a|b){1,3}");
96+
assert (r.exec("aba") == "aba,a");
97+
98+
r = new RegExp ("(a|b){1,3}");
99+
assert (r.exec("bab") == "bab,b");
100+
101+
r = new RegExp ("(a|b){1,3}");
102+
assert (r.exec("bbb") == "bbb,b");
103+
104+
r = new RegExp ("(a|b){1,4}a");
105+
assert (r.exec("bbb") == undefined);
106+
107+
r = new RegExp ("(a|b){1,4}");
108+
assert (r.exec("ab") == "ab,b");
109+
110+
r = new RegExp ("(a|b){1,4}");
111+
assert (r.exec("aba") == "aba,a");
112+
113+
r = new RegExp ("(a|b){1,4}");
114+
assert (r.exec("bbb") == "bbb,b");
115+
116+
r = new RegExp ("(a|b){1,5}");
117+
assert (r.exec("aba") == "aba,a");
118+
119+
r = new RegExp ("(a|b){1,5}");
120+
assert (r.exec("abab") == "abab,b");
121+
122+
r = new RegExp ("(a|b){1,5}");
123+
assert (r.exec("bbb") == "bbb,b");
124+
125+
r = new RegExp ("(aba)*");
126+
assert (r.exec("aaaa") == ",");
127+
128+
r = new RegExp ("(aba)+");
129+
assert (r.exec("aaaa") == undefined);
130+
131+
r = new RegExp ("(a|bb|c|d)");
132+
assert (r.exec("a") == "a,a");
133+
134+
r = new RegExp ("(a|b)");
135+
assert (r.exec("a") == "a,a");
136+
137+
r = new RegExp ("(a|b)+");
138+
assert (r.exec("aba") == "aba,a");
139+
140+
r = new RegExp ("(a|b)");
141+
assert (r.exec("b") == "b,b");
142+
143+
r = new RegExp ("(a)");
144+
assert (r.exec("a") == "a,a");
145+
146+
r = new RegExp ("(a)*");
147+
assert (r.exec("a") == "a,a");
148+
149+
r = new RegExp ("(a)*");
150+
assert (r.exec("aaaa") == "aaaa,a");
151+
152+
r = new RegExp ("(a)+");
153+
assert (r.exec("aaaa") == "aaaa,a");
154+
155+
r = new RegExp ("(a|aa){0,3}b");
156+
assert (r.exec("aaaaaab") == "aaaaaab,aa");
157+
158+
r = new RegExp ("((a){2,3}){4}b");
159+
assert (r.exec("aaaaaaaab") == "aaaaaaaab,aa,a");
51160

52161
// Test non-greedy iterations
53-
// FIXME: Add testcases
162+
r = new RegExp ("(a)+?");
163+
assert (r.exec("aaaa") == "a,a");
164+
165+
r = new RegExp ("(a)*?aa");
166+
assert (r.exec("aaaa") == "aa,");
167+
168+
r = new RegExp ("(aaa|aa)*?aa");
169+
assert (r.exec("aaaa")[0] == "aa");
170+
assert (r.exec("aaaa")[1] == undefined);
171+
172+
r = new RegExp ("(a)??aa");
173+
assert (r.exec("aaaa")[0] == "aa");
174+
assert (r.exec("aaaa")[1] == undefined);
175+
176+
r = new RegExp ("(a)?aa");
177+
assert (r.exec("aaaa") == "aaa,a");
178+
179+
r = new RegExp ("(()*?)*?a");
180+
assert (r.exec("ba")[0] == "a");
181+
assert (r.exec("ba")[1] == undefined);
182+
assert (r.exec("ba")[2] == undefined);
183+
184+
r = new RegExp ("((bb?)*)*a");
185+
assert (r.exec("bbba") == "bbba,bbb,b");
186+
187+
r = new RegExp ("((bb?)*)*bbb\\Ba");
188+
assert (r.exec("bbba")[0] == "bbba");
189+
assert (r.exec("bbba")[1] == undefined);
190+
assert (r.exec("bbba")[2] == undefined);
191+
192+
r = new RegExp ("(a??){0,1}a");
193+
assert (r.exec("aa") == "aa,a");
194+
195+
r = new RegExp ("(a?){0,1}a");
196+
assert (r.exec("aa") == "aa,a");
197+
198+
r = new RegExp ("(a{0,1}?){0,1}a");
199+
assert (r.exec("aa") == "aa,a");

tests/jerry/regexp-construct.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515

1616
var r;
1717

18+
r = new RegExp ();
19+
assert (r.source == "(?:)");
20+
assert (r.global == false);
21+
assert (r.ignoreCase == false);
22+
assert (r.multiline == false);
23+
1824
r = new RegExp ("a");
1925
assert (r.source == "a");
2026
assert (r.global == false);
@@ -61,6 +67,12 @@ assert (r2.global == true);
6167
assert (r2.ignoreCase == true);
6268
assert (r2.multiline == true);
6369

70+
r = /(?:)/;
71+
assert (r.source == "(?:)");
72+
assert (r.global == false);
73+
assert (r.ignoreCase == false);
74+
assert (r.multiline == false);
75+
6476
r = /a/;
6577
assert (r.source == "a");
6678
assert (r.global == false);

0 commit comments

Comments
 (0)