1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
|
/*
AngelCode Scripting Library
Copyright (c) 2003-2021 Andreas Jonsson
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any
damages arising from the use of this software.
Permission is granted to anyone to use this software for any
purpose, including commercial applications, and to alter it and
redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you
must not claim that you wrote the original software. If you use
this software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and
must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
The original version of this library can be located at:
http://www.angelcode.com/angelscript/
Andreas Jonsson
andreas@angelcode.com
*/
//
// as_config.h
//
// this file is used for configuring the compilation of the library
//
#ifndef AS_CONFIG_H
#define AS_CONFIG_H
//
// Features
//-----------------------------------------
#define AS_NO_THREADS
// Turns off support for multithreading. By turning off
// this when it's not needed a bit of performance is gained.
// AS_WINDOWS_THREADS
// If the library should be compiled using windows threads.
// AS_POSIX_THREADS
// If the library should be compiled using posix threads.
// AS_NO_ATOMIC
// If the compiler/platform doesn't support atomic instructions
// then this should be defined to use critical sections instead.
// AS_DEBUG
// This flag can be defined to make the library write some extra output when
// compiling and executing scripts.
// AS_DEPRECATED
// If this flag is defined then some backwards compatibility is maintained.
// There is no guarantee for how well deprecated functionality will work though
// so it is best to exchange it for the new functionality as soon as possible.
#define AS_NO_CLASS_METHODS
// Disables the possibility to add class methods. Can increase the
// portability of the library.
#define AS_MAX_PORTABILITY
// Disables all platform specific code. Only the asCALL_GENERIC calling
// convention will be available in with this flag set.
// AS_DOUBLEBYTE_CHARSET
// When this flag is defined, the parser will treat all characters in strings
// that are greater than 127 as lead characters and automatically include the
// next character in the script without checking its value. This should be
// compatible with common encoding schemes, e.g. Big5. Shift-JIS is not compatible
// though as it encodes some single byte characters above 127.
//
// If support for international text is desired, it is recommended that UTF-8
// is used as this is supported natively by the compiler without the use for this
// preprocessor flag.
// AS_NO_COMPILER
// Compiles the library without support for compiling scripts. This is intended
// for those applications that will load pre-compiled bytecode and wants to decrease
// the size of the executable.
#define AS_NO_EXCEPTIONS
// Define this if exception handling is turned off or not available on the target platform.
// AS_NO_MEMBER_INIT
// Disable the support for initialization of class members directly in the declaration.
// This was as a form to maintain backwards compatibility with versions before 2.26.0
// if the new order of the member initialization caused null pointer exceptions in older
// scripts (e.g. if a base class accessed members of a derived class through a virtual method).
// AS_USE_NAMESPACE
// Adds the AngelScript namespace on the declarations.
//
// Library usage
//------------------------------------------
// ANGELSCRIPT_EXPORT
// This flag should be defined when compiling the library as a lib or dll.
// ANGELSCRIPT_DLL_LIBRARY_IMPORT
// This flag should be defined when using AngelScript as a dll with automatic
// library import.
// ANGELSCRIPT_DLL_MANUAL_IMPORT
// This flag should be defined when using AngelScript as a dll with manual
// loading of the library.
//
// Compiler differences
//-----------------------------------------
// asVSNPRINTF(a,b,c,d)
// Some compilers use different names for this function. You must
// define this macro to map to the proper function.
// ASM_AT_N_T or ASM_INTEL
// You should choose what inline assembly syntax to use when compiling.
// VALUE_OF_BOOLEAN_TRUE
// This flag allows to customize the exact value of boolean true.
// AS_SIZEOF_BOOL
// On some target platforms the sizeof(bool) is 4, but on most it is 1.
// STDCALL
// This is used to declare a function to use the stdcall calling convention.
// AS_NO_MEMORY_H
// Some compilers don't come with the memory.h header file.
// AS_NO_THISCALL_FUNCTOR_METHOD
// Defined if the support for functor methods hasn't been implemented on the platform.
//
// How to identify different compilers
//-----------------------------------------
// Ref: http://nadeausoftware.com/articles/2012/10/c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros
// MS Visual C++
// _MSC_VER is defined
// __MWERKS__ is not defined
// Metrowerks
// _MSC_VER is defined
// __MWERKS__ is defined
// GNU C based compilers
// __GNUC__ is defined
// CLang/LLVM
// __clang__ is defined
// Embarcadero C++Builder
// __BORLANDC__ is defined
// Oracle Solaris Studio (previously known as Sun CC compiler)
// __SUNPRO_CC is defined
// Local (or Little) C Compiler
// __LCC__ is defined
// __e2k__ is not defined
// MCST eLbrus C Compiler
// __LCC__ is defined
// __e2k__ is defined
//
// CPU differences
//---------------------------------------
// AS_USE_DOUBLE_AS_FLOAT
// If there is no 64 bit floating point type, then this constant can be defined
// to treat double like normal floats.
// AS_X86
// Use assembler code for the x86 CPU family
// AS_SH4
// Use assembler code for the SH4 CPU family
// AS_MIPS
// Use assembler code for the MIPS CPU family
// AS_PPC
// Use assembler code for the 32bit PowerPC CPU family
// AS_PPC_64
// Use assembler code for the 64bit PowerPC CPU family
// AS_XENON
// Use assembler code for the Xenon (XBOX360) CPU family
// AS_ARM
// Use assembler code for the ARM CPU family
// AS_ARM64
// Use assembler code for the ARM64/AArch64 CPU family
// AS_SOFTFP
// Use to tell compiler that ARM soft-float ABI
// should be used instead of ARM hard-float ABI
// AS_X64_GCC
// Use GCC assembler code for the X64 AMD/Intel CPU family
// AS_X64_MSVC
// Use MSVC assembler code for the X64 AMD/Intel CPU family
// AS_64BIT_PTR
// Define this to make the engine store all pointers in 64bit words.
// AS_BIG_ENDIAN
// Define this for CPUs that use big endian memory layout, e.g. PPC
// AS_SPARC
// Define this for SPARC CPU family
// AS_E2K
// Define this for MCST Elbrus 2000 CPU family
//
// Target systems
//--------------------------------
// This group shows a few of the flags used to identify different target systems.
// Sometimes there are differences on different target systems, while both CPU and
// compiler is the same for both, when this is so these flags are used to produce the
// right code.
// AS_WIN - Microsoft Windows
// AS_LINUX - Linux
// AS_MAC - Apple Macintosh
// AS_BSD - BSD based OS (FreeBSD, DragonFly, OpenBSD, etc)
// AS_XBOX - Microsoft XBox
// AS_XBOX360 - Microsoft XBox 360
// AS_PSP - Sony Playstation Portable
// AS_PSVITA - Sony Playstation Vita
// AS_PS2 - Sony Playstation 2
// AS_PS3 - Sony Playstation 3
// AS_DC - Sega Dreamcast
// AS_GC - Nintendo GameCube
// AS_WII - Nintendo Wii
// AS_WIIU - Nintendo Wii U
// AS_NINTENDOSWITCH - Nintendo Switch
// AS_IPHONE - Apple IPhone
// AS_ANDROID - Android
// AS_HAIKU - Haiku
// AS_ILLUMOS - Illumos like (OpenSolaris, OpenIndiana, NCP, etc)
// AS_MARMALADE - Marmalade cross platform SDK (a layer on top of the OS)
// AS_SUN - Sun UNIX
//
// Calling conventions
//-----------------------------------------
// GNU_STYLE_VIRTUAL_METHOD
// This constant should be defined if method pointers store index for virtual
// functions in the same location as the function pointer. In such cases the method
// is identified as virtual if the least significant bit is set.
// MULTI_BASE_OFFSET(x)
// This macro is used to retrieve the offset added to the object pointer in order to
// implicitly cast the object to the base object. x is the method pointer received by
// the register function.
// HAVE_VIRTUAL_BASE_OFFSET
// Define this constant if the compiler stores the virtual base offset in the method
// pointers. If it is not stored in the pointers then AngelScript have no way of
// identifying a method as coming from a class with virtual inheritance.
// VIRTUAL_BASE_OFFSET(x)
// This macro is used to retrieve the offset added to the object pointer in order to
// find the virtual base object. x is the method pointer received by the register
// function;
// COMPLEX_RETURN_MASK
// This constant shows what attributes determine if an object is returned in memory
// or in the registers as normal structures
// COMPLEX_MASK
// This constant shows what attributes determine if an object is implicitly passed
// by reference or not, even if the argument is declared by value
// THISCALL_RETURN_SIMPLE_IN_MEMORY
// CDECL_RETURN_SIMPLE_IN_MEMORY
// STDCALL_RETURN_SIMPLE_IN_MEMORY
// When these constants are defined then the corresponding calling convention always
// return classes/structs in memory regardless of size or complexity.
// THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
// STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
// CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
// Specifies the minimum size in dwords a class/struct needs to be to be passed in memory
// CALLEE_POPS_HIDDEN_RETURN_POINTER
// This constant should be defined if the callee pops the hidden return pointer,
// used when returning an object in memory.
// THISCALL_CALLEE_POPS_HIDDEN_RETURN_POINTER
// This constant should be defined if the callee pops the hidden return pointer
// for thiscall functions; used when returning an object in memory.
// THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
// With this constant defined AngelScript will pass the object pointer on the stack
// THISCALL_CALLEE_POPS_ARGUMENTS
// If the callee pops arguments for class methods then define this constant
// COMPLEX_OBJS_PASSED_BY_REF
// Some compilers always pass certain objects by reference. GNUC for example does
// this if the the class has a defined destructor.
// AS_LARGE_OBJS_PASSED_BY_REF
// If this is defined large objects are passed by reference, whether they are complex or not
// AS_LARGE_OBJ_MIN_SIZE
// This is the size of objects determined as large ones
// AS_CALLEE_DESTROY_OBJ_BY_VAL
// When an object is passed by value the called function is the one responsible
// for calling the destructor before returning.
// HAS_128_BIT_PRIMITIVES
// 64bit processors often support 128bit primitives. These may require special
// treatment when passed in function arguments or returned by functions.
// SPLIT_OBJS_BY_MEMBER_TYPES
// On some platforms objects with primitive members are split over different
// register types when passed by value to functions.
//
// Detect compiler
//------------------------------------------------
#define VALUE_OF_BOOLEAN_TRUE 1
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define THISCALL_CALLEE_POPS_HIDDEN_RETURN_POINTER
// Not implemented by default. Undefined with tested platforms.
#define AS_NO_THISCALL_FUNCTOR_METHOD
// Emscripten compiler toolchain
// ref: https://emscripten.org/
#if defined(__EMSCRIPTEN__)
#define AS_MAX_PORTABILITY
#endif
// Embarcadero C++Builder
#if defined(__BORLANDC__)
#ifndef _Windows
#error "Configuration doesn't yet support BCC for Linux or Mac OS."
#endif
#if defined(_M_X64)
#error "Configuration doesn't yet support BCC for AMD64."
#endif
#define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1))
#define HAVE_VIRTUAL_BASE_OFFSET
#define VIRTUAL_BASE_OFFSET(x) (*((asDWORD*)(&x)+2))
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#define COMPLEX_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR)
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR)
#define STDCALL __stdcall
#define AS_SIZEOF_BOOL 1
#define AS_WINDOWS_THREADS
#undef THISCALL_CALLEE_POPS_HIDDEN_RETURN_POINTER
#define AS_WIN
#define AS_X86
#define ASM_INTEL
#define asVSNPRINTF(a, b, c, d) _vsnprintf(a, b, c, d)
#define fmodf(a,b) fmod(a,b)
#define UNREACHABLE_RETURN
#endif
// Microsoft Visual C++
// Ref: http://msdn.microsoft.com/en-us/library/b0084kay.aspx
#if defined(_MSC_VER) && !defined(__MWERKS__)
#if _MSC_VER <= 1200 // MSVC6
// Disable the useless warnings about truncated symbol names for template instances
#pragma warning( disable : 4786 )
#endif
#ifdef _M_X64
#define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+2))
#define VIRTUAL_BASE_OFFSET(x) (*((asDWORD*)(&x)+4))
#else
#define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1))
#define VIRTUAL_BASE_OFFSET(x) (*((asDWORD*)(&x)+3))
#endif
#define HAVE_VIRTUAL_BASE_OFFSET
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_PASS_OBJECT_POINTER_IN_ECX
// http://www.madewithmarmalade.com/
#if defined(__S3E__)
#ifndef AS_MARMALADE
// From now on we'll use the below define
#define AS_MARMALADE
#endif
// Marmalade doesn't use the Windows libraries
#define asVSNPRINTF(a, b, c, d) vsnprintf(a, b, c, d)
// Marmalade doesn't seem to have proper support for
// atomic instructions or read/write locks, so we turn off
// multithread support
//#define AS_POSIX_THREADS
#define AS_NO_THREADS
#define AS_NO_ATOMIC
// Marmalade has it's own way of identifying the CPU target
// Note, when building for ARM, the gnuc compiler will always
// be used so we don't need to check for it here
#if defined(I3D_ARCH_X86)
#define AS_X86
#endif
#else
#if _MSC_VER < 1500 // MSVC++ 9 (aka MSVC++ .NET 2008)
#define asVSNPRINTF(a, b, c, d) _vsnprintf(a, b, c, d)
#else
#define asVSNPRINTF(a, b, c, d) vsnprintf_s(a, b, _TRUNCATE, c, d)
#endif
#define AS_WINDOWS_THREADS
#endif
#define THISCALL_CALLEE_POPS_ARGUMENTS
#define STDCALL __stdcall
#define AS_SIZEOF_BOOL 1
#define COMPLEX_OBJS_PASSED_BY_REF
#define ASM_INTEL // Intel style for inline assembly on microsoft compilers
#if defined(WIN32) || defined(_WIN32) || defined(_WIN64)
#define AS_WIN
#endif
#if _XBOX_VER >= 200
// 360 uses a Xenon processor (which is a modified 64bit PPC)
#define AS_XBOX360
#define AS_XENON
#define AS_BIG_ENDIAN
#else
#if defined(_XBOX) || (defined(_M_IX86) && !defined(__LP64__))
#define AS_X86
#ifndef _XBOX
// Not tested with xbox (only enabled if is Windows)
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#endif
#elif defined(_M_X64)
#define AS_X64_MSVC
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define AS_CALLEE_DESTROY_OBJ_BY_VAL
#define AS_LARGE_OBJS_PASSED_BY_REF
#define AS_LARGE_OBJ_MIN_SIZE 3
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY | asOBJ_APP_CLASS_MORE_CONSTRUCTORS)
#define COMPLEX_MASK (asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#endif
#endif
#if defined(_ARM_) || defined(_M_ARM)
#define AS_ARM
#define AS_CALLEE_DESTROY_OBJ_BY_VAL
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define COMPLEX_MASK (asOBJ_APP_CLASS_ASSIGNMENT | asOBJ_APP_ARRAY)
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_ASSIGNMENT | asOBJ_APP_ARRAY)
// Windows CE uses softfp calling convention, while Windows RT uses hardfp calling convention
// ref: http://stackoverflow.com/questions/16375355/what-is-the-windows-rt-on-arm-native-code-calling-convention
#if defined(_WIN32_WCE)
#define AS_SOFTFP
#endif
#endif
#if defined(_M_ARM64)
#define AS_ARM64
// TODO: MORE HERE
#endif
#ifndef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_ARRAY)
#endif
#ifndef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT | asOBJ_APP_ARRAY | asOBJ_APP_CLASS_MORE_CONSTRUCTORS)
#endif
#define UNREACHABLE_RETURN
#endif
// Metrowerks CodeWarrior (experimental, let me know if something isn't working)
#if defined(__MWERKS__) && !defined(EPPC) // JWC -- If Wii DO NOT use this even when using Metrowerks Compiler. Even though they are called Freescale...
#define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1))
#define HAVE_VIRTUAL_BASE_OFFSET
#define VIRTUAL_BASE_OFFSET(x) (*((asDWORD*)(&x)+3))
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_PASS_OBJECT_POINTER_IN_ECX
#define asVSNPRINTF(a, b, c, d) _vsnprintf(a, b, c, d)
#define THISCALL_CALLEE_POPS_ARGUMENTS
#define COMPLEX_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT)
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_CONSTRUCTOR | asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_ASSIGNMENT)
#define AS_SIZEOF_BOOL 1
#define AS_WINDOWS_THREADS
#define STDCALL __stdcall
// Support native calling conventions on x86, but not 64bit yet
#if defined(_M_IX86) && !defined(__LP64__)
#define AS_X86
#define ASM_INTEL // Intel style for inline assembly
#endif
#define UNREACHABLE_RETURN
#endif
// SN Systems ProDG
#if defined(__SNC__) || defined(SNSYS)
#define MULTI_BASE_OFFSET(x) (*((asDWORD*)(&x)+1))
#define CALLEE_POPS_HIDDEN_RETURN_POINTER
#define COMPLEX_OBJS_PASSED_BY_REF
#ifdef __psp2__
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR)
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR)
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#else
#define GNU_STYLE_VIRTUAL_METHOD
#define ASM_AT_N_T // AT&T style inline assembly
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR)
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR)
#endif
#define AS_SIZEOF_BOOL 1
#define asVSNPRINTF(a, b, c, d) vsnprintf(a, b, c, d)
// SN doesnt seem to like STDCALL.
// Maybe it can work with some fiddling, but I can't imagine linking to
// any STDCALL functions with a console anyway...
#define STDCALL
// Linux specific
#ifdef __linux__
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#endif
// Support native calling conventions on x86, but not 64bit yet
#if (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
#define AS_X86
// PS3
#elif (defined(__PPC__) || defined(__ppc__)) && defined(__PPU__)
// Support native calling conventions on PS3
#define AS_PS3
#define AS_PPC_64
#define AS_NO_MEMORY_H
#define AS_NO_EXCEPTIONS
#include <stdlib.h>
// PSP
#elif defined(__psp__)
#define AS_NO_MEMORY_H
#define AS_MIPS
#define AS_PSP
#define AS_USE_DOUBLE_AS_FLOAT
// PSVita
#elif defined(__psp2__)
#define AS_PSVITA
#define AS_ARM
#define AS_NO_MEMORY_H
#define AS_NO_EXCEPTIONS
#define AS_CALLEE_DESTROY_OBJ_BY_VAL
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#endif
#define UNREACHABLE_RETURN
#endif
// GNU C (and MinGW or Cygwin on Windows)
// Use the following command to determine predefined macros: echo . | g++ -dM -E -
// MSVC2015 can now use CLang too, but it shouldn't go in here
#if (defined(__GNUC__) && !defined(__SNC__) && !defined(_MSC_VER)) || defined(EPPC) || defined(__CYGWIN__) // JWC -- use this instead for Wii
#define GNU_STYLE_VIRTUAL_METHOD
#define MULTI_BASE_OFFSET(x) (*((const asPWORD*)(&x)+1))
#define asVSNPRINTF(a, b, c, d) vsnprintf(a, b, c, d)
#define CALLEE_POPS_HIDDEN_RETURN_POINTER
#define COMPLEX_OBJS_PASSED_BY_REF
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_ARRAY)
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_ARRAY)
#define AS_NO_MEMORY_H
#define AS_SIZEOF_BOOL 1
#define STDCALL __attribute__((stdcall))
#define ASM_AT_N_T
// WII U
#if defined(__ghs__)
#define AS_WIIU
// Native calling conventions are not yet supported
#define AS_MAX_PORTABILITY
// Nintendo Switch
// Note, __SWITCH__ is not an official define in the Nintendo dev kit.
// You need to manually add this to the project when compiling for Switch.
#elif defined(__SWITCH__)
#define AS_NINTENDOSWITCH
#if (!defined(__LP64__))
#error write me
#else
#define AS_ARM64
#undef STDCALL
#define STDCALL
#undef GNU_STYLE_VIRTUAL_METHOD
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define HAS_128_BIT_PRIMITIVES
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#endif
// Marmalade is a cross platform SDK. It uses g++ to compile for iOS and Android
#elif defined(__S3E__)
#ifndef AS_MARMALADE
// From now on we'll use the below define
#define AS_MARMALADE
#endif
// STDCALL is not available on Marmalade when compiled for iOS or Android
#undef STDCALL
#define STDCALL
// Marmalade doesn't seem to have proper support for
// atomic instructions or read/write locks
#define AS_NO_THREADS
#define AS_NO_ATOMIC
// Identify for which CPU the library is being built
#if defined(I3D_ARCH_X86)
#define AS_X86
#elif defined(I3D_ARCH_ARM)
#define AS_ARM
#define AS_SOFTFP
// Marmalade appear to use the same ABI as Android when built for ARM
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#undef GNU_STYLE_VIRTUAL_METHOD
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#define AS_CALLEE_DESTROY_OBJ_BY_VAL
#endif
// MacOSX and IPhone
#elif defined(__APPLE__)
#include <TargetConditionals.h>
// Is this a Mac or an IPhone (or other iOS device)?
#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1
#define AS_IPHONE
#else
#define AS_MAC
#endif
// The sizeof bool is different depending on the target CPU
#undef AS_SIZEOF_BOOL
#if defined(__ppc__)
#define AS_SIZEOF_BOOL 4
// STDCALL is not available on PPC
#undef STDCALL
#define STDCALL
#else
#define AS_SIZEOF_BOOL 1
#endif
#if (defined(_ARM_) || defined(__arm__))
// iOS use ARM processor
#define AS_ARM
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#undef GNU_STYLE_VIRTUAL_METHOD
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define COMPLEX_OBJS_PASSED_BY_REF
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
// iOS uses soft-float ABI
#define AS_SOFTFP
// STDCALL is not available on ARM
#undef STDCALL
#define STDCALL
#elif (defined(__aarch64__))
// The IPhone 5S+ uses an ARM64 processor
// AngelScript currently doesn't support native calling
// for 64bit ARM processors so it's necessary to turn on
// portability mode
#define AS_MAX_PORTABILITY
// STDCALL is not available on ARM
#undef STDCALL
#define STDCALL
#elif (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
// Support native calling conventions on Mac OS X + Intel 32bit CPU
#define AS_X86
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#elif defined(__LP64__) && !defined(__ppc__) && !defined(__PPC__) && !defined(__aarch64__)
// http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/LowLevelABI/140-x86-64_Function_Calling_Conventions/x86_64.html#//apple_ref/doc/uid/TP40005035-SW1
#define AS_X64_GCC
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define HAS_128_BIT_PRIMITIVES
#define SPLIT_OBJS_BY_MEMBER_TYPES
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#define AS_LARGE_OBJS_PASSED_BY_REF
#define AS_LARGE_OBJ_MIN_SIZE 5
// STDCALL is not available on 64bit Mac
#undef STDCALL
#define STDCALL
#elif (defined(__ppc__) || defined(__PPC__)) && !defined(__LP64__)
// Support native calling conventions on Mac OS X + PPC 32bit CPU
#define AS_PPC
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#elif (defined(__ppc__) || defined(__PPC__)) && defined(__LP64__)
#define AS_PPC_64
#else
// Unknown CPU type
#define AS_MAX_PORTABILITY
#endif
#define AS_POSIX_THREADS
// Windows
#elif defined(WIN32) || defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
// On Windows the simple classes are returned in the EAX:EDX registers
//#define THISCALL_RETURN_SIMPLE_IN_MEMORY
//#define CDECL_RETURN_SIMPLE_IN_MEMORY
//#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#if (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
// Support native calling conventions on Intel 32bit CPU
#define AS_X86
#undef AS_NO_THISCALL_FUNCTOR_METHOD
// As of version 4.7 MinGW changed the ABI, presumably
// to be better aligned with how MSVC works
#if (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || __GNUC__ > 4
#define AS_MINGW47
#endif
#if (__clang_major__ == 3 && __clang_minor__ > 4) || __clang_major > 3
#define AS_MINGW47
#endif
#ifdef AS_MINGW47
#undef CALLEE_POPS_HIDDEN_RETURN_POINTER
#define THISCALL_CALLEE_POPS_ARGUMENTS
#else
// Earlier versions than 4.7
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#endif
#elif defined(__x86_64__)
#define AS_X64_MINGW
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define AS_LARGE_OBJS_PASSED_BY_REF
#define AS_LARGE_OBJ_MIN_SIZE 3
#define COMPLEX_OBJS_PASSED_BY_REF
#else
#define AS_MAX_PORTABILITY
#endif
#define AS_WIN
#define AS_WINDOWS_THREADS
// Linux
#elif defined(__linux__) && !defined(ANDROID) && !defined(__ANDROID__)
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#if (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
// x86 32bit
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
// Support native calling conventions on Intel 32bit CPU
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#define AS_X86
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#elif defined(__x86_64__)
// x86 64bit
#define AS_X64_GCC
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define HAS_128_BIT_PRIMITIVES
#define SPLIT_OBJS_BY_MEMBER_TYPES
#define AS_LARGE_OBJS_PASSED_BY_REF
#define AS_LARGE_OBJ_MIN_SIZE 5
// STDCALL is not available on 64bit Linux
#undef STDCALL
#define STDCALL
#elif defined(__ARMEL__) || defined(__arm__) || defined(__aarch64__) || defined(__AARCH64EL__)
// arm
// The assembler code currently doesn't support arm v4
#if !defined(__ARM_ARCH_4__) && !defined(__ARM_ARCH_4T__) && !defined(__LP64__)
#define AS_ARM
// TODO: The stack unwind on exceptions currently fails due to the assembler code in as_callfunc_arm_gcc.S
#define AS_NO_EXCEPTIONS
#undef STDCALL
#define STDCALL
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#ifndef AS_MAX_PORTABILITY
// Make a few checks against incompatible ABI combinations
#if defined(__FAST_MATH__) && __FAST_MATH__ == 1
#error -ffast-math is not supported with native calling conventions
#endif
#endif
// Verify if soft-float or hard-float ABI is used
#if (defined(__SOFTFP__) && __SOFTFP__ == 1) || defined(__ARM_PCS)
// -ffloat-abi=softfp or -ffloat-abi=soft
#define AS_SOFTFP
#endif
// Tested with both hard float and soft float abi
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#elif defined(__LP64__) || defined(__aarch64__)
#define AS_ARM64
#undef STDCALL
#define STDCALL
#undef GNU_STYLE_VIRTUAL_METHOD
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#define HAS_128_BIT_PRIMITIVES
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#endif
#elif defined(__mips__)
// mips
#define AS_MIPS
#undef STDCALL
#define STDCALL
#ifdef _ABIO32
// 32bit O32 ABI
#define AS_MIPS
// All structures are returned in memory regardless of size or complexity
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#else
// For other ABIs the native calling convention is not available (yet)
#define AS_MAX_PORTABILITY
#endif
#elif defined(__PPC64__)
// PPC 64bit
// The code in as_callfunc_ppc_64.cpp was built for PS3 and XBox 360, that
// although use 64bit PPC only uses 32bit pointers.
// TODO: Add support for native calling conventions on Linux with PPC 64bit
#define AS_MAX_PORTABILITY
#elif defined(__e2k__)
// 64bit MCST Elbrus 2000
// ref: https://en.wikipedia.org/wiki/Elbrus_2000
#define AS_E2K
// AngelScript currently doesn't support native calling
// for MCST Elbrus 2000 processor so it's necessary to turn on
// portability mode
#define AS_MAX_PORTABILITY
// STDCALL is not available on 64bit Linux
#undef STDCALL
#define STDCALL
#else
#define AS_MAX_PORTABILITY
#endif
#define AS_LINUX
#define AS_POSIX_THREADS
#if !( ( (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) || __GNUC__ > 4) )
// Only with GCC 4.1 was the atomic instructions available
#define AS_NO_ATOMIC
#endif
// Free BSD
#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__)
#define AS_BSD
#if (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#define AS_X86
#elif defined(__x86_64__)
#define AS_X64_GCC
#define HAS_128_BIT_PRIMITIVES
#define SPLIT_OBJS_BY_MEMBER_TYPES
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#define AS_LARGE_OBJS_PASSED_BY_REF
#define AS_LARGE_OBJ_MIN_SIZE 5
#undef STDCALL
#define STDCALL
#else
#define AS_MAX_PORTABILITY
#endif
#define AS_POSIX_THREADS
#if !( ( (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) || __GNUC__ > 4) )
// Only with GCC 4.1 was the atomic instructions available
#define AS_NO_ATOMIC
#endif
// PSP and PS2
#elif defined(__PSP__) || defined(__psp__) || defined(_EE_) || defined(_PSP) || defined(_PS2)
// Support native calling conventions on MIPS architecture
#if (defined(_MIPS_ARCH) || defined(_mips) || defined(__MIPSEL__)) && !defined(__LP64__)
#define AS_MIPS
#define AS_USE_DOUBLE_AS_FLOAT
#else
#define AS_MAX_PORTABILITY
#endif
// PS3
#elif (defined(__PPC__) || defined(__ppc__)) && defined(__PPU__)
// Support native calling conventions on PS3
#define AS_PS3
#define AS_PPC_64
#define SPLIT_OBJS_BY_MEMBER_TYPES
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
// PS3 doesn't have STDCALL
#undef STDCALL
#define STDCALL
// Dreamcast
#elif __SH4_SINGLE_ONLY__
// Support native calling conventions on Dreamcast
#define AS_DC
#define AS_SH4
// Wii JWC - Close to PS3 just no PPC_64 and AS_PS3
#elif defined(EPPC)
#define AS_WII
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#undef STDCALL
#define STDCALL
// Android
#elif defined(ANDROID) || defined(__ANDROID__)
#define AS_ANDROID
// Android 2.3+ supports posix threads
#define AS_POSIX_THREADS
// Common configuration with Android arm and x86
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#if (defined(_ARM_) || defined(__arm__) || defined(__aarch64__) || defined(__AARCH64EL__))
// Android ARM
#undef THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
#undef STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE
// The stdcall calling convention is not used on the arm cpu
#undef STDCALL
#define STDCALL
#undef GNU_STYLE_VIRTUAL_METHOD
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#if (!defined(__LP64__))
// TODO: The stack unwind on exceptions currently fails due to the assembler code in as_callfunc_arm_gcc.S
#define AS_NO_EXCEPTIONS
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 2
#define AS_ARM
#define AS_SOFTFP
#define AS_CALLEE_DESTROY_OBJ_BY_VAL
#elif (defined(__LP64__) || defined(__aarch64__))
#define AS_ARM64
#define HAS_128_BIT_PRIMITIVES
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#define STDCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 5
#endif
#elif (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
// Android Intel x86 (same config as Linux x86). Tested with Intel x86 Atom System Image.
// Support native calling conventions on Intel 32bit CPU
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#define AS_X86
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#elif defined(__mips__)
#define AS_MIPS
#undef STDCALL
#define STDCALL
#ifdef _ABIO32
#define AS_MIPS
// All structures are returned in memory regardless of size or complexity
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define THISCALL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY_MIN_SIZE 0
#undef AS_NO_THISCALL_FUNCTOR_METHOD
#else
// For other ABIs the native calling convention is not available (yet)
#define AS_MAX_PORTABILITY
#endif
#endif
// Haiku OS
#elif __HAIKU__
#define AS_HAIKU
#if (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
#define AS_X86
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
#elif defined(__x86_64__)
#define AS_X64_GCC
#define HAS_128_BIT_PRIMITIVES
#define SPLIT_OBJS_BY_MEMBER_TYPES
#undef COMPLEX_MASK
#define COMPLEX_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#undef COMPLEX_RETURN_MASK
#define COMPLEX_RETURN_MASK (asOBJ_APP_CLASS_DESTRUCTOR | asOBJ_APP_CLASS_COPY_CONSTRUCTOR | asOBJ_APP_ARRAY)
#define AS_LARGE_OBJS_PASSED_BY_REF
#define AS_LARGE_OBJ_MIN_SIZE 5
#undef STDCALL
#define STDCALL
#else
#define AS_MAX_PORTABILITY
#endif
// Illumos
#elif defined(__sun)
#if (defined(i386) || defined(__i386) || defined(__i386__)) && !defined(__LP64__)
#define THISCALL_RETURN_SIMPLE_IN_MEMORY
#define CDECL_RETURN_SIMPLE_IN_MEMORY
#define STDCALL_RETURN_SIMPLE_IN_MEMORY
// Support native calling conventions on Intel 32bit CPU
#define THISCALL_PASS_OBJECT_POINTER_ON_THE_STACK
#define AS_X86
#elif defined(__x86_64__)
#define AS_X64_GCC
#define HAS_128_BIT_PRIMITIVES
#define SPLIT_OBJS_BY_MEMBER_TYPES
// STDCALL is not available on 64bit Linux
#undef STDCALL
#define STDCALL
#else
#define AS_MAX_PORTABILITY
#endif
#define AS_ILLUMOS
#define AS_POSIX_THREADS
#if !( ( (__GNUC__ == 4) && (__GNUC_MINOR__ >= 1) || __GNUC__ > 4) )
// Only with GCC 4.1 was the atomic instructions available
#define AS_NO_ATOMIC
#endif
#endif
#define UNREACHABLE_RETURN
#endif
// Sun CC
// Initial information provided by Andrey Bergman
#if defined(__SUNPRO_CC)
#if defined(__sparc)
#define AS_SPARC
#endif
#if defined(__sun)
#define AS_SUN
#endif
// Native calling conventions is not yet supported for Sun CC
#if !defined(AS_MAX_PORTABILITY)
#define AS_MAX_PORTABILITY
#endif
// I presume Sun CC uses a similar structure of method pointers as gnuc
#define MULTI_BASE_OFFSET(x) (*((asPWORD*)(&x)+1))
#if !defined(AS_SIZEOF_BOOL)
#define AS_SIZEOF_BOOL 1 // sizeof(bool) == 1
#endif
#if !defined(UNREACHABLE_RETURN)
#define UNREACHABLE_RETURN
#endif
#if !defined(STDCALL)
#define STDCALL // There is no stdcall on Solaris/SunPro/SPARC
#endif
#if !defined(asVSNPRINTF)
#define asVSNPRINTF(a, b, c, d) vsnprintf(a, b, c, d)
#endif
#endif
//
// Detect target hardware
//------------------------------------------------
// Big endian CPU target?
// see: http://sourceforge.net/p/predef/wiki/Endianness/
#if !defined(AS_BIG_ENDIAN) && \
defined(__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN || \
defined(__BIG_ENDIAN__) || \
defined(__ARMEB__) || \
defined(__THUMBEB__) || \
defined(__AARCH64EB__) || \
defined(_MIBSEB) || defined(__MIBSEB) || defined(__MIBSEB__)
#define AS_BIG_ENDIAN
#endif
// Dreamcast and Gamecube use only 32bit floats, so treat doubles as floats
#if defined(__SH4_SINGLE_ONLY__) || defined(_GC)
#define AS_USE_DOUBLE_AS_FLOAT // use 32bit floats instead of doubles
#endif
// If there are no current support for native calling
// conventions, then compile with AS_MAX_PORTABILITY
#if (!defined(AS_X86) && !defined(AS_SH4) && !defined(AS_MIPS) && !defined(AS_PPC) && !defined(AS_PPC_64) && !defined(AS_XENON) && !defined(AS_X64_GCC) && !defined(AS_X64_MSVC) && !defined(AS_ARM) && !defined(AS_ARM64) && !defined(AS_X64_MINGW))
#ifndef AS_MAX_PORTABILITY
#define AS_MAX_PORTABILITY
#endif
#endif
// If the platform doesn't support atomic instructions we can't allow
// multithreading as the reference counters won't be threadsafe
#if defined(AS_NO_ATOMIC) && !defined(AS_NO_THREADS)
#define AS_NO_THREADS
#endif
// If the form of threads to use hasn't been chosen
// then the library will be compiled without support
// for multithreading
#if !defined(AS_POSIX_THREADS) && !defined(AS_WINDOWS_THREADS)
#define AS_NO_THREADS
#endif
// The assert macro
#if defined(ANDROID)
#if defined(AS_DEBUG)
#include <android/log.h>
#include <stdlib.h>
#define asASSERT(x) \
do { \
if (!(x)) { \
__android_log_print(ANDROID_LOG_ERROR, "AngelScript", "Assert failed at %s:%d - %s", __FILE__, __LINE__, #x); \
exit(1); \
} \
} while (0)
#else
#define asASSERT(x)
#endif
#else
#include <assert.h>
#define asASSERT(x) assert(x)
#endif
//
// Internal defines (do not change these)
//----------------------------------------------------------------
#define ARG_W(b) ((asWORD*)&b)
#define ARG_DW(b) ((asDWORD*)&b)
#define ARG_QW(b) ((asQWORD*)&b)
#define ARG_PTR(b) ((asPWORD*)&b)
#define BCARG_W(b) ((asWORD*)&(b)[1])
#define BCARG_DW(b) ((asDWORD*)&(b)[1])
#define BCARG_QW(b) ((asQWORD*)&(b)[1])
#define BCARG_PTR(b) ((asPWORD*)&(b)[1])
// This macro is used to avoid warnings about unused variables.
// Usually where the variables are only used in debug mode.
#define UNUSED_VAR(x) (void)(x)
#include "hpl1/engine/libraries/angelscript/angelscript.h"
#ifdef AS_USE_NAMESPACE
using namespace AngelScript;
#endif
#endif
|