/** * Boolean object creation operation. * * See also: ECMA-262 v5, 15.6.2.1 * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t ecma_op_create_boolean_object (ecma_value_t arg) /**< argument passed to the Boolean constructor */ { bool boolean_value = ecma_op_to_boolean (arg); #ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE); #else /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN */ ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE); #endif /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN */ ecma_object_t *obj_p = ecma_create_object (prototype_obj_p, false, true, ECMA_OBJECT_TYPE_GENERAL); ecma_deref_object (prototype_obj_p); ecma_property_t *class_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_CLASS); ECMA_PROPERTY_VALUE_PTR (class_prop_p)->value = LIT_MAGIC_STRING_BOOLEAN_UL; ecma_property_t *prim_value_prop_p = ecma_create_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_ECMA_VALUE); ecma_value_t prim_value = ecma_make_simple_value (boolean_value ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE); ecma_set_internal_property_value (prim_value_prop_p, prim_value); return ecma_make_object_value (obj_p); } /* ecma_op_create_boolean_object */
/** * 'Logical NOT Operator' opcode handler. * * See also: ECMA-262 v5, 11.4.9 * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t opfunc_logical_not (ecma_value_t left_value) /**< left value */ { ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE); ecma_value_t to_bool_value = ecma_op_to_boolean (left_value); if (ecma_is_value_true (to_bool_value)) { ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE); } return ret_value; } /* opfunc_logical_not */
/** * Handle calling [[Call]] of built-in Boolean object * * @return completion-value */ ecma_completion_value_t ecma_builtin_boolean_dispatch_call (const ecma_value_t *arguments_list_p, /**< arguments list */ ecma_length_t arguments_list_len) /**< number of arguments */ { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); ecma_value_t arg_value; if (arguments_list_len == 0) { arg_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); } else { arg_value = arguments_list_p[0]; } return ecma_op_to_boolean (arg_value); } /* ecma_builtin_boolean_dispatch_call */
/** * Boolean object creation operation. * * See also: ECMA-262 v5, 15.6.2.1 * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t ecma_op_create_boolean_object (ecma_value_t arg) /**< argument passed to the Boolean constructor */ { bool boolean_value = ecma_op_to_boolean (arg); #ifndef CONFIG_DISABLE_BOOLEAN_BUILTIN ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_BOOLEAN_PROTOTYPE); #else /* CONFIG_DISABLE_BOOLEAN_BUILTIN */ ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_OBJECT_PROTOTYPE); #endif /* !CONFIG_DISABLE_BOOLEAN_BUILTIN */ ecma_object_t *object_p = ecma_create_object (prototype_obj_p, sizeof (ecma_extended_object_t), ECMA_OBJECT_TYPE_CLASS); ecma_deref_object (prototype_obj_p); ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p; ext_object_p->u.class_prop.class_id = LIT_MAGIC_STRING_BOOLEAN_UL; ext_object_p->u.class_prop.value = ecma_make_boolean_value (boolean_value); return ecma_make_object_value (object_p); } /* ecma_op_create_boolean_object */
/** * 'Logical NOT Operator' opcode handler. * * See also: ECMA-262 v5, 11.4.9 * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t opfunc_logical_not (ecma_value_t left_value) /**< left value */ { return ecma_make_boolean_value (!ecma_op_to_boolean (left_value)); } /* opfunc_logical_not */
/** * ToPropertyDescriptor operation. * * See also: * ECMA-262 v5, 8.10.5 * * @return ecma value * Returned value must be freed with ecma_free_value */ ecma_value_t ecma_op_to_property_descriptor (ecma_value_t obj_value, /**< object value */ ecma_property_descriptor_t *out_prop_desc_p) /**< [out] filled property descriptor if return value is normal empty completion value */ { ecma_value_t ret_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); // 1. if (!ecma_is_value_object (obj_value)) { ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("")); } else { ecma_object_t *obj_p = ecma_get_object_from_value (obj_value); // 2. ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor (); // 3. ecma_string_t *enumerable_magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_ENUMERABLE); if (ecma_op_object_get_property (obj_p, enumerable_magic_string_p) != NULL) { ECMA_TRY_CATCH (enumerable_prop_value, ecma_op_object_get (obj_p, enumerable_magic_string_p), ret_value); prop_desc.is_enumerable_defined = true; prop_desc.is_enumerable = ecma_op_to_boolean (enumerable_prop_value); ECMA_FINALIZE (enumerable_prop_value); } ecma_deref_ecma_string (enumerable_magic_string_p); if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); // 4. ecma_string_t *configurable_magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_CONFIGURABLE); if (ecma_op_object_get_property (obj_p, configurable_magic_string_p) != NULL) { ECMA_TRY_CATCH (configurable_prop_value, ecma_op_object_get (obj_p, configurable_magic_string_p), ret_value); prop_desc.is_configurable_defined = true; prop_desc.is_configurable = ecma_op_to_boolean (configurable_prop_value); ECMA_FINALIZE (configurable_prop_value); } ecma_deref_ecma_string (configurable_magic_string_p); } if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); // 5. ecma_string_t *value_magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_VALUE); if (ecma_op_object_get_property (obj_p, value_magic_string_p) != NULL) { ECMA_TRY_CATCH (value_prop_value, ecma_op_object_get (obj_p, value_magic_string_p), ret_value); prop_desc.is_value_defined = true; prop_desc.value = ecma_copy_value (value_prop_value); ECMA_FINALIZE (value_prop_value); } ecma_deref_ecma_string (value_magic_string_p); } if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); // 6. ecma_string_t *writable_magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_WRITABLE); if (ecma_op_object_get_property (obj_p, writable_magic_string_p) != NULL) { ECMA_TRY_CATCH (writable_prop_value, ecma_op_object_get (obj_p, writable_magic_string_p), ret_value); prop_desc.is_writable_defined = true; prop_desc.is_writable = ecma_op_to_boolean (writable_prop_value); ECMA_FINALIZE (writable_prop_value); } ecma_deref_ecma_string (writable_magic_string_p); } if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); // 7. ecma_string_t *get_magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_GET); if (ecma_op_object_get_property (obj_p, get_magic_string_p) != NULL) { ECMA_TRY_CATCH (get_prop_value, ecma_op_object_get (obj_p, get_magic_string_p), ret_value); if (!ecma_op_is_callable (get_prop_value) && !ecma_is_value_undefined (get_prop_value)) { ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("")); } else { prop_desc.is_get_defined = true; if (ecma_is_value_undefined (get_prop_value)) { prop_desc.get_p = NULL; } else { JERRY_ASSERT (ecma_is_value_object (get_prop_value)); ecma_object_t *get_p = ecma_get_object_from_value (get_prop_value); ecma_ref_object (get_p); prop_desc.get_p = get_p; } } ECMA_FINALIZE (get_prop_value); } ecma_deref_ecma_string (get_magic_string_p); } if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); // 8. ecma_string_t *set_magic_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_SET); if (ecma_op_object_get_property (obj_p, set_magic_string_p) != NULL) { ECMA_TRY_CATCH (set_prop_value, ecma_op_object_get (obj_p, set_magic_string_p), ret_value); if (!ecma_op_is_callable (set_prop_value) && !ecma_is_value_undefined (set_prop_value)) { ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("")); } else { prop_desc.is_set_defined = true; if (ecma_is_value_undefined (set_prop_value)) { prop_desc.set_p = NULL; } else { JERRY_ASSERT (ecma_is_value_object (set_prop_value)); ecma_object_t *set_p = ecma_get_object_from_value (set_prop_value); ecma_ref_object (set_p); prop_desc.set_p = set_p; } } ECMA_FINALIZE (set_prop_value); } ecma_deref_ecma_string (set_magic_string_p); } if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); // 9. if (prop_desc.is_get_defined || prop_desc.is_set_defined) { if (prop_desc.is_value_defined || prop_desc.is_writable_defined) { ret_value = ecma_raise_type_error (ECMA_ERR_MSG ("")); } } } if (!ecma_is_value_error (ret_value)) { JERRY_ASSERT (ecma_is_value_empty (ret_value)); } else { ecma_free_property_descriptor (&prop_desc); } *out_prop_desc_p = prop_desc; } return ret_value; } /* ecma_op_to_property_descriptor */