416 lines
11 KiB
C
416 lines
11 KiB
C
|
#ifndef HXCPP_H
|
||
|
#define HXCPP_H
|
||
|
|
||
|
#include <kinc/global.h>
|
||
|
|
||
|
#ifdef __clang__
|
||
|
#pragma clang diagnostic ignored "-Wunused-variable"
|
||
|
#pragma clang diagnostic ignored "-Wunused-value"
|
||
|
#pragma clang diagnostic ignored "-Wunreachable-code"
|
||
|
#pragma clang diagnostic ignored "-Wshorten-64-to-32"
|
||
|
#pragma clang diagnostic ignored "-Winvalid-offsetof"
|
||
|
#pragma clang diagnostic ignored "-Wparentheses-equality"
|
||
|
#pragma clang diagnostic ignored "-Wconditional-uninitialized"
|
||
|
#pragma clang diagnostic ignored "-Wreorder"
|
||
|
#pragma clang diagnostic ignored "-Wself-assign"
|
||
|
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast"
|
||
|
#pragma clang diagnostic ignored "-Woverloaded-virtual"
|
||
|
#pragma clang diagnostic ignored "-Wsometimes-uninitialized"
|
||
|
#else
|
||
|
#pragma warning(disable : 4018 4101 4146 4244 4305 4127 4100 4267 4389 4201 4312 4244 4996 4457 4458 4189 4701 4702)
|
||
|
#endif
|
||
|
|
||
|
// Standard headers ....
|
||
|
#include <limits>
|
||
|
|
||
|
// Windows hack
|
||
|
#define NOMINMAX
|
||
|
|
||
|
#ifndef HXCPP_API_LEVEL
|
||
|
#define HXCPP_API_LEVEL 0
|
||
|
#endif
|
||
|
|
||
|
#include "hx/HeaderVersion.h"
|
||
|
|
||
|
#if defined(_MSC_VER) || defined(__BORLANDC__)
|
||
|
#if _MSC_VER >= 1423
|
||
|
#include <typeinfo>
|
||
|
#else
|
||
|
#include <typeinfo.h>
|
||
|
#endif
|
||
|
#if defined(__BORLANDC__)
|
||
|
namespace hx { typedef std::type_info type_info; }
|
||
|
#else
|
||
|
namespace hx { typedef ::type_info type_info; }
|
||
|
#endif
|
||
|
#else
|
||
|
#include <typeinfo>
|
||
|
#include <stdint.h>
|
||
|
#include <cstddef>
|
||
|
namespace hx { typedef std::type_info type_info; }
|
||
|
#ifndef EMSCRIPTEN
|
||
|
using hx::type_info;
|
||
|
#ifdef __MINGW32__
|
||
|
#include <stdint.h>
|
||
|
#else
|
||
|
typedef int64_t __int64;
|
||
|
#endif
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#if defined(EMSCRIPTEN) || defined(IPHONE) || defined(APPLETV)
|
||
|
#include <unistd.h>
|
||
|
#include <cstdlib>
|
||
|
#endif
|
||
|
|
||
|
#if defined(EMSCRIPTEN)
|
||
|
#include <emscripten.h>
|
||
|
#endif
|
||
|
|
||
|
#ifdef __OBJC__
|
||
|
#ifdef HXCPP_OBJC
|
||
|
#import <Foundation/Foundation.h>
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include <string.h>
|
||
|
|
||
|
#include <wchar.h>
|
||
|
|
||
|
#ifdef HX_LINUX
|
||
|
#include <unistd.h>
|
||
|
#include <cstdio>
|
||
|
#include <stddef.h>
|
||
|
#endif
|
||
|
|
||
|
#if defined(EMSCRIPTEN) || defined(_ARM_) || defined(__arm__) || defined(GCW0)
|
||
|
#define HXCPP_ALIGN_FLOAT
|
||
|
#endif
|
||
|
|
||
|
// Must allign allocs to 8 bytes to match floating point requirement?
|
||
|
// Ints must br read on 4-byte boundary
|
||
|
#if defined(EMSCRIPTEN) || defined(GCW0)
|
||
|
#define HXCPP_ALIGN_ALLOC
|
||
|
#endif
|
||
|
|
||
|
#if defined(__LP64__) || defined(_LP64) || defined(_WIN64)
|
||
|
#if !defined(HXCPP_M64)
|
||
|
#define HXCPP_M64
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// Some compilers are over-enthusiastic about what they #define ...
|
||
|
//#ifdef NULL
|
||
|
//#undef NULL
|
||
|
//#endif
|
||
|
|
||
|
#ifdef assert
|
||
|
#undef assert
|
||
|
#endif
|
||
|
|
||
|
#define HXCPP_CLASS_ATTRIBUTES
|
||
|
|
||
|
#ifdef _MSC_VER
|
||
|
#if defined(HXCPP_DLL_IMPORT)
|
||
|
#define HXCPP_EXTERN_CLASS_ATTRIBUTES __declspec(dllimport)
|
||
|
#elif defined (HXCPP_DLL_EXPORT)
|
||
|
#define HXCPP_EXTERN_CLASS_ATTRIBUTES __declspec(dllexport)
|
||
|
#else
|
||
|
#define HXCPP_EXTERN_CLASS_ATTRIBUTES
|
||
|
#endif
|
||
|
#else
|
||
|
#if defined(HXCPP_DLL_EXPORT)
|
||
|
#define HXCPP_EXTERN_CLASS_ATTRIBUTES __attribute__((visibility("default")))
|
||
|
#else
|
||
|
#define HXCPP_EXTERN_CLASS_ATTRIBUTES
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
typedef char HX_CHAR;
|
||
|
|
||
|
|
||
|
|
||
|
#if (defined(HXCPP_DEBUG) || defined(HXCPP_DEBUGGER)) && !defined HXCPP_CHECK_POINTER
|
||
|
#define HXCPP_CHECK_POINTER
|
||
|
#endif
|
||
|
|
||
|
#ifdef HX_WINRT
|
||
|
|
||
|
#define WINRT_LOG(fmt, ...) {char buf[1024];sprintf_s(buf,1024,"****LOG: %s(%d): %s \n [" fmt "]\n",__FILE__,__LINE__,__FUNCTION__, __VA_ARGS__);OutputDebugStringA(buf);}
|
||
|
#define WINRT_PRINTF(fmt, ...) {char buf[2048];sprintf_s(buf,2048,fmt,__VA_ARGS__);OutputDebugStringA(buf);}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef BIG_ENDIAN
|
||
|
#undef BIG_ENDIAN
|
||
|
|
||
|
#ifndef HXCPP_BIG_ENDIAN
|
||
|
#define HXCPP_BIG_ENDIAN
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef __BIG_ENDIAN__
|
||
|
#ifndef HXCPP_BIG_ENDIAN
|
||
|
#define HXCPP_BIG_ENDIAN
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef LITTLE_ENDIAN
|
||
|
#undef LITTLE_ENDIAN
|
||
|
|
||
|
#ifdef HXCPP_BIG_ENDIAN
|
||
|
#undef HXCPP_BIG_ENDIAN
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef __LITTLE_ENDIAN__
|
||
|
#ifdef HXCPP_BIG_ENDIAN
|
||
|
#undef HXCPP_BIG_ENDIAN
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// HX_HCSTRING is for constant strings with built-in hashes
|
||
|
// HX_GC_CONST_ALLOC_BIT | HX_GC_STRING_HASH
|
||
|
// HX_CSTRING is for constant strings without built-in hashes
|
||
|
// HX_GC_CONST_ALLOC_BIT
|
||
|
// HX_GC_CONST_ALLOC_BIT = 0x80000000
|
||
|
// HX_GC_STRING_HASH = 0x00100000
|
||
|
// HX_GC_STRING_CHAR16_T = 0x00200000
|
||
|
|
||
|
// For making generated code easier to read
|
||
|
#define HX_HASH_JOIN(A, B) A##B
|
||
|
#define HX_JOIN_PARTS(A, B) HX_HASH_JOIN(A, B)
|
||
|
#define HX_HASH_OF(A) #A
|
||
|
#define HX_HASH_OF_W(A) HX_HASH_JOIN(u,#A)
|
||
|
#define HX_STR_QUOTE(A) HX_HASH_OF(A)
|
||
|
#define HX_STR_QUOTE_W(A) HX_HASH_OF_W(A)
|
||
|
#define HX_HEX_QUOTE(hex) HX_STR_QUOTE(HX_JOIN_PARTS(\x,hex))
|
||
|
#define HX_HEX_QUOTE_W(hex) HX_STR_QUOTE_W(HX_JOIN_PARTS(\x,hex))
|
||
|
|
||
|
#ifdef HXCPP_BIG_ENDIAN
|
||
|
|
||
|
#define HX_HCSTRING(s,h0,h1,h2,h3) ::String( const_cast<char *>((h3 h2 h1 h0 "\x80\x10\x00\x00" s)) + 8 , sizeof(s)/sizeof(char)-1)
|
||
|
#define HX_(s,h0,h1,h2,h3) ::String( const_cast<char *>(( HX_HEX_QUOTE(h3) HX_HEX_QUOTE(h2) HX_HEX_QUOTE(h1) HX_HEX_QUOTE(h0) "\x80\x10\x00\x00" s )) + 8 , sizeof(s)/sizeof(char)-1)
|
||
|
#define HX_STRINGI(s,len) ::String( const_cast<char *>(("\x80\x00\x00\x00" s)) + 4 ,len)
|
||
|
#define HX_W(s,h0,h1) ::String( const_cast<char16_t *>(( HX_HEX_QUOTE_W(h1) HX_HEX_QUOTE_W(h0) u"\x8030\x0000" s )) + 4, sizeof(s)/2-1)
|
||
|
|
||
|
#else
|
||
|
|
||
|
#define HX_HCSTRING(s,h0,h1,h2,h3) ::String( const_cast<char *>((h0 h1 h2 h3 "\x00\x00\x10\x80" s )) + 8 , sizeof(s)/sizeof(char)-1)
|
||
|
#define HX_(s,h0,h1,h2,h3) ::String( const_cast<char *>(( HX_HEX_QUOTE(h0) HX_HEX_QUOTE(h1) HX_HEX_QUOTE(h2) HX_HEX_QUOTE(h3) "\x00\x00\x10\x80" s )) + 8 , sizeof(s)/sizeof(char)-1)
|
||
|
#define HX_STRINGI(s,len) ::String( const_cast<char *>(("\x00\x00\x0\x80" s)) + 4 ,len)
|
||
|
|
||
|
#define HX_W(s,h0,h1) ::String( const_cast<char16_t *>(( HX_HEX_QUOTE_W(h0) HX_HEX_QUOTE_W(h1) u"\x0000\x8030" s )) + 4, sizeof(s)/2-1)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define HX_STRI(s) HX_STRINGI(s,sizeof(s)/sizeof(char)-1)
|
||
|
#define HX_CSTRING(x) HX_STRI(x)
|
||
|
#define HX_CSTRING2(wide,len,utf8) HX_STRI(utf8)
|
||
|
|
||
|
#ifdef HX_SMART_STRINGS
|
||
|
#define HX_FIELD_EQ(name,field) (name.isAsciiEncoded() && !::memcmp(name.raw_ptr(), field, sizeof(field)/sizeof(char)))
|
||
|
// No null check is performedd...
|
||
|
#define HX_QSTR_EQ(name,field) (name.length==field.length && field.isAsciiEncodedQ() && !::memcmp(name.raw_ptr(), field.raw_ptr() , field.length) )
|
||
|
// field is known to be isAsciiEncodedQ
|
||
|
#define HX_QSTR_EQ_AE(name,field) (name.length==field.length && !::memcmp(name.raw_ptr(), field.raw_ptr() , field.length) )
|
||
|
#else
|
||
|
#define HX_FIELD_EQ(name,field) !::memcmp(name.__s, field, sizeof(field)/sizeof(char))
|
||
|
// No null check is performed....
|
||
|
#define HX_QSTR_EQ(name,field) (name.length==field.length && !::memcmp(name.__s, field.__s, field.length))
|
||
|
#define HX_QSTR_EQ_AE(name,field) (name.length==field.length && !::memcmp(name.__s, field.__s, field.length))
|
||
|
#endif
|
||
|
|
||
|
#if defined(_MSC_VER)
|
||
|
|
||
|
|
||
|
#pragma warning(disable:4251)
|
||
|
#pragma warning(disable:4800)
|
||
|
#endif
|
||
|
|
||
|
#if defined(_MSC_VER) && _MSC_VER < 1201
|
||
|
#error MSVC 7.1 does not support template specialization and is not supported by HXCPP
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// HXCPP includes...
|
||
|
|
||
|
// Basic mapping from haxe -> c++
|
||
|
#if (HXCPP_API_LEVEL<=330)
|
||
|
typedef int Int;
|
||
|
typedef bool Bool;
|
||
|
#endif
|
||
|
|
||
|
#ifdef HXCPP_FLOAT32
|
||
|
typedef float Float;
|
||
|
#else
|
||
|
typedef double Float;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// Extended mapping - cpp namespace
|
||
|
namespace cpp
|
||
|
{
|
||
|
typedef signed char Int8;
|
||
|
typedef unsigned char UInt8;
|
||
|
typedef char Char;
|
||
|
typedef signed short Int16;
|
||
|
typedef unsigned short UInt16;
|
||
|
typedef signed int Int32;
|
||
|
typedef unsigned int UInt32;
|
||
|
#ifdef _WIN32
|
||
|
typedef __int64 Int64;
|
||
|
typedef unsigned __int64 UInt64;
|
||
|
// TODO - EMSCRIPTEN?
|
||
|
#else
|
||
|
typedef int64_t Int64;
|
||
|
typedef uint64_t UInt64;
|
||
|
#endif
|
||
|
typedef float Float32;
|
||
|
typedef double Float64;
|
||
|
typedef volatile int AtomicInt;
|
||
|
};
|
||
|
// Extended mapping - old way
|
||
|
namespace haxe { namespace io { typedef unsigned char Unsigned_char__; } }
|
||
|
|
||
|
// --- Forward decalarations --------------------------------------------
|
||
|
|
||
|
class null;
|
||
|
namespace hx { class Object; }
|
||
|
namespace hx { class FieldRef; }
|
||
|
namespace hx { class IndexRef; }
|
||
|
namespace hx { class NativeInterface; }
|
||
|
namespace hx { struct StackContext; }
|
||
|
namespace hx { template<typename T> class Native; }
|
||
|
namespace hx { template<typename O> class ObjectPtr; }
|
||
|
namespace cpp { template<typename S,typename H> class Struct; }
|
||
|
namespace cpp { template<typename T> class Pointer; }
|
||
|
namespace cpp { template<typename T> class Function; }
|
||
|
template<typename ELEM_> class Array_obj;
|
||
|
template<typename ELEM_> class Array;
|
||
|
namespace hx {
|
||
|
class Class_obj;
|
||
|
typedef hx::ObjectPtr<hx::Class_obj> Class;
|
||
|
}
|
||
|
namespace cpp {
|
||
|
struct Variant;
|
||
|
class VirtualArray_obj;
|
||
|
class VirtualArray;
|
||
|
class CppInt32__;
|
||
|
}
|
||
|
|
||
|
|
||
|
#if (HXCPP_API_LEVEL < 320) && !defined(__OBJC__)
|
||
|
typedef hx::Class Class;
|
||
|
typedef hx::Class_obj Class_obj;
|
||
|
#endif
|
||
|
|
||
|
class Dynamic;
|
||
|
class String;
|
||
|
|
||
|
// Use an external routine to throw to avoid sjlj overhead on iphone.
|
||
|
namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES Dynamic Throw(Dynamic inDynamic); }
|
||
|
namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES Dynamic Rethrow(Dynamic inDynamic); }
|
||
|
namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES void CriticalError(const String &inError, bool inAllowFixup=false); }
|
||
|
namespace hx { HXCPP_EXTERN_CLASS_ATTRIBUTES void NullReference(const char *type, bool allowFixup); }
|
||
|
namespace hx { extern String sNone[]; }
|
||
|
void __hxcpp_check_overflow(int inVal);
|
||
|
|
||
|
namespace hx
|
||
|
{
|
||
|
class MarkContext;
|
||
|
|
||
|
|
||
|
class VisitContext
|
||
|
{
|
||
|
public:
|
||
|
virtual void visitObject(hx::Object **ioPtr)=0;
|
||
|
virtual void visitAlloc(void **ioPtr)=0;
|
||
|
};
|
||
|
|
||
|
#if (HXCPP_API_LEVEL >= 330)
|
||
|
typedef ::cpp::Variant Val;
|
||
|
#else
|
||
|
typedef ::Dynamic Val;
|
||
|
#endif
|
||
|
|
||
|
#ifdef HXCPP_GC_GENERATIONAL
|
||
|
#define HXCPP_GC_NURSERY
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//#define HXCPP_COMBINE_STRINGS
|
||
|
|
||
|
#if (HXCPP_API_LEVEL >= 313)
|
||
|
enum PropertyAccessMode
|
||
|
{
|
||
|
paccNever = 0,
|
||
|
paccDynamic = 1,
|
||
|
paccAlways = 2,
|
||
|
};
|
||
|
typedef PropertyAccessMode PropertyAccess;
|
||
|
#define HX_PROP_NEVER hx::paccNever
|
||
|
#define HX_PROP_DYNAMIC hx::paccDynamic
|
||
|
#define HX_PROP_ALWAYS hx::paccAlways
|
||
|
#else
|
||
|
typedef bool PropertyAccess;
|
||
|
#define HX_PROP_NEVER false
|
||
|
#define HX_PROP_DYNAMIC true
|
||
|
#define HX_PROP_ALWAYS true
|
||
|
#endif
|
||
|
|
||
|
} // end namespace hx
|
||
|
|
||
|
#define HX_COMMA ,
|
||
|
|
||
|
|
||
|
// The order of these includes has been chosen to minimize forward declarations.
|
||
|
// You should not include the individual files, just this one.
|
||
|
|
||
|
// First time ...
|
||
|
#include <hx/Macros.h>
|
||
|
#include <cpp/Variant.h>
|
||
|
#include <hx/ErrorCodes.h>
|
||
|
#include <hx/GC.h>
|
||
|
#include <hx/StackContext.h>
|
||
|
#include "null.h"
|
||
|
#include <hx/Object.h>
|
||
|
#include "hxString.h"
|
||
|
#include "Dynamic.h"
|
||
|
#include <cpp/CppInt32__.h>
|
||
|
// This needs to "see" other declarations ...
|
||
|
#include <hx/GcTypeInference.h>
|
||
|
#include <hx/FieldRef.h>
|
||
|
#include "Array.h"
|
||
|
#include <hx/Anon.h>
|
||
|
#include <hx/Class.h>
|
||
|
#include "Enum.h"
|
||
|
#include <hx/Interface.h>
|
||
|
#include <hx/Telemetry.h>
|
||
|
#if defined(__OBJC__) && defined(HXCPP_OBJC)
|
||
|
#include <hx/ObjcHelpers.h>
|
||
|
#endif
|
||
|
#include <hx/StdLibs.h>
|
||
|
#include <cpp/Pointer.h>
|
||
|
#include <hx/Native.h>
|
||
|
#include <hx/Operators.h>
|
||
|
#include <hx/Functions.h>
|
||
|
// second time ...
|
||
|
#include <cpp/Variant.h>
|
||
|
#include <hx/Debug.h>
|
||
|
#include <hx/Boot.h>
|
||
|
#include <hx/Undefine.h>
|
||
|
#if (HXCPP_API_LEVEL>=330)
|
||
|
#include <hx/LessThanEq.h>
|
||
|
#else
|
||
|
#include <cpp/Int64.h>
|
||
|
#endif
|
||
|
|
||
|
#endif
|
||
|
|