diff --git a/src/globals.h b/src/globals.h index cdaa2ed06..af8d0ab83 100644 --- a/src/globals.h +++ b/src/globals.h @@ -34,6 +34,12 @@ typedef signed long ssize_t; #define __packed __attribute__((packed)) #define __noreturn __attribute__((noreturn)) #define __noinline __attribute__((noinline)) +#ifndef __attribute_const__ +# define __attribute_const__ __attribute__((const)) +#endif /* !__attribute_const__ */ +#ifndef __attribute_pure__ +# define __attribute_pure__ __attribute__((pure)) +#endif /* !__attribute_pure__ */ /** * Constants diff --git a/src/libecmaobjects/ecma-helpers.c b/src/libecmaobjects/ecma-helpers.c index 5d78393ff..1f1e42042 100644 --- a/src/libecmaobjects/ecma-helpers.c +++ b/src/libecmaobjects/ecma-helpers.c @@ -170,8 +170,8 @@ ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, /**< out /** * Check if the object is lexical environment. */ -bool -ecma_is_lexical_environment (ecma_object_t *object_p) /**< object or lexical environment */ +bool __attribute_pure__ +ecma_is_lexical_environment (const ecma_object_t *object_p) /**< object or lexical environment */ { JERRY_ASSERT (object_p != NULL); @@ -183,8 +183,8 @@ ecma_is_lexical_environment (ecma_object_t *object_p) /**< object or lexical env /** * Get value of [[Extensible]] object's internal property. */ -bool -ecma_get_object_extensible (ecma_object_t *object_p) /**< object */ +bool __attribute_pure__ +ecma_get_object_extensible (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (!ecma_is_lexical_environment (object_p)); @@ -213,8 +213,8 @@ ecma_set_object_extensible (ecma_object_t *object_p, /**< object */ /** * Get object's internal implementation-defined type. */ -ecma_object_type_t -ecma_get_object_type (ecma_object_t *object_p) /**< object */ +ecma_object_type_t __attribute_pure__ +ecma_get_object_type (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (!ecma_is_lexical_environment (object_p)); @@ -243,8 +243,8 @@ ecma_set_object_type (ecma_object_t *object_p, /**< object */ /** * Get object's prototype. */ -ecma_object_t* -ecma_get_object_prototype (ecma_object_t *object_p) /**< object */ +ecma_object_t* __attribute_pure__ +ecma_get_object_prototype (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (!ecma_is_lexical_environment (object_p)); @@ -261,8 +261,8 @@ ecma_get_object_prototype (ecma_object_t *object_p) /**< object */ * * @return true / false */ -bool -ecma_get_object_is_builtin (ecma_object_t *object_p) /**< object */ +bool __attribute_pure__ +ecma_get_object_is_builtin (const ecma_object_t *object_p) /**< object */ { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (!ecma_is_lexical_environment (object_p)); @@ -301,8 +301,8 @@ ecma_set_object_is_builtin (ecma_object_t *object_p, /**< object */ /** * Get type of lexical environment. */ -ecma_lexical_environment_type_t -ecma_get_lex_env_type (ecma_object_t *object_p) /**< lexical environment */ +ecma_lexical_environment_type_t __attribute_pure__ +ecma_get_lex_env_type (const ecma_object_t *object_p) /**< lexical environment */ { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (ecma_is_lexical_environment (object_p)); @@ -315,8 +315,8 @@ ecma_get_lex_env_type (ecma_object_t *object_p) /**< lexical environment */ /** * Get outer reference of lexical environment. */ -ecma_object_t* -ecma_get_lex_env_outer_reference (ecma_object_t *object_p) /**< lexical environment */ +ecma_object_t* __attribute_pure__ +ecma_get_lex_env_outer_reference (const ecma_object_t *object_p) /**< lexical environment */ { JERRY_ASSERT (object_p != NULL); JERRY_ASSERT (ecma_is_lexical_environment (object_p)); @@ -331,8 +331,8 @@ ecma_get_lex_env_outer_reference (ecma_object_t *object_p) /**< lexical environm /** * Get object's/lexical environment's property list. */ -ecma_property_t* -ecma_get_property_list (ecma_object_t *object_p) /**< object or lexical environment */ +ecma_property_t* __attribute_pure__ +ecma_get_property_list (const ecma_object_t *object_p) /**< object or lexical environment */ { JERRY_ASSERT (object_p != NULL); diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index 4d28c04b9..2bb1483df 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -197,18 +197,18 @@ extern ecma_object_t* ecma_create_decl_lex_env (ecma_object_t *outer_lexical_env extern ecma_object_t* ecma_create_object_lex_env (ecma_object_t *outer_lexical_environment_p, ecma_object_t *binding_obj_p, bool provide_this); -extern bool ecma_is_lexical_environment (ecma_object_t *object_p); -extern bool ecma_get_object_extensible (ecma_object_t *object_p); +extern bool __attribute_pure__ ecma_is_lexical_environment (const ecma_object_t *object_p); +extern bool __attribute_pure__ ecma_get_object_extensible (const ecma_object_t *object_p); extern void ecma_set_object_extensible (ecma_object_t *object_p, bool is_extensible); -extern ecma_object_type_t ecma_get_object_type (ecma_object_t *object_p); +extern ecma_object_type_t __attribute_pure__ ecma_get_object_type (const ecma_object_t *object_p); extern void ecma_set_object_type (ecma_object_t *object_p, ecma_object_type_t type); -extern ecma_object_t* ecma_get_object_prototype (ecma_object_t *object_p); -extern bool ecma_get_object_is_builtin (ecma_object_t *object_p); +extern ecma_object_t* __attribute_pure__ ecma_get_object_prototype (const ecma_object_t *object_p); +extern bool __attribute_pure__ ecma_get_object_is_builtin (const ecma_object_t *object_p); extern void ecma_set_object_is_builtin (ecma_object_t *object_p, bool is_builtin); -extern ecma_lexical_environment_type_t ecma_get_lex_env_type (ecma_object_t *object_p); -extern ecma_object_t *ecma_get_lex_env_outer_reference (ecma_object_t *object_p); -extern ecma_property_t *ecma_get_property_list (ecma_object_t *object_p); +extern ecma_lexical_environment_type_t __attribute_pure__ ecma_get_lex_env_type (const ecma_object_t *object_p); +extern ecma_object_t* __attribute_pure__ ecma_get_lex_env_outer_reference (const ecma_object_t *object_p); +extern ecma_property_t* __attribute_pure__ ecma_get_property_list (const ecma_object_t *object_p); extern ecma_property_t* ecma_create_internal_property (ecma_object_t *object_p, ecma_internal_property_id_t property_id); diff --git a/src/libruntime/jrt-bit-fields.c b/src/libruntime/jrt-bit-fields.c index 9cacf2d81..7ae4d2079 100644 --- a/src/libruntime/jrt-bit-fields.c +++ b/src/libruntime/jrt-bit-fields.c @@ -21,7 +21,7 @@ * * @return bit-field's value */ -extern uint64_t +uint64_t __attribute_const__ jrt_extract_bit_field (uint64_t container, /**< container to extract bit-field from */ uint32_t lsb, /**< least significant bit of the value * to be extracted */ @@ -42,7 +42,7 @@ jrt_extract_bit_field (uint64_t container, /**< container to extract bit-field f * * @return bit-field's value */ -extern uint64_t +uint64_t __attribute_const__ jrt_set_bit_field_value (uint64_t container, /**< container to insert bit-field to */ uint64_t new_bit_field_value, /**< value of bit-field to insert */ uint32_t lsb, /**< least significant bit of the value diff --git a/src/libruntime/jrt-bit-fields.h b/src/libruntime/jrt-bit-fields.h index 34112409b..1a8925a4c 100644 --- a/src/libruntime/jrt-bit-fields.h +++ b/src/libruntime/jrt-bit-fields.h @@ -16,9 +16,9 @@ #ifndef JERRY_BIT_FIELDS_H #define JERRY_BIT_FIELDS_H -extern uint64_t jrt_extract_bit_field (uint64_t value, uint32_t lsb, - uint32_t width); -extern uint64_t jrt_set_bit_field_value (uint64_t value, uint64_t bit_field_value, - uint32_t lsb, uint32_t width); +extern uint64_t __attribute_const__ jrt_extract_bit_field (uint64_t value, uint32_t lsb, + uint32_t width); +extern uint64_t __attribute_const__ jrt_set_bit_field_value (uint64_t value, uint64_t bit_field_value, + uint32_t lsb, uint32_t width); #endif /* !JERRY_BIT_FIELDS_H */