/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef jsctypes_test_h #define jsctypes_test_h #include "mozilla/Attributes.h" #include "mozilla/Types.h" #include "jspubtd.h" #include "typedefs.h" #define EXPORT_CDECL(type) MOZ_EXPORT type #if defined(_WIN32) #if defined(_WIN64) #define NS_STDCALL #else #define NS_STDCALL __stdcall #endif #define EXPORT_STDCALL(type) MOZ_EXPORT type NS_STDCALL #endif MOZ_BEGIN_EXTERN_C EXPORT_CDECL(void) test_void_t_cdecl(); EXPORT_CDECL(void*) get_voidptr_t_cdecl(); EXPORT_CDECL(void*) set_voidptr_t_cdecl(void*); #define DECLARE_CDECL_FUNCTIONS(name, type, ffiType) \ EXPORT_CDECL(type) get_##name##_cdecl(); \ EXPORT_CDECL(type) set_##name##_cdecl(type); \ EXPORT_CDECL(type) sum_##name##_cdecl(type, type); \ EXPORT_CDECL(type) sum_alignb_##name##_cdecl(char, type, char, type, char); \ EXPORT_CDECL(type) sum_alignf_##name##_cdecl( \ float, type, float, type, float); \ EXPORT_CDECL(type) sum_many_##name##_cdecl( \ type, type, type, type, type, type, type, type, type, \ type, type, type, type, type, type, type, type, type); \ \ EXPORT_CDECL(void) get_##name##_stats(size_t* align, size_t* size, \ size_t* nalign, size_t* nsize, \ size_t offsets[]); CTYPES_FOR_EACH_TYPE(DECLARE_CDECL_FUNCTIONS) #undef DECLARE_CDECL_FUNCTIONS #if defined(_WIN32) EXPORT_STDCALL(void) test_void_t_stdcall(); EXPORT_STDCALL(void*) get_voidptr_t_stdcall(); EXPORT_STDCALL(void*) set_voidptr_t_stdcall(void*); #define DECLARE_STDCALL_FUNCTIONS(name, type, ffiType) \ EXPORT_STDCALL(type) get_##name##_stdcall(); \ EXPORT_STDCALL(type) set_##name##_stdcall(type); \ EXPORT_STDCALL(type) sum_##name##_stdcall(type, type); \ EXPORT_STDCALL(type) sum_alignb_##name##_stdcall( \ char, type, char, type, char); \ EXPORT_STDCALL(type) sum_alignf_##name##_stdcall( \ float, type, float, type, float); \ EXPORT_STDCALL(type) sum_many_##name##_stdcall( \ type, type, type, type, type, type, type, type, type, \ type, type, type, type, type, type, type, type, type); CTYPES_FOR_EACH_TYPE(DECLARE_STDCALL_FUNCTIONS) #undef DECLARE_STDCALL_FUNCTIONS #endif /* defined(_WIN32) */ MOZ_EXPORT int32_t test_ansi_len(const char*); MOZ_EXPORT int32_t test_wide_len(const char16_t*); MOZ_EXPORT const char* test_ansi_ret(); MOZ_EXPORT const char16_t* test_wide_ret(); MOZ_EXPORT char* test_ansi_echo(const char*); struct ONE_BYTE { char a; }; struct TWO_BYTE { char a; char b; }; struct THREE_BYTE { char a; char b; char c; }; struct FOUR_BYTE { char a; char b; char c; char d; }; struct FIVE_BYTE { char a; char b; char c; char d; char e; }; struct SIX_BYTE { char a; char b; char c; char d; char e; char f; }; struct SEVEN_BYTE { char a; char b; char c; char d; char e; char f; char g; }; struct myPOINT { int32_t x; int32_t y; }; struct myRECT { int32_t top; int32_t left; int32_t bottom; int32_t right; }; struct INNER { uint8_t i1; int64_t i2; uint8_t i3; }; struct NESTED { int32_t n1; int16_t n2; INNER inner; int64_t n3; int32_t n4; }; MOZ_EXPORT int32_t test_pt_in_rect(myRECT, myPOINT); MOZ_EXPORT void test_init_pt(myPOINT* pt, int32_t x, int32_t y); MOZ_EXPORT int32_t test_nested_struct(NESTED); MOZ_EXPORT myPOINT test_struct_return(myRECT); MOZ_EXPORT myRECT test_large_struct_return(myRECT, myRECT); MOZ_EXPORT ONE_BYTE test_1_byte_struct_return(myRECT); MOZ_EXPORT TWO_BYTE test_2_byte_struct_return(myRECT); MOZ_EXPORT THREE_BYTE test_3_byte_struct_return(myRECT); MOZ_EXPORT FOUR_BYTE test_4_byte_struct_return(myRECT); MOZ_EXPORT FIVE_BYTE test_5_byte_struct_return(myRECT); MOZ_EXPORT SIX_BYTE test_6_byte_struct_return(myRECT); MOZ_EXPORT SEVEN_BYTE test_7_byte_struct_return(myRECT); MOZ_EXPORT void * test_fnptr(); typedef int32_t (* test_func_ptr)(int8_t); MOZ_EXPORT int32_t test_closure_cdecl(int8_t, test_func_ptr); #if defined(_WIN32) typedef int32_t (NS_STDCALL * test_func_ptr_stdcall)(int8_t); MOZ_EXPORT int32_t test_closure_stdcall(int8_t, test_func_ptr_stdcall); #endif /* defined(_WIN32) */ MOZ_EXPORT int32_t test_callme(int8_t); MOZ_EXPORT void* test_getfn(); EXPORT_CDECL(int32_t) test_sum_va_cdecl(uint8_t n, ...); EXPORT_CDECL(uint8_t) test_count_true_va_cdecl(uint8_t n, ...); EXPORT_CDECL(void) test_add_char_short_int_va_cdecl(uint32_t* result, ...); EXPORT_CDECL(int32_t*) test_vector_add_va_cdecl(uint8_t num_vecs, uint8_t vec_len, int32_t* result, ...); MOZ_EXPORT extern myRECT data_rect; MOZ_END_EXTERN_C class MOZ_EXPORT TestClass final { public: explicit TestClass(int32_t); int32_t Add(int32_t); private: int32_t mInt; }; #endif