|
62 | 62 | * @return completion value
|
63 | 63 | * Returned value must be freed with ecma_free_completion_value
|
64 | 64 | */
|
65 |
| -static ecma_completion_value_t |
| 65 | +ecma_completion_value_t |
66 | 66 | re_parse_regexp_flags (ecma_string_t *flags_str_p, /**< Input string with flags */
|
67 | 67 | uint8_t *flags_p) /**< Output: parsed flag bits */
|
68 | 68 | {
|
@@ -119,6 +119,101 @@ re_parse_regexp_flags (ecma_string_t *flags_str_p, /**< Input string with flags
|
119 | 119 | return ret_value;
|
120 | 120 | } /* re_parse_regexp_flags */
|
121 | 121 |
|
| 122 | +/* |
| 123 | + * Initializes the source, global, ignoreCase, multiline, and lastIndex properties of RegExp instance. |
| 124 | + */ |
| 125 | +void |
| 126 | +re_initialize_props (ecma_object_t *re_obj_p, /**< RegExp obejct */ |
| 127 | + ecma_string_t *source_p, /**< source string */ |
| 128 | + uint8_t flags) /**< flags */ |
| 129 | +{ |
| 130 | + /* Set source property. ECMA-262 v5, 15.10.7.1 */ |
| 131 | + ecma_string_t *magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_SOURCE); |
| 132 | + ecma_property_t *prop_p = ecma_find_named_property (re_obj_p, magic_string_p); |
| 133 | + |
| 134 | + if (prop_p == NULL) |
| 135 | + { |
| 136 | + prop_p = ecma_create_named_data_property (re_obj_p, |
| 137 | + magic_string_p, |
| 138 | + false, false, false); |
| 139 | + } |
| 140 | + |
| 141 | + ecma_deref_ecma_string (magic_string_p); |
| 142 | + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA); |
| 143 | + ecma_named_data_property_assign_value (re_obj_p, |
| 144 | + prop_p, |
| 145 | + ecma_make_string_value (source_p)); |
| 146 | + |
| 147 | + ecma_simple_value_t prop_value; |
| 148 | + |
| 149 | + /* Set global property. ECMA-262 v5, 15.10.7.2 */ |
| 150 | + magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_GLOBAL); |
| 151 | + prop_p = ecma_find_named_property (re_obj_p, magic_string_p); |
| 152 | + |
| 153 | + if (prop_p == NULL) |
| 154 | + { |
| 155 | + prop_p = ecma_create_named_data_property (re_obj_p, |
| 156 | + magic_string_p, |
| 157 | + false, false, false); |
| 158 | + } |
| 159 | + |
| 160 | + ecma_deref_ecma_string (magic_string_p); |
| 161 | + prop_value = flags & RE_FLAG_GLOBAL ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE; |
| 162 | + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA); |
| 163 | + ecma_set_named_data_property_value (prop_p, ecma_make_simple_value (prop_value)); |
| 164 | + |
| 165 | + /* Set ignoreCase property. ECMA-262 v5, 15.10.7.3 */ |
| 166 | + magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_IGNORECASE_UL); |
| 167 | + prop_p = ecma_find_named_property (re_obj_p, magic_string_p); |
| 168 | + |
| 169 | + if (prop_p == NULL) |
| 170 | + { |
| 171 | + prop_p = ecma_create_named_data_property (re_obj_p, |
| 172 | + magic_string_p, |
| 173 | + false, false, false); |
| 174 | + } |
| 175 | + |
| 176 | + ecma_deref_ecma_string (magic_string_p); |
| 177 | + prop_value = flags & RE_FLAG_IGNORE_CASE ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE; |
| 178 | + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA); |
| 179 | + ecma_set_named_data_property_value (prop_p, ecma_make_simple_value (prop_value)); |
| 180 | + |
| 181 | + /* Set multiline property. ECMA-262 v5, 15.10.7.4 */ |
| 182 | + magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_MULTILINE); |
| 183 | + prop_p = ecma_find_named_property (re_obj_p, magic_string_p); |
| 184 | + |
| 185 | + if (prop_p == NULL) |
| 186 | + { |
| 187 | + prop_p = ecma_create_named_data_property (re_obj_p, |
| 188 | + magic_string_p, |
| 189 | + false, false, false); |
| 190 | + } |
| 191 | + |
| 192 | + ecma_deref_ecma_string (magic_string_p); |
| 193 | + prop_value = flags & RE_FLAG_MULTILINE ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE; |
| 194 | + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA); |
| 195 | + ecma_set_named_data_property_value (prop_p, ecma_make_simple_value (prop_value)); |
| 196 | + |
| 197 | + /* Set lastIndex property. ECMA-262 v5, 15.10.7.5 */ |
| 198 | + magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_LASTINDEX_UL); |
| 199 | + prop_p = ecma_find_named_property (re_obj_p, magic_string_p); |
| 200 | + |
| 201 | + if (prop_p == NULL) |
| 202 | + { |
| 203 | + prop_p = ecma_create_named_data_property (re_obj_p, |
| 204 | + magic_string_p, |
| 205 | + true, false, false); |
| 206 | + } |
| 207 | + |
| 208 | + ecma_deref_ecma_string (magic_string_p); |
| 209 | + |
| 210 | + ecma_number_t *lastindex_num_p = ecma_alloc_number (); |
| 211 | + *lastindex_num_p = ECMA_NUMBER_ZERO; |
| 212 | + JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA); |
| 213 | + ecma_named_data_property_assign_value (re_obj_p, prop_p, ecma_make_number_value (lastindex_num_p)); |
| 214 | + ecma_dealloc_number (lastindex_num_p); |
| 215 | +} /* re_initialize_props */ |
| 216 | + |
122 | 217 | /**
|
123 | 218 | * RegExp object creation operation.
|
124 | 219 | *
|
@@ -155,64 +250,19 @@ ecma_op_create_regexp_object (ecma_string_t *pattern_p, /**< input pattern */
|
155 | 250 | ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS);
|
156 | 251 | class_prop_p->u.internal_property.value = LIT_MAGIC_STRING_REGEXP_UL;
|
157 | 252 |
|
158 |
| - /* Set source property. ECMA-262 v5, 15.10.7.1 */ |
159 |
| - ecma_string_t *magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_SOURCE); |
160 |
| - ecma_property_t *source_prop_p = ecma_create_named_data_property (obj_p, |
161 |
| - magic_string_p, |
162 |
| - false, false, false); |
163 |
| - ecma_deref_ecma_string (magic_string_p); |
164 |
| - ecma_set_named_data_property_value (source_prop_p, |
165 |
| - ecma_make_string_value (ecma_copy_or_ref_ecma_string (pattern_p))); |
166 |
| - |
167 |
| - ecma_simple_value_t prop_value; |
168 |
| - |
169 |
| - /* Set global property. ECMA-262 v5, 15.10.7.2*/ |
170 |
| - magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_GLOBAL); |
171 |
| - ecma_property_t *global_prop_p = ecma_create_named_data_property (obj_p, |
172 |
| - magic_string_p, |
173 |
| - false, false, false); |
174 |
| - ecma_deref_ecma_string (magic_string_p); |
175 |
| - prop_value = flags & RE_FLAG_GLOBAL ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE; |
176 |
| - ecma_set_named_data_property_value (global_prop_p, ecma_make_simple_value (prop_value)); |
177 |
| - |
178 |
| - /* Set ignoreCase property. ECMA-262 v5, 15.10.7.3*/ |
179 |
| - magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_IGNORECASE_UL); |
180 |
| - ecma_property_t *ignorecase_prop_p = ecma_create_named_data_property (obj_p, |
181 |
| - magic_string_p, |
182 |
| - false, false, false); |
183 |
| - ecma_deref_ecma_string (magic_string_p); |
184 |
| - prop_value = flags & RE_FLAG_IGNORE_CASE ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE; |
185 |
| - ecma_set_named_data_property_value (ignorecase_prop_p, ecma_make_simple_value (prop_value)); |
186 |
| - |
187 |
| - |
188 |
| - /* Set multiline property. ECMA-262 v5, 15.10.7.4*/ |
189 |
| - magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_MULTILINE); |
190 |
| - ecma_property_t *multiline_prop_p = ecma_create_named_data_property (obj_p, |
191 |
| - magic_string_p, |
192 |
| - false, false, false); |
193 |
| - ecma_deref_ecma_string (magic_string_p); |
194 |
| - prop_value = flags & RE_FLAG_MULTILINE ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE; |
195 |
| - ecma_set_named_data_property_value (multiline_prop_p, ecma_make_simple_value (prop_value)); |
196 |
| - |
197 |
| - /* Set lastIndex property. ECMA-262 v5, 15.10.7.5*/ |
198 |
| - magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_LASTINDEX_UL); |
199 |
| - ecma_property_t *lastindex_prop_p = ecma_create_named_data_property (obj_p, |
200 |
| - magic_string_p, |
201 |
| - true, false, false); |
202 |
| - ecma_deref_ecma_string (magic_string_p); |
203 |
| - |
204 |
| - ecma_number_t *lastindex_num_p = ecma_alloc_number (); |
205 |
| - *lastindex_num_p = ECMA_NUMBER_ZERO; |
206 |
| - ecma_named_data_property_assign_value (obj_p, lastindex_prop_p, ecma_make_number_value (lastindex_num_p)); |
207 |
| - ecma_dealloc_number (lastindex_num_p); |
| 253 | + re_initialize_props (obj_p, pattern_p, flags); |
208 | 254 |
|
209 | 255 | /* Set bytecode internal property. */
|
210 | 256 | ecma_property_t *bytecode_prop_p;
|
211 | 257 | bytecode_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_REGEXP_BYTECODE);
|
212 | 258 |
|
213 | 259 | /* Compile bytecode. */
|
214 |
| - ECMA_TRY_CATCH (empty, re_compile_bytecode (bytecode_prop_p, pattern_p, flags), ret_value); |
| 260 | + re_bytecode_t *bc_p = NULL; |
| 261 | + ECMA_TRY_CATCH (empty, re_compile_bytecode (&bc_p, pattern_p, flags), ret_value); |
| 262 | + |
| 263 | + ECMA_SET_POINTER (bytecode_prop_p->u.internal_property.value, bc_p); |
215 | 264 | ret_value = ecma_make_normal_completion_value (ecma_make_object_value (obj_p));
|
| 265 | + |
216 | 266 | ECMA_FINALIZE (empty);
|
217 | 267 |
|
218 | 268 | if (ecma_is_completion_value_throw (ret_value))
|
|
0 commit comments