Index: .github/workflows/msys2.yml ================================================================== --- .github/workflows/msys2.yml +++ .github/workflows/msys2.yml @@ -34,5 +34,10 @@ shell: msys2 {0} run: make check - name: make install shell: msys2 {0} run: make install + - name: C++ test + shell: msys2 {0} + run: | + objfw-compile -o cxxtest .github/workflows/CXXTest.mm + ./cxxtest.exe Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -1,13 +1,12 @@ -AC_INIT(ObjFW, 1.3-dev, js@nil.im, objfw, https://objfw.nil.im/) +AC_INIT(ObjFW, 1.2, js@nil.im, objfw, https://objfw.nil.im/) AC_CONFIG_SRCDIR(src) AC_CONFIG_AUX_DIR(build-aux) AC_CONFIG_MACRO_DIR(build-aux/m4) AC_DEFINE(OBJFW_VERSION_MAJOR, 1, [The major version of ObjFW]) -AC_DEFINE(OBJFW_VERSION_MINOR, 3, [The minor version of ObjFW]) -dnl This may only be set to 1.3 once 1.3 is released +AC_DEFINE(OBJFW_VERSION_MINOR, 2, [The minor version of ObjFW]) AC_SUBST(BUNDLE_VERSION, 1.2.0) AC_SUBST(BUNDLE_SHORT_VERSION, 1.2) for i in configure.ac build-aux/m4/*; do AS_IF([test $i -nt configure], [ @@ -2119,11 +2118,11 @@ AS_IF([test x"$GOBJC" = x"yes"], [ OBJCFLAGS="$OBJCFLAGS -Wwrite-strings -Wpointer-arith" AC_ARG_ENABLE(werror, AS_HELP_STRING([--disable-werror], [do not build with -Werror])) - AS_IF([test x"$enable_werror" != x"no"], [ + AS_IF([test x"$enable_werror" = x"yes"], [ OBJCFLAGS="$OBJCFLAGS -Werror" ]) old_OBJCFLAGS="$OBJCFLAGS" OBJCFLAGS="$OBJCFLAGS -Werror" Index: extra.mk.in ================================================================== --- extra.mk.in +++ extra.mk.in @@ -1,19 +1,19 @@ OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@ OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@ OBJFW_FRAMEWORK = @OBJFW_FRAMEWORK@ OBJFW_LIB_MAJOR = 1 OBJFW_LIB_MINOR = 2 -OBJFW_LIB_PATCH = 0 +OBJFW_LIB_PATCH = 1 OBJFW_LIB_MAJOR_MINOR = ${OBJFW_LIB_MAJOR}.${OBJFW_LIB_MINOR} OBJFWRT_SHARED_LIB = @OBJFWRT_SHARED_LIB@ OBJFWRT_STATIC_LIB = @OBJFWRT_STATIC_LIB@ OBJFWRT_FRAMEWORK = @OBJFWRT_FRAMEWORK@ OBJFWRT_LIB_MAJOR = 1 OBJFWRT_LIB_MINOR = 2 -OBJFWRT_LIB_PATCH = 0 +OBJFWRT_LIB_PATCH = 1 OBJFWRT_LIB_MAJOR_MINOR = ${OBJFWRT_LIB_MAJOR}.${OBJFWRT_LIB_MINOR} OBJFWBRIDGE_SHARED_LIB = @OBJFWBRIDGE_SHARED_LIB@ OBJFWBRIDGE_STATIC_LIB = @OBJFWBRIDGE_STATIC_LIB@ OBJFWBRIDGE_FRAMEWORK = @OBJFWBRIDGE_FRAMEWORK@ @@ -31,11 +31,11 @@ OBJFWHID_SHARED_LIB = @OBJFWHID_SHARED_LIB@ OBJFWHID_STATIC_LIB = @OBJFWHID_STATIC_LIB@ OBJFWHID_FRAMEWORK = @OBJFWHID_FRAMEWORK@ OBJFWHID_LIB_MAJOR = 1 OBJFWHID_LIB_MINOR = 0 -OBJFWHID_LIB_PATCH = 0 +OBJFWHID_LIB_PATCH = 1 OBJFWHID_LIB_MAJOR_MINOR = ${OBJFWHID_LIB_MAJOR}.${OBJFWHID_LIB_MINOR} BIN_PREFIX = @BIN_PREFIX@ BRIDGE = @BRIDGE@ CVINCLUDE_INLINE_H = @CVINCLUDE_INLINE_H@ Index: src/OFColor.h ================================================================== --- src/OFColor.h +++ src/OFColor.h @@ -30,11 +30,11 @@ #ifdef OF_HAVE_CLASS_PROPERTIES @property (class, readonly, nonatomic) OFColor *black; @property (class, readonly, nonatomic) OFColor *silver; @property (class, readonly, nonatomic) OFColor *gray; @property (class, readonly, nonatomic) OFColor *grey - OF_DEPRECATED(ObjFW, 1, 1, "Use gray instead"); + OF_DEPRECATED(ObjFW, 1, 1, "Use +[gray] instead"); @property (class, readonly, nonatomic) OFColor *white; @property (class, readonly, nonatomic) OFColor *maroon; @property (class, readonly, nonatomic) OFColor *red; @property (class, readonly, nonatomic) OFColor *purple; @property (class, readonly, nonatomic) OFColor *fuchsia; @@ -97,11 +97,11 @@ * * The RGBA value is (0.5, 0.5, 0.5, 1). * * @return The HTML color `gray` */ -+ (OFColor *)grey OF_DEPRECATED(ObjFW, 1, 1, "Use gray instead"); ++ (OFColor *)grey OF_DEPRECATED(ObjFW, 1, 1, "Use +[gray] instead"); /** * @brief Returns the HTML color `white`. * * The RGBA value is (1, 1, 1, 1). Index: src/runtime/exception.m ================================================================== --- src/runtime/exception.m +++ src/runtime/exception.m @@ -37,10 +37,11 @@ # include #endif #if defined(__SEH__) # define PERSONALITY gnu_objc_personality +# define CXX_PERSONALITY_STR "__gxx_personality_seh0" #elif defined(__USING_SJLJ_EXCEPTIONS__) # define PERSONALITY __gnu_objc_personality_sj0 # define CXX_PERSONALITY_STR "__gxx_personality_sj0" # define _Unwind_RaiseException _Unwind_SjLj_RaiseException # define __builtin_eh_return_data_regno(i) (i) @@ -235,11 +236,38 @@ uintptr_t thumb = _Unwind_GetGR(ctx, 15) & 1; _Unwind_SetGR(ctx, 15, (value | thumb)); } #endif -#if defined(CXX_PERSONALITY_STR) && !defined(OF_AMIGAOS_M68K) +#if defined(OF_WINDOWS) +# ifdef __SEH__ +static EXCEPTION_DISPOSITION (*cxx_personality)(PEXCEPTION_RECORD, void *, + PCONTEXT, PDISPATCHER_CONTEXT); +# else +static PERSONALITY_FUNC((*cxx_personality)); +# endif + +OF_CONSTRUCTOR() +{ + /* + * This only works if the application uses libc++.dll or + * libstdc++-6.dll. There is unfortunately no other way, as Windows + * does not support proper weak linking. + */ + + HMODULE module; + + module = GetModuleHandle("libc++"); + + if (module == NULL) + module = GetModuleHandle("libstdc++-6"); + + if (module != NULL) + cxx_personality = (__typeof__(cxx_personality)) + GetProcAddress(module, CXX_PERSONALITY_STR); +} +#elif !defined(OF_AMIGAOS_M68K) static PERSONALITY_FUNC(cxx_personality) OF_WEAK_REF(CXX_PERSONALITY_STR); #endif #ifdef __SEH__ extern EXCEPTION_DISPOSITION _GCC_specific_handler(PEXCEPTION_RECORD, void *, @@ -613,11 +641,11 @@ uint8_t found = 0; intptr_t filter = 0; if (foreign) { switch (exClass) { -#if defined(CXX_PERSONALITY_STR) && !defined(OF_AMIGAOS_M68K) +#if !defined(__SEH__) && !defined(OF_AMIGAOS_M68K) case GNUCCXX0_EXCEPTION_CLASS: case CLNGCXX0_EXCEPTION_CLASS: if (cxx_personality != NULL) return CALL_PERSONALITY(cxx_personality); break; @@ -783,30 +811,10 @@ return old; } #ifdef __SEH__ -typedef EXCEPTION_DISPOSITION (*seh_personality_fn)(PEXCEPTION_RECORD, void *, - PCONTEXT, PDISPATCHER_CONTEXT); -static seh_personality_fn __gxx_personality_seh0; - -OF_CONSTRUCTOR() -{ - /* - * This only works if the application uses libstdc++-6.dll. - * There is unfortunately no other way, as Windows does not support - * proper weak linking. - */ - - HMODULE module; - if ((module = GetModuleHandle("libstdc++-6")) == NULL) - return; - - __gxx_personality_seh0 = (seh_personality_fn) - GetProcAddress(module, "__gxx_personality_seh0"); -} - EXCEPTION_DISPOSITION __gnu_objc_personality_seh0(PEXCEPTION_RECORD ms_exc, void *this_frame, PCONTEXT ms_orig_context, PDISPATCHER_CONTEXT ms_disp) { struct _Unwind_Exception *ex = @@ -813,14 +821,14 @@ (struct _Unwind_Exception *)ms_exc->ExceptionInformation[0]; switch (ex->class) { case GNUCCXX0_EXCEPTION_CLASS: case CLNGCXX0_EXCEPTION_CLASS: - if (__gxx_personality_seh0 != NULL) - return __gxx_personality_seh0(ms_exc, this_frame, + if (cxx_personality != NULL) + return cxx_personality(ms_exc, this_frame, ms_orig_context, ms_disp); } return _GCC_specific_handler(ms_exc, this_frame, ms_orig_context, ms_disp, PERSONALITY); } #endif