Skip to content

Commit 4779451

Browse files
authored
Cleanup code around JERRY_UNREACHABLEs (#2342)
`JERRY_UNREACHABLE`s often signal code structure that could be improved: they can usually either be rewritten to `JERRY_ASSERT`s or eliminated by restructuring loops, `if`s or `#if`s. Roughly, the only valid occurences are in default cases of `switch`es. And even they can often be merged into non-default cases. Moreover, it is dangerous to write meaningful code after `JERRY_UNREACHABLE` because it pretends as if there was a way to recover from an impossible situation. This patch rewrites/eliminates `JERRY_UNREACHABLE`s where possible and removes misleading code from after them. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss [email protected]
1 parent acb3e71 commit 4779451

24 files changed

+165
-253
lines changed

jerry-core/api/jerry-snapshot.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ snapshot_add_compiled_code (ecma_compiled_code_t *compiled_code_p, /**< compiled
154154
uint8_t *copied_code_start_p = snapshot_buffer_p + globals_p->snapshot_buffer_write_offset;
155155
ecma_compiled_code_t *copied_code_p = (ecma_compiled_code_t *) copied_code_start_p;
156156

157+
#ifndef CONFIG_DISABLE_REGEXP_BUILTIN
157158
if (!(compiled_code_p->status_flags & CBC_CODE_FLAGS_FUNCTION))
158159
{
159-
#ifndef CONFIG_DISABLE_REGEXP_BUILTIN
160160
/* Regular expression. */
161161
if (globals_p->snapshot_buffer_write_offset + sizeof (ecma_compiled_code_t) > snapshot_buffer_size)
162162
{
@@ -204,11 +204,11 @@ snapshot_add_compiled_code (ecma_compiled_code_t *compiled_code_p, /**< compiled
204204

205205
copied_code_p->status_flags = compiled_code_p->status_flags;
206206

207-
#else /* CONFIG_DISABLE_REGEXP_BUILTIN */
208-
JERRY_UNREACHABLE (); /* RegExp is not supported in the selected profile. */
209-
#endif /* !CONFIG_DISABLE_REGEXP_BUILTIN */
210207
return start_offset;
211208
}
209+
#endif /* !CONFIG_DISABLE_REGEXP_BUILTIN */
210+
211+
JERRY_ASSERT (compiled_code_p->status_flags & CBC_CODE_FLAGS_FUNCTION);
212212

213213
if (!snapshot_write_to_buffer_by_offset (snapshot_buffer_p,
214214
snapshot_buffer_size,
@@ -536,9 +536,9 @@ snapshot_load_compiled_code (const uint8_t *base_addr_p, /**< base address of th
536536
ecma_compiled_code_t *bytecode_p = (ecma_compiled_code_t *) base_addr_p;
537537
uint32_t code_size = ((uint32_t) bytecode_p->size) << JMEM_ALIGNMENT_LOG;
538538

539+
#ifndef CONFIG_DISABLE_REGEXP_BUILTIN
539540
if (!(bytecode_p->status_flags & CBC_CODE_FLAGS_FUNCTION))
540541
{
541-
#ifndef CONFIG_DISABLE_REGEXP_BUILTIN
542542
const re_compiled_code_t *re_bytecode_p = NULL;
543543

544544
const uint8_t *regex_start_p = ((const uint8_t *) bytecode_p) + sizeof (ecma_compiled_code_t);
@@ -554,10 +554,10 @@ snapshot_load_compiled_code (const uint8_t *base_addr_p, /**< base address of th
554554
ecma_deref_ecma_string (pattern_str_p);
555555

556556
return (ecma_compiled_code_t *) re_bytecode_p;
557-
#else /* CONFIG_DISABLE_REGEXP_BUILTIN */
558-
JERRY_UNREACHABLE (); /* RegExp is not supported in the selected profile. */
559-
#endif /* !CONFIG_DISABLE_REGEXP_BUILTIN */
560557
}
558+
#endif /* !CONFIG_DISABLE_REGEXP_BUILTIN */
559+
560+
JERRY_ASSERT (bytecode_p->status_flags & CBC_CODE_FLAGS_FUNCTION);
561561

562562
size_t header_size;
563563
uint32_t argument_end = 0;

jerry-core/api/jerry.c

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,7 @@ static const char * const wrong_args_msg_p = "wrong type of argument";
100100
static inline void JERRY_ATTR_ALWAYS_INLINE
101101
jerry_assert_api_available (void)
102102
{
103-
if (JERRY_UNLIKELY (!(JERRY_CONTEXT (status_flags) & ECMA_STATUS_API_AVAILABLE)))
104-
{
105-
/* Terminates the execution. */
106-
JERRY_UNREACHABLE ();
107-
}
103+
JERRY_ASSERT (JERRY_CONTEXT (status_flags) & ECMA_STATUS_API_AVAILABLE);
108104
} /* jerry_assert_api_available */
109105

110106
/**
@@ -178,11 +174,8 @@ jerry_throw (jerry_value_t value) /**< return value */
178174
void
179175
jerry_init (jerry_init_flag_t flags) /**< combination of Jerry flags */
180176
{
181-
if (JERRY_UNLIKELY (JERRY_CONTEXT (status_flags) & ECMA_STATUS_API_AVAILABLE))
182-
{
183-
/* This function cannot be called twice unless jerry_cleanup is called. */
184-
JERRY_UNREACHABLE ();
185-
}
177+
/* This function cannot be called twice unless jerry_cleanup is called. */
178+
JERRY_ASSERT (!(JERRY_CONTEXT (status_flags) & ECMA_STATUS_API_AVAILABLE));
186179

187180
/* Zero out all members. */
188181
memset (&JERRY_CONTEXT (JERRY_CONTEXT_FIRST_MEMBER), 0, sizeof (jerry_context_t));
@@ -834,21 +827,16 @@ jerry_value_get_type (const jerry_value_t value) /**< input value to check */
834827
{
835828
return JERRY_TYPE_FUNCTION;
836829
}
837-
case LIT_MAGIC_STRING_OBJECT:
830+
default:
838831
{
832+
JERRY_ASSERT (lit_id == LIT_MAGIC_STRING_OBJECT);
833+
839834
/* Based on the ECMA 262 5.1 standard the 'null' value is an object.
840835
* Thus we'll do an extra check for 'null' here.
841836
*/
842837
return ecma_is_value_null (argument) ? JERRY_TYPE_NULL : JERRY_TYPE_OBJECT;
843838
}
844-
default:
845-
{
846-
JERRY_UNREACHABLE ();
847-
break;
848-
}
849839
}
850-
851-
return JERRY_TYPE_NONE;
852840
} /* jerry_value_get_type */
853841

854842
/**

jerry-core/ecma/base/ecma-gc.c

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,14 @@ ecma_gc_mark_property (ecma_property_pair_t *property_pair_p, /**< property pair
196196
}
197197
break;
198198
}
199-
case ECMA_PROPERTY_TYPE_SPECIAL:
199+
default:
200200
{
201+
JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (property) == ECMA_PROPERTY_TYPE_SPECIAL);
202+
201203
JERRY_ASSERT (property == ECMA_PROPERTY_TYPE_HASHMAP
202204
|| property == ECMA_PROPERTY_TYPE_DELETED);
203205
break;
204206
}
205-
default:
206-
{
207-
JERRY_UNREACHABLE ();
208-
break;
209-
}
210207
}
211208
} /* ecma_gc_mark_property */
212209

@@ -290,14 +287,6 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
290287

291288
switch (ext_object_p->u.pseudo_array.type)
292289
{
293-
case ECMA_PSEUDO_ARRAY_ARGUMENTS:
294-
{
295-
ecma_object_t *lex_env_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t,
296-
ext_object_p->u.pseudo_array.u2.lex_env_cp);
297-
298-
ecma_gc_set_object_visited (lex_env_p);
299-
break;
300-
}
301290
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
302291
case ECMA_PSEUDO_ARRAY_TYPEDARRAY:
303292
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
@@ -308,7 +297,12 @@ ecma_gc_mark (ecma_object_t *object_p) /**< object to mark from */
308297
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
309298
default:
310299
{
311-
JERRY_UNREACHABLE ();
300+
JERRY_ASSERT (ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_ARRAY_ARGUMENTS);
301+
302+
ecma_object_t *lex_env_p = ECMA_GET_INTERNAL_VALUE_POINTER (ecma_object_t,
303+
ext_object_p->u.pseudo_array.u2.lex_env_cp);
304+
305+
ecma_gc_set_object_visited (lex_env_p);
312306
break;
313307
}
314308
}
@@ -537,15 +531,6 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
537531

538532
switch (ext_object_p->u.class_prop.class_id)
539533
{
540-
/* The undefined id represents an uninitialized class. */
541-
case LIT_MAGIC_STRING_UNDEFINED:
542-
case LIT_MAGIC_STRING_ARGUMENTS_UL:
543-
case LIT_MAGIC_STRING_BOOLEAN_UL:
544-
case LIT_MAGIC_STRING_ERROR_UL:
545-
{
546-
break;
547-
}
548-
549534
case LIT_MAGIC_STRING_STRING_UL:
550535
case LIT_MAGIC_STRING_NUMBER_UL:
551536
{
@@ -615,7 +600,11 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
615600
#endif /* !CONFIG_DISABLE_ES2015_PROMISE_BUILTIN */
616601
default:
617602
{
618-
JERRY_UNREACHABLE ();
603+
/* The undefined id represents an uninitialized class. */
604+
JERRY_ASSERT (ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_UNDEFINED
605+
|| ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_ARGUMENTS_UL
606+
|| ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_BOOLEAN_UL
607+
|| ext_object_p->u.class_prop.class_id == LIT_MAGIC_STRING_ERROR_UL);
619608
break;
620609
}
621610
}
@@ -689,8 +678,22 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
689678

690679
switch (ext_object_p->u.pseudo_array.type)
691680
{
692-
case ECMA_PSEUDO_ARRAY_ARGUMENTS:
681+
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
682+
case ECMA_PSEUDO_ARRAY_TYPEDARRAY:
693683
{
684+
ecma_dealloc_extended_object (object_p, sizeof (ecma_extended_object_t));
685+
return;
686+
}
687+
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
688+
{
689+
ecma_dealloc_extended_object (object_p, sizeof (ecma_extended_typedarray_object_t));
690+
return;
691+
}
692+
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
693+
default:
694+
{
695+
JERRY_ASSERT (ext_object_p->u.pseudo_array.type == ECMA_PSEUDO_ARRAY_ARGUMENTS);
696+
694697
ecma_length_t formal_params_number = ext_object_p->u.pseudo_array.u1.length;
695698
ecma_value_t *arg_Literal_p = (ecma_value_t *) (ext_object_p + 1);
696699

@@ -707,26 +710,7 @@ ecma_gc_free_object (ecma_object_t *object_p) /**< object to free */
707710
ecma_dealloc_extended_object (object_p, sizeof (ecma_extended_object_t) + formal_params_size);
708711
return;
709712
}
710-
#ifndef CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN
711-
case ECMA_PSEUDO_ARRAY_TYPEDARRAY:
712-
{
713-
ecma_dealloc_extended_object (object_p, sizeof (ecma_extended_object_t));
714-
return;
715-
}
716-
case ECMA_PSEUDO_ARRAY_TYPEDARRAY_WITH_INFO:
717-
{
718-
ecma_dealloc_extended_object (object_p, sizeof (ecma_extended_typedarray_object_t));
719-
return;
720-
}
721-
#endif /* !CONFIG_DISABLE_ES2015_TYPEDARRAY_BUILTIN */
722-
default:
723-
{
724-
JERRY_UNREACHABLE ();
725-
break;
726-
}
727713
}
728-
729-
JERRY_UNREACHABLE ();
730714
}
731715

732716
if (object_type == ECMA_OBJECT_TYPE_BOUND_FUNCTION)

jerry-core/ecma/base/ecma-helpers-string.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -930,20 +930,17 @@ ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */
930930
ecma_dealloc_string_buffer (string_p, string_p->u.long_utf8_string_size + sizeof (ecma_long_string_t));
931931
return;
932932
}
933-
case ECMA_STRING_CONTAINER_UINT32_IN_DESC:
934-
case ECMA_STRING_CONTAINER_MAGIC_STRING_EX:
935-
{
936-
/* only the string descriptor itself should be freed */
937-
break;
938-
}
939933
case ECMA_STRING_LITERAL_NUMBER:
940934
{
941935
ecma_free_value (string_p->u.lit_number);
942936
break;
943937
}
944938
default:
945939
{
946-
JERRY_UNREACHABLE ();
940+
JERRY_ASSERT (ECMA_STRING_GET_CONTAINER (string_p) == ECMA_STRING_CONTAINER_UINT32_IN_DESC
941+
|| ECMA_STRING_GET_CONTAINER (string_p) == ECMA_STRING_CONTAINER_MAGIC_STRING_EX);
942+
943+
/* only the string descriptor itself should be freed */
947944
break;
948945
}
949946
}
@@ -2107,6 +2104,7 @@ ecma_string_get_size (const ecma_string_t *string_p) /**< ecma-string */
21072104
default:
21082105
{
21092106
JERRY_ASSERT (ECMA_STRING_GET_CONTAINER (string_p) == ECMA_STRING_CONTAINER_MAGIC_STRING_EX);
2107+
21102108
return lit_get_magic_string_ex_size (string_p->u.magic_string_ex_id);
21112109
}
21122110
}

jerry-core/ecma/base/ecma-helpers-value.c

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -714,11 +714,6 @@ ecma_copy_value (ecma_value_t value) /**< value description */
714714
{
715715
switch (ecma_get_value_type_field (value))
716716
{
717-
case ECMA_TYPE_DIRECT:
718-
case ECMA_TYPE_DIRECT_STRING:
719-
{
720-
return value;
721-
}
722717
case ECMA_TYPE_FLOAT:
723718
{
724719
ecma_number_t *num_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
@@ -737,8 +732,10 @@ ecma_copy_value (ecma_value_t value) /**< value description */
737732
}
738733
default:
739734
{
740-
JERRY_UNREACHABLE ();
741-
return ECMA_VALUE_UNDEFINED;
735+
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT
736+
|| ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT_STRING);
737+
738+
return value;
742739
}
743740
}
744741
} /* ecma_copy_value */
@@ -905,13 +902,6 @@ ecma_free_value (ecma_value_t value) /**< value description */
905902
{
906903
switch (ecma_get_value_type_field (value))
907904
{
908-
case ECMA_TYPE_DIRECT:
909-
case ECMA_TYPE_DIRECT_STRING:
910-
{
911-
/* no memory is allocated */
912-
break;
913-
}
914-
915905
case ECMA_TYPE_FLOAT:
916906
{
917907
ecma_number_t *number_p = (ecma_number_t *) ecma_get_pointer_from_ecma_value (value);
@@ -934,7 +924,10 @@ ecma_free_value (ecma_value_t value) /**< value description */
934924

935925
default:
936926
{
937-
JERRY_UNREACHABLE ();
927+
JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT
928+
|| ecma_get_value_type_field (value) == ECMA_TYPE_DIRECT_STRING);
929+
930+
/* no memory is allocated */
938931
break;
939932
}
940933
}

jerry-core/ecma/base/ecma-helpers.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -784,8 +784,9 @@ ecma_free_property (ecma_object_t *object_p, /**< object the property belongs to
784784
ecma_free_value_if_not_object (ECMA_PROPERTY_VALUE_PTR (property_p)->value);
785785
break;
786786
}
787-
case ECMA_PROPERTY_TYPE_NAMEDACCESSOR:
787+
default:
788788
{
789+
JERRY_ASSERT (ECMA_PROPERTY_GET_TYPE (*property_p) == ECMA_PROPERTY_TYPE_NAMEDACCESSOR);
789790
#ifdef JERRY_CPOINTER_32_BIT
790791
ecma_getter_setter_pointers_t *getter_setter_pair_p;
791792
getter_setter_pair_p = ECMA_GET_POINTER (ecma_getter_setter_pointers_t,
@@ -794,11 +795,6 @@ ecma_free_property (ecma_object_t *object_p, /**< object the property belongs to
794795
#endif /* JERRY_CPOINTER_32_BIT */
795796
break;
796797
}
797-
default:
798-
{
799-
JERRY_UNREACHABLE ();
800-
return;
801-
}
802798
}
803799

804800
if (ecma_is_property_lcached (property_p))
@@ -1056,8 +1052,9 @@ ecma_assert_object_contains_the_property (const ecma_object_t *object_p, /**< ec
10561052
prop_iter_p->next_property_cp);
10571053
}
10581054

1059-
while (prop_iter_p != NULL)
1055+
while (true)
10601056
{
1057+
JERRY_ASSERT (prop_iter_p != NULL);
10611058
JERRY_ASSERT (ECMA_PROPERTY_IS_PROPERTY_PAIR (prop_iter_p));
10621059

10631060
ecma_property_pair_t *prop_pair_p = (ecma_property_pair_t *) prop_iter_p;
@@ -1074,9 +1071,6 @@ ecma_assert_object_contains_the_property (const ecma_object_t *object_p, /**< ec
10741071
prop_iter_p = ECMA_GET_POINTER (ecma_property_header_t,
10751072
prop_iter_p->next_property_cp);
10761073
}
1077-
1078-
JERRY_UNREACHABLE ();
1079-
10801074
#else /* JERRY_NDEBUG */
10811075
JERRY_UNUSED (object_p);
10821076
JERRY_UNUSED (prop_value_p);

jerry-core/ecma/base/ecma-lcache.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,11 @@ ecma_lcache_invalidate (ecma_object_t *object_p, /**< object */
232232
size_t row_index = ecma_lcache_row_index (object_cp, name_hash);
233233
ecma_lcache_hash_entry_t *entry_p = JERRY_HASH_TABLE_CONTEXT (table) [row_index];
234234

235-
for (uint32_t entry_index = 0; entry_index < ECMA_LCACHE_HASH_ROW_LENGTH; entry_index++)
235+
while (true)
236236
{
237+
/* The property must be present. */
238+
JERRY_ASSERT (entry_p - JERRY_HASH_TABLE_CONTEXT (table) [row_index] < ECMA_LCACHE_HASH_ROW_LENGTH);
239+
237240
if (entry_p->object_cp != ECMA_NULL_POINTER && entry_p->prop_p == prop_p)
238241
{
239242
JERRY_ASSERT (entry_p->object_cp == object_cp);
@@ -243,9 +246,6 @@ ecma_lcache_invalidate (ecma_object_t *object_p, /**< object */
243246
}
244247
entry_p++;
245248
}
246-
247-
/* The property must be present. */
248-
JERRY_UNREACHABLE ();
249249
#else /* CONFIG_ECMA_LCACHE_DISABLE */
250250
JERRY_UNUSED (name_cp);
251251
#endif /* !CONFIG_ECMA_LCACHE_DISABLE */

jerry-core/ecma/base/ecma-property-hashmap.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -539,8 +539,6 @@ ecma_property_hashmap_find (ecma_property_hashmap_t *hashmap_p, /**< hashmap */
539539
JERRY_ASSERT (entry_index != start_entry_index);
540540
#endif /* !JERRY_NDEBUG */
541541
}
542-
543-
JERRY_UNREACHABLE ();
544542
}
545543

546544
while (true)

0 commit comments

Comments
 (0)