Remove support of plug-in mechanism.
This API is obsolete and can be fully replaced with existing `api.h`. JerryScript-DCO-1.0-Signed-off-by: Evgeny Gavrin e.gavrin@samsung.com
This commit is contained in:
@@ -160,26 +160,6 @@
|
||||
// #define CONFIG_ECMA_COMPACT_PROFILE_DISABLE_REGEXP_BUILTIN
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE */
|
||||
|
||||
/**
|
||||
* Size of character buffer used to exchange character data between core and extensions' routine
|
||||
*/
|
||||
#define CONFIG_EXTENSION_CHAR_BUFFER_SIZE 2048
|
||||
|
||||
/**
|
||||
* Maximum number of registered extensions
|
||||
*/
|
||||
#define CONFIG_EXTENSION_MAX_NUMBER_OF_EXTENSIONS 32
|
||||
|
||||
/**
|
||||
* Maximum number of functions in an extension
|
||||
*/
|
||||
#define CONFIG_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION 1024
|
||||
|
||||
/**
|
||||
* Maximum number of arguments in a function
|
||||
*/
|
||||
#define CONFIG_EXTENSION_MAX_ARGUMENTS_IN_FUNCTION 16
|
||||
|
||||
/**
|
||||
* Run GC after execution of each opcode
|
||||
*/
|
||||
|
||||
@@ -396,9 +396,7 @@ typedef enum
|
||||
ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION, /** One of built-in functions described in section 15
|
||||
of ECMA-262 v5 specification */
|
||||
ECMA_OBJECT_TYPE_ARGUMENTS, /**< Arguments object (10.6) */
|
||||
ECMA_OBJECT_TYPE_ARRAY, /**< Array object (15.4) */
|
||||
ECMA_OBJECT_TYPE_EXTENSION, /**< Extension (implementation-defined) object
|
||||
* See also: ecma_extension_instantiate */
|
||||
ECMA_OBJECT_TYPE_ARRAY /**< Array object (15.4) */
|
||||
// ECMA_OBJECT_TYPE_HOST /**< Host object */
|
||||
} ecma_object_type_t;
|
||||
|
||||
|
||||
@@ -133,13 +133,6 @@ OBJECT_VALUE (ECMA_MAGIC_STRING_DATE_UL,
|
||||
ECMA_PROPERTY_CONFIGURABLE)
|
||||
#endif /* CONFIG_ECMA_COMPACT_PROFILE_DISABLE_DATE_BUILTIN */
|
||||
|
||||
// Implementation-defined property for accessing the engine's extensions */
|
||||
OBJECT_VALUE (ECMA_MAGIC_STRING_JERRY_UL,
|
||||
ecma_builtin_get (ECMA_BUILTIN_ID_JERRY),
|
||||
ECMA_PROPERTY_NOT_WRITABLE,
|
||||
ECMA_PROPERTY_NOT_ENUMERABLE,
|
||||
ECMA_PROPERTY_NOT_CONFIGURABLE)
|
||||
|
||||
// ECMA-262 v5, 15.1.4.8
|
||||
CP_UNIMPLEMENTED_VALUE (ECMA_MAGIC_STRING_REG_EXP_UL,
|
||||
ecma_builtin_get (ECMA_BUILTIN_ID_REGEXP),
|
||||
|
||||
@@ -1,592 +0,0 @@
|
||||
/* Copyright 2015 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "ecma-alloc.h"
|
||||
#include "ecma-builtins.h"
|
||||
#include "ecma-exceptions.h"
|
||||
#include "ecma-extension.h"
|
||||
#include "ecma-gc.h"
|
||||
#include "ecma-helpers.h"
|
||||
#include "ecma-objects-general.h"
|
||||
|
||||
#define ECMA_BUILTINS_INTERNAL
|
||||
#include "ecma-builtins-internal.h"
|
||||
|
||||
/**
|
||||
* List of registered extensions
|
||||
*/
|
||||
static jerry_extension_descriptor_t *jerry_extensions_list_p = NULL;
|
||||
|
||||
/**
|
||||
* Index to assign to next registered extension
|
||||
*/
|
||||
static uint32_t jerry_extensions_next_index = 0;
|
||||
|
||||
/**
|
||||
* If the property's name is one of built-in properties of the built-in object
|
||||
* that is not instantiated yet, instantiate the property and
|
||||
* return pointer to the instantiated property.
|
||||
*
|
||||
* @return pointer property, if one was instantiated,
|
||||
* NULL - otherwise.
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_builtin_jerry_try_to_instantiate_property (ecma_object_t *obj_p, /**< object */
|
||||
ecma_string_t *extension_name_p) /**< property's name */
|
||||
{
|
||||
JERRY_ASSERT (ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_JERRY));
|
||||
JERRY_ASSERT (ecma_find_named_property (obj_p, extension_name_p) == NULL);
|
||||
|
||||
ssize_t req_buffer_size = ecma_string_to_zt_string (extension_name_p, NULL, 0);
|
||||
JERRY_ASSERT (req_buffer_size < 0);
|
||||
|
||||
ecma_property_t *prop_p = NULL;
|
||||
|
||||
MEM_DEFINE_LOCAL_ARRAY (extension_name_zt_buf_p, -req_buffer_size, uint8_t);
|
||||
|
||||
req_buffer_size = ecma_string_to_zt_string (extension_name_p, extension_name_zt_buf_p, -req_buffer_size);
|
||||
JERRY_ASSERT (req_buffer_size > 0);
|
||||
|
||||
#if CONFIG_ECMA_CHAR_ENCODING != CONFIG_ECMA_CHAR_ASCII
|
||||
JERRY_UNIMPLEMENTED ("Only ASCII encoding support is implemented.");
|
||||
#else /* CONFIG_ECMA_CHAR_ENCODING == CONFIG_ECMA_CHAR_ASCII */
|
||||
const char *name_p = (const char*) extension_name_zt_buf_p;
|
||||
|
||||
jerry_extension_descriptor_t *desc_p;
|
||||
for (desc_p = jerry_extensions_list_p;
|
||||
desc_p != NULL;
|
||||
desc_p = desc_p->next_p)
|
||||
{
|
||||
if (!strcmp (name_p, desc_p->name_p))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (desc_p == NULL)
|
||||
{
|
||||
/* no extension with specified name was found */
|
||||
prop_p = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
prop_p = ecma_create_named_data_property (obj_p,
|
||||
extension_name_p,
|
||||
ECMA_PROPERTY_NOT_WRITABLE,
|
||||
ECMA_PROPERTY_NOT_ENUMERABLE,
|
||||
ECMA_PROPERTY_NOT_CONFIGURABLE);
|
||||
|
||||
ecma_object_t *extension_object_p = ecma_create_object (NULL,
|
||||
false,
|
||||
ECMA_OBJECT_TYPE_EXTENSION);
|
||||
ecma_set_object_is_builtin (extension_object_p, true);
|
||||
ecma_property_t *extension_id_prop_p = ecma_create_internal_property (extension_object_p,
|
||||
ECMA_INTERNAL_PROPERTY_EXTENSION_ID);
|
||||
extension_id_prop_p->u.internal_property.value = desc_p->index;
|
||||
|
||||
ecma_named_data_property_assign_value (obj_p, prop_p, ecma_make_object_value (extension_object_p));
|
||||
|
||||
ecma_deref_object (extension_object_p);
|
||||
}
|
||||
#endif /* CONFIG_ECMA_CHAR_ENCODING == CONFIG_ECMA_CHAR_ASCII */
|
||||
|
||||
MEM_FINALIZE_LOCAL_ARRAY (extension_name_zt_buf_p);
|
||||
|
||||
return prop_p;
|
||||
} /* ecma_builtin_jerry_try_to_instantiate_property */
|
||||
|
||||
/**
|
||||
* Stub for dispatcher of the built-in's routines
|
||||
*
|
||||
* Warning:
|
||||
* does not return (the stub should be unreachable)
|
||||
*/
|
||||
ecma_completion_value_t
|
||||
ecma_builtin_jerry_dispatch_routine (uint16_t builtin_routine_id, /**< built-in wide identifier of routine */
|
||||
ecma_value_t this_arg_value __attr_unused___, /**< 'this' argument value */
|
||||
const ecma_value_t arguments_list[], /**< list of arguments
|
||||
* passed to routine */
|
||||
ecma_length_t arguments_number) /**< length of arguments' list */
|
||||
{
|
||||
uint32_t extension_object_index = builtin_routine_id / ECMA_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION;
|
||||
uint32_t function_index = builtin_routine_id % ECMA_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION;
|
||||
|
||||
jerry_extension_descriptor_t *desc_p;
|
||||
for (desc_p = jerry_extensions_list_p;
|
||||
desc_p != NULL;
|
||||
desc_p = desc_p->next_p)
|
||||
{
|
||||
if (desc_p->index == extension_object_index)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
JERRY_ASSERT (desc_p != NULL);
|
||||
|
||||
JERRY_ASSERT (function_index < desc_p->functions_count);
|
||||
jerry_extension_function_t *function_p = &desc_p->functions_p[function_index];
|
||||
|
||||
bool throw_type_error = false;
|
||||
if (function_p->args_number != arguments_number)
|
||||
{
|
||||
throw_type_error = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t arg_index;
|
||||
for (arg_index = 0; arg_index < function_p->args_number; arg_index++)
|
||||
{
|
||||
jerry_api_value_t *arg_p = &function_p->args_p[arg_index];
|
||||
const ecma_value_t arg_value = arguments_list[arg_index];
|
||||
|
||||
if (arg_p->type == JERRY_API_DATA_TYPE_BOOLEAN)
|
||||
{
|
||||
if (!ecma_is_value_boolean (arg_value))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg_p->v_bool = ecma_is_value_true (arg_value);
|
||||
}
|
||||
}
|
||||
else if (arg_p->type == JERRY_API_DATA_TYPE_FLOAT32
|
||||
|| arg_p->type == JERRY_API_DATA_TYPE_FLOAT64
|
||||
|| arg_p->type == JERRY_API_DATA_TYPE_UINT32)
|
||||
{
|
||||
if (!ecma_is_value_number (arg_value))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_number_t num_value = *ecma_get_number_from_value (arg_value);
|
||||
if (arg_p->type == JERRY_API_DATA_TYPE_FLOAT32)
|
||||
{
|
||||
arg_p->v_float32 = (float) num_value;
|
||||
}
|
||||
else if (arg_p->type == JERRY_API_DATA_TYPE_FLOAT64)
|
||||
{
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
|
||||
JERRY_UNREACHABLE ();
|
||||
#elif CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
|
||||
arg_p->v_float64 = num_value;
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
|
||||
}
|
||||
else if (arg_p->type == JERRY_API_DATA_TYPE_UINT32)
|
||||
{
|
||||
arg_p->v_uint32 = ecma_number_to_uint32 (num_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (arg_p->type == JERRY_API_DATA_TYPE_STRING)
|
||||
{
|
||||
if (!ecma_is_value_string (arg_value))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg_p->v_string = ecma_get_string_from_value (arg_value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (arg_p->type == JERRY_API_DATA_TYPE_OBJECT);
|
||||
|
||||
if (!ecma_is_value_object (arg_value))
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
arg_p->v_object = ecma_get_object_from_value (arg_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t initialized_args_count = arg_index;
|
||||
|
||||
if (initialized_args_count != function_p->args_number)
|
||||
{
|
||||
throw_type_error = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
function_p->function_wrapper_p (function_p);
|
||||
}
|
||||
|
||||
for (arg_index = 0;
|
||||
arg_index < initialized_args_count;
|
||||
arg_index++)
|
||||
{
|
||||
jerry_api_value_t *arg_p = &function_p->args_p[arg_index];
|
||||
|
||||
if (arg_p->type == JERRY_API_DATA_TYPE_STRING)
|
||||
{
|
||||
arg_p->v_string = NULL;
|
||||
}
|
||||
else if (arg_p->type == JERRY_API_DATA_TYPE_OBJECT)
|
||||
{
|
||||
arg_p->v_object = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (arg_p->type == JERRY_API_DATA_TYPE_BOOLEAN
|
||||
|| arg_p->type == JERRY_API_DATA_TYPE_FLOAT32
|
||||
|| arg_p->type == JERRY_API_DATA_TYPE_FLOAT64
|
||||
|| arg_p->type == JERRY_API_DATA_TYPE_UINT32);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (throw_type_error)
|
||||
{
|
||||
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
}
|
||||
else
|
||||
{
|
||||
jerry_api_value_t& ret_value = function_p->ret_value;
|
||||
ecma_completion_value_t completion;
|
||||
|
||||
if (ret_value.type == JERRY_API_DATA_TYPE_VOID)
|
||||
{
|
||||
completion = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
}
|
||||
else if (ret_value.type == JERRY_API_DATA_TYPE_BOOLEAN)
|
||||
{
|
||||
if (ret_value.v_bool)
|
||||
{
|
||||
completion = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
completion = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
}
|
||||
else if (ret_value.type == JERRY_API_DATA_TYPE_UINT32
|
||||
|| ret_value.type == JERRY_API_DATA_TYPE_FLOAT32
|
||||
|| ret_value.type == JERRY_API_DATA_TYPE_FLOAT64)
|
||||
{
|
||||
ecma_number_t* num_value_p = ecma_alloc_number ();
|
||||
if (ret_value.type == JERRY_API_DATA_TYPE_FLOAT32)
|
||||
{
|
||||
*num_value_p = ret_value.v_float32;
|
||||
}
|
||||
else if (ret_value.type == JERRY_API_DATA_TYPE_FLOAT64)
|
||||
{
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
|
||||
JERRY_UNREACHABLE ();
|
||||
#elif CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
|
||||
*num_value_p = ret_value.v_float64;
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ret_value.type == JERRY_API_DATA_TYPE_UINT32);
|
||||
|
||||
*num_value_p = ecma_uint32_to_number (ret_value.v_uint32);
|
||||
}
|
||||
|
||||
completion = ecma_make_normal_completion_value (ecma_make_number_value (num_value_p));
|
||||
}
|
||||
else if (ret_value.type == JERRY_API_DATA_TYPE_STRING)
|
||||
{
|
||||
completion = ecma_make_normal_completion_value (ecma_make_string_value (ret_value.v_string));
|
||||
|
||||
ret_value.v_string = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ret_value.type == JERRY_API_DATA_TYPE_OBJECT);
|
||||
|
||||
completion = ecma_make_normal_completion_value (ecma_make_object_value (ret_value.v_object));
|
||||
|
||||
ret_value.v_object = NULL;
|
||||
}
|
||||
|
||||
return completion;
|
||||
}
|
||||
} /* ecma_builtin_jerry_dispatch_routine */
|
||||
|
||||
bool
|
||||
ecma_extension_register (jerry_extension_descriptor_t *extension_desc_p) /**< extension description */
|
||||
{
|
||||
if (jerry_extensions_next_index >= ECMA_EXTENSION_MAX_NUMBER_OF_EXTENSIONS)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (extension_desc_p->functions_count > ECMA_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Check names intersection */
|
||||
for (uint32_t i = 0; i < extension_desc_p->fields_count; i++)
|
||||
{
|
||||
for (uint32_t j = 0; j < extension_desc_p->fields_count; j++)
|
||||
{
|
||||
if (i != j
|
||||
&& !strcmp (extension_desc_p->fields_p[i].field_name_p,
|
||||
extension_desc_p->fields_p[j].field_name_p))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < extension_desc_p->functions_count; i++)
|
||||
{
|
||||
if (extension_desc_p->functions_p[i].args_number >= ECMA_EXTENSION_MAX_ARGUMENTS_IN_FUNCTION)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
|
||||
/* Check if we can represent the arguments' values */
|
||||
for (uint32_t j = 0; j < extension_desc_p->functions_p[i].args_number; j++)
|
||||
{
|
||||
if (extension_desc_p->functions_p[i].args_p[j].type == JERRY_API_DATA_TYPE_FLOAT64)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
|
||||
|
||||
for (uint32_t j = 0; j < extension_desc_p->functions_count; j++)
|
||||
{
|
||||
if (i != j
|
||||
&& !strcmp (extension_desc_p->functions_p[i].function_name_p,
|
||||
extension_desc_p->functions_p[j].function_name_p))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < extension_desc_p->fields_count; i++)
|
||||
{
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
|
||||
/* Check if we can represent the field's value */
|
||||
|
||||
if (extension_desc_p->fields_p[i].type == JERRY_API_DATA_TYPE_FLOAT64)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (extension_desc_p->fields_p[i].type == JERRY_API_DATA_TYPE_UINT32
|
||||
&& (ecma_number_to_uint32 (ecma_uint32_to_number (extension_desc_p->fields_p[i].v_uint32))
|
||||
!= extension_desc_p->fields_p[i].v_uint32))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
|
||||
|
||||
for (uint32_t j = 0; j < extension_desc_p->functions_count; j++)
|
||||
{
|
||||
if (!strcmp (extension_desc_p->fields_p[i].field_name_p,
|
||||
extension_desc_p->functions_p[j].function_name_p))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (jerry_extension_descriptor_t *desc_iter_p = jerry_extensions_list_p;
|
||||
desc_iter_p != NULL;
|
||||
desc_iter_p = desc_iter_p->next_p)
|
||||
{
|
||||
if (desc_iter_p == extension_desc_p
|
||||
|| !strcmp (desc_iter_p->name_p, extension_desc_p->name_p))
|
||||
{
|
||||
/* The extension already registered or an extension with the same name already registered */
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
extension_desc_p->next_p = jerry_extensions_list_p;
|
||||
jerry_extensions_list_p = extension_desc_p;
|
||||
extension_desc_p->index = jerry_extensions_next_index++;
|
||||
|
||||
return true;
|
||||
} /* ecma_extension_register */
|
||||
|
||||
/**
|
||||
* [[GetOwnProperty]] Implementation extension object's operation
|
||||
*
|
||||
* @return property descriptor
|
||||
*/
|
||||
ecma_property_t*
|
||||
ecma_op_extension_object_get_own_property (ecma_object_t *obj_p, /**< the extension object */
|
||||
ecma_string_t *property_name_p) /**< property name */
|
||||
{
|
||||
JERRY_ASSERT (ecma_get_object_type (obj_p) == ECMA_OBJECT_TYPE_EXTENSION);
|
||||
|
||||
// 1.
|
||||
ecma_property_t *prop_p = ecma_op_general_object_get_own_property (obj_p, property_name_p);
|
||||
|
||||
// 2.
|
||||
if (prop_p != NULL)
|
||||
{
|
||||
return prop_p;
|
||||
}
|
||||
|
||||
#if CONFIG_ECMA_CHAR_ENCODING != CONFIG_ECMA_CHAR_ASCII
|
||||
JERRY_UNIMPLEMENTED ("Only ASCII encoding support is implemented.");
|
||||
#else /* CONFIG_ECMA_CHAR_ENCODING == CONFIG_ECMA_CHAR_ASCII */
|
||||
ssize_t req_buffer_size = ecma_string_to_zt_string (property_name_p, NULL, 0);
|
||||
JERRY_ASSERT (req_buffer_size < 0);
|
||||
|
||||
MEM_DEFINE_LOCAL_ARRAY (property_name_zt_buf_p, -req_buffer_size, uint8_t);
|
||||
|
||||
req_buffer_size = ecma_string_to_zt_string (property_name_p, property_name_zt_buf_p, -req_buffer_size);
|
||||
JERRY_ASSERT (req_buffer_size > 0);
|
||||
|
||||
const char *name_p = (const char*) property_name_zt_buf_p;
|
||||
|
||||
ecma_property_t *extension_id_prop_p = ecma_get_internal_property (obj_p,
|
||||
ECMA_INTERNAL_PROPERTY_EXTENSION_ID);
|
||||
uint32_t extension_object_index = extension_id_prop_p->u.internal_property.value;
|
||||
|
||||
jerry_extension_descriptor_t *desc_p;
|
||||
for (desc_p = jerry_extensions_list_p;
|
||||
desc_p != NULL;
|
||||
desc_p = desc_p->next_p)
|
||||
{
|
||||
if (desc_p->index == extension_object_index)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
JERRY_ASSERT (desc_p != NULL);
|
||||
|
||||
uint32_t field_index;
|
||||
for (field_index = 0;
|
||||
field_index < desc_p->fields_count;
|
||||
field_index++)
|
||||
{
|
||||
if (!strcmp (name_p, desc_p->fields_p[field_index].field_name_p))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (field_index < desc_p->fields_count)
|
||||
{
|
||||
const jerry_extension_field_t *field_p = &desc_p->fields_p[field_index];
|
||||
|
||||
ecma_value_t value;
|
||||
prop_p = ecma_create_named_data_property (obj_p,
|
||||
property_name_p,
|
||||
ECMA_PROPERTY_NOT_WRITABLE,
|
||||
ECMA_PROPERTY_NOT_ENUMERABLE,
|
||||
ECMA_PROPERTY_NOT_CONFIGURABLE);
|
||||
|
||||
if (field_p->type == JERRY_API_DATA_TYPE_UNDEFINED)
|
||||
{
|
||||
value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
}
|
||||
else if (field_p->type == JERRY_API_DATA_TYPE_NULL)
|
||||
{
|
||||
value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_NULL);
|
||||
}
|
||||
else if (field_p->type == JERRY_API_DATA_TYPE_BOOLEAN)
|
||||
{
|
||||
value = ecma_make_simple_value (field_p->v_bool ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
|
||||
}
|
||||
else if (field_p->type == JERRY_API_DATA_TYPE_FLOAT32)
|
||||
{
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
*num_p = field_p->v_float32;
|
||||
value = ecma_make_number_value (num_p);
|
||||
}
|
||||
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64
|
||||
else if (field_p->type == JERRY_API_DATA_TYPE_FLOAT64)
|
||||
{
|
||||
JERRY_UNREACHABLE ();
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
*num_p = field_p->v_float64;
|
||||
value = ecma_make_number_value (num_p);
|
||||
}
|
||||
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT64 */
|
||||
else if (field_p->type == JERRY_API_DATA_TYPE_UINT32)
|
||||
{
|
||||
ecma_number_t *num_p = ecma_alloc_number ();
|
||||
*num_p = ecma_uint32_to_number (field_p->v_uint32);
|
||||
JERRY_ASSERT (ecma_number_to_uint32 (*num_p) == field_p->v_uint32);
|
||||
value = ecma_make_number_value (num_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (field_p->type == JERRY_API_DATA_TYPE_STRING);
|
||||
const ecma_char_t *string_p = (const ecma_char_t*) field_p->v_string;
|
||||
ecma_string_t *str_p = ecma_new_ecma_string (string_p);
|
||||
value = ecma_make_string_value (str_p);
|
||||
}
|
||||
|
||||
ecma_named_data_property_assign_value (obj_p, prop_p, value);
|
||||
ecma_free_value (value, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t function_index;
|
||||
for (function_index = 0;
|
||||
function_index < desc_p->functions_count;
|
||||
function_index++)
|
||||
{
|
||||
if (!strcmp (name_p, desc_p->functions_p[function_index].function_name_p))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (function_index < desc_p->functions_count)
|
||||
{
|
||||
const jerry_extension_function_t *function_p = &desc_p->functions_p[function_index];
|
||||
|
||||
/* Currently, combined identifier of extension object and extension function should fit in uint16_t. */
|
||||
JERRY_STATIC_ASSERT (ECMA_EXTENSION_MAX_NUMBER_OF_EXTENSIONS * ECMA_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION
|
||||
< (1ull << (sizeof (uint16_t) * JERRY_BITSINBYTE)));
|
||||
|
||||
uint32_t routine_id = desc_p->index * ECMA_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION + function_index;
|
||||
JERRY_ASSERT ((uint16_t) routine_id == routine_id);
|
||||
JERRY_STATIC_ASSERT ((ecma_number_t) ECMA_EXTENSION_MAX_ARGUMENTS_IN_FUNCTION
|
||||
== ECMA_EXTENSION_MAX_ARGUMENTS_IN_FUNCTION);
|
||||
ecma_number_t args_number = ecma_uint32_to_number (function_p->args_number);
|
||||
JERRY_ASSERT (function_p->args_number == ecma_number_to_uint32 (args_number));
|
||||
ecma_object_t *func_obj_p = ecma_builtin_make_function_object_for_routine (ECMA_BUILTIN_ID_JERRY,
|
||||
(uint16_t) routine_id,
|
||||
args_number);
|
||||
|
||||
prop_p = ecma_create_named_data_property (obj_p,
|
||||
property_name_p,
|
||||
ECMA_PROPERTY_NOT_WRITABLE,
|
||||
ECMA_PROPERTY_NOT_ENUMERABLE,
|
||||
ECMA_PROPERTY_NOT_CONFIGURABLE);
|
||||
|
||||
ecma_named_data_property_assign_value (obj_p, prop_p, ecma_make_object_value (func_obj_p));
|
||||
|
||||
ecma_deref_object (func_obj_p);
|
||||
}
|
||||
}
|
||||
|
||||
MEM_FINALIZE_LOCAL_ARRAY (property_name_zt_buf_p);
|
||||
|
||||
return prop_p;
|
||||
#endif /* CONFIG_ECMA_CHAR_ENCODING == CONFIG_ECMA_CHAR_ASCII */
|
||||
} /* ecma_op_extension_object_get_own_property */
|
||||
@@ -288,12 +288,4 @@ BUILTIN (ECMA_BUILTIN_ID_GLOBAL,
|
||||
true,
|
||||
global)
|
||||
|
||||
/* Jerry's dynamic extension proxy object */
|
||||
BUILTIN (ECMA_BUILTIN_ID_JERRY,
|
||||
ECMA_OBJECT_TYPE_GENERAL,
|
||||
ECMA_BUILTIN_ID__COUNT, /* no prototype */
|
||||
false,
|
||||
false,
|
||||
jerry)
|
||||
|
||||
#undef BUILTIN
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/* Copyright 2015 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef ECMA_EXTENSION_H
|
||||
#define ECMA_EXTENSION_H
|
||||
|
||||
#include "ecma-globals.h"
|
||||
#include "jerry-extension.h"
|
||||
|
||||
/**
|
||||
* Maximum number of registered extensions
|
||||
*/
|
||||
#define ECMA_EXTENSION_MAX_NUMBER_OF_EXTENSIONS (CONFIG_EXTENSION_MAX_NUMBER_OF_EXTENSIONS)
|
||||
|
||||
/**
|
||||
* Maximum number of functions in an extension
|
||||
*/
|
||||
#define ECMA_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION (CONFIG_EXTENSION_MAX_FUNCTIONS_IN_EXTENSION)
|
||||
|
||||
/**
|
||||
* Maximum number of arguments in a function
|
||||
*/
|
||||
#define ECMA_EXTENSION_MAX_ARGUMENTS_IN_FUNCTION (CONFIG_EXTENSION_MAX_ARGUMENTS_IN_FUNCTION)
|
||||
|
||||
extern bool ecma_extension_register (jerry_extension_descriptor_t *extension_desc_p);
|
||||
extern ecma_property_t* ecma_op_extension_object_get_own_property (ecma_object_t*, ecma_string_t*);
|
||||
|
||||
#endif /* ECMA_EXTENSION_H */
|
||||
@@ -16,7 +16,6 @@
|
||||
#include "ecma-array-object.h"
|
||||
#include "ecma-builtins.h"
|
||||
#include "ecma-exceptions.h"
|
||||
#include "ecma-extension.h"
|
||||
#include "ecma-globals.h"
|
||||
#include "ecma-function-object.h"
|
||||
#include "ecma-lcache.h"
|
||||
@@ -45,7 +44,6 @@ ecma_assert_object_type_is_valid (ecma_object_type_t type) /**< object's impleme
|
||||
|| type == ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION
|
||||
|| type == ECMA_OBJECT_TYPE_STRING
|
||||
|| type == ECMA_OBJECT_TYPE_ARGUMENTS
|
||||
|| type == ECMA_OBJECT_TYPE_EXTENSION
|
||||
|| type == ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION);
|
||||
} /* ecma_assert_object_type_is_valid */
|
||||
|
||||
@@ -77,7 +75,6 @@ ecma_op_object_get (ecma_object_t *obj_p, /**< the object */
|
||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_EXTENSION:
|
||||
case ECMA_OBJECT_TYPE_STRING:
|
||||
{
|
||||
return ecma_op_general_object_get (obj_p, property_name_p);
|
||||
@@ -138,20 +135,12 @@ ecma_op_object_get_own_property_longpath (ecma_object_t *obj_p, /**< the object
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ECMA_OBJECT_TYPE_EXTENSION:
|
||||
{
|
||||
prop_p = ecma_op_extension_object_get_own_property (obj_p, property_name_p);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely (prop_p == NULL))
|
||||
{
|
||||
if (is_builtin
|
||||
&& type != ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION
|
||||
&& type != ECMA_OBJECT_TYPE_EXTENSION)
|
||||
&& type != ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION)
|
||||
{
|
||||
prop_p = ecma_builtin_try_to_instantiate_property (obj_p, property_name_p);
|
||||
}
|
||||
@@ -219,7 +208,6 @@ ecma_op_object_get_property (ecma_object_t *obj_p, /**< the object */
|
||||
* [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_get_property,
|
||||
* [ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION] = &ecma_op_general_object_get_property,
|
||||
* [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_get_property,
|
||||
* [ECMA_OBJECT_TYPE_EXTENSION] = &ecma_op_general_object_get_property,
|
||||
* [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_get_property,
|
||||
* [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_get_property
|
||||
* };
|
||||
@@ -262,7 +250,6 @@ ecma_op_object_put (ecma_object_t *obj_p, /**< the object */
|
||||
* [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_put,
|
||||
* [ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION] = &ecma_op_general_object_put,
|
||||
* [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_put,
|
||||
* [ECMA_OBJECT_TYPE_EXTENSION] = &ecma_op_general_object_put,
|
||||
* [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_put,
|
||||
* [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_put
|
||||
* };
|
||||
@@ -303,7 +290,6 @@ ecma_op_object_can_put (ecma_object_t *obj_p, /**< the object */
|
||||
* [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_can_put,
|
||||
* [ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION] = &ecma_op_general_object_can_put,
|
||||
* [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_can_put,
|
||||
* [ECMA_OBJECT_TYPE_EXTENSION] = &ecma_op_general_object_can_put,
|
||||
* [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_can_put,
|
||||
* [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_can_put
|
||||
* };
|
||||
@@ -343,7 +329,6 @@ ecma_op_object_delete (ecma_object_t *obj_p, /**< the object */
|
||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_EXTENSION:
|
||||
case ECMA_OBJECT_TYPE_STRING:
|
||||
{
|
||||
return ecma_op_general_object_delete (obj_p,
|
||||
@@ -393,7 +378,6 @@ ecma_op_object_default_value (ecma_object_t *obj_p, /**< the object */
|
||||
* [ECMA_OBJECT_TYPE_BOUND_FUNCTION] = &ecma_op_general_object_default_value,
|
||||
* [ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION] = &ecma_op_general_object_default_value,
|
||||
* [ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION] = &ecma_op_general_object_default_value,
|
||||
* [ECMA_OBJECT_TYPE_EXTENSION] = &ecma_op_general_object_default_value,
|
||||
* [ECMA_OBJECT_TYPE_ARGUMENTS] = &ecma_op_general_object_default_value,
|
||||
* [ECMA_OBJECT_TYPE_STRING] = &ecma_op_general_object_default_value
|
||||
* };
|
||||
@@ -434,7 +418,6 @@ ecma_op_object_define_own_property (ecma_object_t *obj_p, /**< the object */
|
||||
case ECMA_OBJECT_TYPE_BOUND_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_EXTERNAL_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_BUILT_IN_FUNCTION:
|
||||
case ECMA_OBJECT_TYPE_EXTENSION:
|
||||
case ECMA_OBJECT_TYPE_STRING:
|
||||
{
|
||||
return ecma_op_general_object_define_own_property (obj_p,
|
||||
@@ -487,7 +470,6 @@ ecma_op_object_has_instance (ecma_object_t *obj_p, /**< the object */
|
||||
case ECMA_OBJECT_TYPE_GENERAL:
|
||||
case ECMA_OBJECT_TYPE_STRING:
|
||||
case ECMA_OBJECT_TYPE_ARGUMENTS:
|
||||
case ECMA_OBJECT_TYPE_EXTENSION:
|
||||
{
|
||||
return ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
}
|
||||
@@ -555,10 +537,6 @@ ecma_object_get_class_name (ecma_object_t *obj_p) /**< object */
|
||||
{
|
||||
return ECMA_MAGIC_STRING_ARGUMENTS_UL;
|
||||
}
|
||||
case ECMA_OBJECT_TYPE_EXTENSION:
|
||||
{
|
||||
return ECMA_MAGIC_STRING_OBJECT_UL;
|
||||
}
|
||||
case ECMA_OBJECT_TYPE_FUNCTION:
|
||||
{
|
||||
ecma_magic_string_id_t class_name;
|
||||
@@ -705,8 +683,7 @@ ecma_object_get_class_name (ecma_object_t *obj_p) /**< object */
|
||||
#endif /* !CONFIG_ECMA_COMPACT_PROFILE_DISABLE_ERROR_BUILTINS */
|
||||
default:
|
||||
{
|
||||
JERRY_ASSERT (ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_GLOBAL)
|
||||
|| ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_JERRY));
|
||||
JERRY_ASSERT (ecma_builtin_is (obj_p, ECMA_BUILTIN_ID_GLOBAL));
|
||||
|
||||
return ECMA_MAGIC_STRING_OBJECT_UL;
|
||||
}
|
||||
|
||||
@@ -1,104 +0,0 @@
|
||||
/* Copyright 2015 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef JERRY_EXTENSION_H
|
||||
#define JERRY_EXTENSION_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "jerry-api.h"
|
||||
|
||||
/** \addtogroup jerry Jerry engine interface
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** \addtogroup jerry_extension Jerry engine extension interface
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Description of an extension object's fields
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
const char *field_name_p; /**< field name */
|
||||
|
||||
const jerry_api_data_type_t type; /**< field data type */
|
||||
|
||||
/**
|
||||
* Value description
|
||||
*/
|
||||
union
|
||||
{
|
||||
const char* v_string; /**< string */
|
||||
bool v_bool; /**< boolean */
|
||||
float v_float32; /**< 32-bit float */
|
||||
double v_float64; /**< 64-bit float */
|
||||
uint32_t v_uint32; /**< 32-bit unsigned integer */
|
||||
};
|
||||
} jerry_extension_field_t;
|
||||
|
||||
/**
|
||||
* Forward declaration of description of an extension object's function
|
||||
*/
|
||||
struct jerry_extension_function_t;
|
||||
|
||||
/**
|
||||
* Pointer to extension function implementation
|
||||
*/
|
||||
typedef void (*jerry_extension_function_pointer_t) (struct jerry_extension_function_t *function_block_p);
|
||||
|
||||
/**
|
||||
* Description of an extension object's function
|
||||
*/
|
||||
typedef struct jerry_extension_function_t
|
||||
{
|
||||
const char* function_name_p; /**< name of function */
|
||||
|
||||
const jerry_extension_function_pointer_t function_wrapper_p; /**< pointer to function implementation */
|
||||
|
||||
jerry_api_value_t ret_value; /**< function's return value */
|
||||
jerry_api_value_t* args_p; /**< arrays of the function's arguments */
|
||||
const uint32_t args_number; /**< number of arguments */
|
||||
} jerry_extension_function_t;
|
||||
|
||||
/**
|
||||
* Description of an extention object
|
||||
*/
|
||||
typedef struct jerry_extension_descriptor_t
|
||||
{
|
||||
const uint32_t fields_count; /**< number of fields */
|
||||
const uint32_t functions_count; /**< number of functions */
|
||||
|
||||
const jerry_extension_field_t* const fields_p; /**< array of field descriptor */
|
||||
jerry_extension_function_t* const functions_p; /**< array of function descriptors */
|
||||
|
||||
const char* const name_p; /**< name of the extension */
|
||||
struct jerry_extension_descriptor_t *next_p; /**< next descriptor in list of registered extensions */
|
||||
uint32_t index; /**< global index of the extension among registered exceptions */
|
||||
} jerry_extension_descriptor_t;
|
||||
|
||||
extern EXTERN_C bool
|
||||
jerry_extend_with (jerry_extension_descriptor_t *desc_p);
|
||||
|
||||
/**
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
#endif /* !JERRY_EXTENSION_H */
|
||||
@@ -1,126 +0,0 @@
|
||||
/* Copyright 2015 Samsung Electronics Co., Ltd.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "jerry.h"
|
||||
|
||||
/* Counting fields */
|
||||
enum
|
||||
{
|
||||
#define EXTENSION_FIELD(_field_name, _type, _value) \
|
||||
JERRY_EXTENSION_ ## EXTENSION_NAME ## _ ## _field_name,
|
||||
# include EXTENSION_DESCRIPTION_HEADER
|
||||
#undef EXTENSION_FIELD
|
||||
JERRY_EXTENSION_FIELDS_NUMBER
|
||||
};
|
||||
|
||||
/* Counting functions */
|
||||
enum
|
||||
{
|
||||
#define EXTENSION_FUNCTION(_function_name, _function_wrapper, _ret_value_type, _args_number, ... /* args */) \
|
||||
JERRY_EXTENSION_ ## EXTENSION_NAME ## _ ## _function_name,
|
||||
# include EXTENSION_DESCRIPTION_HEADER
|
||||
#undef EXTENSION_FUNCTION
|
||||
JERRY_EXTENSION_FUNCTIONS_NUMBER
|
||||
};
|
||||
|
||||
/* Fields description */
|
||||
static const jerry_extension_field_t jerry_extension_fields[JERRY_EXTENSION_FIELDS_NUMBER + 1] =
|
||||
{
|
||||
#define EXTENSION_FIELD(_field_name, _type, _value) \
|
||||
{ # _field_name, JERRY_API_DATA_TYPE_ ## _type, { _value } },
|
||||
# include EXTENSION_DESCRIPTION_HEADER
|
||||
#undef EXTENSION_FIELD
|
||||
#define EMPTY_FIELD_ENTRY { NULL, JERRY_API_DATA_TYPE_UNDEFINED, { NULL } }
|
||||
EMPTY_FIELD_ENTRY
|
||||
#undef EMPTY_FIELD_ENTRY
|
||||
};
|
||||
|
||||
/* Functions wrapper definitions */
|
||||
#define EXTENSION_ARG_PASS_BOOL(_arg_index) \
|
||||
args_p[_arg_index].v_bool
|
||||
#define EXTENSION_ARG_PASS_FLOAT32(_arg_index) \
|
||||
args_p[_arg_index].v_float32
|
||||
#define EXTENSION_ARG_PASS_FLOAT64(_arg_index) \
|
||||
args_p[_arg_index].v_float64
|
||||
#define EXTENSION_ARG_PASS_UINT32(_arg_index) \
|
||||
args_p[_arg_index].v_uint32
|
||||
#define EXTENSION_ARG_PASS_STRING(_arg_index) \
|
||||
args_p[_arg_index].v_string
|
||||
#define EXTENSION_ARG_PASS_OBJECT(_arg_index) \
|
||||
args_p[_arg_index].v_object
|
||||
#define EXTENSION_ARG(_arg_index, _type) EXTENSION_ARG_PASS_ ## _type(_arg_index)
|
||||
#define EXTENSION_RET_VALUE_SET_VOID
|
||||
#define EXTENSION_RET_VALUE_SET_BOOLEAN function_block_p->ret_value.v_bool =
|
||||
#define EXTENSION_RET_VALUE_SET_UINT32 function_block_p->ret_value.v_uint32 =
|
||||
#define EXTENSION_RET_VALUE_SET_FLOAT32 function_block_p->ret_value.v_float32 =
|
||||
#define EXTENSION_RET_VALUE_SET_FLOAT64 function_block_p->ret_value.v_float64 =
|
||||
#define EXTENSION_RET_VALUE_SET_STRING function_block_p->ret_value.v_string =
|
||||
#define EXTENSION_RET_VALUE_SET_OBJECT function_block_p->ret_value.v_object =
|
||||
#define EXTENSION_FUNCTION(_function_name, _function_to_call, _ret_value_type, _args_number, ...) \
|
||||
static void jerry_extension_ ## _function_name ## _wrapper (jerry_extension_function_t *function_block_p) \
|
||||
{ \
|
||||
const jerry_api_value_t *args_p = function_block_p->args_p; \
|
||||
EXTENSION_RET_VALUE_SET_ ## _ret_value_type _function_to_call (__VA_ARGS__); \
|
||||
}
|
||||
# include EXTENSION_DESCRIPTION_HEADER
|
||||
#undef EXTENSION_FUNCTION
|
||||
#undef EXTENSION_ARG
|
||||
#undef EXTENSION_ARG_PASS_OBJECT
|
||||
#undef EXTENSION_ARG_PASS_STRING
|
||||
#undef EXTENSION_ARG_PASS_UINT32
|
||||
#undef EXTENSION_ARG_PASS_FLOAT64
|
||||
#undef EXTENSION_ARG_PASS_FLOAT32
|
||||
#undef EXTENSION_ARG_PASS_BOOL
|
||||
|
||||
/* Functions' arguments description */
|
||||
#define EXTENSION_ARG(_arg_index, _type) [_arg_index] = { \
|
||||
(JERRY_API_DATA_TYPE_ ## _type), \
|
||||
{ false } /* just for initialization, should be overwritten upon call */ \
|
||||
}
|
||||
#define EXTENSION_FUNCTION(_function_name, _function_to_call, _ret_value_type, _args_number, ...) \
|
||||
static jerry_api_value_t jerry_extension_function_ ## _function_name ## _args[_args_number] = { \
|
||||
__VA_ARGS__ \
|
||||
};
|
||||
# include EXTENSION_DESCRIPTION_HEADER
|
||||
#undef EXTENSION_FUNCTION
|
||||
#undef EXTENSION_ARG
|
||||
|
||||
/* Functions description */
|
||||
static jerry_extension_function_t jerry_extension_functions[JERRY_EXTENSION_FUNCTIONS_NUMBER + 1] =
|
||||
{
|
||||
#define EXTENSION_FUNCTION(_function_name, _function_to_call, _ret_value_type, _args_number, ...) \
|
||||
{ \
|
||||
# _function_name, jerry_extension_ ## _function_name ## _wrapper, \
|
||||
{ JERRY_API_DATA_TYPE_ ## _ret_value_type, { false } }, \
|
||||
jerry_extension_function_ ## _function_name ## _args, \
|
||||
_args_number \
|
||||
},
|
||||
# include EXTENSION_DESCRIPTION_HEADER
|
||||
#undef EXTENSION_FUNCTION
|
||||
#define EMPTY_FUNCTION_ENTRY { NULL, NULL, { JERRY_API_DATA_TYPE_VOID, { false } }, NULL, 0 }
|
||||
EMPTY_FUNCTION_ENTRY
|
||||
#undef EMPTY_FUNCTION_ENTRY
|
||||
};
|
||||
|
||||
static jerry_extension_descriptor_t jerry_extension =
|
||||
{
|
||||
JERRY_EXTENSION_FIELDS_NUMBER,
|
||||
JERRY_EXTENSION_FUNCTIONS_NUMBER,
|
||||
jerry_extension_fields,
|
||||
jerry_extension_functions,
|
||||
EXTENSION_NAME,
|
||||
NULL,
|
||||
0 /* just for initialization, should be overwritten upon registration */
|
||||
};
|
||||
@@ -18,7 +18,6 @@
|
||||
#include "ecma-alloc.h"
|
||||
#include "ecma-builtins.h"
|
||||
#include "ecma-exceptions.h"
|
||||
#include "ecma-extension.h"
|
||||
#include "ecma-eval.h"
|
||||
#include "ecma-function-object.h"
|
||||
#include "ecma-gc.h"
|
||||
@@ -61,11 +60,6 @@ static bool jerry_api_available;
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Buffer of character data (used for exchange between core and extensions' routines)
|
||||
*/
|
||||
char jerry_extension_characters_buffer[CONFIG_EXTENSION_CHAR_BUFFER_SIZE];
|
||||
|
||||
#ifdef JERRY_ENABLE_LOG
|
||||
/**
|
||||
* TODO:
|
||||
@@ -274,20 +268,6 @@ jerry_api_convert_api_value_to_ecma_value (ecma_value_t *out_value_p, /**< out:
|
||||
} /* jerry_api_convert_api_value_to_ecma_value */
|
||||
|
||||
|
||||
/**
|
||||
* Extend Global scope with specified extension object
|
||||
*
|
||||
* After extension the object is accessible through non-configurable property
|
||||
* with name equal to builtin_object_name converted to ecma chars.
|
||||
*/
|
||||
bool
|
||||
jerry_extend_with (jerry_extension_descriptor_t *desc_p) /**< description of the extension object */
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_extension_register (desc_p);
|
||||
} /* jerry_extend_with */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "jerry-api.h"
|
||||
#include "jerry-extension.h"
|
||||
|
||||
/** \addtogroup jerry Jerry engine interface
|
||||
* @{
|
||||
|
||||
Reference in New Issue
Block a user