|
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