From f9e25081807eb57b2e39988af10cad4272288048 Mon Sep 17 00:00:00 2001 From: Apprentice-Alchemist <53486764+Apprentice-Alchemist@users.noreply.github.com> Date: Sun, 27 Feb 2022 21:38:09 +0100 Subject: [PATCH] Add hashlink as a submodule. --- .gitignore | 6 + .gitmodules | 3 + project/Build.xml | 52 +- project/BuildHashlink.xml | 241 ++++++++ project/include/hl.h | 929 ----------------------------- project/include/system/CFFI.h | 2 + project/lib/hashlink | 1 + tools/platforms/LinuxPlatform.hx | 4 + tools/platforms/MacPlatform.hx | 5 + tools/platforms/WindowsPlatform.hx | 5 + 10 files changed, 294 insertions(+), 954 deletions(-) create mode 100644 project/BuildHashlink.xml delete mode 100644 project/include/hl.h create mode 160000 project/lib/hashlink diff --git a/.gitignore b/.gitignore index aea1ac3358..37fb39f4e6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,12 @@ Export/ ndll/*/lime* ndll/*/liblime* +ndll/*/*.hdll +ndll/*/*.hash +ndll/*/*.so +ndll/*/*.dylib +ndll/*/*.lib +ndll/*/hl* project/all_objs project/obj project/vc*.pdb diff --git a/.gitmodules b/.gitmodules index afb8e8cd08..f53ffa4dec 100644 --- a/.gitmodules +++ b/.gitmodules @@ -58,3 +58,6 @@ [submodule "project/lib/mojoal"] path = project/lib/mojoal url = https://github.com/native-toolkit/mojoal +[submodule "project/lib/hashlink"] + path = project/lib/hashlink + url = https://github.com/HaxeFoundation/hashlink diff --git a/project/Build.xml b/project/Build.xml index bac949ff4d..7434bdcf81 100644 --- a/project/Build.xml +++ b/project/Build.xml @@ -10,7 +10,7 @@ - + @@ -65,10 +65,10 @@
- - - - + + + + @@ -124,6 +124,8 @@
+ +
@@ -218,12 +220,12 @@
- - - - - - + + + + + + @@ -231,9 +233,9 @@
- - - + + + @@ -325,7 +327,7 @@ - + @@ -422,7 +424,7 @@ - + @@ -436,14 +438,14 @@ - +
- + @@ -455,12 +457,12 @@ - + - +
@@ -500,8 +502,8 @@ - - + + @@ -519,9 +521,9 @@ - - - + + + diff --git a/project/BuildHashlink.xml b/project/BuildHashlink.xml new file mode 100644 index 0000000000..7b23e656a1 --- /dev/null +++ b/project/BuildHashlink.xml @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/project/include/hl.h b/project/include/hl.h deleted file mode 100644 index e2dde9ed17..0000000000 --- a/project/include/hl.h +++ /dev/null @@ -1,929 +0,0 @@ -/* - * Copyright (C)2005-2016 Haxe Foundation - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ -#ifndef HL_H -#define HL_H - -/** - Detailed documentation can be found here: - https://github.com/HaxeFoundation/hashlink/wiki/ -**/ - -#define HL_VERSION 0x010C00 - -#if defined(_WIN32) -# define HL_WIN -# ifndef _DURANGO -# define HL_WIN_DESKTOP -# endif -#endif - -#if defined(__APPLE__) || defined(__MACH__) || defined(macintosh) -#include -#if TARGET_OS_IOS -#define HL_IOS -#elif TARGET_OS_TV -#define HL_TVOS -#elif TARGET_OS_MAC -#define HL_MAC -#endif -#endif - -#ifdef __ANDROID__ -# define HL_ANDROID -#endif - -#if defined(linux) || defined(__linux__) -# define HL_LINUX -# define _GNU_SOURCE -#endif - -#if defined(HL_IOS) || defined(HL_ANDROID) || defined(HL_TVOS) -# define HL_MOBILE -#endif - -#ifdef __ORBIS__ -# define HL_PS -#endif - -#ifdef __NX__ -# define HL_NX -#endif - -#ifdef _DURANGO -# define HL_XBO -#endif - -#if defined(HL_PS) || defined(HL_NX) || defined(HL_XBO) -# define HL_CONSOLE -#endif - -#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)) && !defined(HL_CONSOLE) -# define HL_BSD -#endif - -#if defined(_64BITS) || defined(__x86_64__) || defined(_M_X64) || defined(__LP64__) -# define HL_64 -#endif - -#if defined(__GNUC__) -# define HL_GCC -#endif - -#if defined(__MINGW32__) -# define HL_MINGW -#endif - -#if defined(__CYGWIN__) -# define HL_CYGWIN -#endif - -#if defined(__llvm__) -# define HL_LLVM -#endif - -#if defined(__clang__) -# define HL_CLANG -#endif - -#if defined(_MSC_VER) && !defined(HL_LLVM) -# define HL_VCC -# pragma warning(disable:4996) // remove deprecated C API usage warnings -# pragma warning(disable:4055) // void* - to - function cast -# pragma warning(disable:4152) // void* - to - function cast -# pragma warning(disable:4201) // anonymous struct -# pragma warning(disable:4127) // while( true ) -# pragma warning(disable:4710) // inline disabled -# pragma warning(disable:4711) // inline activated -# pragma warning(disable:4255) // windows include -# pragma warning(disable:4820) // windows include -# pragma warning(disable:4668) // windows include -# pragma warning(disable:4738) // return float bad performances -#endif - -#if defined(HL_VCC) || defined(HL_MINGW) || defined(HL_CYGWIN) -# define HL_WIN_CALL -#endif - -#ifdef _DEBUG -# define HL_DEBUG -#endif - -#ifndef HL_CONSOLE -# define HL_TRACK_ENABLE -#endif - -#ifndef HL_NO_THREADS -# define HL_THREADS -# ifdef HL_VCC -# define HL_THREAD_VAR __declspec( thread ) -# define HL_THREAD_STATIC_VAR HL_THREAD_VAR static -# else -# define HL_THREAD_VAR __thread -# define HL_THREAD_STATIC_VAR static HL_THREAD_VAR -# endif -#else -# define HL_THREAD_VAR -# define HL_THREAD_STATIC_VAR static -#endif - -#include -#ifndef HL_VCC -# include -#endif - -#if defined(HL_VCC) || defined(HL_MINGW) -# define EXPORT __declspec( dllexport ) -# define IMPORT __declspec( dllimport ) -#else -# define EXPORT -# define IMPORT extern -#endif - -#ifdef HL_64 -# define HL_WSIZE 8 -# define IS_64 1 -# ifdef HL_VCC -# define _PTR_FMT L"%IX" -# else -# define _PTR_FMT u"%lX" -# endif -#else -# define HL_WSIZE 4 -# define IS_64 0 -# ifdef HL_VCC -# define _PTR_FMT L"%IX" -# else -# define _PTR_FMT u"%X" -# endif -#endif - -#ifdef __cplusplus -# define C_FUNCTION_BEGIN extern "C" { -# define C_FUNCTION_END }; -#else -# define C_FUNCTION_BEGIN -# define C_FUNCTION_END -#endif - -typedef intptr_t int_val; -typedef long long int64; -typedef unsigned long long uint64; - -#include -#include -#include -#include - -#if defined(LIBHL_EXPORTS) -#define HL_API extern EXPORT -#elif defined(LIBHL_STATIC) -#define HL_API extern -#else -#define HL_API IMPORT -#endif - -// -------------- UNICODE ----------------------------------- - -#if defined(HL_WIN) && !defined(HL_LLVM) -#if defined(HL_WIN_DESKTOP) && !defined(HL_MINGW) -# include -#elif defined(HL_WIN_DESKTOP) && defined(HL_MINGW) -# include -#else -# include -#endif -# include -typedef wchar_t uchar; -# define USTR(str) L##str -# define HL_NATIVE_UCHAR_FUN -# define usprintf swprintf -# define uprintf wprintf -# define ustrlen wcslen -# define ustrdup _wcsdup -HL_API int uvszprintf( uchar *out, int out_size, const uchar *fmt, va_list arglist ); -# define _utod(s,end) wcstod(s,end) -# define _utoi(s,end) wcstol(s,end,10) -# define ucmp(a,b) wcscmp(a,b) -# define utostr(out,size,str) wcstombs(out,str,size) -#elif defined(HL_MAC) -typedef uint16_t uchar; -# undef USTR -# define USTR(str) u##str -#else -# include -#if defined(HL_IOS) || defined(HL_TVOS) || defined(HL_MAC) -#include -#include -typedef uint16_t char16_t; -typedef uint32_t char32_t; -#else -# include -#endif -typedef char16_t uchar; -# undef USTR -# define USTR(str) u##str -#endif - -C_FUNCTION_BEGIN -HL_API double utod( const uchar *str, uchar **end ); -HL_API int utoi( const uchar *str, uchar **end ); -#ifndef HL_NATIVE_UCHAR_FUN -HL_API int ustrlen( const uchar *str ); -HL_API uchar *ustrdup( const uchar *str ); -HL_API int ucmp( const uchar *a, const uchar *b ); -HL_API int utostr( char *out, int out_size, const uchar *str ); -HL_API int usprintf( uchar *out, int out_size, const uchar *fmt, ... ); -HL_API int uvszprintf( uchar *out, int out_size, const uchar *fmt, va_list arglist ); -HL_API void uprintf( const uchar *fmt, const uchar *str ); -#endif -C_FUNCTION_END - -#if defined(HL_VCC) -# define hl_debug_break() if( IsDebuggerPresent() ) __debugbreak() -#elif defined(HL_PS) && defined(_DEBUG) -# define hl_debug_break() __debugbreak() -#elif defined(HL_NX) -C_FUNCTION_BEGIN -HL_API void hl_debug_break( void ); -C_FUNCTION_END -#elif defined(HL_LINUX) && defined(__i386__) -# ifdef HL_64 -# define hl_debug_break() \ - if( hl_detect_debugger() ) \ - __asm__("0: int3;" \ - ".pushsection embed-breakpoints;" \ - ".quad 0b;" \ - ".popsection") -# else -# define hl_debug_break() \ - if( hl_detect_debugger() ) \ - __asm__("0: int3;" \ - ".pushsection embed-breakpoints;" \ - ".long 0b;" \ - ".popsection") -# endif -#elif defined(HL_MAC) -#include -# define hl_debug_break() \ - if( hl_detect_debugger() ) \ - raise(SIGTRAP);//__builtin_trap(); -#else -# define hl_debug_break() -#endif - -#ifdef HL_VCC -# define HL_NO_RETURN(f) __declspec(noreturn) f -# define HL_UNREACHABLE -#else -# define HL_NO_RETURN(f) f __attribute__((noreturn)) -# define HL_UNREACHABLE __builtin_unreachable() -#endif - -// ---- TYPES ------------------------------------------- - -typedef enum { - HVOID = 0, - HUI8 = 1, - HUI16 = 2, - HI32 = 3, - HI64 = 4, - HF32 = 5, - HF64 = 6, - HBOOL = 7, - HBYTES = 8, - HDYN = 9, - HFUN = 10, - HOBJ = 11, - HARRAY = 12, - HTYPE = 13, - HREF = 14, - HVIRTUAL= 15, - HDYNOBJ = 16, - HABSTRACT=17, - HENUM = 18, - HNULL = 19, - HMETHOD = 20, - HSTRUCT = 21, - // --------- - HLAST = 22, - _H_FORCE_INT = 0x7FFFFFFF -} hl_type_kind; - -typedef struct hl_type hl_type; -typedef struct hl_runtime_obj hl_runtime_obj; -typedef struct hl_alloc_block hl_alloc_block; -typedef struct { hl_alloc_block *cur; } hl_alloc; -typedef struct _hl_field_lookup hl_field_lookup; - -typedef struct { - hl_alloc alloc; - void **functions_ptrs; - hl_type **functions_types; -} hl_module_context; - -typedef struct { - hl_type **args; - hl_type *ret; - int nargs; - // storage for closure - hl_type *parent; - struct { - hl_type_kind kind; - void *p; - } closure_type; - struct { - hl_type **args; - hl_type *ret; - int nargs; - hl_type *parent; - } closure; -} hl_type_fun; - -typedef struct { - const uchar *name; - hl_type *t; - int hashed_name; -} hl_obj_field; - -typedef struct { - const uchar *name; - int findex; - int pindex; - int hashed_name; -} hl_obj_proto; - -typedef struct { - int nfields; - int nproto; - int nbindings; - const uchar *name; - hl_type *super; - hl_obj_field *fields; - hl_obj_proto *proto; - int *bindings; - void **global_value; - hl_module_context *m; - hl_runtime_obj *rt; -} hl_type_obj; - -typedef struct { - hl_obj_field *fields; - int nfields; - // runtime - int dataSize; - int *indexes; - hl_field_lookup *lookup; -} hl_type_virtual; - -typedef struct { - const uchar *name; - int nparams; - hl_type **params; - int size; - bool hasptr; - int *offsets; -} hl_enum_construct; - -typedef struct { - const uchar *name; - int nconstructs; - hl_enum_construct *constructs; - void **global_value; -} hl_type_enum; - -struct hl_type { - hl_type_kind kind; - union { - const uchar *abs_name; - hl_type_fun *fun; - hl_type_obj *obj; - hl_type_enum *tenum; - hl_type_virtual *virt; - hl_type *tparam; - }; - void **vobj_proto; - unsigned int *mark_bits; -}; - -C_FUNCTION_BEGIN - -HL_API int hl_type_size( hl_type *t ); -#define hl_pad_size(size,t) ((t)->kind == HVOID ? 0 : ((-(size)) & (hl_type_size(t) - 1))) -HL_API int hl_pad_struct( int size, hl_type *t ); - -HL_API hl_runtime_obj *hl_get_obj_rt( hl_type *ot ); -HL_API hl_runtime_obj *hl_get_obj_proto( hl_type *ot ); -HL_API void hl_flush_proto( hl_type *ot ); -HL_API void hl_init_enum( hl_type *et, hl_module_context *m ); - -/* -------------------- VALUES ------------------------------ */ - -typedef unsigned char vbyte; - -typedef struct { - hl_type *t; -# ifndef HL_64 - int __pad; // force align on 16 bytes for double -# endif - union { - bool b; - unsigned char ui8; - unsigned short ui16; - int i; - float f; - double d; - vbyte *bytes; - void *ptr; - int64 i64; - } v; -} vdynamic; - -typedef struct { - hl_type *t; - /* fields data */ -} vobj; - -typedef struct _vvirtual vvirtual; -struct _vvirtual { - hl_type *t; - vdynamic *value; - vvirtual *next; -}; - -#define hl_vfields(v) ((void**)(((vvirtual*)(v))+1)) - -typedef struct { - hl_type *t; - hl_type *at; - int size; - int __pad; // force align on 16 bytes for double -} varray; - -typedef struct _vclosure { - hl_type *t; - void *fun; - int hasValue; -# ifdef HL_64 - int stackCount; -# endif - void *value; -} vclosure; - -typedef struct { - vclosure cl; - vclosure *wrappedFun; -} vclosure_wrapper; - -struct _hl_field_lookup { - hl_type *t; - int hashed_name; - int field_index; // negative or zero : index in methods -}; - -typedef struct { - void *ptr; - hl_type *closure; - int fid; -} hl_runtime_binding; - -struct hl_runtime_obj { - hl_type *t; - // absolute - int nfields; - int nproto; - int size; - int nmethods; - int nbindings; - bool hasPtr; - void **methods; - int *fields_indexes; - hl_runtime_binding *bindings; - hl_runtime_obj *parent; - const uchar *(*toStringFun)( vdynamic *obj ); - int (*compareFun)( vdynamic *a, vdynamic *b ); - vdynamic *(*castFun)( vdynamic *obj, hl_type *t ); - vdynamic *(*getFieldFun)( vdynamic *obj, int hfield ); - // relative - int nlookup; - int ninterfaces; - hl_field_lookup *lookup; - int *interfaces; -}; - -typedef struct { - hl_type *t; - hl_field_lookup *lookup; - char *raw_data; - void **values; - int nfields; - int raw_size; - int nvalues; - vvirtual *virtuals; -} vdynobj; - -typedef struct _venum { - hl_type *t; - int index; -} venum; - -HL_API hl_type hlt_void; -HL_API hl_type hlt_i32; -HL_API hl_type hlt_i64; -HL_API hl_type hlt_f64; -HL_API hl_type hlt_f32; -HL_API hl_type hlt_dyn; -HL_API hl_type hlt_array; -HL_API hl_type hlt_bytes; -HL_API hl_type hlt_dynobj; -HL_API hl_type hlt_bool; -HL_API hl_type hlt_abstract; - -HL_API double hl_nan( void ); -HL_API bool hl_is_dynamic( hl_type *t ); -#define hl_is_ptr(t) ((t)->kind >= HBYTES) -HL_API bool hl_same_type( hl_type *a, hl_type *b ); -HL_API bool hl_safe_cast( hl_type *t, hl_type *to ); - -#define hl_aptr(a,t) ((t*)(((varray*)(a))+1)) - -HL_API varray *hl_alloc_array( hl_type *t, int size ); -HL_API vdynamic *hl_alloc_dynamic( hl_type *t ); -HL_API vdynamic *hl_alloc_dynbool( bool b ); -HL_API vdynamic *hl_alloc_obj( hl_type *t ); -HL_API venum *hl_alloc_enum( hl_type *t, int index ); -HL_API vvirtual *hl_alloc_virtual( hl_type *t ); -HL_API vdynobj *hl_alloc_dynobj( void ); -HL_API vbyte *hl_alloc_bytes( int size ); -HL_API vbyte *hl_copy_bytes( const vbyte *byte, int size ); -HL_API int hl_utf8_length( const vbyte *s, int pos ); -HL_API int hl_from_utf8( uchar *out, int outLen, const char *str ); -HL_API char *hl_to_utf8( const uchar *bytes ); -HL_API uchar *hl_to_utf16( const char *str ); -HL_API vdynamic *hl_virtual_make_value( vvirtual *v ); -HL_API hl_obj_field *hl_obj_field_fetch( hl_type *t, int fid ); - -HL_API int hl_hash( vbyte *name ); -HL_API int hl_hash_utf8( const char *str ); // no cache -HL_API int hl_hash_gen( const uchar *name, bool cache_name ); -HL_API vbyte *hl_field_name( int hash ); - -#define hl_error(msg, ...) hl_throw(hl_alloc_strbytes(USTR(msg), ## __VA_ARGS__)) - -HL_API vdynamic *hl_alloc_strbytes( const uchar *msg, ... ); -HL_API void hl_assert( void ); -HL_API HL_NO_RETURN( void hl_throw( vdynamic *v ) ); -HL_API HL_NO_RETURN( void hl_rethrow( vdynamic *v ) ); -HL_API HL_NO_RETURN( void hl_null_access( void ) ); -HL_API void hl_setup_longjump( void *j ); -HL_API void hl_setup_exception( void *resolve_symbol, void *capture_stack ); -HL_API void hl_dump_stack( void ); -HL_API varray *hl_exception_stack( void ); -HL_API bool hl_detect_debugger( void ); - -HL_API vvirtual *hl_to_virtual( hl_type *vt, vdynamic *obj ); -HL_API void hl_init_virtual( hl_type *vt, hl_module_context *ctx ); -HL_API hl_field_lookup *hl_lookup_find( hl_field_lookup *l, int size, int hash ); -HL_API hl_field_lookup *hl_lookup_insert( hl_field_lookup *l, int size, int hash, hl_type *t, int index ); - -HL_API int hl_dyn_geti( vdynamic *d, int hfield, hl_type *t ); -HL_API void *hl_dyn_getp( vdynamic *d, int hfield, hl_type *t ); -HL_API float hl_dyn_getf( vdynamic *d, int hfield ); -HL_API double hl_dyn_getd( vdynamic *d, int hfield ); - -HL_API int hl_dyn_casti( void *data, hl_type *t, hl_type *to ); -HL_API void *hl_dyn_castp( void *data, hl_type *t, hl_type *to ); -HL_API float hl_dyn_castf( void *data, hl_type *t ); -HL_API double hl_dyn_castd( void *data, hl_type *t ); - -#define hl_invalid_comparison 0xAABBCCDD -HL_API int hl_dyn_compare( vdynamic *a, vdynamic *b ); -HL_API vdynamic *hl_make_dyn( void *data, hl_type *t ); -HL_API void hl_write_dyn( void *data, hl_type *t, vdynamic *v, bool is_tmp ); - -HL_API void hl_dyn_seti( vdynamic *d, int hfield, hl_type *t, int value ); -HL_API void hl_dyn_setp( vdynamic *d, int hfield, hl_type *t, void *ptr ); -HL_API void hl_dyn_setf( vdynamic *d, int hfield, float f ); -HL_API void hl_dyn_setd( vdynamic *d, int hfield, double v ); - -typedef enum { - OpAdd, - OpSub, - OpMul, - OpMod, - OpDiv, - OpShl, - OpShr, - OpUShr, - OpAnd, - OpOr, - OpXor, - OpLast -} DynOp; -HL_API vdynamic *hl_dyn_op( int op, vdynamic *a, vdynamic *b ); - -HL_API vclosure *hl_alloc_closure_void( hl_type *t, void *fvalue ); -HL_API vclosure *hl_alloc_closure_ptr( hl_type *fullt, void *fvalue, void *ptr ); -HL_API vclosure *hl_make_fun_wrapper( vclosure *c, hl_type *to ); -HL_API void *hl_wrapper_call( void *value, void **args, vdynamic *ret ); -HL_API void *hl_dyn_call_obj( vdynamic *obj, hl_type *ft, int hfield, void **args, vdynamic *ret ); -HL_API vdynamic *hl_dyn_call( vclosure *c, vdynamic **args, int nargs ); -HL_API vdynamic *hl_dyn_call_safe( vclosure *c, vdynamic **args, int nargs, bool *isException ); - -/* - These macros should be only used when the closure `cl` has been type checked beforehand - so you are sure it's of the used typed. Otherwise use hl_dyn_call -*/ -#define hl_call0(ret,cl) \ - (cl->hasValue ? ((ret(*)(vdynamic*))cl->fun)(cl->value) : ((ret(*)())cl->fun)()) -#define hl_call1(ret,cl,t,v) \ - (cl->hasValue ? ((ret(*)(vdynamic*,t))cl->fun)(cl->value,v) : ((ret(*)(t))cl->fun)(v)) -#define hl_call2(ret,cl,t1,v1,t2,v2) \ - (cl->hasValue ? ((ret(*)(vdynamic*,t1,t2))cl->fun)(cl->value,v1,v2) : ((ret(*)(t1,t2))cl->fun)(v1,v2)) -#define hl_call3(ret,cl,t1,v1,t2,v2,t3,v3) \ - (cl->hasValue ? ((ret(*)(vdynamic*,t1,t2,t3))cl->fun)(cl->value,v1,v2,v3) : ((ret(*)(t1,t2,t3))cl->fun)(v1,v2,v3)) -#define hl_call4(ret,cl,t1,v1,t2,v2,t3,v3,t4,v4) \ - (cl->hasValue ? ((ret(*)(vdynamic*,t1,t2,t3,t4))cl->fun)(cl->value,v1,v2,v3,v4) : ((ret(*)(t1,t2,t3,t4))cl->fun)(v1,v2,v3,v4)) - -// ----------------------- THREADS -------------------------------------------------- - -struct _hl_thread; -struct _hl_mutex; -struct _hl_semaphore; -struct _hl_condition; -struct _hl_tls; -typedef struct _hl_thread hl_thread; -typedef struct _hl_mutex hl_mutex; -typedef struct _hl_semaphore hl_semaphore; -typedef struct _hl_condition hl_condition; -typedef struct _hl_tls hl_tls; - -HL_API hl_thread *hl_thread_start( void *callback, void *param, bool withGC ); -HL_API hl_thread *hl_thread_current( void ); -HL_API void hl_thread_yield(void); -HL_API void hl_register_thread( void *stack_top ); -HL_API void hl_unregister_thread( void ); - -HL_API hl_mutex *hl_mutex_alloc( bool gc_thread ); -HL_API void hl_mutex_acquire( hl_mutex *l ); -HL_API bool hl_mutex_try_acquire( hl_mutex *l ); -HL_API void hl_mutex_release( hl_mutex *l ); -HL_API void hl_mutex_free( hl_mutex *l ); - -HL_API hl_semaphore *hl_semaphore_alloc(int value); -HL_API void hl_semaphore_acquire(hl_semaphore *sem); -HL_API bool hl_semaphore_try_acquire(hl_semaphore *sem, vdynamic *timeout); -HL_API void hl_semaphore_release(hl_semaphore *sem); -HL_API void hl_semaphore_free(hl_semaphore *sem); - -HL_API hl_condition *hl_condition_alloc(); -HL_API void hl_condition_acquire(hl_condition *cond); -HL_API bool hl_condition_try_acquire(hl_condition *cond); -HL_API void hl_condition_release(hl_condition *cond); -HL_API void hl_condition_wait(hl_condition *cond); -HL_API bool hl_condition_timed_wait(hl_condition *cond, double timeout); -HL_API void hl_condition_signal(hl_condition *cond); -HL_API void hl_condition_broadcast(hl_condition *cond); -HL_API void hl_condition_free(hl_condition *cond); - -HL_API hl_tls *hl_tls_alloc( bool gc_value ); -HL_API void hl_tls_set( hl_tls *l, void *value ); -HL_API void *hl_tls_get( hl_tls *l ); -HL_API void hl_tls_free( hl_tls *l ); - -// ----------------------- ALLOC -------------------------------------------------- - -#define MEM_HAS_PTR(kind) (!((kind)&2)) -#define MEM_KIND_DYNAMIC 0 -#define MEM_KIND_RAW 1 -#define MEM_KIND_NOPTR 2 -#define MEM_KIND_FINALIZER 3 -#define MEM_ALIGN_DOUBLE 128 -#define MEM_ZERO 256 - -HL_API void *hl_gc_alloc_gen( hl_type *t, int size, int flags ); -HL_API void hl_add_root( void *ptr ); -HL_API void hl_remove_root( void *ptr ); -HL_API void hl_gc_major( void ); -HL_API bool hl_is_gc_ptr( void *ptr ); - -HL_API void hl_blocking( bool b ); -HL_API bool hl_is_blocking( void ); - -typedef void (*hl_types_dump)( void (*)( void *, int) ); -HL_API void hl_gc_set_dump_types( hl_types_dump tdump ); - -#define hl_gc_alloc_noptr(size) hl_gc_alloc_gen(&hlt_bytes,size,MEM_KIND_NOPTR) -#define hl_gc_alloc(t,size) hl_gc_alloc_gen(t,size,MEM_KIND_DYNAMIC) -#define hl_gc_alloc_raw(size) hl_gc_alloc_gen(&hlt_abstract,size,MEM_KIND_RAW) -#define hl_gc_alloc_finalizer(size) hl_gc_alloc_gen(&hlt_abstract,size,MEM_KIND_FINALIZER) - -HL_API void hl_alloc_init( hl_alloc *a ); -HL_API void *hl_malloc( hl_alloc *a, int size ); -HL_API void *hl_zalloc( hl_alloc *a, int size ); -HL_API void hl_free( hl_alloc *a ); - -HL_API void hl_global_init( void ); -HL_API void hl_global_free( void ); - -HL_API void *hl_alloc_executable_memory( int size ); -HL_API void hl_free_executable_memory( void *ptr, int size ); - -// ----------------------- BUFFER -------------------------------------------------- - -typedef struct hl_buffer hl_buffer; - -HL_API hl_buffer *hl_alloc_buffer( void ); -HL_API void hl_buffer_val( hl_buffer *b, vdynamic *v ); -HL_API void hl_buffer_char( hl_buffer *b, uchar c ); -HL_API void hl_buffer_str( hl_buffer *b, const uchar *str ); -HL_API void hl_buffer_cstr( hl_buffer *b, const char *str ); -HL_API void hl_buffer_str_sub( hl_buffer *b, const uchar *str, int len ); -HL_API int hl_buffer_length( hl_buffer *b ); -HL_API uchar *hl_buffer_content( hl_buffer *b, int *len ); -HL_API uchar *hl_to_string( vdynamic *v ); -HL_API const uchar *hl_type_str( hl_type *t ); -HL_API void hl_throw_buffer( hl_buffer *b ); - -// ----------------------- FFI ------------------------------------------------------ - -// match GNU C++ mangling -#define TYPE_STR "vcsilfdbBDPOATR??X?N?S" - -#undef _VOID -#define _NO_ARG -#define _VOID "v" -#define _I8 "c" -#define _I16 "s" -#define _I32 "i" -#define _I64 "l" -#define _F32 "f" -#define _F64 "d" -#define _BOOL "b" -#define _BYTES "B" -#define _DYN "D" -#define _FUN(t, args) "P" args "_" t -#define _OBJ(fields) "O" fields "_" -#define _ARR "A" -#define _TYPE "T" -#define _REF(t) "R" t -#define _ABSTRACT(name) "X" #name "_" -#undef _NULL -#define _NULL(t) "N" t -#define _STRUCT "S" - -#undef _STRING -#define _STRING _OBJ(_BYTES _I32) - -typedef struct { - hl_type *t; - uchar *bytes; - int length; -} vstring; - -// this macro has been renamed from DEFINE_PRIM to DEFINE_HL_PRIM, because DEFINE_PRIM is already used -#define DEFINE_HL_PRIM(t,name,args) DEFINE_PRIM_WITH_NAME(t,name,args,name) -#define _DEFINE_PRIM_WITH_NAME(t,name,args,realName) C_FUNCTION_BEGIN EXPORT void *hlp_##realName( const char **sign ) { *sign = _FUN(t,args); return (void*)(&HL_NAME(name)); } C_FUNCTION_END - -#if !defined(HL_NAME) -# define HL_NAME(p) p -# ifdef LIBHL_EXPORTS -# define HL_PRIM EXPORT -# undef DEFINE_PRIM -# define DEFINE_PRIM(t,name,args) _DEFINE_PRIM_WITH_NAME(t,hl_##name,args,name) -# define DEFINE_PRIM_WITH_NAME _DEFINE_PRIM_WITH_NAME -# else -# define HL_PRIM -# define DEFINE_PRIM_WITH_NAME(t,name,args,realName) -# endif -#elif defined(LIBHL_STATIC) -# ifdef __cplusplus -# define HL_PRIM extern "C" -# else -# define HL_PRIM -# endif -#define DEFINE_PRIM_WITH_NAME(t,name,args,realName) -#else -# ifdef __cplusplus -# define HL_PRIM extern "C" EXPORT -# else -# define HL_PRIM EXPORT -# endif -# define DEFINE_PRIM_WITH_NAME _DEFINE_PRIM_WITH_NAME -#endif - -#if defined(HL_GCC) && !defined(HL_CONSOLE) -# ifdef HL_CLANG -# define HL_NO_OPT __attribute__ ((optnone)) -# else -# define HL_NO_OPT __attribute__((optimize("-O0"))) -# endif -#else -# define HL_NO_OPT -#endif - -// -------------- EXTRA ------------------------------------ - -#define hl_fatal(msg) hl_fatal_error(msg,__FILE__,__LINE__) -#define hl_fatal1(msg,p0) hl_fatal_fmt(__FILE__,__LINE__,msg,p0) -#define hl_fatal2(msg,p0,p1) hl_fatal_fmt(__FILE__,__LINE__,msg,p0,p1) -#define hl_fatal3(msg,p0,p1,p2) hl_fatal_fmt(__FILE__,__LINE__,msg,p0,p1,p2) -#define hl_fatal4(msg,p0,p1,p2,p3) hl_fatal_fmt(__FILE__,__LINE__,msg,p0,p1,p2,p3) -HL_API void *hl_fatal_error( const char *msg, const char *file, int line ); -HL_API void hl_fatal_fmt( const char *file, int line, const char *fmt, ...); -HL_API void hl_sys_init(void **args, int nargs, void *hlfile); -HL_API void hl_setup_callbacks(void *sc, void *gw); -HL_API void hl_setup_callbacks2(void *sc, void *gw, int flags); -HL_API void hl_setup_reload_check( void *freload, void *param ); - -#include -typedef struct _hl_trap_ctx hl_trap_ctx; -struct _hl_trap_ctx { - jmp_buf buf; - hl_trap_ctx *prev; - vdynamic *tcheck; -}; -#define hl_trap(ctx,r,label) { hl_thread_info *__tinf = hl_get_thread(); ctx.tcheck = NULL; ctx.prev = __tinf->trap_current; __tinf->trap_current = &ctx; if( setjmp(ctx.buf) ) { r = __tinf->exc_value; goto label; } } -#define hl_endtrap(ctx) hl_get_thread()->trap_current = ctx.prev - -#define HL_EXC_MAX_STACK 0x100 -#define HL_EXC_RETHROW 1 -#define HL_EXC_CATCH_ALL 2 -#define HL_EXC_IS_THROW 4 -#define HL_THREAD_INVISIBLE 16 -#define HL_THREAD_PROFILER_PAUSED 32 -#define HL_TREAD_TRACK_SHIFT 16 - -#define HL_TRACK_ALLOC 1 -#define HL_TRACK_CAST 2 -#define HL_TRACK_DYNFIELD 4 -#define HL_TRACK_DYNCALL 8 -#define HL_TRACK_MASK (HL_TRACK_ALLOC | HL_TRACK_CAST | HL_TRACK_DYNFIELD | HL_TRACK_DYNCALL) - -#define HL_MAX_EXTRA_STACK 64 - -typedef struct { - int thread_id; - // gc vars - volatile int gc_blocking; - void *stack_top; - void *stack_cur; - // exception handling - hl_trap_ctx *trap_current; - hl_trap_ctx *trap_uncaught; - vclosure *exc_handler; - vdynamic *exc_value; - int flags; - int exc_stack_count; - // extra - jmp_buf gc_regs; - void *exc_stack_trace[HL_EXC_MAX_STACK]; - void *extra_stack_data[HL_MAX_EXTRA_STACK]; - int extra_stack_size; -} hl_thread_info; - -HL_API hl_thread_info *hl_get_thread(); - -#ifdef HL_TRACK_ENABLE - -typedef struct { - int flags; - void (*on_alloc)(hl_type *,int,int,void*); - void (*on_cast)(hl_type *, hl_type*); - void (*on_dynfield)( vdynamic *, int ); - void (*on_dyncall)( vdynamic *, int ); -} hl_track_info; - -#define hl_is_tracking(flag) ((hl_track.flags&(flag)) && (hl_get_thread()->flags & (flag< +#undef DEFINE_PRIM +#define DEFINE_HL_PRIM(t, name, args) DEFINE_PRIM_WITH_NAME(t, name, args, name) typedef vdynamic hl_vdynamic; typedef vobj hl_vobj; diff --git a/project/lib/hashlink b/project/lib/hashlink new file mode 160000 index 0000000000..a23b60636d --- /dev/null +++ b/project/lib/hashlink @@ -0,0 +1 @@ +Subproject commit a23b60636df7c916c58c17b4f38ab60b5f6b2b90 diff --git a/tools/platforms/LinuxPlatform.hx b/tools/platforms/LinuxPlatform.hx index 7c7a11622f..1228d3e617 100644 --- a/tools/platforms/LinuxPlatform.hx +++ b/tools/platforms/LinuxPlatform.hx @@ -334,6 +334,10 @@ class LinuxPlatform extends PlatformTarget } } + if(targetFlags.exists("hl")) { + CPPHelper.rebuild(project, commands, null, "BuildHashlink.xml"); + } + CPPHelper.rebuild(project, commands); } diff --git a/tools/platforms/MacPlatform.hx b/tools/platforms/MacPlatform.hx index 59f8dcf19f..678950f657 100644 --- a/tools/platforms/MacPlatform.hx +++ b/tools/platforms/MacPlatform.hx @@ -296,6 +296,11 @@ class MacPlatform extends PlatformTarget } } + if (targetFlags.exists("hl")) + { + CPPHelper.rebuild(project, commands, null, "BuildHashlink.xml"); + } + CPPHelper.rebuild(project, commands); } diff --git a/tools/platforms/WindowsPlatform.hx b/tools/platforms/WindowsPlatform.hx index e466670a83..68fff2f2da 100644 --- a/tools/platforms/WindowsPlatform.hx +++ b/tools/platforms/WindowsPlatform.hx @@ -593,6 +593,11 @@ class WindowsPlatform extends PlatformTarget } } + if (targetFlags.exists("hl")) + { + CPPHelper.rebuild(project, commands, null, "BuildHashlink.xml"); + } + CPPHelper.rebuild(project, commands); } }