Add ArrayBuffer detach operations (#3208)

JerryScript-DCO-1.0-Signed-off-by: legendecas legendecas@gmail.com
This commit is contained in:
legendecas
2019-10-16 22:41:27 +08:00
committed by Dániel Bátyai
parent 09c5d98e25
commit 2e86bdae6f
11 changed files with 375 additions and 2 deletions
@@ -203,6 +203,79 @@ ecma_arraybuffer_get_buffer (ecma_object_t *object_p) /**< pointer to the ArrayB
}
} /* ecma_arraybuffer_get_buffer */
/**
* Helper function: check if the target ArrayBuffer is detached
*
* @return true - if value is an detached ArrayBuffer object
* false - otherwise
*/
inline bool JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
ecma_arraybuffer_is_detached (ecma_object_t *object_p) /**< pointer to the ArrayBuffer object */
{
JERRY_ASSERT (ecma_object_class_is (object_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL));
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
if (ECMA_ARRAYBUFFER_HAS_EXTERNAL_MEMORY (ext_object_p))
{
ecma_arraybuffer_external_info *array_p = (ecma_arraybuffer_external_info *) ext_object_p;
/* in case the arraybuffer has been detached */
return array_p->buffer_p == NULL;
}
return false;
} /* ecma_arraybuffer_is_detached */
/**
* Helper function: check if the target ArrayBuffer is detachable
*
* @return true - if value is an detachable ArrayBuffer object
* false - otherwise
*/
inline bool JERRY_ATTR_PURE JERRY_ATTR_ALWAYS_INLINE
ecma_arraybuffer_is_detachable (ecma_object_t *object_p) /**< pointer to the ArrayBuffer object */
{
JERRY_ASSERT (ecma_object_class_is (object_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL));
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
if (ECMA_ARRAYBUFFER_HAS_EXTERNAL_MEMORY (ext_object_p))
{
ecma_arraybuffer_external_info *array_p = (ecma_arraybuffer_external_info *) ext_object_p;
/* in case the arraybuffer has been detached */
return array_p->buffer_p != NULL;
}
return false;
} /* ecma_arraybuffer_is_detachable */
/**
* ArrayBuffer object detaching operation
*
* See also: ES2015 24.1.1.3
*
* @return true - if detach op succeeded
* false - otherwise
*/
inline bool JERRY_ATTR_ALWAYS_INLINE
ecma_arraybuffer_detach (ecma_object_t *object_p) /**< pointer to the ArrayBuffer object */
{
JERRY_ASSERT (ecma_object_class_is (object_p, LIT_MAGIC_STRING_ARRAY_BUFFER_UL));
if (!ecma_arraybuffer_is_detachable (object_p))
{
return false;
}
ecma_extended_object_t *ext_object_p = (ecma_extended_object_t *) object_p;
ecma_arraybuffer_external_info *array_object_p = (ecma_arraybuffer_external_info *) ext_object_p;
array_object_p->buffer_p = NULL;
array_object_p->extended_object.u.class_prop.u.length = 0;
return true;
} /* ecma_arraybuffer_detach */
/**
* @}
* @}