Skip to content

Commit ae7dd81

Browse files
committed
Remove a few ECMA_TRY_CATCH macro usages
By removing the ECMA_TRY_CATCH macros at these places ~200 bytes of .text is saved on rpi2. JerryScript-DCO-1.0-Signed-off-by: Peter Gal [email protected]
1 parent a79c217 commit ae7dd81

File tree

5 files changed

+104
-119
lines changed

5 files changed

+104
-119
lines changed

jerry-core/ecma/builtin-objects/ecma-builtin-function-prototype.c

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,22 @@ ecma_builtin_function_prototype_object_apply (ecma_value_t this_arg, /**< this a
115115
ecma_object_t *obj_p = ecma_get_object_from_value (arg2);
116116

117117
/* 4. */
118-
ECMA_TRY_CATCH (length_value,
119-
ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_LENGTH),
120-
ret_value);
118+
ecma_value_t length_value = ecma_op_object_get_by_magic_id (obj_p, LIT_MAGIC_STRING_LENGTH);
119+
if (ECMA_IS_VALUE_ERROR (length_value))
120+
{
121+
return length_value;
122+
}
123+
124+
ecma_number_t length_number;
125+
ecma_value_t get_result = ecma_get_number (length_value, &length_number);
121126

122-
ECMA_OP_TO_NUMBER_TRY_CATCH (length_number,
123-
length_value,
124-
ret_value);
127+
ecma_free_value (length_value);
128+
129+
if (ECMA_IS_VALUE_ERROR (get_result))
130+
{
131+
return get_result;
132+
}
133+
JERRY_ASSERT (ecma_is_value_empty (get_result));
125134

126135
/* 5. */
127136
const uint32_t length = ecma_number_to_uint32 (length_number);
@@ -134,45 +143,40 @@ ecma_builtin_function_prototype_object_apply (ecma_value_t this_arg, /**< this a
134143
{
135144
/* 6. */
136145
JMEM_DEFINE_LOCAL_ARRAY (arguments_list_p, length, ecma_value_t);
137-
uint32_t last_index = 0;
146+
uint32_t index = 0;
138147

139148
/* 7. */
140-
for (uint32_t index = 0;
141-
index < length && ecma_is_value_empty (ret_value);
142-
index++)
149+
for (index = 0; index < length; index++)
143150
{
144151
ecma_string_t *curr_idx_str_p = ecma_new_ecma_string_from_uint32 (index);
152+
ecma_value_t get_value = ecma_op_object_get (obj_p, curr_idx_str_p);
153+
ecma_deref_ecma_string (curr_idx_str_p);
145154

146-
ECMA_TRY_CATCH (get_value,
147-
ecma_op_object_get (obj_p, curr_idx_str_p),
148-
ret_value);
149-
150-
arguments_list_p[index] = ecma_copy_value (get_value);
151-
last_index = index + 1;
155+
if (ECMA_IS_VALUE_ERROR (get_value))
156+
{
157+
ret_value = get_value;
158+
break;
159+
}
152160

153-
ECMA_FINALIZE (get_value);
154-
ecma_deref_ecma_string (curr_idx_str_p);
161+
arguments_list_p[index] = get_value;
155162
}
156163

157164
if (ecma_is_value_empty (ret_value))
158165
{
159-
JERRY_ASSERT (last_index == length);
166+
JERRY_ASSERT (index == length);
160167
ret_value = ecma_op_function_call (func_obj_p,
161168
arg1,
162169
arguments_list_p,
163170
length);
164171
}
165172

166-
for (uint32_t index = 0; index < last_index; index++)
173+
for (uint32_t remove_index = 0; remove_index < index; remove_index++)
167174
{
168-
ecma_free_value (arguments_list_p[index]);
175+
ecma_free_value (arguments_list_p[remove_index]);
169176
}
170177

171178
JMEM_FINALIZE_LOCAL_ARRAY (arguments_list_p);
172179
}
173-
174-
ECMA_OP_TO_NUMBER_FINALIZE (length_number);
175-
ECMA_FINALIZE (length_value);
176180
}
177181
}
178182
}

jerry-core/ecma/operations/ecma-get-put-value.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,14 @@ ecma_op_get_value_object_base (ecma_value_t base_value, /**< base value */
9898
|| ecma_is_value_number (base_value)
9999
|| ecma_is_value_string (base_value));
100100

101-
ecma_value_t ret_value = ECMA_VALUE_EMPTY;
102-
103-
ECMA_TRY_CATCH (object_base, ecma_op_to_object (base_value), ret_value);
101+
ecma_value_t object_base = ecma_op_to_object (base_value);
102+
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (object_base));
104103

105104
ecma_object_t *object_p = ecma_get_object_from_value (object_base);
106105
JERRY_ASSERT (object_p != NULL
107106
&& !ecma_is_lexical_environment (object_p));
108107

109-
ret_value = ECMA_VALUE_UNDEFINED;
108+
ecma_value_t ret_value = ECMA_VALUE_UNDEFINED;
110109

111110
/* Circular reference is possible in JavaScript and testing it is complicated. */
112111
int max_depth = ECMA_PROPERTY_SEARCH_DEPTH_LIMIT;
@@ -130,7 +129,7 @@ ecma_op_get_value_object_base (ecma_value_t base_value, /**< base value */
130129
}
131130
while (object_p != NULL);
132131

133-
ECMA_FINALIZE (object_base);
132+
ecma_free_value (object_base);
134133

135134
return ret_value;
136135
} /* ecma_op_get_value_object_base */

jerry-core/parser/regexp/re-compiler.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -239,10 +239,14 @@ re_parse_alternative (re_compiler_ctx_t *re_ctx_p, /**< RegExp compiler context
239239

240240
while (ecma_is_value_empty (ret_value) && should_loop)
241241
{
242-
ECMA_TRY_CATCH (empty,
243-
re_parse_next_token (re_ctx_p->parser_ctx_p,
244-
&(re_ctx_p->current_token)),
245-
ret_value);
242+
ecma_value_t next_token_result = re_parse_next_token (re_ctx_p->parser_ctx_p,
243+
&(re_ctx_p->current_token));
244+
if (ECMA_IS_VALUE_ERROR (next_token_result))
245+
{
246+
ret_value = next_token_result;
247+
break;
248+
}
249+
JERRY_ASSERT (next_token_result == ECMA_VALUE_EMPTY);
246250

247251
uint32_t new_atom_start_offset = re_get_bytecode_length (re_ctx_p->bytecode_ctx_p);
248252

@@ -444,7 +448,6 @@ re_parse_alternative (re_compiler_ctx_t *re_ctx_p, /**< RegExp compiler context
444448
break;
445449
}
446450
}
447-
ECMA_FINALIZE (empty);
448451
}
449452

450453
return ret_value;
@@ -561,10 +564,16 @@ re_compile_bytecode (const re_compiled_code_t **out_bytecode_p, /**< [out] point
561564
re_ctx.num_of_captures = 1;
562565
re_append_opcode (&bc_ctx, RE_OP_SAVE_AT_START);
563566

564-
ECMA_TRY_CATCH (empty, re_parse_alternative (&re_ctx, true), ret_value);
567+
ecma_value_t parse_alt_result = re_parse_alternative (&re_ctx, true);
565568

569+
ECMA_FINALIZE_UTF8_STRING (pattern_start_p, pattern_start_size);
570+
571+
if (ECMA_IS_VALUE_ERROR (parse_alt_result))
572+
{
573+
ret_value = parse_alt_result;
574+
}
566575
/* 2. Check for invalid backreference */
567-
if (re_ctx.highest_backref >= re_ctx.num_of_captures)
576+
else if (re_ctx.highest_backref >= re_ctx.num_of_captures)
568577
{
569578
ret_value = ecma_raise_syntax_error ("Invalid backreference.\n");
570579
}
@@ -589,10 +598,6 @@ re_compile_bytecode (const re_compiled_code_t **out_bytecode_p, /**< [out] point
589598
sizeof (re_compiled_code_t));
590599
}
591600

592-
ECMA_FINALIZE (empty);
593-
594-
ECMA_FINALIZE_UTF8_STRING (pattern_start_p, pattern_start_size);
595-
596601
size_t byte_code_size = (size_t) (bc_ctx.block_end_p - bc_ctx.block_start_p);
597602

598603
if (!ecma_is_value_empty (ret_value))

jerry-core/vm/opcodes-ecma-relational-equality.c

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -104,26 +104,13 @@ ecma_value_t
104104
opfunc_instanceof (ecma_value_t left_value, /**< left value */
105105
ecma_value_t right_value) /**< right value */
106106
{
107-
ecma_value_t ret_value = ECMA_VALUE_EMPTY;
108-
109107
if (!ecma_is_value_object (right_value))
110108
{
111-
ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Expected an object in 'instanceof' check."));
112-
}
113-
else
114-
{
115-
ecma_object_t *right_value_obj_p = ecma_get_object_from_value (right_value);
116-
117-
ECMA_TRY_CATCH (is_instance_of,
118-
ecma_op_object_has_instance (right_value_obj_p, left_value),
119-
ret_value);
120-
121-
ret_value = is_instance_of;
122-
123-
ECMA_FINALIZE (is_instance_of);
109+
return ecma_raise_type_error (ECMA_ERR_MSG ("Expected an object in 'instanceof' check."));
124110
}
125111

126-
return ret_value;
112+
ecma_object_t *right_value_obj_p = ecma_get_object_from_value (right_value);
113+
return ecma_op_object_has_instance (right_value_obj_p, left_value);
127114
} /* opfunc_instanceof */
128115

129116
/**
@@ -138,25 +125,23 @@ ecma_value_t
138125
opfunc_in (ecma_value_t left_value, /**< left value */
139126
ecma_value_t right_value) /**< right value */
140127
{
141-
ecma_value_t ret_value = ECMA_VALUE_EMPTY;
142-
143128
if (!ecma_is_value_object (right_value))
144129
{
145-
ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("Expected an object in 'in' check."));
130+
return ecma_raise_type_error (ECMA_ERR_MSG ("Expected an object in 'in' check."));
146131
}
147-
else
148-
{
149-
ECMA_TRY_CATCH (str_left_value, ecma_op_to_string (left_value), ret_value);
150132

151-
ecma_string_t *left_value_prop_name_p = ecma_get_string_from_value (str_left_value);
152-
ecma_object_t *right_value_obj_p = ecma_get_object_from_value (right_value);
133+
ecma_value_t left_string_value = ecma_op_to_string (left_value);
134+
if (ECMA_IS_VALUE_ERROR (left_string_value))
135+
{
136+
return left_string_value;
137+
}
153138

154-
ret_value = ecma_make_boolean_value (ecma_op_object_has_property (right_value_obj_p, left_value_prop_name_p));
139+
ecma_string_t *left_value_prop_name_p = ecma_get_string_from_value (left_string_value);
140+
ecma_object_t *right_value_obj_p = ecma_get_object_from_value (right_value);
155141

156-
ECMA_FINALIZE (str_left_value);
157-
}
142+
ecma_free_value (left_string_value);
158143

159-
return ret_value;
144+
return ecma_make_boolean_value (ecma_op_object_has_property (right_value_obj_p, left_value_prop_name_p));
160145
} /* opfunc_in */
161146

162147
/**

jerry-core/vm/opcodes.c

Lines changed: 43 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -168,45 +168,40 @@ vm_op_delete_prop (ecma_value_t object, /**< base object */
168168
ecma_value_t property, /**< property name */
169169
bool is_strict) /**< strict mode */
170170
{
171-
ecma_value_t completion_value = ECMA_VALUE_EMPTY;
172-
173171
if (ecma_is_value_undefined (object))
174172
{
175-
completion_value = ECMA_VALUE_TRUE;
173+
return ECMA_VALUE_TRUE;
176174
}
177-
else
178-
{
179-
completion_value = ECMA_VALUE_EMPTY;
180175

181-
ECMA_TRY_CATCH (check_coercible_ret,
182-
ecma_op_check_object_coercible (object),
183-
completion_value);
184-
ECMA_TRY_CATCH (str_name_value,
185-
ecma_op_to_string (property),
186-
completion_value);
187-
188-
JERRY_ASSERT (ecma_is_value_string (str_name_value));
189-
ecma_string_t *name_string_p = ecma_get_string_from_value (str_name_value);
190-
191-
ECMA_TRY_CATCH (obj_value, ecma_op_to_object (object), completion_value);
176+
ecma_value_t check_coercible = ecma_op_check_object_coercible (object);
177+
if (ECMA_IS_VALUE_ERROR (check_coercible))
178+
{
179+
return check_coercible;
180+
}
181+
JERRY_ASSERT (check_coercible == ECMA_VALUE_EMPTY);
192182

193-
JERRY_ASSERT (ecma_is_value_object (obj_value));
194-
ecma_object_t *obj_p = ecma_get_object_from_value (obj_value);
195-
JERRY_ASSERT (!ecma_is_lexical_environment (obj_p));
183+
ecma_value_t str_name_value = ecma_op_to_string (property);
184+
if (ECMA_IS_VALUE_ERROR (str_name_value))
185+
{
186+
return str_name_value;
187+
}
196188

197-
ECMA_TRY_CATCH (delete_op_ret_val,
198-
ecma_op_object_delete (obj_p, name_string_p, is_strict),
199-
completion_value);
189+
JERRY_ASSERT (ecma_is_value_string (str_name_value));
190+
ecma_string_t *name_string_p = ecma_get_string_from_value (str_name_value);
200191

201-
completion_value = delete_op_ret_val;
192+
ecma_value_t obj_value = ecma_op_to_object (object);
193+
/* The ecma_op_check_object_coercible call already checked the op_to_object error cases. */
194+
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (obj_value));
195+
JERRY_ASSERT (ecma_is_value_object (obj_value));
196+
ecma_object_t *obj_p = ecma_get_object_from_value (obj_value);
197+
JERRY_ASSERT (!ecma_is_lexical_environment (obj_p));
202198

203-
ECMA_FINALIZE (delete_op_ret_val);
204-
ECMA_FINALIZE (obj_value);
205-
ECMA_FINALIZE (str_name_value);
206-
ECMA_FINALIZE (check_coercible_ret);
207-
}
199+
ecma_value_t delete_op_ret = ecma_op_object_delete (obj_p, name_string_p, is_strict);
200+
JERRY_ASSERT (ecma_is_value_boolean (delete_op_ret) || (is_strict == true && ECMA_IS_VALUE_ERROR (delete_op_ret)));
201+
ecma_free_value (obj_value);
202+
ecma_free_value (str_name_value);
208203

209-
return completion_value;
204+
return delete_op_ret;
210205
} /* vm_op_delete_prop */
211206

212207
/**
@@ -251,36 +246,33 @@ ecma_collection_chunk_t *
251246
opfunc_for_in (ecma_value_t left_value, /**< left value */
252247
ecma_value_t *result_obj_p) /**< expression object */
253248
{
254-
ecma_value_t compl_val = ECMA_VALUE_EMPTY;
255249
ecma_collection_chunk_t *prop_names_p = NULL;
256250

257251
/* 3. */
258-
if (!ecma_is_value_undefined (left_value)
259-
&& !ecma_is_value_null (left_value))
252+
if (ecma_is_value_undefined (left_value)
253+
|| ecma_is_value_null (left_value))
260254
{
261-
/* 4. */
262-
ECMA_TRY_CATCH (obj_expr_value,
263-
ecma_op_to_object (left_value),
264-
compl_val);
265-
266-
ecma_object_t *obj_p = ecma_get_object_from_value (obj_expr_value);
267-
ecma_collection_header_t *prop_names_coll_p = ecma_op_object_get_property_names (obj_p, false, true, true);
268-
269-
if (prop_names_coll_p->item_count != 0)
270-
{
271-
prop_names_p = ECMA_GET_POINTER (ecma_collection_chunk_t,
272-
prop_names_coll_p->first_chunk_cp);
255+
return prop_names_p;
256+
}
273257

274-
ecma_ref_object (obj_p);
275-
*result_obj_p = ecma_make_object_value (obj_p);
276-
}
258+
/* 4. */
259+
ecma_value_t obj_expr_value = ecma_op_to_object (left_value);
260+
/* ecma_op_to_object will only raise error on null/undefined values but those are handled above. */
261+
JERRY_ASSERT (!ECMA_IS_VALUE_ERROR (obj_expr_value));
262+
ecma_object_t *obj_p = ecma_get_object_from_value (obj_expr_value);
263+
ecma_collection_header_t *prop_names_coll_p = ecma_op_object_get_property_names (obj_p, false, true, true);
277264

278-
jmem_heap_free_block (prop_names_coll_p, sizeof (ecma_collection_header_t));
265+
if (prop_names_coll_p->item_count != 0)
266+
{
267+
prop_names_p = ECMA_GET_POINTER (ecma_collection_chunk_t,
268+
prop_names_coll_p->first_chunk_cp);
279269

280-
ECMA_FINALIZE (obj_expr_value);
270+
ecma_ref_object (obj_p);
271+
*result_obj_p = ecma_make_object_value (obj_p);
281272
}
282273

283-
JERRY_ASSERT (ecma_is_value_empty (compl_val));
274+
jmem_heap_free_block (prop_names_coll_p, sizeof (ecma_collection_header_t));
275+
ecma_free_value (obj_expr_value);
284276

285277
return prop_names_p;
286278
} /* opfunc_for_in */

0 commit comments

Comments
 (0)