diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-object.cpp b/jerry-core/ecma/builtin-objects/ecma-builtin-object.cpp index c3a6d12530..d6f49b2738 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-object.cpp +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-object.cpp @@ -176,10 +176,24 @@ ecma_builtin_object_object_freeze (ecma_value_t this_arg, /**< 'this' argument * * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_object_object_prevent_extensions (ecma_value_t this_arg, /**< 'this' argument */ +ecma_builtin_object_object_prevent_extensions (ecma_value_t this_arg __attr_unused___, /**< 'this' argument */ ecma_value_t arg) /**< routine's argument */ { - ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg, arg); + ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); + + if (!ecma_is_value_object (arg)) + { + ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE)); + } + else + { + ecma_object_t *obj_p = ecma_get_object_from_value (arg); + ecma_set_object_extensible (obj_p, false); + + ret_value = ecma_make_normal_completion_value (ecma_copy_value (arg, true)); + } + + return ret_value; } /* ecma_builtin_object_object_prevent_extensions */ /** @@ -224,10 +238,27 @@ ecma_builtin_object_object_is_frozen (ecma_value_t this_arg, /**< 'this' argumen * Returned value must be freed with ecma_free_completion_value. */ static ecma_completion_value_t -ecma_builtin_object_object_is_extensible (ecma_value_t this_arg, /**< 'this' argument */ +ecma_builtin_object_object_is_extensible (ecma_value_t this_arg __attr_unused___, /**< 'this' argument */ ecma_value_t arg) /**< routine's argument */ { - ECMA_BUILTIN_CP_UNIMPLEMENTED (this_arg, arg); + ecma_completion_value_t ret_value = ecma_make_empty_completion_value (); + + if (!ecma_is_value_object (arg)) + { + ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE)); + } + else + { + ecma_object_t *obj_p = ecma_get_object_from_value (arg); + + bool extensible = ecma_get_object_extensible (obj_p); + + ret_value = ecma_make_simple_completion_value (extensible + ? ECMA_SIMPLE_VALUE_TRUE + : ECMA_SIMPLE_VALUE_FALSE); + } + + return ret_value; } /* ecma_builtin_object_object_is_extensible */ /** diff --git a/tests/jerry/object_is_extensible.js b/tests/jerry/object_is_extensible.js new file mode 100644 index 0000000000..4d0e397aa0 --- /dev/null +++ b/tests/jerry/object_is_extensible.js @@ -0,0 +1,48 @@ +// Copyright 2015 Samsung Electronics Co., Ltd. +// Copyright 2015 University of Szeged. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// New objects are extensible. +var empty = {}; +assert (Object.isExtensible(empty) === true); + +// ...but that can be changed. +Object.preventExtensions(empty); +assert(Object.isExtensible(empty) === false); + +// Call on undefined should throw TypeError. +try +{ + Object.isExtensible(undefined); + assert (false); +} catch (e) { + assert (e instanceof TypeError); +} + +try +{ + Object.preventExtensions(undefined); + assert (false); +} catch (e) { + assert (e instanceof TypeError); +} + +// The functions below are unimplemented. +// Sealed objects are by definition non-extensible. +// var sealed = Object.seal({}); +// assert(Object.isExtensible(sealed) === false); + +// Frozen objects are also by definition non-extensible. +// var frozen = Object.freeze({}); +// assert(Object.isExtensible(frozen) === false);