jerryscript/jerry-core/jerry-extension.inc.h
2015-02-25 16:51:21 +03:00

111 lines
3.8 KiB
C

/* 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, _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_EXTENSION_FIELD_TYPE_ ## _type, _value },
# include EXTENSION_DESCRIPTION_HEADER
#undef EXTENSION_FIELD
};
/* 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) \
(const char*) args_p [_arg_index].v_string.chars_p, \
args_p [_arg_index].v_string.length
#define EXTENSION_ARG(_arg_index, _type) EXTENSION_ARG_PASS_ ## _type(_arg_index)
#define EXTENSION_FUNCTION(_function_name, _function_to_call, _args_number, ...) \
static void jerry_extension_ ## _function_name ## _wrapper (const jerry_extension_function_t *function_block_p) \
{ \
const jerry_extension_function_arg_t *args_p = function_block_p->args_p; \
_function_to_call (__VA_ARGS__); \
}
# include EXTENSION_DESCRIPTION_HEADER
#undef EXTENSION_FUNCTION
#undef EXTENSION_ARG
#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_EXTENSION_FIELD_TYPE_ ## _type), \
false /* just for initialization, should be overwritten upon call */ \
}
#define EXTENSION_FUNCTION(_function_name, _function_to_call, _args_number, ...) \
static jerry_extension_function_arg_t jerry_extension_function_ ## _function_name ## _args [_args_number] = { \
__VA_ARGS__ \
};
# include EXTENSION_DESCRIPTION_HEADER
#undef EXTENSION_FUNCTION
#undef EXTENSION_ARG
/* Functions description */
static const jerry_extension_function_t jerry_extension_functions [JERRY_EXTENSION_FUNCTIONS_NUMBER + 1] =
{
#define EXTENSION_FUNCTION(_function_name, _function_wrapper, _args_number, ...) \
{ \
# _function_name, jerry_extension_ ## _function_name ## _wrapper, \
jerry_extension_function_ ## _function_name ## _args, \
_args_number \
},
# include EXTENSION_DESCRIPTION_HEADER
#undef EXTENSION_FUNCTION
};
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 */
};