Add foreach function for inquiry properties into obj

JerryScript-DCO-1.0-Signed-off-by: pius.lee pius.lee@samsung.com
This commit is contained in:
pius.lee
2015-10-02 10:06:36 +09:00
committed by Evgeny Gavrin
parent 3d286b46d0
commit ece246ef9e
3 changed files with 164 additions and 1 deletions
+10
View File
@@ -140,6 +140,13 @@ typedef bool (*jerry_external_handler_t) (const jerry_api_object_t *function_obj
*/
typedef void (*jerry_object_free_callback_t) (const uintptr_t native_p);
/**
* function type applied for each fields in objects
*/
typedef bool (*jerry_object_field_foreach_t) (const jerry_api_string_t *field_name_p,
const jerry_api_value_t *field_value_p,
void *user_data_p);
extern EXTERN_C ssize_t
jerry_api_string_to_char_buffer (const jerry_api_string_t *, jerry_api_char_t *, ssize_t);
extern EXTERN_C
@@ -200,6 +207,9 @@ extern EXTERN_C
bool jerry_api_set_object_field_value_sz (jerry_api_object_t *, const jerry_api_char_t *, jerry_api_size_t,
const jerry_api_value_t *);
extern EXTERN_C
bool jerry_api_foreach_object_field (jerry_api_object_t *, jerry_object_field_foreach_t, void *);
extern EXTERN_C
bool jerry_api_get_object_native_handle (jerry_api_object_t *, uintptr_t *);
+58
View File
@@ -26,6 +26,7 @@
#include "ecma-init-finalize.h"
#include "ecma-objects.h"
#include "ecma-objects-general.h"
#include "ecma-try-catch-macro.h"
#include "lit-magic-strings.h"
#include "parser.h"
#include "serializer.h"
@@ -898,6 +899,63 @@ bool jerry_api_get_object_field_value (jerry_api_object_t *object_p,
field_value_p);
}
/**
* Applies the given function to the every fields in the objects
*
* @return true, if object fields traversal was performed successfully, i.e.:
* - no unhandled exceptions were thrown in object fields traversal;
* - object fields traversal was stopped on callback that returned false;
* false - otherwise,
* if getter of field threw a exception or unhandled exceptions were thrown during traversal;
*/
bool
jerry_api_foreach_object_field (jerry_api_object_t *object_p, /**< object */
jerry_object_field_foreach_t foreach_p, /**< foreach function */
void *user_data_p) /**< user data for foreach function */
{
jerry_assert_api_available ();
ecma_collection_iterator_t names_iter;
ecma_collection_header_t *names_p = ecma_op_object_get_property_names (object_p, false, true, true);
ecma_collection_iterator_init (&names_iter, names_p);
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
bool continuous = true;
while (ecma_is_completion_value_empty (ret_value)
&& continuous
&& ecma_collection_iterator_next (&names_iter))
{
ecma_string_t *property_name_p = ecma_get_string_from_value (*names_iter.current_value_p);
ECMA_TRY_CATCH (property_value, ecma_op_object_get (object_p, property_name_p), ret_value);
jerry_api_value_t field_value;
jerry_api_convert_ecma_value_to_api_value (&field_value, property_value);
continuous = foreach_p (property_name_p, &field_value, user_data_p);
jerry_api_release_value (&field_value);
ECMA_FINALIZE (property_value);
}
ecma_free_values_collection (names_p, true);
if (ecma_is_completion_value_empty (ret_value))
{
return true;
}
else
{
JERRY_ASSERT (ecma_is_completion_value_throw (ret_value));
ecma_free_completion_value (ret_value);
return false;
}
} /* jerry_api_foreach_object_field */
/**
* Get value of field in the specified object
*