Jerry API for array creation and manipulation

1. jerry_api_create_array_object : create array object of given size
2. jerry_api_set_array_index_value : set value at given index
3. jerry_api_get_array_index_value : get value at given index

JerryScript-DCO-1.0-Signed-off-by: chunseok lee chunseok.lee@samsung.com
This commit is contained in:
chunseok lee 2015-08-04 11:03:44 +09:00
parent 1cafff32b5
commit d31eb3c4cb
3 changed files with 107 additions and 0 deletions

View File

@ -161,6 +161,18 @@ extern EXTERN_C
jerry_api_string_t *jerry_api_create_string_sz (const jerry_api_char_t *, jerry_api_size_t);
extern EXTERN_C
jerry_api_object_t* jerry_api_create_object (void);
extern EXTERN_C
jerry_api_object_t* jerry_api_create_array_object (jerry_api_size_t);
extern EXTERN_C
bool jerry_api_set_array_index_value (jerry_api_object_t *array_obj_p,
jerry_api_length_t index,
jerry_api_value_t *value_p);
extern EXTERN_C
bool jerry_api_get_array_index_value (jerry_api_object_t *array_obj_p,
jerry_api_length_t index,
jerry_api_value_t *value_p);
extern EXTERN_C
jerry_api_object_t* jerry_api_create_error (jerry_api_error_t error_type,
const jerry_api_char_t *message_p);

View File

@ -16,6 +16,7 @@
#include <stdio.h>
#include "ecma-alloc.h"
#include "ecma-array-object.h"
#include "ecma-builtins.h"
#include "ecma-exceptions.h"
#include "ecma-eval.h"
@ -429,6 +430,85 @@ jerry_api_create_object (void)
return ecma_op_create_object_object_noarg ();
} /* jerry_api_create_object */
/**
* Create an array object
*
* Note:
* caller should release the object with jerry_api_release_object, just when the value becomes unnecessary.
*
* @return pointer to created array object
*/
jerry_api_object_t *
jerry_api_create_array_object (jerry_api_size_t size) /* size of array */
{
JERRY_ASSERT (size > 0);
ecma_number_t *length_num_p = ecma_alloc_number ();
*length_num_p = ecma_uint32_to_number (size);
ecma_value_t array_length = ecma_make_number_value (length_num_p);
jerry_api_length_t argument_size = 1;
ecma_completion_value_t new_array_completion = ecma_op_create_array_object (&array_length, argument_size, true);
JERRY_ASSERT (ecma_is_completion_value_normal (new_array_completion));
ecma_value_t val = ecma_get_completion_value_value (new_array_completion);
jerry_api_object_t *obj_p = ecma_get_object_from_value (val);
ecma_free_value (array_length, true);
return obj_p;
} /* jerry_api_create_array_object */
/**
* Set value of field in the specified array object
*
* @return true, if field value was set successfully
* throw exception, otherwise
*/
bool
jerry_api_set_array_index_value (jerry_api_object_t *array_obj_p, /* array object */
jerry_api_length_t index, /* index to be written */
jerry_api_value_t *value_p) /* value to set*/
{
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index);
ecma_value_t value;
jerry_api_convert_api_value_to_ecma_value (&value, value_p);
ecma_completion_value_t set_completion = ecma_op_object_put (array_obj_p, str_idx_p, value, false);
JERRY_ASSERT (ecma_is_completion_value_normal (set_completion));
ecma_free_completion_value (set_completion);
ecma_deref_ecma_string (str_idx_p);
ecma_free_value (value, true);
return true;
} /* jerry_api_set_array_index_value */
/**
* Get value of field in the specified array object
*
* Note:
* if value was retrieved successfully, it should be freed
* with jerry_api_release_value just when it becomes unnecessary.
*
* @return true, if field value was retrieved successfully, i.e. upon the call:
* - there is field with specified name in the object;
* throw exception - otherwise.
*/
bool
jerry_api_get_array_index_value (jerry_api_object_t *array_obj_p, /* array object */
jerry_api_length_t index, /* index to be written */
jerry_api_value_t *value_p) /* output value at index */
{
ecma_string_t *str_idx_p = ecma_new_ecma_string_from_uint32 ((uint32_t) index);
ecma_completion_value_t get_completion = ecma_op_object_get (array_obj_p, str_idx_p);
JERRY_ASSERT (ecma_is_completion_value_normal (get_completion));
ecma_value_t val = ecma_get_completion_value_value (get_completion);
jerry_api_convert_ecma_value_to_api_value (value_p, val);
ecma_free_completion_value (get_completion);
ecma_deref_ecma_string (str_idx_p);
return true;
} /* jerry_api_get_array_index_value */
/**
* Create an error object
*

View File

@ -516,6 +516,21 @@ main (void)
jerry_api_release_object (obj_p);
// Test: Array Object API
jerry_api_object_t *array_obj_p = jerry_api_create_array_object (10);
jerry_api_value_t v_in;
test_api_init_api_value_float64 (&v_in, 10.5);
jerry_api_set_array_index_value (array_obj_p, 5, &v_in);
jerry_api_value_t v_out;
jerry_api_get_array_index_value (array_obj_p, 5, &v_out);
JERRY_ASSERT (v_out.type == JERRY_API_DATA_TYPE_FLOAT64 && v_out.v_float64 == 10.5);
jerry_api_release_object (array_obj_p);
// Test: eval
const char *eval_code_src_p = "(function () { return 123; })";
jerry_completion_code_t status = jerry_api_eval ((jerry_api_char_t *) eval_code_src_p,