/* * Tencent is pleased to support the open source community by making Puerts available. * Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved. * Puerts is licensed under the BSD 3-Clause License, except for the third-party components listed in the file 'LICENSE' which may * be subject to their corresponding license terms. This file is subject to the terms and conditions defined in file 'LICENSE', * which is part of this source code package. */ #ifndef PS_API_H_ #define PS_API_H_ #include #include #include // Portable Embedded Scripting API #define PESAPI_VERSION 11 #define PESAPI_EXTERN #if defined(__APPLE__) && defined(BUILDING_PES_EXTENSION) && !defined(PESAPI_ADPT_C) #include "TargetConditionals.h" #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR #define USING_OBJC_REFLECTION #endif #endif #ifdef USING_OBJC_REFLECTION #import #endif #ifdef _WIN32 #define PESAPI_MODULE_EXPORT __declspec(dllexport) #else #define PESAPI_MODULE_EXPORT __attribute__((visibility("default"))) #endif #if defined(__GNUC__) #define PESAPI_NO_RETURN __attribute__((noreturn)) #elif defined(_WIN32) #define PESAPI_NO_RETURN __declspec(noreturn) #else #define PESAPI_NO_RETURN #endif #ifdef __cplusplus #define EXTERN_C_START \ extern "C" \ { #define EXTERN_C_END } #else #define EXTERN_C_START #define EXTERN_C_END #endif #define PESAPI_MODULE_INITIALIZER_X(base, module, version) PESAPI_MODULE_INITIALIZER_X_HELPER(base, module, version) #define PESAPI_MODULE_INITIALIZER_X_HELPER(base, module, version) base##module##_v##version #define PESAPI_MODULE_INITIALIZER_BASE pesapi_register_ #define PESAPI_MODULE_INITIALIZER(modname) PESAPI_MODULE_INITIALIZER_X(PESAPI_MODULE_INITIALIZER_BASE, modname, PESAPI_VERSION) #define PESAPI_MODULE_VERSION() PESAPI_MODULE_INITIALIZER_X(PESAPI_MODULE_INITIALIZER_BASE, version, 0) #ifdef USING_OBJC_REFLECTION #define PESAPI_MODULE(modname, initfunc) \ @interface PESAPI_MODULE_INITIALIZER (modname) : NSObject \ @end \ @implementation PESAPI_MODULE_INITIALIZER (modname) \ +(void) initlib : (pesapi_func_ptr*) func_ptr_array \ { \ pesapi_init(func_ptr_array); \ initfunc(); \ } \ @end #else #define PESAPI_MODULE(modname, initfunc) \ EXTERN_C_START \ PESAPI_MODULE_EXPORT void PESAPI_MODULE_INITIALIZER(modname)(pesapi_func_ptr * func_ptr_array); \ PESAPI_MODULE_EXPORT const char* PESAPI_MODULE_INITIALIZER(dynamic)(pesapi_func_ptr * func_ptr_array); \ PESAPI_MODULE_EXPORT int PESAPI_MODULE_VERSION()(); \ EXTERN_C_END \ PESAPI_MODULE_EXPORT void PESAPI_MODULE_INITIALIZER(modname)(pesapi_func_ptr * func_ptr_array) \ { \ pesapi_init(func_ptr_array); \ initfunc(); \ } \ PESAPI_MODULE_EXPORT const char* PESAPI_MODULE_INITIALIZER(dynamic)(pesapi_func_ptr * func_ptr_array) \ { \ if (func_ptr_array) \ { \ pesapi_init(func_ptr_array); \ initfunc(); \ } \ return #modname; \ } \ PESAPI_MODULE_EXPORT int PESAPI_MODULE_VERSION()() \ { \ return PESAPI_VERSION; \ } #endif EXTERN_C_START // alloc on stack struct pesapi_scope_memory { int padding__[32]; }; typedef struct pesapi_env__* pesapi_env; typedef struct pesapi_env_ref__* pesapi_env_ref; typedef struct pesapi_value__* pesapi_value; typedef struct pesapi_value_ref__* pesapi_value_ref; typedef struct pesapi_callback_info__* pesapi_callback_info; typedef struct pesapi_scope__* pesapi_scope; typedef struct pesapi_type_info__* pesapi_type_info; typedef struct pesapi_signature_info__* pesapi_signature_info; typedef struct pesapi_property_descriptor__* pesapi_property_descriptor; typedef void (*pesapi_callback)(pesapi_callback_info info); typedef void* (*pesapi_constructor)(pesapi_callback_info info); typedef void (*pesapi_finalize)(void* ptr, void* class_data, void* env_private); typedef void* (*pesapi_on_native_object_enter)(void* ptr, void* class_data, void* env_private); // userdata: return of pesapi_on_native_object_enter typedef void (*pesapi_on_native_object_exit)(void* ptr, void* class_data, void* env_private, void* userdata); typedef bool (*pesapi_class_not_found_callback)(const void* type_id); typedef void (*pesapi_func_ptr)(void); #ifdef BUILDING_PES_EXTENSION PESAPI_EXTERN void pesapi_init(pesapi_func_ptr* func_array); #else PESAPI_MODULE_EXPORT int pesapi_load_addon(const char* path, const char* module_name); #endif // value process PESAPI_EXTERN pesapi_value pesapi_create_null(pesapi_env env); PESAPI_EXTERN pesapi_value pesapi_create_undefined(pesapi_env env); PESAPI_EXTERN pesapi_value pesapi_create_boolean(pesapi_env env, bool value); PESAPI_EXTERN pesapi_value pesapi_create_int32(pesapi_env env, int32_t value); PESAPI_EXTERN pesapi_value pesapi_create_uint32(pesapi_env env, uint32_t value); PESAPI_EXTERN pesapi_value pesapi_create_int64(pesapi_env env, int64_t value); PESAPI_EXTERN pesapi_value pesapi_create_uint64(pesapi_env env, uint64_t value); PESAPI_EXTERN pesapi_value pesapi_create_double(pesapi_env env, double value); PESAPI_EXTERN pesapi_value pesapi_create_string_utf8(pesapi_env env, const char* str, size_t length); PESAPI_EXTERN pesapi_value pesapi_create_binary(pesapi_env env, void* str, size_t length); PESAPI_EXTERN pesapi_value pesapi_create_array(pesapi_env env); PESAPI_EXTERN pesapi_value pesapi_create_object(pesapi_env env); PESAPI_EXTERN pesapi_value pesapi_create_function(pesapi_env env, pesapi_callback native_impl, void* data); PESAPI_EXTERN pesapi_value pesapi_create_class(pesapi_env env, const void* type_id); PESAPI_EXTERN bool pesapi_get_value_bool(pesapi_env env, pesapi_value value); PESAPI_EXTERN int32_t pesapi_get_value_int32(pesapi_env env, pesapi_value value); PESAPI_EXTERN uint32_t pesapi_get_value_uint32(pesapi_env env, pesapi_value value); PESAPI_EXTERN int64_t pesapi_get_value_int64(pesapi_env env, pesapi_value value); PESAPI_EXTERN uint64_t pesapi_get_value_uint64(pesapi_env env, pesapi_value value); PESAPI_EXTERN double pesapi_get_value_double(pesapi_env env, pesapi_value value); PESAPI_EXTERN const char* pesapi_get_value_string_utf8(pesapi_env env, pesapi_value value, char* buf, size_t* bufsize); PESAPI_EXTERN void* pesapi_get_value_binary(pesapi_env env, pesapi_value pvalue, size_t* bufsize); PESAPI_EXTERN uint32_t pesapi_get_array_length(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_null(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_undefined(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_boolean(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_int32(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_uint32(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_int64(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_uint64(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_double(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_string(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_object(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_function(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_binary(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_array(pesapi_env env, pesapi_value value); PESAPI_EXTERN pesapi_value pesapi_native_object_to_value(pesapi_env env, const void* type_id, void* object_ptr, bool call_finalize); PESAPI_EXTERN void* pesapi_get_native_object_ptr(pesapi_env env, pesapi_value value); PESAPI_EXTERN const void* pesapi_get_native_object_typeid(pesapi_env env, pesapi_value value); PESAPI_EXTERN bool pesapi_is_instance_of(pesapi_env env, const void* type_id, pesapi_value value); PESAPI_EXTERN pesapi_value pesapi_boxing(pesapi_env env, pesapi_value value); PESAPI_EXTERN pesapi_value pesapi_unboxing(pesapi_env env, pesapi_value value); PESAPI_EXTERN void pesapi_update_boxed_value(pesapi_env env, pesapi_value boxed_value, pesapi_value value); PESAPI_EXTERN bool pesapi_is_boxed_value(pesapi_env env, pesapi_value value); PESAPI_EXTERN int pesapi_get_args_len(pesapi_callback_info info); PESAPI_EXTERN pesapi_value pesapi_get_arg(pesapi_callback_info info, int index); PESAPI_EXTERN pesapi_env pesapi_get_env(pesapi_callback_info info); PESAPI_EXTERN pesapi_value pesapi_get_this(pesapi_callback_info info); PESAPI_EXTERN pesapi_value pesapi_get_holder(pesapi_callback_info info); PESAPI_EXTERN void* pesapi_get_userdata(pesapi_callback_info info); PESAPI_EXTERN void pesapi_add_return(pesapi_callback_info info, pesapi_value value); PESAPI_EXTERN void pesapi_throw_by_string(pesapi_callback_info pinfo, const char* msg); PESAPI_EXTERN pesapi_env_ref pesapi_create_env_ref(pesapi_env env); PESAPI_EXTERN bool pesapi_env_ref_is_valid(pesapi_env_ref env); PESAPI_EXTERN pesapi_env pesapi_get_env_from_ref(pesapi_env_ref env_ref); PESAPI_EXTERN pesapi_env_ref pesapi_duplicate_env_ref(pesapi_env_ref env_ref); PESAPI_EXTERN void pesapi_release_env_ref(pesapi_env_ref env_ref); PESAPI_EXTERN pesapi_scope pesapi_open_scope(pesapi_env_ref env_ref); PESAPI_EXTERN pesapi_scope pesapi_open_scope_placement(pesapi_env_ref env_ref, struct pesapi_scope_memory* memory); PESAPI_EXTERN bool pesapi_has_caught(pesapi_scope scope); PESAPI_EXTERN const char* pesapi_get_exception_as_string(pesapi_scope scope, bool with_stack); PESAPI_EXTERN void pesapi_close_scope(pesapi_scope scope); PESAPI_EXTERN void pesapi_close_scope_placement(pesapi_scope scope); PESAPI_EXTERN pesapi_value_ref pesapi_create_value_ref(pesapi_env env, pesapi_value value, uint32_t internal_field_count); PESAPI_EXTERN pesapi_value_ref pesapi_duplicate_value_ref(pesapi_value_ref value_ref); PESAPI_EXTERN void pesapi_release_value_ref(pesapi_value_ref value_ref); PESAPI_EXTERN pesapi_value pesapi_get_value_from_ref(pesapi_env env, pesapi_value_ref value_ref); PESAPI_EXTERN void pesapi_set_ref_weak(pesapi_env env, pesapi_value_ref value_ref); // Optional api: return false if can not fulfill PESAPI_EXTERN bool pesapi_set_owner(pesapi_env env, pesapi_value value, pesapi_value owner); // suggestion: struct pesapi_value_ref : pesapi_env_ref {...}; PESAPI_EXTERN pesapi_env_ref pesapi_get_ref_associated_env(pesapi_value_ref value_ref); PESAPI_EXTERN void** pesapi_get_ref_internal_fields(pesapi_value_ref value_ref, uint32_t* pinternal_field_count); PESAPI_EXTERN pesapi_value pesapi_get_property(pesapi_env env, pesapi_value object, const char* key); PESAPI_EXTERN void pesapi_set_property(pesapi_env env, pesapi_value object, const char* key, pesapi_value value); PESAPI_EXTERN bool pesapi_get_private(pesapi_env env, pesapi_value object, void** out_ptr); PESAPI_EXTERN bool pesapi_set_private(pesapi_env env, pesapi_value object, void* ptr); PESAPI_EXTERN pesapi_value pesapi_get_property_uint32(pesapi_env env, pesapi_value object, uint32_t key); PESAPI_EXTERN void pesapi_set_property_uint32(pesapi_env env, pesapi_value object, uint32_t key, pesapi_value value); PESAPI_EXTERN pesapi_value pesapi_call_function( pesapi_env env, pesapi_value func, pesapi_value this_object, int argc, const pesapi_value argv[]); PESAPI_EXTERN pesapi_value pesapi_eval(pesapi_env env, const uint8_t* code, size_t code_size, const char* path); PESAPI_EXTERN pesapi_value pesapi_global(pesapi_env env); PESAPI_EXTERN const void* pesapi_get_env_private(pesapi_env env); PESAPI_EXTERN void pesapi_set_env_private(pesapi_env env, const void* ptr); PESAPI_EXTERN pesapi_type_info pesapi_alloc_type_infos(size_t count); PESAPI_EXTERN void pesapi_set_type_info( pesapi_type_info type_infos, size_t index, const char* name, bool is_pointer, bool is_const, bool is_ref, bool is_primitive); PESAPI_EXTERN pesapi_signature_info pesapi_create_signature_info( pesapi_type_info return_type, size_t parameter_count, pesapi_type_info parameter_types); PESAPI_EXTERN pesapi_property_descriptor pesapi_alloc_property_descriptors(size_t count); // using pesapi_get_userdata obtain userdata in callback PESAPI_EXTERN void pesapi_set_method_info(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static, pesapi_callback method, void* data, pesapi_signature_info signature_info); PESAPI_EXTERN void pesapi_set_property_info(pesapi_property_descriptor properties, size_t index, const char* name, bool is_static, pesapi_callback getter, pesapi_callback setter, void* getter_data, void* setter_data, pesapi_type_info type_info); PESAPI_EXTERN void pesapi_define_class(const void* type_id, const void* super_type_id, const char* type_name, pesapi_constructor constructor, pesapi_finalize finalize, size_t property_count, pesapi_property_descriptor properties, void* data); PESAPI_EXTERN void* pesapi_get_class_data(const void* type_id, bool force_load); PESAPI_EXTERN bool pesapi_trace_native_object_lifecycle( const void* type_id, pesapi_on_native_object_enter on_enter, pesapi_on_native_object_exit on_exit); PESAPI_EXTERN void pesapi_on_class_not_found(pesapi_class_not_found_callback callback); PESAPI_EXTERN void pesapi_class_type_info(const char* proto_magic_id, const void* type_id, const void* constructor_info, const void* methods_info, const void* functions_info, const void* properties_info, const void* variables_info); PESAPI_EXTERN const void* pesapi_find_type_id(const char* module_name, const char* type_name); EXTERN_C_END #endif