Index: .fossil-settings/clean-glob ================================================================== --- .fossil-settings/clean-glob +++ .fossil-settings/clean-glob @@ -21,18 +21,17 @@ config.log config.status configure docs extra.mk -generators/gen_tables +generators/library/gen_libraries +generators/unicode/gen_tables src/Info.plist src/bridge/Info.plist src/inline.h src/objfw-defs.h src/runtime/Info.plist -src/runtime/amiga-library-functable.inc -src/runtime/inline.h tests/DerivedData tests/EBOOT.PBP tests/Info.plist tests/PARAM.SFO tests/objc_sync/objc_sync Index: .fossil-settings/ignore-glob ================================================================== --- .fossil-settings/ignore-glob +++ .fossil-settings/ignore-glob @@ -23,18 +23,17 @@ config.log config.status configure docs extra.mk -generators/gen_tables +generators/library/gen_libraries +generators/unicode/gen_tables src/Info.plist src/bridge/Info.plist src/inline.h src/objfw-defs.h src/runtime/Info.plist -src/runtime/amiga-library-functable.inc -src/runtime/inline.h tests/DerivedData tests/EBOOT.PBP tests/Info.plist tests/PARAM.SFO tests/iOS.xcodeproj/*.pbxuser Index: .gitignore ================================================================== --- .gitignore +++ .gitignore @@ -23,18 +23,17 @@ config.log config.status configure docs extra.mk -generators/gen_tables +generators/library/gen_libraries +generators/unicode/gen_tables src/Info.plist src/bridge/Info.plist src/inline.h src/objfw-defs.h src/runtime/Info.plist -src/runtime/amiga-library-functable.inc -src/runtime/inline.h tests/DerivedData tests/EBOOT.PBP tests/Info.plist tests/PARAM.SFO tests/iOS.xcodeproj/*.pbxuser Index: buildsys.mk.in ================================================================== --- buildsys.mk.in +++ buildsys.mk.in @@ -884,11 +884,11 @@ ${DIR_LEAVE}; \ done : >.deps - for i in "" ${DEPS} ${OBJS} ${OBJS_EXTRA} ${LIB_OBJS} ${LIB_OBJS_EXTRA} ${AMIGA_LIB_OBJS} ${AMIGA_LIB_OBJS_EXTRA} ${PLUGIN_OBJS} ${PROG} ${PROG_NOINST} ${SHARED_LIB} ${SHARED_LIB_NOINST} ${AMIGA_LIB} ${AMIGA_LIB_NOINST} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST} ${STATIC_AMIGA_LIB} ${STATIC_AMIGA_LIB_NOINST} ${FRAMEWORK} ${PLUGIN} ${PLUGIN_NOINST} ${CLEAN_LIB} ${MO_FILES} ${CLEAN}; do \ + for i in "" ${DEPS} ${OBJS} ${OBJS_EXTRA} ${LIB_OBJS} ${LIB_OBJS_EXTRA} ${AMIGA_LIB_OBJS} ${AMIGA_LIB_OBJS_START} ${AMIGA_LIB_OBJS_EXTRA} ${PLUGIN_OBJS} ${PROG} ${PROG_NOINST} ${SHARED_LIB} ${SHARED_LIB_NOINST} ${AMIGA_LIB} ${AMIGA_LIB_NOINST} ${STATIC_LIB} ${STATIC_LIB_NOINST} ${STATIC_PIC_LIB} ${STATIC_PIC_LIB_NOINST} ${STATIC_AMIGA_LIB} ${STATIC_AMIGA_LIB_NOINST} ${FRAMEWORK} ${PLUGIN} ${PLUGIN_NOINST} ${CLEAN_LIB} ${MO_FILES} ${CLEAN}; do \ test x"$$i" = x"" && continue; \ if test -f $$i -o -d $$i; then \ if rm -fr $$i; then \ ${DELETE_OK}; \ else \ Index: configure.ac ================================================================== --- configure.ac +++ configure.ac @@ -49,13 +49,10 @@ supports_amiga_lib="yes" AS_IF([test x"$enable_amiga_lib" != x"no"], [ AC_SUBST(OBJFW_AMIGA_LIB, objfw68k.library) AC_SUBST(OBJFWRT_AMIGA_LIB, objfwrt68k.library) - AC_SUBST(SFDC_TARGET, m68k-amigaos) - AC_SUBST(SFD_FILE, amigaos3.sfd) - AC_SUBST(SFDC_INLINE_H, inline.h) dnl For 68000, GCC emits calls to helper functions that dnl do not work properly in a library. t="-mcpu=68020 -fbaserel32 -noixemul -ffreestanding" AC_SUBST(AMIGA_LIB_CFLAGS, $t) t="$t -resident32 -nostartfiles -nodefaultlibs -ldebug -lc" @@ -80,16 +77,14 @@ LIBS="$LIBS -ldebug" enable_files="yes" # Required for reading ENV: enable_shared="no" supports_amiga_lib="yes" - check_pedantic="no" # Breaks generated inlines AS_IF([test x"$enable_amiga_lib" != x"no"], [ AC_SUBST(OBJFW_AMIGA_LIB, objfw.library) AC_SUBST(OBJFWRT_AMIGA_LIB, objfwrt.library) - AC_SUBST(CVINCLUDE_INLINE_H, inline.h) t="-mresident32 -ffreestanding -noixemul" AC_SUBST(AMIGA_LIB_CFLAGS, $t) t="-mresident32 -nostartfiles -nodefaultlibs -noixemul" t="$t -laboxstubs -labox -lmath -ldebug -lc" AC_SUBST(AMIGA_LIB_LDFLAGS, $t) @@ -1963,10 +1958,14 @@ ]) AC_ARG_WITH(fish_completions, AS_HELP_STRING([--with-fish-completions], [install completions for the fish shell])) +AS_IF([test x"$with_fish_completions" = x""], [ + AC_CHECK_PROG(FISH, fish, fish) + AS_IF([test x"$FISH" != x""], [with_fish_completions="yes"]) +]) AS_IF([test x"$with_fish_completions" = x"yes"], [ AC_SUBST(FISH_COMPLETIONS, fish) ]) dnl We don't call AC_PROG_CPP, but only AC_PROG_OBJCPP and set CPP to OBJCPP DELETED generators/Makefile Index: generators/Makefile ================================================================== --- generators/Makefile +++ generators/Makefile @@ -1,67 +0,0 @@ -include ../extra.mk - -PROG_NOINST = gen_tables${PROG_SUFFIX} -SRCS = TableGenerator.m - -.PHONY: run -run: all - rm -f libobjfw.so.${OBJFW_LIB_MAJOR} - rm -f libobjfw.so.${OBJFW_LIB_MAJOR_MINOR} - rm -f objfw.dll libobjfw.${OBJFW_LIB_MAJOR}.dylib - rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR} - rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} - rm -f objfwrt.dll libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib - rm -f ${OBJFWRT_AMIGA_LIB} - if test -f ../src/libobjfw.so; then \ - ${LN_S} ../src/libobjfw.so libobjfw.so.${OBJFW_LIB_MAJOR}; \ - ${LN_S} ../src/libobjfw.so \ - libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; \ - elif test -f ../src/libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; then \ - ${LN_S} ../src/libobjfw.so.${OBJFW_LIB_MAJOR_MINOR} \ - libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; \ - fi - if test -f ../src/objfw.dll; then \ - ${LN_S} ../src/objfw.dll objfw.dll; \ - fi - if test -f ../src/libobjfw.dylib; then \ - ${LN_S} ../src/libobjfw.dylib \ - libobjfw.${OBJFW_LIB_MAJOR}.dylib; \ - fi - if test -f ../src/runtime/libobjfwrt.so; then \ - ${LN_S} ../src/runtime/libobjfwrt.so \ - libobjfwrt.so.${OBJFWRT_LIB_MAJOR}; \ - ${LN_S} ../src/runtime/libobjfwrt.so \ - libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; \ - elif test -f ../src/runtime/libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; then \ - ${LN_S} ../src/runtime/libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; \ - fi - if test -f ../src/runtime/objfwrt.dll; then \ - ${LN_S} ../src/runtime/objfwrt.dll objfwrt.dll; \ - fi - if test -f ../src/runtime/libobjfwrt.dylib; then \ - ${LN_S} ../src/runtime/libobjfwrt.dylib \ - libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib; \ - fi - if test -f ../src/runtime/${OBJFWRT_AMIGA_LIB}; then \ - ${LN_S} ../src/runtime/${OBJFWRT_AMIGA_LIB} \ - ${OBJFWRT_AMIGA_LIB}; \ - fi - LD_LIBRARY_PATH=.$${LD_LIBRARY_PATH+:}$$LD_LIBRARY_PATH \ - DYLD_FRAMEWORK_PATH=../src:../src/runtime$${DYLD_FRAMEWORK_PATH+:}$$DYLD_FRAMEWORK_PATH \ - DYLD_LIBRARY_PATH=.$${DYLD_LIBRARY_PATH+:}$$DYLD_LIBRARY_PATH \ - LIBRARY_PATH=.$${LIBRARY_PATH+:}$$LIBRARY_PATH \ - ASAN_OPTIONS=allocator_may_return_null=1 \ - ${WRAPPER} ./${PROG_NOINST}; EXIT=$$?; \ - rm -f libobjfw.so.${OBJFW_LIB_MAJOR}; \ - rm -f objfw.so.${OBJFW_LIB_MAJOR_MINOR} objfw.dll; \ - rm -f libobjfw.${OBJFW_LIB_MAJOR}.dylib; \ - rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR}; \ - rm -f objfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} objfwrt.dll; \ - rm -f libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib; \ - exit $$EXIT - -include ../buildsys.mk - -CPPFLAGS += -I../src -I../src/exceptions -I../src/runtime -I.. -LIBS := -L../src -lobjfw -L../src/runtime ${RUNTIME_LIBS} ${LIBS} -LD = ${OBJC} DELETED generators/TableGenerator.h Index: generators/TableGenerator.h ================================================================== --- generators/TableGenerator.h +++ generators/TableGenerator.h @@ -1,57 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, - * 2018, 2019, 2020 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFObject.h" -#import "OFHTTPClient.h" - -@class OFString; - -@interface TableGenerator: OFObject -{ - OFHTTPClient *_HTTPClient; - of_unichar_t _uppercaseTable[0x110000]; - of_unichar_t _lowercaseTable[0x110000]; - of_unichar_t _titlecaseTable[0x110000]; - of_unichar_t _casefoldingTable[0x110000]; - OFString *_decompositionTable[0x110000]; - OFString *_decompositionCompatTable[0x110000]; - char _uppercaseTableUsed[0x1100]; - char _lowercaseTableUsed[0x1100]; - char _titlecaseTableUsed[0x1100]; - char _casefoldingTableUsed[0x1100]; - char _decompositionTableUsed[0x1100]; - char _decompositionCompatTableUsed[0x1100]; - size_t _uppercaseTableSize; - size_t _lowercaseTableSize; - size_t _titlecaseTableSize; - size_t _casefoldingTableSize; - size_t _decompositionTableSize; - size_t _decompositionCompatTableSize; - enum { - STATE_UNICODE_DATA, - STATE_CASE_FOLDING - } _state; -} - -- (void)parseUnicodeData: (OFHTTPResponse *)response; -- (void)parseCaseFolding: (OFHTTPResponse *)response; -- (void)applyDecompositionRecursivelyForTable: (OFString *[0x110000])table; -- (void)writeFiles; -- (void)writeTablesToFile: (OFString *)path; -- (void)writeHeaderToFile: (OFString *)path; -@end DELETED generators/TableGenerator.m Index: generators/TableGenerator.m ================================================================== --- generators/TableGenerator.m +++ generators/TableGenerator.m @@ -1,776 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, - * 2018, 2019, 2020 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#include "config.h" - -#include - -#import "OFString.h" -#import "OFArray.h" -#import "OFApplication.h" -#import "OFURL.h" -#import "OFHTTPRequest.h" -#import "OFHTTPResponse.h" -#import "OFHTTPClient.h" -#import "OFFile.h" -#import "OFStdIOStream.h" - -#import "OFOutOfRangeException.h" - -#import "TableGenerator.h" -#import "copyright.h" - -#define UNICODE_DATA_URL \ - @"http://www.unicode.org/Public/UNIDATA/UnicodeData.txt" -#define CASE_FOLDING_URL \ - @"http://www.unicode.org/Public/UNIDATA/CaseFolding.txt" - -OF_APPLICATION_DELEGATE(TableGenerator) - -@implementation TableGenerator -- (instancetype)init -{ - self = [super init]; - - @try { - _HTTPClient = [[OFHTTPClient alloc] init]; - _HTTPClient.delegate = self; - - _uppercaseTableSize = SIZE_MAX; - _lowercaseTableSize = SIZE_MAX; - _titlecaseTableSize = SIZE_MAX; - _casefoldingTableSize = SIZE_MAX; - _decompositionTableSize = SIZE_MAX; - _decompositionCompatTableSize = SIZE_MAX; - } @catch (id e) { - @throw e; - [self release]; - } - - return self; -} - -- (void)applicationDidFinishLaunching -{ - OFHTTPRequest *request; - - [of_stdout writeString: @"Downloading UnicodeData.txt…"]; - _state = STATE_UNICODE_DATA; - request = [OFHTTPRequest requestWithURL: - [OFURL URLWithString: UNICODE_DATA_URL]]; - [_HTTPClient asyncPerformRequest: request]; -} - -- (void)client: (OFHTTPClient *)client - didPerformRequest: (OFHTTPRequest *)request - response: (OFHTTPResponse *)response - exception: (id)exception -{ - if (exception != nil) - @throw exception; - - [of_stdout writeLine: @" done"]; - - switch (_state) { - case STATE_UNICODE_DATA: - [self parseUnicodeData: response]; - break; - case STATE_CASE_FOLDING: - [self parseCaseFolding: response]; - break; - } -} - -- (void)parseUnicodeData: (OFHTTPResponse *)response -{ - OFString *line; - OFHTTPRequest *request; - - [of_stdout writeString: @"Parsing UnicodeData.txt…"]; - - while ((line = [response readLine]) != nil) { - void *pool2; - OFArray OF_GENERIC(OFString *) *components; - of_unichar_t codePoint; - - if (line.length == 0) - continue; - - pool2 = objc_autoreleasePoolPush(); - - components = [line componentsSeparatedByString: @";"]; - if (components.count != 15) { - of_log(@"Invalid line: %@\n", line); - [OFApplication terminateWithStatus: 1]; - } - - codePoint = (of_unichar_t)[[components objectAtIndex: 0] - unsignedLongLongValueWithBase: 16]; - - if (codePoint > 0x10FFFF) - @throw [OFOutOfRangeException exception]; - - _uppercaseTable[codePoint] = (of_unichar_t)[[components - objectAtIndex: 12] unsignedLongLongValueWithBase: 16]; - _lowercaseTable[codePoint] = (of_unichar_t)[[components - objectAtIndex: 13] unsignedLongLongValueWithBase: 16]; - _titlecaseTable[codePoint] = (of_unichar_t)[[components - objectAtIndex: 14] unsignedLongLongValueWithBase: 16]; - - if ([[components objectAtIndex: 5] length] > 0) { - OFArray *decomposed = [[components objectAtIndex: 5] - componentsSeparatedByString: @" "]; - bool compat = false; - OFMutableString *string; - - if ([decomposed.firstObject hasPrefix: @"<"]) { - decomposed = [decomposed objectsInRange: - of_range(1, decomposed.count - 1)]; - compat = true; - } - - string = [OFMutableString string]; - - for (OFString *character in decomposed) { - of_unichar_t unichar = (of_unichar_t)[character - unsignedLongLongValueWithBase: 16]; - - [string appendCharacters: &unichar - length: 1]; - } - - [string makeImmutable]; - - if (!compat) - _decompositionTable[codePoint] = [string copy]; - _decompositionCompatTable[codePoint] = [string copy]; - } - - objc_autoreleasePoolPop(pool2); - } - - [self applyDecompositionRecursivelyForTable: _decompositionTable]; - [self applyDecompositionRecursivelyForTable: _decompositionCompatTable]; - - [of_stdout writeLine: @" done"]; - - [of_stdout writeString: @"Downloading CaseFolding.txt…"]; - _state = STATE_CASE_FOLDING; - request = [OFHTTPRequest requestWithURL: - [OFURL URLWithString: CASE_FOLDING_URL]]; - [_HTTPClient asyncPerformRequest: request]; -} - -- (void)parseCaseFolding: (OFHTTPResponse *)response -{ - OFString *line; - - [of_stdout writeString: @"Parsing CaseFolding.txt…"]; - - while ((line = [response readLine]) != nil) { - void *pool2; - OFArray OF_GENERIC(OFString *) *components; - of_unichar_t codePoint; - - if (line.length == 0 || [line hasPrefix: @"#"]) - continue; - - pool2 = objc_autoreleasePoolPush(); - - components = [line componentsSeparatedByString: @"; "]; - if (components.count != 4) { - of_log(@"Invalid line: %s\n", line); - [OFApplication terminateWithStatus: 1]; - } - - if (![[components objectAtIndex: 1] isEqual: @"S"] && - ![[components objectAtIndex: 1] isEqual: @"C"]) - continue; - - codePoint = (of_unichar_t)[[components objectAtIndex: 0] - unsignedLongLongValueWithBase: 16]; - - if (codePoint > 0x10FFFF) - @throw [OFOutOfRangeException exception]; - - _casefoldingTable[codePoint] = (of_unichar_t)[[components - objectAtIndex: 2] unsignedLongLongValueWithBase: 16]; - - objc_autoreleasePoolPop(pool2); - } - - [of_stdout writeLine: @" done"]; - - [self writeFiles]; -} - -- (void)applyDecompositionRecursivelyForTable: (OFString *[0x110000])table -{ - bool done; - - do { - done = true; - - for (of_unichar_t i = 0; i < 0x110000; i++) { - void *pool; - const of_unichar_t *characters; - size_t length; - OFMutableString *replacement; - bool changed = false; - - if (table[i] == nil) - continue; - - pool = objc_autoreleasePoolPush(); - characters = table[i].characters; - length = table[i].length; - replacement = [OFMutableString string]; - - for (size_t j = 0; j < length; j++) { - if (characters[j] > 0x10FFFF) - @throw [OFOutOfRangeException - exception]; - - if (table[characters[j]] == nil) - [replacement - appendCharacters: &characters[j] - length: 1]; - else { - [replacement - appendString: table[characters[j]]]; - changed = true; - } - } - - [replacement makeImmutable]; - - if (changed) { - [table[i] release]; - table[i] = [replacement copy]; - - done = false; - } - - objc_autoreleasePoolPop(pool); - } - } while (!done); -} - -- (void)writeFiles -{ - OFURL *URL; - - [of_stdout writeString: @"Writing files…"]; - - URL = [OFURL fileURLWithPath: @"../src/unicode.m"]; - [self writeTablesToFile: URL.fileSystemRepresentation]; - - URL = [OFURL fileURLWithPath: @"../src/unicode.h"]; - [self writeHeaderToFile: URL.fileSystemRepresentation]; - - [of_stdout writeLine: @" done"]; - - [OFApplication terminate]; -} - -- (void)writeTablesToFile: (OFString *)path -{ - void *pool = objc_autoreleasePoolPush(); - OFFile *file = [OFFile fileWithPath: path - mode: @"w"]; - - [file writeString: COPYRIGHT - @"#include \"config.h\"\n" - @"\n" - @"#import \"OFString.h\"\n\n" - @"static const of_unichar_t emptyPage[0x100] = { 0 };\n" - @"static const char *emptyDecompositionPage[0x100] = { NULL };\n" - @"\n"]; - - /* Write uppercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { - bool isEmpty = true; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_uppercaseTable[j] != 0) { - isEmpty = false; - _uppercaseTableSize = i >> 8; - _uppercaseTableUsed[_uppercaseTableSize] = 1; - break; - } - } - - if (!isEmpty) { - void *pool2 = objc_autoreleasePoolPush(); - - [file writeFormat: @"static const of_unichar_t " - @"uppercasePage%u[0x100] = {\n", - i >> 8]; - - for (of_unichar_t j = i; j < i + 0x100; j += 8) - [file writeFormat: - @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", - _uppercaseTable[j], - _uppercaseTable[j + 1], - _uppercaseTable[j + 2], - _uppercaseTable[j + 3], - _uppercaseTable[j + 4], - _uppercaseTable[j + 5], - _uppercaseTable[j + 6], - _uppercaseTable[j + 7]]; - - [file writeString: @"};\n\n"]; - - objc_autoreleasePoolPop(pool2); - } - } - - /* Write lowercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { - bool isEmpty = true; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_lowercaseTable[j] != 0) { - isEmpty = false; - _lowercaseTableSize = i >> 8; - _lowercaseTableUsed[_lowercaseTableSize] = 1; - break; - } - } - - if (!isEmpty) { - void *pool2 = objc_autoreleasePoolPush(); - - [file writeFormat: @"static const of_unichar_t " - @"lowercasePage%u[0x100] = {\n", - i >> 8]; - - for (of_unichar_t j = i; j < i + 0x100; j += 8) - [file writeFormat: - @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", - _lowercaseTable[j], - _lowercaseTable[j + 1], - _lowercaseTable[j + 2], - _lowercaseTable[j + 3], - _lowercaseTable[j + 4], - _lowercaseTable[j + 5], - _lowercaseTable[j + 6], - _lowercaseTable[j + 7]]; - - [file writeString: @"};\n\n"]; - - objc_autoreleasePoolPop(pool2); - } - } - - /* Write titlecasePage%u if it does NOT match uppercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { - bool isEmpty = true; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_titlecaseTable[j] != 0) { - isEmpty = !memcmp(_uppercaseTable + i, - _titlecaseTable + i, - 256 * sizeof(of_unichar_t)); - _titlecaseTableSize = i >> 8; - _titlecaseTableUsed[_titlecaseTableSize] = - (isEmpty ? 2 : 1); - break; - } - } - - if (!isEmpty) { - void *pool2 = objc_autoreleasePoolPush(); - - [file writeFormat: @"static const of_unichar_t " - @"titlecasePage%u[0x100] = {\n", - i >> 8]; - - for (of_unichar_t j = i; j < i + 0x100; j += 8) - [file writeFormat: - @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", - _titlecaseTable[j], - _titlecaseTable[j + 1], - _titlecaseTable[j + 2], - _titlecaseTable[j + 3], - _titlecaseTable[j + 4], - _titlecaseTable[j + 5], - _titlecaseTable[j + 6], - _titlecaseTable[j + 7]]; - - [file writeString: @"};\n\n"]; - - objc_autoreleasePoolPop(pool2); - } - } - - /* Write casefoldingPage%u if it does NOT match lowercasePage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { - bool isEmpty = true; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_casefoldingTable[j] != 0) { - isEmpty = !memcmp(_lowercaseTable + i, - _casefoldingTable + i, - 256 * sizeof(of_unichar_t)); - _casefoldingTableSize = i >> 8; - _casefoldingTableUsed[_casefoldingTableSize] = - (isEmpty ? 2 : 1); - break; - } - } - - if (!isEmpty) { - void *pool2 = objc_autoreleasePoolPush(); - - [file writeFormat: @"static const of_unichar_t " - @"casefoldingPage%u[0x100] = {\n", - i >> 8]; - - for (of_unichar_t j = i; j < i + 0x100; j += 8) - [file writeFormat: - @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", - _casefoldingTable[j], - _casefoldingTable[j + 1], - _casefoldingTable[j + 2], - _casefoldingTable[j + 3], - _casefoldingTable[j + 4], - _casefoldingTable[j + 5], - _casefoldingTable[j + 6], - _casefoldingTable[j + 7]]; - - [file writeString: @"};\n\n"]; - - objc_autoreleasePoolPop(pool2); - } - } - - /* Write decompositionPage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { - bool isEmpty = true; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_decompositionTable[j] != nil) { - isEmpty = false; - _decompositionTableSize = i >> 8; - _decompositionTableUsed[ - _decompositionTableSize] = 1; - break; - } - } - - if (!isEmpty) { - void *pool2 = objc_autoreleasePoolPush(); - - [file writeFormat: @"static const char *const " - @"decompositionPage%u[0x100] = {\n", - i >> 8]; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if ((j - i) % 2 == 0) - [file writeString: @"\t"]; - else - [file writeString: @" "]; - - if (_decompositionTable[j] != nil) { - const char *UTF8String = - _decompositionTable[j].UTF8String; - size_t length = _decompositionTable[j] - .UTF8StringLength; - - [file writeString: @"\""]; - - for (size_t k = 0; k < length; k++) - [file writeFormat: - @"\\x%02X", - (uint8_t)UTF8String[k]]; - - [file writeString: @"\","]; - } else - [file writeString: @"NULL,"]; - - if ((j - i) % 2 == 1) - [file writeString: @"\n"]; - } - - [file writeString: @"};\n\n"]; - - objc_autoreleasePoolPop(pool2); - } - } - - /* Write decompCompatPage%u if it does NOT match decompositionPage%u */ - for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { - bool isEmpty = true; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if (_decompositionCompatTable[j] != 0) { - /* - * We bulk-compare pointers via memcmp here. - * This is safe, as we always set the same - * pointer in both tables if both are the same. - */ - isEmpty = !memcmp(_decompositionTable + i, - _decompositionCompatTable + i, - 256 * sizeof(const char *)); - _decompositionCompatTableSize = i >> 8; - _decompositionCompatTableUsed[ - _decompositionCompatTableSize] = - (isEmpty ? 2 : 1); - - break; - } - } - - if (!isEmpty) { - void *pool2 = objc_autoreleasePoolPush(); - - [file writeFormat: @"static const char *const " - @"decompCompatPage%u[0x100] = {\n", - i >> 8]; - - for (of_unichar_t j = i; j < i + 0x100; j++) { - if ((j - i) % 2 == 0) - [file writeString: @"\t"]; - else - [file writeString: @" "]; - - if (_decompositionCompatTable[j] != nil) { - const char *UTF8String = - _decompositionCompatTable[j] - .UTF8String; - size_t length = - _decompositionCompatTable[j] - .UTF8StringLength; - - [file writeString: @"\""]; - - for (size_t k = 0; k < length; k++) - [file writeFormat: - @"\\x%02X", - (uint8_t)UTF8String[k]]; - - [file writeString: @"\","]; - } else - [file writeString: @"NULL,"]; - - if ((j - i) % 2 == 1) - [file writeString: @"\n"]; - } - - [file writeString: @"};\n\n"]; - - objc_autoreleasePoolPop(pool2); - } - } - - /* - * Those are currently set to the last index. - * But from now on, we need the size. - */ - _uppercaseTableSize++; - _lowercaseTableSize++; - _titlecaseTableSize++; - _casefoldingTableSize++; - _decompositionTableSize++; - _decompositionCompatTableSize++; - - /* Write of_unicode_uppercase_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_uppercase_table[0x%X] = {\n\t", - _uppercaseTableSize]; - - for (of_unichar_t i = 0; i < _uppercaseTableSize; i++) { - if (_uppercaseTableUsed[i]) - [file writeFormat: @"uppercasePage%u", i]; - else - [file writeString: @"emptyPage"]; - - if (i + 1 < _uppercaseTableSize) { - if ((i + 1) % 4 == 0) - [file writeString: @",\n\t"]; - else - [file writeString: @", "]; - } - } - - [file writeString: @"\n};\n\n"]; - - /* Write of_unicode_lowercase_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_lowercase_table[0x%X] = {\n\t", - _lowercaseTableSize]; - - for (of_unichar_t i = 0; i < _lowercaseTableSize; i++) { - if (_lowercaseTableUsed[i]) - [file writeFormat: @"lowercasePage%u", i]; - else - [file writeString: @"emptyPage"]; - - if (i + 1 < _lowercaseTableSize) { - if ((i + 1) % 4 == 0) - [file writeString: @",\n\t"]; - else - [file writeString: @", "]; - } - } - - [file writeString: @"\n};\n\n"]; - - /* Write of_unicode_titlecase_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_titlecase_table[0x%X] = {\n\t", - _titlecaseTableSize]; - - for (of_unichar_t i = 0; i < _titlecaseTableSize; i++) { - if (_titlecaseTableUsed[i] == 1) - [file writeFormat: @"titlecasePage%u", i]; - else if (_titlecaseTableUsed[i] == 2) - [file writeFormat: @"uppercasePage%u", i]; - else - [file writeString: @"emptyPage"]; - - if (i + 1 < _titlecaseTableSize) { - if ((i + 1) % 4 == 0) - [file writeString: @",\n\t"]; - else - [file writeString: @", "]; - } - } - - [file writeString: @"\n};\n\n"]; - - /* Write of_unicode_casefolding_table */ - [file writeFormat: @"const of_unichar_t *const " - @"of_unicode_casefolding_table[0x%X] = {\n\t", - _casefoldingTableSize]; - - for (of_unichar_t i = 0; i < _casefoldingTableSize; i++) { - if (_casefoldingTableUsed[i] == 1) - [file writeFormat: @"casefoldingPage%u", i]; - else if (_casefoldingTableUsed[i] == 2) - [file writeFormat: @"lowercasePage%u", i]; - else - [file writeString: @"emptyPage"]; - - if (i + 1 < _casefoldingTableSize) { - if ((i + 1) % 3 == 0) - [file writeString: @",\n\t"]; - else - [file writeString: @", "]; - } - } - - [file writeString: @"\n};\n\n"]; - - /* Write of_unicode_decomposition_table */ - [file writeFormat: @"const char *const " - @"*of_unicode_decomposition_table[0x%X] = {\n\t", - _decompositionTableSize]; - - for (of_unichar_t i = 0; i < _decompositionTableSize; i++) { - if (_decompositionTableUsed[i]) - [file writeFormat: @"decompositionPage%u", i]; - else - [file writeString: @"emptyDecompositionPage"]; - - if (i + 1 < _decompositionTableSize) { - if ((i + 1) % 3 == 0) - [file writeString: @",\n\t"]; - else - [file writeString: @", "]; - } - } - - [file writeString: @"\n};\n\n"]; - - /* Write of_unicode_decomposition_compat_table */ - [file writeFormat: @"const char *const " - @"*of_unicode_decomposition_compat_table[0x%X] = {" - @"\n\t", - _decompositionCompatTableSize]; - - for (of_unichar_t i = 0; i < _decompositionCompatTableSize; i++) { - if (_decompositionCompatTableUsed[i] == 1) - [file writeFormat: @"decompCompatPage%u", i]; - else if (_decompositionCompatTableUsed[i] == 2) - [file writeFormat: @"decompositionPage%u", i]; - else - [file writeString: @"emptyDecompositionPage"]; - - if (i + 1 < _decompositionCompatTableSize) { - if ((i + 1) % 3 == 0) - [file writeString: @",\n\t"]; - else - [file writeString: @", "]; - } - } - - [file writeString: @"\n};\n"]; - - objc_autoreleasePoolPop(pool); -} - -- (void)writeHeaderToFile: (OFString *)path -{ - void *pool = objc_autoreleasePoolPush(); - OFFile *file = [OFFile fileWithPath: path - mode: @"w"]; - - [file writeString: COPYRIGHT - @"#import \"OFString.h\"\n\n"]; - - [file writeFormat: - @"#define OF_UNICODE_UPPERCASE_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_LOWERCASE_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_TITLECASE_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_CASEFOLDING_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_DECOMPOSITION_TABLE_SIZE 0x%X\n" - @"#define OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE 0x%X\n\n", - _uppercaseTableSize, _lowercaseTableSize, _titlecaseTableSize, - _casefoldingTableSize, _decompositionTableSize, - _decompositionCompatTableSize]; - - [file writeString: - @"#ifdef __cplusplus\n" - @"extern \"C\" {\n" - @"#endif\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_uppercase_table[" - @"OF_UNICODE_UPPERCASE_TABLE_SIZE];\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_lowercase_table[" - @"OF_UNICODE_LOWERCASE_TABLE_SIZE];\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_titlecase_table[" - @"OF_UNICODE_TITLECASE_TABLE_SIZE];\n" - @"extern const of_unichar_t *const _Nonnull\n" - @" of_unicode_casefolding_table[" - @"OF_UNICODE_CASEFOLDING_TABLE_SIZE];\n" - @"extern const char *const _Nullable *const _Nonnull\n" - @" of_unicode_decomposition_table[" - @"OF_UNICODE_DECOMPOSITION_TABLE_SIZE];\n" - @"extern const char *const _Nullable *const _Nonnull\n" - @" of_unicode_decomposition_compat_table[" - @"OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE];\n" - @"#ifdef __cplusplus\n" - @"}\n" - @"#endif\n"]; - - objc_autoreleasePoolPop(pool); -} -@end DELETED generators/copyright.h Index: generators/copyright.h ================================================================== --- generators/copyright.h +++ generators/copyright.h @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, - * 2018, 2019, 2020 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "OFString.h" - -#define COPYRIGHT \ - @"/*\n" \ - @" * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, " \ - @"2017,\n" \ - @" * 2018, 2019, 2020\n" \ - @" * Jonathan Schleifer \n" \ - @" *\n" \ - @" * All rights reserved.\n" \ - @" *\n" \ - @" * This file is part of ObjFW. It may be distributed under the terms " \ - @"of the\n" \ - @" * Q Public License 1.0, which can be found in the file LICENSE.QPL " \ - @"included in\n" \ - @" * the packaging of this file.\n" \ - @" *\n" \ - @" * Alternatively, it may be distributed under the terms of the GNU " \ - @"General\n" \ - @" * Public License, either version 2 or 3, which can be found in the " \ - @"file\n" \ - @" * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the " \ - @"packaging of this\n" \ - @" * file.\n" \ - @" */\n" \ - @"\n" ADDED generators/library/FuncArrayGenerator.h Index: generators/library/FuncArrayGenerator.h ================================================================== --- generators/library/FuncArrayGenerator.h +++ generators/library/FuncArrayGenerator.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFObject.h" + +#import "OFStream.h" +#import "OFXMLElement.h" + +@interface FuncArrayGenerator: OFObject +{ + OFXMLElement *_library; + OFStream *_include; +} + +- (instancetype)initWithLibrary: (OFXMLElement *)library + include: (OFStream *)include; +- (void)generate; +@end ADDED generators/library/FuncArrayGenerator.m Index: generators/library/FuncArrayGenerator.m ================================================================== --- generators/library/FuncArrayGenerator.m +++ generators/library/FuncArrayGenerator.m @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFArray.h" +#import "OFXMLAttribute.h" + +#import "FuncArrayGenerator.h" + +#import "OFInvalidFormatException.h" +#import "OFUnsupportedVersionException.h" + +#import "copyright.h" + +@implementation FuncArrayGenerator +- (instancetype)initWithLibrary: (OFXMLElement *)library + include: (OFStream *)include +{ + self = [super init]; + + @try { + OFXMLAttribute *version; + + if (![library.name isEqual: @"amiga-library"] || + library.namespace != nil) + @throw [OFInvalidFormatException exception]; + + if ((version = [library attributeForName: @"version"]) == nil) + @throw [OFInvalidFormatException exception]; + + if (![version.stringValue isEqual: @"1.0"]) + @throw [OFUnsupportedVersionException + exceptionWithVersion: version.stringValue]; + + _library = [library retain]; + _include = [include retain]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (void)dealloc +{ + [_library release]; + [_include release]; + + [super dealloc]; +} + +- (void)generate +{ + [_include writeString: COPYRIGHT]; + [_include writeString: + @"/* This file is automatically generated from library.xml */\n" + @"\n"]; + + for (OFXMLElement *function in [_library elementsForName: @"function"]) + [_include writeFormat: + @"(CONST_APTR)glue_%@,\n", + [function attributeForName: @"name"].stringValue]; +} +@end ADDED generators/library/GlueGenerator.h Index: generators/library/GlueGenerator.h ================================================================== --- generators/library/GlueGenerator.h +++ generators/library/GlueGenerator.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFObject.h" + +#import "OFStream.h" +#import "OFXMLElement.h" + +@interface GlueGenerator: OFObject +{ + OFXMLElement *_library; + OFStream *_header, *_impl; +} + +- (instancetype)initWithLibrary: (OFXMLElement *)library + header: (OFStream *)header + implementation: (OFStream *)implementation; +- (void)generate; +@end ADDED generators/library/GlueGenerator.m Index: generators/library/GlueGenerator.m ================================================================== --- generators/library/GlueGenerator.m +++ generators/library/GlueGenerator.m @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFArray.h" +#import "OFXMLAttribute.h" + +#import "GlueGenerator.h" + +#import "OFInvalidFormatException.h" +#import "OFUnsupportedVersionException.h" + +#import "copyright.h" + +@implementation GlueGenerator +- (instancetype)initWithLibrary: (OFXMLElement *)library + header: (OFStream *)header + implementation: (OFStream *)impl +{ + self = [super init]; + + @try { + OFXMLAttribute *version; + + if (![library.name isEqual: @"amiga-library"] || + library.namespace != nil) + @throw [OFInvalidFormatException exception]; + + if ((version = [library attributeForName: @"version"]) == nil) + @throw [OFInvalidFormatException exception]; + + if (![version.stringValue isEqual: @"1.0"]) + @throw [OFUnsupportedVersionException + exceptionWithVersion: version.stringValue]; + + _library = [library retain]; + _header = [header retain]; + _impl = [impl retain]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (void)dealloc +{ + [_library release]; + [_header release]; + [_impl release]; + + [super dealloc]; +} + +- (void)generate +{ + [_header writeString: COPYRIGHT]; + [_impl writeString: COPYRIGHT]; + + [_header writeString: + @"/* This file is automatically generated from library.xml */\n" + @"\n"]; + + [_impl writeString: + @"/* This file is automatically generated from library.xml */\n" + @"\n" + @"#include \"config.h\"\n" + @"\n" + @"#import \"amiga-glue.h\"\n" + @"\n"]; + + for (OFXMLElement *include in [_library elementsForName: @"include"]) + [_header writeFormat: @"#import \"%@\"\n", include.stringValue]; + + [_header writeString: + @"\n" + @"#ifdef OF_AMIGAOS_M68K\n" + @"# define PPC_PARAMS(...) (void)\n" + @"# define M68K_ARG(type, name, reg)\t\t\\\n" + @"\tregister type reg##name __asm__(#reg);\t\\\n" + @"\ttype name = reg##name;\n" + @"#else\n" + @"# define PPC_PARAMS(...) (__VA_ARGS__)\n" + @"# define M68K_ARG(...)\n" + @"#endif\n" + @"\n"]; + [_impl writeString: + @"#ifdef OF_MORPHOS\n" + @"/* All __saveds functions in this file need to use the SysV " + @"ABI */\n" + @"__asm__ (\n" + @" \".section .text\\n\"\n" + @" \".align 2\\n\"\n" + @" \"__restore_r13:\\n\"\n" + @" \"\tlwz\t%r13, 44(%r12)\\n\"\n" + @" \"\tblr\\n\"\n" + @");\n" + @"#endif\n"]; + + for (OFXMLElement *function in + [_library elementsForName: @"function"]) { + OFString *name = + [function attributeForName: @"name"].stringValue; + OFString *returnType = + [function attributeForName: @"return-type"].stringValue; + OFArray OF_GENERIC(OFXMLElement *) *arguments = + [function elementsForName: @"argument"]; + size_t argumentIndex; + + if (returnType == nil) + returnType = @"void"; + + [_header writeFormat: + @"extern %@%@glue_%@", + returnType, + (![returnType hasSuffix: @"*"] ? @" " : @""), + name]; + + [_impl writeFormat: @"\n" + @"%@ __saveds\n" + @"glue_%@", + returnType, name]; + + if (arguments.count > 0) { + [_header writeString: @" PPC_PARAMS("]; + [_impl writeString: @" PPC_PARAMS("]; + } else { + [_header writeString: @"(void"]; + [_impl writeString: @"(void"]; + } + + argumentIndex = 0; + for (OFXMLElement *argument in arguments) { + OFString *argName = + [argument attributeForName: @"name"].stringValue; + OFString *argType = + [argument attributeForName: @"type"].stringValue; + + if (argumentIndex++ > 0) { + [_header writeString: @", "]; + [_impl writeString: @", "]; + } + + [_header writeString: argType]; + [_impl writeString: argType]; + if (![argType hasSuffix: @"*"]) { + [_header writeString: @" "]; + [_impl writeString: @" "]; + } + [_header writeString: argName]; + [_impl writeString: argName]; + } + + [_header writeString: @");\n"]; + + [_impl writeString: @")\n{\n"]; + for (OFXMLElement *argument in arguments) { + OFString *argName = + [argument attributeForName: @"name"].stringValue; + OFString *argType = + [argument attributeForName: @"type"].stringValue; + OFString *m68kReg = [argument + attributeForName: @"m68k-reg"].stringValue; + + [_impl writeFormat: @"\tM68K_ARG(%@, %@, %@)\n", + argType, argName, m68kReg]; + } + + if (arguments.count > 0) + [_impl writeString: @"\n"]; + + if (![returnType isEqual: @"void"]) + [_impl writeString: @"\treturn "]; + else + [_impl writeString: @"\t"]; + + [_impl writeFormat: @"%@(", name]; + + argumentIndex = 0; + for (OFXMLElement *argument in arguments) { + OFString *argName = + [argument attributeForName: @"name"].stringValue; + + if (argumentIndex++ > 0) + [_impl writeString: @", "]; + + [_impl writeString: argName]; + } + + [_impl writeString: @");\n}\n"]; + } +} +@end ADDED generators/library/LibraryGenerator.m Index: generators/library/LibraryGenerator.m ================================================================== --- generators/library/LibraryGenerator.m +++ generators/library/LibraryGenerator.m @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFApplication.h" +#import "OFFile.h" +#import "OFFileManager.h" +#import "OFURL.h" +#import "OFXMLElement.h" + +#import "FuncArrayGenerator.h" +#import "GlueGenerator.h" +#import "LinkLibGenerator.h" + +@interface LibraryGenerator: OFObject +@end + +OF_APPLICATION_DELEGATE(LibraryGenerator) + +@implementation LibraryGenerator +- (void)applicationDidFinishLaunching +{ + OFURL *sourcesURL = [[OFFileManager defaultManager].currentDirectoryURL + URLByAppendingPathComponent: @"../../src"]; + OFURL *runtimeLibraryURL = [sourcesURL + URLByAppendingPathComponent: @"runtime/library.xml"]; + OFURL *runtimeLinkLibURL = [sourcesURL + URLByAppendingPathComponent: @"runtime/linklib/linklib.m"]; + OFURL *runtimeGlueHeaderURL = [sourcesURL + URLByAppendingPathComponent: @"runtime/amiga-glue.h"]; + OFURL *runtimeGlueURL = [sourcesURL + URLByAppendingPathComponent: @"runtime/amiga-glue.m"]; + OFURL *runtimeFuncArrayURL = [sourcesURL + URLByAppendingPathComponent: @"runtime/amiga-funcarray.inc"]; + OFXMLElement *runtimeLibrary = [OFXMLElement elementWithStream: + [OFFile fileWithURL: runtimeLibraryURL + mode: @"r"]]; + OFFile *runtimeLinkLib = [OFFile fileWithURL: runtimeLinkLibURL + mode: @"w"]; + OFFile *runtimeGlueHeader = [OFFile fileWithURL: runtimeGlueHeaderURL + mode: @"w"]; + OFFile *runtimeGlue = [OFFile fileWithURL: runtimeGlueURL + mode: @"w"]; + OFFile *runtimeFuncArray = [OFFile fileWithURL: runtimeFuncArrayURL + mode: @"w"]; + LinkLibGenerator *runtimeLinkLibGenerator = [[[LinkLibGenerator alloc] + initWithLibrary: runtimeLibrary + implementation: runtimeLinkLib] autorelease]; + GlueGenerator *runtimeGlueGenerator = [[[GlueGenerator alloc] + initWithLibrary: runtimeLibrary + header: runtimeGlueHeader + implementation: runtimeGlue] autorelease]; + FuncArrayGenerator *runtimeFuncArrayGenerator; + runtimeFuncArrayGenerator = [[[FuncArrayGenerator alloc] + initWithLibrary: runtimeLibrary + include: runtimeFuncArray] autorelease]; + + [runtimeLinkLibGenerator generate]; + [runtimeGlueGenerator generate]; + [runtimeFuncArrayGenerator generate]; + + [OFApplication terminate]; +} +@end ADDED generators/library/LinkLibGenerator.h Index: generators/library/LinkLibGenerator.h ================================================================== --- generators/library/LinkLibGenerator.h +++ generators/library/LinkLibGenerator.h @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFObject.h" +#import "OFStream.h" +#import "OFXMLElement.h" + +@interface LinkLibGenerator: OFObject +{ + OFXMLElement *_library; + OFStream *_impl; +} + +- (instancetype)initWithLibrary: (OFXMLElement *)library + implementation: (OFStream *)impl; +- (void)generate; +@end ADDED generators/library/LinkLibGenerator.m Index: generators/library/LinkLibGenerator.m ================================================================== --- generators/library/LinkLibGenerator.m +++ generators/library/LinkLibGenerator.m @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "OFArray.h" +#import "OFXMLAttribute.h" + +#import "LinkLibGenerator.h" + +#import "OFInvalidFormatException.h" +#import "OFUnsupportedVersionException.h" + +#import "copyright.h" + +@implementation LinkLibGenerator +- (instancetype)initWithLibrary: (OFXMLElement *)library + implementation: (OFStream *)impl +{ + self = [super init]; + + @try { + OFXMLAttribute *version; + + if (![library.name isEqual: @"amiga-library"] || + library.namespace != nil) + @throw [OFInvalidFormatException exception]; + + if ((version = [library attributeForName: @"version"]) == nil) + @throw [OFInvalidFormatException exception]; + + if (![version.stringValue isEqual: @"1.0"]) + @throw [OFUnsupportedVersionException + exceptionWithVersion: version.stringValue]; + + _library = [library retain]; + _impl = [impl retain]; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} + +- (void)dealloc +{ + [_library release]; + [_impl release]; + + [super dealloc]; +} + +- (void)generate +{ + OFString *libBase = [_library attributeForName: @"base"].stringValue; + OFArray OF_GENERIC(OFXMLElement *) *functions; + size_t funcIndex = 0; + + [_impl writeString: COPYRIGHT]; + [_impl writeString: + @"/* This file is automatically generated from library.xml */\n" + @"\n" + @"#include \"config.h\"\n" + @"\n"]; + + for (OFXMLElement *include in [_library elementsForName: @"include"]) + [_impl writeFormat: @"#import \"%@\"\n", + include.stringValue]; + + [_impl writeFormat: @"\n" + @"extern struct Library *%@;\n" + @"\n", + libBase]; + + functions = [_library elementsForName: @"function"]; + for (OFXMLElement *function in functions) { + OFString *name = + [function attributeForName: @"name"].stringValue; + OFString *returnType = + [function attributeForName: @"return-type"].stringValue; + OFArray OF_GENERIC(OFXMLElement *) *arguments = + [function elementsForName: @"argument"]; + size_t argumentIndex; + + if (returnType == nil) + returnType = @"void"; + + [_impl writeFormat: @"%@\n%@(", returnType, name]; + + argumentIndex = 0; + for (OFXMLElement *argument in + [function elementsForName: @"argument"]) { + OFString *argName = + [argument attributeForName: @"name"].stringValue; + OFString *argType = + [argument attributeForName: @"type"].stringValue; + + if (argumentIndex++ > 0) + [_impl writeString: @", "]; + + [_impl writeString: argType]; + if (![argType hasSuffix: @"*"]) + [_impl writeString: @" "]; + [_impl writeString: argName]; + } + + [_impl writeFormat: + @")\n" + @"{\n" + @"#if defined(OF_AMIGAOS_M68K)\n" + @"\tregister struct Library *a6 __asm__(\"a6\") = %@;\n" + @"\t(void)a6;\n" + @"\t", libBase]; + + if (![returnType isEqual: @"void"]) + [_impl writeString: @"return "]; + + [_impl writeString: @"(("]; + [_impl writeString: returnType]; + if (![returnType hasSuffix: @"*"]) + [_impl writeString: @" "]; + [_impl writeString: @"(*)("]; + + argumentIndex = 0; + for (OFXMLElement *argument in arguments) { + OFString *argType = + [argument attributeForName: @"type"].stringValue; + OFString *m68kReg = [argument + attributeForName: @"m68k-reg"].stringValue; + + if (argumentIndex++ > 0) + [_impl writeString: @", "]; + + [_impl writeString: argType]; + if (![argType hasSuffix: @"*"]) + [_impl writeString: @" "]; + [_impl writeFormat: @"__asm__(\"%@\")", + m68kReg]; + } + + [_impl writeFormat: @"))(((uintptr_t)%@) - %zu))(", + libBase, 30 + funcIndex * 6]; + + argumentIndex = 0; + for (OFXMLElement *argument in + [function elementsForName: @"argument"]) { + OFString *argName = + [argument attributeForName: @"name"].stringValue; + + if (argumentIndex++ > 0) + [_impl writeString: @", "]; + + [_impl writeString: argName]; + } + + [_impl writeFormat: @");\n" + @"#elif defined(OF_MORPHOS)\n" + @"\t__asm__ __volatile__ (\n" + @"\t \"mr\t\t%%%%r12, %%0\"\n" + @"\t :: \"r\"(%@) : \"r12\"\n" + @"\t);\n" + @"\n" + @"\t", + libBase, libBase]; + + if (![returnType isEqual: @"void"]) + [_impl writeString: @"return "]; + + [_impl writeString: @"__extension__ (("]; + [_impl writeString: returnType]; + if (![returnType hasSuffix: @"*"]) + [_impl writeString: @" "]; + [_impl writeString: @"(*)("]; + + argumentIndex = 0; + for (OFXMLElement *argument in arguments) { + OFString *argType = + [argument attributeForName: @"type"].stringValue; + + if (argumentIndex++ > 0) + [_impl writeString: @", "]; + + [_impl writeString: argType]; + } + + [_impl writeFormat: @"))*(void **)(((uintptr_t)%@) - %zu))(", + libBase, 28 + funcIndex * 6]; + + argumentIndex = 0; + for (OFXMLElement *argument in + [function elementsForName: @"argument"]) { + OFString *argName = + [argument attributeForName: @"name"].stringValue; + + if (argumentIndex++ > 0) + [_impl writeString: @", "]; + + [_impl writeString: argName]; + } + + [_impl writeString: @");\n" + @"#endif\n"]; + + if ([function attributeForName: @"noreturn"] != nil) + [_impl writeString: @"\n\tOF_UNREACHABLE\n"]; + + [_impl writeString: @"}\n"]; + + if (++funcIndex < functions.count) + [_impl writeString: @"\n"]; + } +} +@end ADDED generators/library/Makefile Index: generators/library/Makefile ================================================================== --- generators/library/Makefile +++ generators/library/Makefile @@ -0,0 +1,70 @@ +include ../../extra.mk + +PROG_NOINST = gen_libraries${PROG_SUFFIX} +SRCS = FuncArrayGenerator.m \ + GlueGenerator.m \ + LibraryGenerator.m \ + LinkLibGenerator.m + +.PHONY: run +run: all + rm -f libobjfw.so.${OBJFW_LIB_MAJOR} + rm -f libobjfw.so.${OBJFW_LIB_MAJOR_MINOR} + rm -f objfw.dll libobjfw.${OBJFW_LIB_MAJOR}.dylib + rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR} + rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} + rm -f objfwrt.dll libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib + rm -f ${OBJFWRT_AMIGA_LIB} + if test -f ../../src/libobjfw.so; then \ + ${LN_S} ../../src/libobjfw.so libobjfw.so.${OBJFW_LIB_MAJOR}; \ + ${LN_S} ../../src/libobjfw.so \ + libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; \ + elif test -f ../../src/libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; then \ + ${LN_S} ../../src/libobjfw.so.${OBJFW_LIB_MAJOR_MINOR} \ + libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; \ + fi + if test -f ../../src/objfw.dll; then \ + ${LN_S} ../../src/objfw.dll objfw.dll; \ + fi + if test -f ../../src/libobjfw.dylib; then \ + ${LN_S} ../../src/libobjfw.dylib \ + libobjfw.${OBJFW_LIB_MAJOR}.dylib; \ + fi + if test -f ../../src/runtime/libobjfwrt.so; then \ + ${LN_S} ../../src/runtime/libobjfwrt.so \ + libobjfwrt.so.${OBJFWRT_LIB_MAJOR}; \ + ${LN_S} ../../src/runtime/libobjfwrt.so \ + libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; \ + elif test -f ../../src/runtime/libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; then \ + ${LN_S} ../../src/runtime/libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; \ + fi + if test -f ../../src/runtime/objfwrt.dll; then \ + ${LN_S} ../../src/runtime/objfwrt.dll objfwrt.dll; \ + fi + if test -f ../../src/runtime/libobjfwrt.dylib; then \ + ${LN_S} ../../src/runtime/libobjfwrt.dylib \ + libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib; \ + fi + if test -f ../../src/runtime/${OBJFWRT_AMIGA_LIB}; then \ + ${LN_S} ../../src/runtime/${OBJFWRT_AMIGA_LIB} \ + ${OBJFWRT_AMIGA_LIB}; \ + fi + LD_LIBRARY_PATH=.$${LD_LIBRARY_PATH+:}$$LD_LIBRARY_PATH \ + DYLD_FRAMEWORK_PATH=../../src:../../src/runtime$${DYLD_FRAMEWORK_PATH+:}$$DYLD_FRAMEWORK_PATH \ + DYLD_LIBRARY_PATH=.$${DYLD_LIBRARY_PATH+:}$$DYLD_LIBRARY_PATH \ + LIBRARY_PATH=.$${LIBRARY_PATH+:}$$LIBRARY_PATH \ + ASAN_OPTIONS=allocator_may_return_null=1 \ + ${WRAPPER} ./${PROG_NOINST}; EXIT=$$?; \ + rm -f libobjfw.so.${OBJFW_LIB_MAJOR}; \ + rm -f objfw.so.${OBJFW_LIB_MAJOR_MINOR} objfw.dll; \ + rm -f libobjfw.${OBJFW_LIB_MAJOR}.dylib; \ + rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR}; \ + rm -f objfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} objfwrt.dll; \ + rm -f libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib; \ + exit $$EXIT + +include ../../buildsys.mk + +CPPFLAGS += -I../../src -I../../src/exceptions -I../../src/runtime -I../.. +LIBS := -L../../src -lobjfw -L../../src/runtime ${RUNTIME_LIBS} ${LIBS} +LD = ${OBJC} ADDED generators/library/copyright.h Index: generators/library/copyright.h ================================================================== --- generators/library/copyright.h +++ generators/library/copyright.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFString.h" + +#define COPYRIGHT \ + @"/*\n" \ + @" * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, " \ + @"2017,\n" \ + @" * 2018, 2019, 2020\n" \ + @" * Jonathan Schleifer \n" \ + @" *\n" \ + @" * All rights reserved.\n" \ + @" *\n" \ + @" * This file is part of ObjFW. It may be distributed under the terms " \ + @"of the\n" \ + @" * Q Public License 1.0, which can be found in the file LICENSE.QPL " \ + @"included in\n" \ + @" * the packaging of this file.\n" \ + @" *\n" \ + @" * Alternatively, it may be distributed under the terms of the GNU " \ + @"General\n" \ + @" * Public License, either version 2 or 3, which can be found in the " \ + @"file\n" \ + @" * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the " \ + @"packaging of this\n" \ + @" * file.\n" \ + @" */\n" \ + @"\n" ADDED generators/unicode/Makefile Index: generators/unicode/Makefile ================================================================== --- generators/unicode/Makefile +++ generators/unicode/Makefile @@ -0,0 +1,67 @@ +include ../../extra.mk + +PROG_NOINST = gen_tables${PROG_SUFFIX} +SRCS = TableGenerator.m + +.PHONY: run +run: all + rm -f libobjfw.so.${OBJFW_LIB_MAJOR} + rm -f libobjfw.so.${OBJFW_LIB_MAJOR_MINOR} + rm -f objfw.dll libobjfw.${OBJFW_LIB_MAJOR}.dylib + rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR} + rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} + rm -f objfwrt.dll libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib + rm -f ${OBJFWRT_AMIGA_LIB} + if test -f ../../src/libobjfw.so; then \ + ${LN_S} ../../src/libobjfw.so libobjfw.so.${OBJFW_LIB_MAJOR}; \ + ${LN_S} ../../src/libobjfw.so \ + libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; \ + elif test -f ../../src/libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; then \ + ${LN_S} ../../src/libobjfw.so.${OBJFW_LIB_MAJOR_MINOR} \ + libobjfw.so.${OBJFW_LIB_MAJOR_MINOR}; \ + fi + if test -f ../../src/objfw.dll; then \ + ${LN_S} ../../src/objfw.dll objfw.dll; \ + fi + if test -f ../../src/libobjfw.dylib; then \ + ${LN_S} ../../src/libobjfw.dylib \ + libobjfw.${OBJFW_LIB_MAJOR}.dylib; \ + fi + if test -f ../../src/runtime/libobjfwrt.so; then \ + ${LN_S} ../../src/runtime/libobjfwrt.so \ + libobjfwrt.so.${OBJFWRT_LIB_MAJOR}; \ + ${LN_S} ../../src/runtime/libobjfwrt.so \ + libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; \ + elif test -f ../../src/runtime/libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; then \ + ${LN_S} ../../src/runtime/libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} libobjfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR}; \ + fi + if test -f ../../src/runtime/objfwrt.dll; then \ + ${LN_S} ../../src/runtime/objfwrt.dll objfwrt.dll; \ + fi + if test -f ../../src/runtime/libobjfwrt.dylib; then \ + ${LN_S} ../../src/runtime/libobjfwrt.dylib \ + libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib; \ + fi + if test -f ../../src/runtime/${OBJFWRT_AMIGA_LIB}; then \ + ${LN_S} ../../src/runtime/${OBJFWRT_AMIGA_LIB} \ + ${OBJFWRT_AMIGA_LIB}; \ + fi + LD_LIBRARY_PATH=.$${LD_LIBRARY_PATH+:}$$LD_LIBRARY_PATH \ + DYLD_FRAMEWORK_PATH=../../src:../../src/runtime$${DYLD_FRAMEWORK_PATH+:}$$DYLD_FRAMEWORK_PATH \ + DYLD_LIBRARY_PATH=.$${DYLD_LIBRARY_PATH+:}$$DYLD_LIBRARY_PATH \ + LIBRARY_PATH=.$${LIBRARY_PATH+:}$$LIBRARY_PATH \ + ASAN_OPTIONS=allocator_may_return_null=1 \ + ${WRAPPER} ./${PROG_NOINST}; EXIT=$$?; \ + rm -f libobjfw.so.${OBJFW_LIB_MAJOR}; \ + rm -f objfw.so.${OBJFW_LIB_MAJOR_MINOR} objfw.dll; \ + rm -f libobjfw.${OBJFW_LIB_MAJOR}.dylib; \ + rm -f libobjfwrt.so.${OBJFWRT_LIB_MAJOR}; \ + rm -f objfwrt.so.${OBJFWRT_LIB_MAJOR_MINOR} objfwrt.dll; \ + rm -f libobjfwrt.${OBJFWRT_LIB_MAJOR}.dylib; \ + exit $$EXIT + +include ../../buildsys.mk + +CPPFLAGS += -I../../src -I../../src/exceptions -I../../src/runtime -I../.. +LIBS := -L../../src -lobjfw -L../../src/runtime ${RUNTIME_LIBS} ${LIBS} +LD = ${OBJC} ADDED generators/unicode/TableGenerator.h Index: generators/unicode/TableGenerator.h ================================================================== --- generators/unicode/TableGenerator.h +++ generators/unicode/TableGenerator.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFObject.h" +#import "OFHTTPClient.h" + +@class OFString; + +@interface TableGenerator: OFObject +{ + OFHTTPClient *_HTTPClient; + of_unichar_t _uppercaseTable[0x110000]; + of_unichar_t _lowercaseTable[0x110000]; + of_unichar_t _titlecaseTable[0x110000]; + of_unichar_t _casefoldingTable[0x110000]; + OFString *_decompositionTable[0x110000]; + OFString *_decompositionCompatTable[0x110000]; + char _uppercaseTableUsed[0x1100]; + char _lowercaseTableUsed[0x1100]; + char _titlecaseTableUsed[0x1100]; + char _casefoldingTableUsed[0x1100]; + char _decompositionTableUsed[0x1100]; + char _decompositionCompatTableUsed[0x1100]; + size_t _uppercaseTableSize; + size_t _lowercaseTableSize; + size_t _titlecaseTableSize; + size_t _casefoldingTableSize; + size_t _decompositionTableSize; + size_t _decompositionCompatTableSize; + enum { + STATE_UNICODE_DATA, + STATE_CASE_FOLDING + } _state; +} + +- (void)parseUnicodeData: (OFHTTPResponse *)response; +- (void)parseCaseFolding: (OFHTTPResponse *)response; +- (void)applyDecompositionRecursivelyForTable: (OFString *[0x110000])table; +- (void)writeFiles; +- (void)writeTablesToFile: (OFString *)path; +- (void)writeHeaderToFile: (OFString *)path; +@end ADDED generators/unicode/TableGenerator.m Index: generators/unicode/TableGenerator.m ================================================================== --- generators/unicode/TableGenerator.m +++ generators/unicode/TableGenerator.m @@ -0,0 +1,776 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#include + +#import "OFString.h" +#import "OFArray.h" +#import "OFApplication.h" +#import "OFURL.h" +#import "OFHTTPRequest.h" +#import "OFHTTPResponse.h" +#import "OFHTTPClient.h" +#import "OFFile.h" +#import "OFStdIOStream.h" + +#import "OFOutOfRangeException.h" + +#import "TableGenerator.h" +#import "copyright.h" + +#define UNICODE_DATA_URL \ + @"http://www.unicode.org/Public/UNIDATA/UnicodeData.txt" +#define CASE_FOLDING_URL \ + @"http://www.unicode.org/Public/UNIDATA/CaseFolding.txt" + +OF_APPLICATION_DELEGATE(TableGenerator) + +@implementation TableGenerator +- (instancetype)init +{ + self = [super init]; + + @try { + _HTTPClient = [[OFHTTPClient alloc] init]; + _HTTPClient.delegate = self; + + _uppercaseTableSize = SIZE_MAX; + _lowercaseTableSize = SIZE_MAX; + _titlecaseTableSize = SIZE_MAX; + _casefoldingTableSize = SIZE_MAX; + _decompositionTableSize = SIZE_MAX; + _decompositionCompatTableSize = SIZE_MAX; + } @catch (id e) { + @throw e; + [self release]; + } + + return self; +} + +- (void)applicationDidFinishLaunching +{ + OFHTTPRequest *request; + + [of_stdout writeString: @"Downloading UnicodeData.txt…"]; + _state = STATE_UNICODE_DATA; + request = [OFHTTPRequest requestWithURL: + [OFURL URLWithString: UNICODE_DATA_URL]]; + [_HTTPClient asyncPerformRequest: request]; +} + +- (void)client: (OFHTTPClient *)client + didPerformRequest: (OFHTTPRequest *)request + response: (OFHTTPResponse *)response + exception: (id)exception +{ + if (exception != nil) + @throw exception; + + [of_stdout writeLine: @" done"]; + + switch (_state) { + case STATE_UNICODE_DATA: + [self parseUnicodeData: response]; + break; + case STATE_CASE_FOLDING: + [self parseCaseFolding: response]; + break; + } +} + +- (void)parseUnicodeData: (OFHTTPResponse *)response +{ + OFString *line; + OFHTTPRequest *request; + + [of_stdout writeString: @"Parsing UnicodeData.txt…"]; + + while ((line = [response readLine]) != nil) { + void *pool2; + OFArray OF_GENERIC(OFString *) *components; + of_unichar_t codePoint; + + if (line.length == 0) + continue; + + pool2 = objc_autoreleasePoolPush(); + + components = [line componentsSeparatedByString: @";"]; + if (components.count != 15) { + of_log(@"Invalid line: %@\n", line); + [OFApplication terminateWithStatus: 1]; + } + + codePoint = (of_unichar_t)[[components objectAtIndex: 0] + unsignedLongLongValueWithBase: 16]; + + if (codePoint > 0x10FFFF) + @throw [OFOutOfRangeException exception]; + + _uppercaseTable[codePoint] = (of_unichar_t)[[components + objectAtIndex: 12] unsignedLongLongValueWithBase: 16]; + _lowercaseTable[codePoint] = (of_unichar_t)[[components + objectAtIndex: 13] unsignedLongLongValueWithBase: 16]; + _titlecaseTable[codePoint] = (of_unichar_t)[[components + objectAtIndex: 14] unsignedLongLongValueWithBase: 16]; + + if ([[components objectAtIndex: 5] length] > 0) { + OFArray *decomposed = [[components objectAtIndex: 5] + componentsSeparatedByString: @" "]; + bool compat = false; + OFMutableString *string; + + if ([decomposed.firstObject hasPrefix: @"<"]) { + decomposed = [decomposed objectsInRange: + of_range(1, decomposed.count - 1)]; + compat = true; + } + + string = [OFMutableString string]; + + for (OFString *character in decomposed) { + of_unichar_t unichar = (of_unichar_t)[character + unsignedLongLongValueWithBase: 16]; + + [string appendCharacters: &unichar + length: 1]; + } + + [string makeImmutable]; + + if (!compat) + _decompositionTable[codePoint] = [string copy]; + _decompositionCompatTable[codePoint] = [string copy]; + } + + objc_autoreleasePoolPop(pool2); + } + + [self applyDecompositionRecursivelyForTable: _decompositionTable]; + [self applyDecompositionRecursivelyForTable: _decompositionCompatTable]; + + [of_stdout writeLine: @" done"]; + + [of_stdout writeString: @"Downloading CaseFolding.txt…"]; + _state = STATE_CASE_FOLDING; + request = [OFHTTPRequest requestWithURL: + [OFURL URLWithString: CASE_FOLDING_URL]]; + [_HTTPClient asyncPerformRequest: request]; +} + +- (void)parseCaseFolding: (OFHTTPResponse *)response +{ + OFString *line; + + [of_stdout writeString: @"Parsing CaseFolding.txt…"]; + + while ((line = [response readLine]) != nil) { + void *pool2; + OFArray OF_GENERIC(OFString *) *components; + of_unichar_t codePoint; + + if (line.length == 0 || [line hasPrefix: @"#"]) + continue; + + pool2 = objc_autoreleasePoolPush(); + + components = [line componentsSeparatedByString: @"; "]; + if (components.count != 4) { + of_log(@"Invalid line: %s\n", line); + [OFApplication terminateWithStatus: 1]; + } + + if (![[components objectAtIndex: 1] isEqual: @"S"] && + ![[components objectAtIndex: 1] isEqual: @"C"]) + continue; + + codePoint = (of_unichar_t)[[components objectAtIndex: 0] + unsignedLongLongValueWithBase: 16]; + + if (codePoint > 0x10FFFF) + @throw [OFOutOfRangeException exception]; + + _casefoldingTable[codePoint] = (of_unichar_t)[[components + objectAtIndex: 2] unsignedLongLongValueWithBase: 16]; + + objc_autoreleasePoolPop(pool2); + } + + [of_stdout writeLine: @" done"]; + + [self writeFiles]; +} + +- (void)applyDecompositionRecursivelyForTable: (OFString *[0x110000])table +{ + bool done; + + do { + done = true; + + for (of_unichar_t i = 0; i < 0x110000; i++) { + void *pool; + const of_unichar_t *characters; + size_t length; + OFMutableString *replacement; + bool changed = false; + + if (table[i] == nil) + continue; + + pool = objc_autoreleasePoolPush(); + characters = table[i].characters; + length = table[i].length; + replacement = [OFMutableString string]; + + for (size_t j = 0; j < length; j++) { + if (characters[j] > 0x10FFFF) + @throw [OFOutOfRangeException + exception]; + + if (table[characters[j]] == nil) + [replacement + appendCharacters: &characters[j] + length: 1]; + else { + [replacement + appendString: table[characters[j]]]; + changed = true; + } + } + + [replacement makeImmutable]; + + if (changed) { + [table[i] release]; + table[i] = [replacement copy]; + + done = false; + } + + objc_autoreleasePoolPop(pool); + } + } while (!done); +} + +- (void)writeFiles +{ + OFURL *URL; + + [of_stdout writeString: @"Writing files…"]; + + URL = [OFURL fileURLWithPath: @"../../src/unicode.m"]; + [self writeTablesToFile: URL.fileSystemRepresentation]; + + URL = [OFURL fileURLWithPath: @"../../src/unicode.h"]; + [self writeHeaderToFile: URL.fileSystemRepresentation]; + + [of_stdout writeLine: @" done"]; + + [OFApplication terminate]; +} + +- (void)writeTablesToFile: (OFString *)path +{ + void *pool = objc_autoreleasePoolPush(); + OFFile *file = [OFFile fileWithPath: path + mode: @"w"]; + + [file writeString: COPYRIGHT + @"#include \"config.h\"\n" + @"\n" + @"#import \"OFString.h\"\n\n" + @"static const of_unichar_t emptyPage[0x100] = { 0 };\n" + @"static const char *emptyDecompositionPage[0x100] = { NULL };\n" + @"\n"]; + + /* Write uppercasePage%u */ + for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + bool isEmpty = true; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if (_uppercaseTable[j] != 0) { + isEmpty = false; + _uppercaseTableSize = i >> 8; + _uppercaseTableUsed[_uppercaseTableSize] = 1; + break; + } + } + + if (!isEmpty) { + void *pool2 = objc_autoreleasePoolPush(); + + [file writeFormat: @"static const of_unichar_t " + @"uppercasePage%u[0x100] = {\n", + i >> 8]; + + for (of_unichar_t j = i; j < i + 0x100; j += 8) + [file writeFormat: + @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", + _uppercaseTable[j], + _uppercaseTable[j + 1], + _uppercaseTable[j + 2], + _uppercaseTable[j + 3], + _uppercaseTable[j + 4], + _uppercaseTable[j + 5], + _uppercaseTable[j + 6], + _uppercaseTable[j + 7]]; + + [file writeString: @"};\n\n"]; + + objc_autoreleasePoolPop(pool2); + } + } + + /* Write lowercasePage%u */ + for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + bool isEmpty = true; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if (_lowercaseTable[j] != 0) { + isEmpty = false; + _lowercaseTableSize = i >> 8; + _lowercaseTableUsed[_lowercaseTableSize] = 1; + break; + } + } + + if (!isEmpty) { + void *pool2 = objc_autoreleasePoolPush(); + + [file writeFormat: @"static const of_unichar_t " + @"lowercasePage%u[0x100] = {\n", + i >> 8]; + + for (of_unichar_t j = i; j < i + 0x100; j += 8) + [file writeFormat: + @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", + _lowercaseTable[j], + _lowercaseTable[j + 1], + _lowercaseTable[j + 2], + _lowercaseTable[j + 3], + _lowercaseTable[j + 4], + _lowercaseTable[j + 5], + _lowercaseTable[j + 6], + _lowercaseTable[j + 7]]; + + [file writeString: @"};\n\n"]; + + objc_autoreleasePoolPop(pool2); + } + } + + /* Write titlecasePage%u if it does NOT match uppercasePage%u */ + for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + bool isEmpty = true; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if (_titlecaseTable[j] != 0) { + isEmpty = !memcmp(_uppercaseTable + i, + _titlecaseTable + i, + 256 * sizeof(of_unichar_t)); + _titlecaseTableSize = i >> 8; + _titlecaseTableUsed[_titlecaseTableSize] = + (isEmpty ? 2 : 1); + break; + } + } + + if (!isEmpty) { + void *pool2 = objc_autoreleasePoolPush(); + + [file writeFormat: @"static const of_unichar_t " + @"titlecasePage%u[0x100] = {\n", + i >> 8]; + + for (of_unichar_t j = i; j < i + 0x100; j += 8) + [file writeFormat: + @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", + _titlecaseTable[j], + _titlecaseTable[j + 1], + _titlecaseTable[j + 2], + _titlecaseTable[j + 3], + _titlecaseTable[j + 4], + _titlecaseTable[j + 5], + _titlecaseTable[j + 6], + _titlecaseTable[j + 7]]; + + [file writeString: @"};\n\n"]; + + objc_autoreleasePoolPop(pool2); + } + } + + /* Write casefoldingPage%u if it does NOT match lowercasePage%u */ + for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + bool isEmpty = true; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if (_casefoldingTable[j] != 0) { + isEmpty = !memcmp(_lowercaseTable + i, + _casefoldingTable + i, + 256 * sizeof(of_unichar_t)); + _casefoldingTableSize = i >> 8; + _casefoldingTableUsed[_casefoldingTableSize] = + (isEmpty ? 2 : 1); + break; + } + } + + if (!isEmpty) { + void *pool2 = objc_autoreleasePoolPush(); + + [file writeFormat: @"static const of_unichar_t " + @"casefoldingPage%u[0x100] = {\n", + i >> 8]; + + for (of_unichar_t j = i; j < i + 0x100; j += 8) + [file writeFormat: + @"\t%u, %u, %u, %u, %u, %u, %u, %u,\n", + _casefoldingTable[j], + _casefoldingTable[j + 1], + _casefoldingTable[j + 2], + _casefoldingTable[j + 3], + _casefoldingTable[j + 4], + _casefoldingTable[j + 5], + _casefoldingTable[j + 6], + _casefoldingTable[j + 7]]; + + [file writeString: @"};\n\n"]; + + objc_autoreleasePoolPop(pool2); + } + } + + /* Write decompositionPage%u */ + for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + bool isEmpty = true; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if (_decompositionTable[j] != nil) { + isEmpty = false; + _decompositionTableSize = i >> 8; + _decompositionTableUsed[ + _decompositionTableSize] = 1; + break; + } + } + + if (!isEmpty) { + void *pool2 = objc_autoreleasePoolPush(); + + [file writeFormat: @"static const char *const " + @"decompositionPage%u[0x100] = {\n", + i >> 8]; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if ((j - i) % 2 == 0) + [file writeString: @"\t"]; + else + [file writeString: @" "]; + + if (_decompositionTable[j] != nil) { + const char *UTF8String = + _decompositionTable[j].UTF8String; + size_t length = _decompositionTable[j] + .UTF8StringLength; + + [file writeString: @"\""]; + + for (size_t k = 0; k < length; k++) + [file writeFormat: + @"\\x%02X", + (uint8_t)UTF8String[k]]; + + [file writeString: @"\","]; + } else + [file writeString: @"NULL,"]; + + if ((j - i) % 2 == 1) + [file writeString: @"\n"]; + } + + [file writeString: @"};\n\n"]; + + objc_autoreleasePoolPop(pool2); + } + } + + /* Write decompCompatPage%u if it does NOT match decompositionPage%u */ + for (of_unichar_t i = 0; i < 0x110000; i += 0x100) { + bool isEmpty = true; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if (_decompositionCompatTable[j] != 0) { + /* + * We bulk-compare pointers via memcmp here. + * This is safe, as we always set the same + * pointer in both tables if both are the same. + */ + isEmpty = !memcmp(_decompositionTable + i, + _decompositionCompatTable + i, + 256 * sizeof(const char *)); + _decompositionCompatTableSize = i >> 8; + _decompositionCompatTableUsed[ + _decompositionCompatTableSize] = + (isEmpty ? 2 : 1); + + break; + } + } + + if (!isEmpty) { + void *pool2 = objc_autoreleasePoolPush(); + + [file writeFormat: @"static const char *const " + @"decompCompatPage%u[0x100] = {\n", + i >> 8]; + + for (of_unichar_t j = i; j < i + 0x100; j++) { + if ((j - i) % 2 == 0) + [file writeString: @"\t"]; + else + [file writeString: @" "]; + + if (_decompositionCompatTable[j] != nil) { + const char *UTF8String = + _decompositionCompatTable[j] + .UTF8String; + size_t length = + _decompositionCompatTable[j] + .UTF8StringLength; + + [file writeString: @"\""]; + + for (size_t k = 0; k < length; k++) + [file writeFormat: + @"\\x%02X", + (uint8_t)UTF8String[k]]; + + [file writeString: @"\","]; + } else + [file writeString: @"NULL,"]; + + if ((j - i) % 2 == 1) + [file writeString: @"\n"]; + } + + [file writeString: @"};\n\n"]; + + objc_autoreleasePoolPop(pool2); + } + } + + /* + * Those are currently set to the last index. + * But from now on, we need the size. + */ + _uppercaseTableSize++; + _lowercaseTableSize++; + _titlecaseTableSize++; + _casefoldingTableSize++; + _decompositionTableSize++; + _decompositionCompatTableSize++; + + /* Write of_unicode_uppercase_table */ + [file writeFormat: @"const of_unichar_t *const " + @"of_unicode_uppercase_table[0x%X] = {\n\t", + _uppercaseTableSize]; + + for (of_unichar_t i = 0; i < _uppercaseTableSize; i++) { + if (_uppercaseTableUsed[i]) + [file writeFormat: @"uppercasePage%u", i]; + else + [file writeString: @"emptyPage"]; + + if (i + 1 < _uppercaseTableSize) { + if ((i + 1) % 4 == 0) + [file writeString: @",\n\t"]; + else + [file writeString: @", "]; + } + } + + [file writeString: @"\n};\n\n"]; + + /* Write of_unicode_lowercase_table */ + [file writeFormat: @"const of_unichar_t *const " + @"of_unicode_lowercase_table[0x%X] = {\n\t", + _lowercaseTableSize]; + + for (of_unichar_t i = 0; i < _lowercaseTableSize; i++) { + if (_lowercaseTableUsed[i]) + [file writeFormat: @"lowercasePage%u", i]; + else + [file writeString: @"emptyPage"]; + + if (i + 1 < _lowercaseTableSize) { + if ((i + 1) % 4 == 0) + [file writeString: @",\n\t"]; + else + [file writeString: @", "]; + } + } + + [file writeString: @"\n};\n\n"]; + + /* Write of_unicode_titlecase_table */ + [file writeFormat: @"const of_unichar_t *const " + @"of_unicode_titlecase_table[0x%X] = {\n\t", + _titlecaseTableSize]; + + for (of_unichar_t i = 0; i < _titlecaseTableSize; i++) { + if (_titlecaseTableUsed[i] == 1) + [file writeFormat: @"titlecasePage%u", i]; + else if (_titlecaseTableUsed[i] == 2) + [file writeFormat: @"uppercasePage%u", i]; + else + [file writeString: @"emptyPage"]; + + if (i + 1 < _titlecaseTableSize) { + if ((i + 1) % 4 == 0) + [file writeString: @",\n\t"]; + else + [file writeString: @", "]; + } + } + + [file writeString: @"\n};\n\n"]; + + /* Write of_unicode_casefolding_table */ + [file writeFormat: @"const of_unichar_t *const " + @"of_unicode_casefolding_table[0x%X] = {\n\t", + _casefoldingTableSize]; + + for (of_unichar_t i = 0; i < _casefoldingTableSize; i++) { + if (_casefoldingTableUsed[i] == 1) + [file writeFormat: @"casefoldingPage%u", i]; + else if (_casefoldingTableUsed[i] == 2) + [file writeFormat: @"lowercasePage%u", i]; + else + [file writeString: @"emptyPage"]; + + if (i + 1 < _casefoldingTableSize) { + if ((i + 1) % 3 == 0) + [file writeString: @",\n\t"]; + else + [file writeString: @", "]; + } + } + + [file writeString: @"\n};\n\n"]; + + /* Write of_unicode_decomposition_table */ + [file writeFormat: @"const char *const " + @"*of_unicode_decomposition_table[0x%X] = {\n\t", + _decompositionTableSize]; + + for (of_unichar_t i = 0; i < _decompositionTableSize; i++) { + if (_decompositionTableUsed[i]) + [file writeFormat: @"decompositionPage%u", i]; + else + [file writeString: @"emptyDecompositionPage"]; + + if (i + 1 < _decompositionTableSize) { + if ((i + 1) % 3 == 0) + [file writeString: @",\n\t"]; + else + [file writeString: @", "]; + } + } + + [file writeString: @"\n};\n\n"]; + + /* Write of_unicode_decomposition_compat_table */ + [file writeFormat: @"const char *const " + @"*of_unicode_decomposition_compat_table[0x%X] = {" + @"\n\t", + _decompositionCompatTableSize]; + + for (of_unichar_t i = 0; i < _decompositionCompatTableSize; i++) { + if (_decompositionCompatTableUsed[i] == 1) + [file writeFormat: @"decompCompatPage%u", i]; + else if (_decompositionCompatTableUsed[i] == 2) + [file writeFormat: @"decompositionPage%u", i]; + else + [file writeString: @"emptyDecompositionPage"]; + + if (i + 1 < _decompositionCompatTableSize) { + if ((i + 1) % 3 == 0) + [file writeString: @",\n\t"]; + else + [file writeString: @", "]; + } + } + + [file writeString: @"\n};\n"]; + + objc_autoreleasePoolPop(pool); +} + +- (void)writeHeaderToFile: (OFString *)path +{ + void *pool = objc_autoreleasePoolPush(); + OFFile *file = [OFFile fileWithPath: path + mode: @"w"]; + + [file writeString: COPYRIGHT + @"#import \"OFString.h\"\n\n"]; + + [file writeFormat: + @"#define OF_UNICODE_UPPERCASE_TABLE_SIZE 0x%X\n" + @"#define OF_UNICODE_LOWERCASE_TABLE_SIZE 0x%X\n" + @"#define OF_UNICODE_TITLECASE_TABLE_SIZE 0x%X\n" + @"#define OF_UNICODE_CASEFOLDING_TABLE_SIZE 0x%X\n" + @"#define OF_UNICODE_DECOMPOSITION_TABLE_SIZE 0x%X\n" + @"#define OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE 0x%X\n\n", + _uppercaseTableSize, _lowercaseTableSize, _titlecaseTableSize, + _casefoldingTableSize, _decompositionTableSize, + _decompositionCompatTableSize]; + + [file writeString: + @"#ifdef __cplusplus\n" + @"extern \"C\" {\n" + @"#endif\n" + @"extern const of_unichar_t *const _Nonnull\n" + @" of_unicode_uppercase_table[" + @"OF_UNICODE_UPPERCASE_TABLE_SIZE];\n" + @"extern const of_unichar_t *const _Nonnull\n" + @" of_unicode_lowercase_table[" + @"OF_UNICODE_LOWERCASE_TABLE_SIZE];\n" + @"extern const of_unichar_t *const _Nonnull\n" + @" of_unicode_titlecase_table[" + @"OF_UNICODE_TITLECASE_TABLE_SIZE];\n" + @"extern const of_unichar_t *const _Nonnull\n" + @" of_unicode_casefolding_table[" + @"OF_UNICODE_CASEFOLDING_TABLE_SIZE];\n" + @"extern const char *const _Nullable *const _Nonnull\n" + @" of_unicode_decomposition_table[" + @"OF_UNICODE_DECOMPOSITION_TABLE_SIZE];\n" + @"extern const char *const _Nullable *const _Nonnull\n" + @" of_unicode_decomposition_compat_table[" + @"OF_UNICODE_DECOMPOSITION_COMPAT_TABLE_SIZE];\n" + @"#ifdef __cplusplus\n" + @"}\n" + @"#endif\n"]; + + objc_autoreleasePoolPop(pool); +} +@end ADDED generators/unicode/copyright.h Index: generators/unicode/copyright.h ================================================================== --- generators/unicode/copyright.h +++ generators/unicode/copyright.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#import "OFString.h" + +#define COPYRIGHT \ + @"/*\n" \ + @" * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, " \ + @"2017,\n" \ + @" * 2018, 2019, 2020\n" \ + @" * Jonathan Schleifer \n" \ + @" *\n" \ + @" * All rights reserved.\n" \ + @" *\n" \ + @" * This file is part of ObjFW. It may be distributed under the terms " \ + @"of the\n" \ + @" * Q Public License 1.0, which can be found in the file LICENSE.QPL " \ + @"included in\n" \ + @" * the packaging of this file.\n" \ + @" *\n" \ + @" * Alternatively, it may be distributed under the terms of the GNU " \ + @"General\n" \ + @" * Public License, either version 2 or 3, which can be found in the " \ + @"file\n" \ + @" * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the " \ + @"packaging of this\n" \ + @" * file.\n" \ + @" */\n" \ + @"\n" Index: src/OFObject.h ================================================================== --- src/OFObject.h +++ src/OFObject.h @@ -537,11 +537,11 @@ @property (class, readonly, nonatomic) OFString *className; @property (class, readonly, nullable, nonatomic) Class superclass; @property (class, readonly, nonatomic) OFString *description; # endif -# ifdef __cplusplus +# ifndef __cplusplus @property (readonly, nonatomic) Class class; # else @property (readonly, nonatomic, getter=class) Class class_; #endif @property OF_NULLABLE_PROPERTY (readonly, nonatomic) Class superclass; Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -2380,10 +2380,13 @@ base = 8; UTF8String++; } } + + if (base == 0) + base = 10; while (*UTF8String != '\0') { unsigned char c = of_ascii_toupper(*UTF8String++); if (c >= '0' && c <= '9') @@ -2452,10 +2455,13 @@ base = 8; UTF8String++; } } + + if (base == 0) + base = 10; while (*UTF8String != '\0') { unsigned char c = of_ascii_toupper(*UTF8String++); if (c >= '0' && c <= '9') Index: src/OFThread.m ================================================================== --- src/OFThread.m +++ src/OFThread.m @@ -250,10 +250,21 @@ #elif defined(OF_NINTENDO_3DS) if (timeInterval * 1000000000 > INT64_MAX) @throw [OFOutOfRangeException exception]; svcSleepThread((int64_t)(timeInterval * 1000000000)); +#elif defined(OF_AMIGAOS) + struct timerequest request = *DOSBase->dl_TimeReq; + + request.tr_node.io_Message.mn_ReplyPort = + &((struct Process *)FindTask(NULL))->pr_MsgPort; + request.tr_node.io_Command = TR_ADDREQUEST; + request.tr_time.tv_secs = (ULONG)timeInterval; + request.tr_time.tv_micro = (ULONG) + ((timeInterval - (unsigned int)timeInterval) * 1000000); + + DoIO((struct IORequest *)&request); #elif defined(HAVE_NANOSLEEP) struct timespec rqtp; rqtp.tv_sec = (time_t)timeInterval; rqtp.tv_nsec = (long)((timeInterval - rqtp.tv_sec) * 1000000000); @@ -260,15 +271,10 @@ if (rqtp.tv_sec != trunc(timeInterval)) @throw [OFOutOfRangeException exception]; nanosleep(&rqtp, NULL); -#elif defined(OF_AMIGAOS) - if (timeInterval * 50 > ULONG_MAX) - @throw [OFOutOfRangeException exception]; - - Delay(timeInterval * 50); #elif defined(OF_NINTENDO_DS) uint64_t counter; if (timeInterval > UINT64_MAX / 60) @throw [OFOutOfRangeException exception]; @@ -280,11 +286,11 @@ if (timeInterval > UINT_MAX) @throw [OFOutOfRangeException exception]; sleep((unsigned int)timeInterval); usleep((unsigned int) - (timeInterval - (unsigned int)timeInterval) * 1000000); + ((timeInterval - (unsigned int)timeInterval) * 1000000)); #endif } + (void)sleepUntilDate: (OFDate *)date { Index: src/OFXMLElement.h ================================================================== --- src/OFXMLElement.h +++ src/OFXMLElement.h @@ -21,10 +21,11 @@ @class OFArray OF_GENERIC(ObjectType); @class OFMutableArray OF_GENERIC(ObjectType); @class OFMutableDictionary OF_GENERIC(KeyType, ObjectType); @class OFMutableString; +@class OFStream; @class OFString; @class OFXMLAttribute; /** * @class OFXMLElement OFXMLElement.h ObjFW/OFXMLElement.h @@ -138,20 +139,18 @@ * @param string The string to parse * @return A new autoreleased OFXMLElement with the contents of the string */ + (instancetype)elementWithXMLString: (OFString *)string; -#ifdef OF_HAVE_FILES /** - * @brief Parses the specified file and returns an OFXMLElement for it. + * @brief Parses the specified stream and returns an OFXMLElement for it. * - * @param path The path to the file + * @param stream The stream to parse * @return A new autoreleased OFXMLElement with the contents of the specified - * file + * stream */ -+ (instancetype)elementWithFile: (OFString *)path; -#endif ++ (instancetype)elementWithStream: (OFStream *)stream; - (instancetype)init OF_UNAVAILABLE; /** * @brief Initializes an already allocated OFXMLElement with the specified name. @@ -216,20 +215,18 @@ * @param string The string to parse * @return An initialized OFXMLElement with the contents of the string */ - (instancetype)initWithXMLString: (OFString *)string; -#ifdef OF_HAVE_FILES /** - * @brief Parses the specified file and initializes an already allocated + * @brief Parses the specified stream and initializes an already allocated * OFXMLElement with it. * - * @param path The path to the file - * @return An initialized OFXMLElement with the contents of the specified file + * @param stream The stream to parse + * @return An initialized OFXMLElement with the contents of the specified stream */ -- (instancetype)initWithFile: (OFString *)path; -#endif +- (instancetype)initWithStream: (OFStream *)stream; - (instancetype)initWithSerialization: (OFXMLElement *)element; /** * @brief Sets a prefix for a namespace. Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -23,20 +23,21 @@ #include #include #import "OFXMLElement.h" -#import "OFXMLNode+Private.h" -#import "OFString.h" #import "OFArray.h" -#import "OFDictionary.h" #import "OFData.h" +#import "OFDictionary.h" +#import "OFStream.h" +#import "OFString.h" #import "OFXMLAttribute.h" -#import "OFXMLCharacters.h" #import "OFXMLCDATA.h" -#import "OFXMLParser.h" +#import "OFXMLCharacters.h" #import "OFXMLElementBuilder.h" +#import "OFXMLNode+Private.h" +#import "OFXMLParser.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" #import "OFMalformedXMLException.h" #import "OFUnboundNamespaceException.h" @@ -112,16 +113,14 @@ + (instancetype)elementWithXMLString: (OFString *)string { return [[[self alloc] initWithXMLString: string] autorelease]; } -#ifdef OF_HAVE_FILES -+ (instancetype)elementWithFile: (OFString *)path ++ (instancetype)elementWithStream: (OFStream *)stream { - return [[[self alloc] initWithFile: path] autorelease]; + return [[[self alloc] initWithStream: stream] autorelease]; } -#endif - (instancetype)init { OF_INVALID_INIT_METHOD } @@ -232,12 +231,11 @@ objc_autoreleasePoolPop(pool); return self; } -#ifdef OF_HAVE_FILES -- (instancetype)initWithFile: (OFString *)path +- (instancetype)initWithStream: (OFStream *)stream { void *pool; OFXMLParser *parser; OFXMLElementBuilder *builder; OFXMLElementElementBuilderDelegate *delegate; @@ -252,11 +250,11 @@ autorelease]; parser.delegate = builder; builder.delegate = delegate; - [parser parseFile: path]; + [parser parseStream: stream]; if (!parser.hasFinishedParsing) @throw [OFMalformedXMLException exceptionWithParser: parser]; self = [delegate->_element retain]; @@ -263,11 +261,10 @@ objc_autoreleasePoolPop(pool); return self; } -#endif - (instancetype)initWithSerialization: (OFXMLElement *)element { self = [super of_init]; Index: src/OFXMLParser.h ================================================================== --- src/OFXMLParser.h +++ src/OFXMLParser.h @@ -226,17 +226,8 @@ * @brief Parses the specified stream. * * @param stream The stream to parse */ - (void)parseStream: (OFStream *)stream; - -#ifdef OF_HAVE_FILES -/** - * @brief Parses the specified file. - * - * @param path The path to the file to parse -*/ -- (void)parseFile: (OFString *)path; -#endif @end OF_ASSUME_NONNULL_END Index: src/OFXMLParser.m ================================================================== --- src/OFXMLParser.m +++ src/OFXMLParser.m @@ -93,11 +93,11 @@ static OF_INLINE void appendToBuffer(OFMutableData *buffer, const char *string, of_string_encoding_t encoding, size_t length) { - if (OF_LIKELY(encoding == OF_STRING_ENCODING_UTF_8)) + if OF_LIKELY(encoding == OF_STRING_ENCODING_UTF_8) [buffer addItems: string count: length]; else { void *pool = objc_autoreleasePoolPush(); OFString *tmp = [OFString stringWithCString: string @@ -291,23 +291,10 @@ } @finally { free(buffer); } } -#ifdef OF_HAVE_FILES -- (void)parseFile: (OFString *)path -{ - OFFile *file = [[OFFile alloc] initWithPath: path - mode: @"r"]; - @try { - [self parseStream: file]; - } @finally { - [file release]; - } -} -#endif - static void inByteOrderMarkState(OFXMLParser *self) { if (self->_data[self->_i] != "\xEF\xBB\xBF"[self->_level]) { if (self->_level == 0) { Index: src/runtime/Makefile ================================================================== --- src/runtime/Makefile +++ src/runtime/Makefile @@ -1,17 +1,9 @@ include ../../extra.mk SUBDIRS = lookup-asm SUBDIRS_AFTER = ${LINKLIB} -CLEAN = amiga-end.amigalib.dep \ - amiga-end.amigalib.o \ - amiga-glue.amigalib.dep \ - amiga-glue.amigalib.o \ - amiga-library-functable.inc \ - amiga-library.amigalib.dep \ - amiga-library.amigalib.o \ - inline.h DISTCLEAN = Info.plist SHARED_LIB = ${OBJFWRT_SHARED_LIB} STATIC_LIB = ${OBJFWRT_STATIC_LIB} FRAMEWORK = ${OBJFWRT_FRAMEWORK} @@ -54,21 +46,13 @@ lookup-asm/lookup-asm.amigalib.a \ amiga-end.amigalib.o include ../../buildsys.mk -${OBJFWRT_AMIGA_LIB}: inline.h - -${SFDC_INLINE_H}: ${SFD_FILE} - sfdc -q --target=${SFDC_TARGET} --mode=macros -o $@ $<; \ - -${CVINCLUDE_INLINE_H}: morphos.fd morphos-clib.h - cvinclude.pl --quiet --fd=morphos.fd --clib=morphos-clib.h --inlines=$@ - CPPFLAGS += -I. -I.. -I../.. \ -DOBJC_COMPILING_RUNTIME \ -DOBJFWRT_AMIGA_LIB=\"${OBJFWRT_AMIGA_LIB}\" \ -DOBJFWRT_LIB_MAJOR=${OBJFWRT_LIB_MAJOR} \ -DOBJFWRT_LIB_MINOR=${OBJFWRT_LIB_MINOR} AMIGA_LIB_CFLAGS += -DOBJC_COMPILING_AMIGA_LIBRARY LD = ${OBJC} FRAMEWORK_LIBS = ${LIBS} ADDED src/runtime/amiga-funcarray.inc Index: src/runtime/amiga-funcarray.inc ================================================================== --- src/runtime/amiga-funcarray.inc +++ src/runtime/amiga-funcarray.inc @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +/* This file is automatically generated from library.xml */ + +(CONST_APTR)glue_objc_init, +(CONST_APTR)glue___objc_exec_class, +(CONST_APTR)glue_objc_msg_lookup, +(CONST_APTR)glue_objc_msg_lookup_stret, +(CONST_APTR)glue_objc_msg_lookup_super, +(CONST_APTR)glue_objc_msg_lookup_super_stret, +(CONST_APTR)glue_objc_lookUpClass, +(CONST_APTR)glue_objc_getClass, +(CONST_APTR)glue_objc_getRequiredClass, +(CONST_APTR)glue_objc_lookup_class, +(CONST_APTR)glue_objc_get_class, +(CONST_APTR)glue_objc_exception_throw, +(CONST_APTR)glue_objc_sync_enter, +(CONST_APTR)glue_objc_sync_exit, +(CONST_APTR)glue_objc_getProperty, +(CONST_APTR)glue_objc_setProperty, +(CONST_APTR)glue_objc_getPropertyStruct, +(CONST_APTR)glue_objc_setPropertyStruct, +(CONST_APTR)glue_objc_enumerationMutation, +(CONST_APTR)glue___gnu_objc_personality, +(CONST_APTR)glue_objc_retain, +(CONST_APTR)glue_objc_retainBlock, +(CONST_APTR)glue_objc_retainAutorelease, +(CONST_APTR)glue_objc_release, +(CONST_APTR)glue_objc_autorelease, +(CONST_APTR)glue_objc_autoreleaseReturnValue, +(CONST_APTR)glue_objc_retainAutoreleaseReturnValue, +(CONST_APTR)glue_objc_retainAutoreleasedReturnValue, +(CONST_APTR)glue_objc_storeStrong, +(CONST_APTR)glue_objc_storeWeak, +(CONST_APTR)glue_objc_loadWeakRetained, +(CONST_APTR)glue_objc_initWeak, +(CONST_APTR)glue_objc_destroyWeak, +(CONST_APTR)glue_objc_loadWeak, +(CONST_APTR)glue_objc_copyWeak, +(CONST_APTR)glue_objc_moveWeak, +(CONST_APTR)glue_sel_registerName, +(CONST_APTR)glue_sel_getName, +(CONST_APTR)glue_sel_isEqual, +(CONST_APTR)glue_objc_allocateClassPair, +(CONST_APTR)glue_objc_registerClassPair, +(CONST_APTR)glue_objc_getClassList, +(CONST_APTR)glue_objc_copyClassList, +(CONST_APTR)glue_class_isMetaClass, +(CONST_APTR)glue_class_getName, +(CONST_APTR)glue_class_getSuperclass, +(CONST_APTR)glue_class_getInstanceSize, +(CONST_APTR)glue_class_respondsToSelector, +(CONST_APTR)glue_class_conformsToProtocol, +(CONST_APTR)glue_class_getMethodImplementation, +(CONST_APTR)glue_class_getMethodImplementation_stret, +(CONST_APTR)glue_class_getInstanceMethod, +(CONST_APTR)glue_class_addMethod, +(CONST_APTR)glue_class_replaceMethod, +(CONST_APTR)glue_object_getClass, +(CONST_APTR)glue_object_setClass, +(CONST_APTR)glue_object_getClassName, +(CONST_APTR)glue_protocol_getName, +(CONST_APTR)glue_protocol_isEqual, +(CONST_APTR)glue_protocol_conformsToProtocol, +(CONST_APTR)glue_objc_setUncaughtExceptionHandler, +(CONST_APTR)glue_objc_setForwardHandler, +(CONST_APTR)glue_objc_setEnumerationMutationHandler, +(CONST_APTR)glue_objc_constructInstance, +(CONST_APTR)glue_objc_exit, +(CONST_APTR)glue_class_copyIvarList, +(CONST_APTR)glue_ivar_getName, +(CONST_APTR)glue_ivar_getTypeEncoding, +(CONST_APTR)glue_ivar_getOffset, +(CONST_APTR)glue_class_copyMethodList, +(CONST_APTR)glue_method_getName, +(CONST_APTR)glue_method_getTypeEncoding, +(CONST_APTR)glue_class_copyPropertyList, +(CONST_APTR)glue_property_getName, +(CONST_APTR)glue_property_copyAttributeValue, +(CONST_APTR)glue_objc_destructInstance, +(CONST_APTR)glue_objc_autoreleasePoolPush, +(CONST_APTR)glue_objc_autoreleasePoolPop, +(CONST_APTR)glue__objc_rootAutorelease, +(CONST_APTR)glue_objc_hashtable_new, +(CONST_APTR)glue_objc_hashtable_set, +(CONST_APTR)glue_objc_hashtable_get, +(CONST_APTR)glue_objc_hashtable_delete, +(CONST_APTR)glue_objc_hashtable_free, +(CONST_APTR)glue_objc_setTaggedPointerSecret, +(CONST_APTR)glue_objc_registerTaggedPointerClass, +(CONST_APTR)glue_object_isTaggedPointer, +(CONST_APTR)glue_object_getTaggedPointerValue, +(CONST_APTR)glue_objc_createTaggedPointer, ADDED src/runtime/amiga-glue.h Index: src/runtime/amiga-glue.h ================================================================== --- src/runtime/amiga-glue.h +++ src/runtime/amiga-glue.h @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +/* This file is automatically generated from library.xml */ + +#import "ObjFWRT.h" +#import "private.h" +#import "amiga-library.h" + +#ifdef OF_AMIGAOS_M68K +# define PPC_PARAMS(...) (void) +# define M68K_ARG(type, name, reg) \ + register type reg##name __asm__(#reg); \ + type name = reg##name; +#else +# define PPC_PARAMS(...) (__VA_ARGS__) +# define M68K_ARG(...) +#endif + +extern bool glue_objc_init PPC_PARAMS(unsigned int version, struct objc_libc *libc); +extern void glue___objc_exec_class PPC_PARAMS(struct objc_module *_Nonnull module); +extern IMP _Nonnull glue_objc_msg_lookup PPC_PARAMS(id _Nullable object, SEL _Nonnull selector); +extern IMP _Nonnull glue_objc_msg_lookup_stret PPC_PARAMS(id _Nullable object, SEL _Nonnull selector); +extern IMP _Nonnull glue_objc_msg_lookup_super PPC_PARAMS(struct objc_super *_Nonnull super, SEL _Nonnull selector); +extern IMP _Nonnull glue_objc_msg_lookup_super_stret PPC_PARAMS(struct objc_super *_Nonnull super, SEL _Nonnull selector); +extern Class _Nullable glue_objc_lookUpClass PPC_PARAMS(const char *_Nonnull name); +extern Class _Nullable glue_objc_getClass PPC_PARAMS(const char *_Nonnull name); +extern Class _Nonnull glue_objc_getRequiredClass PPC_PARAMS(const char *_Nonnull name); +extern Class _Nullable glue_objc_lookup_class PPC_PARAMS(const char *_Nonnull name); +extern Class _Nonnull glue_objc_get_class PPC_PARAMS(const char *_Nonnull name); +extern void glue_objc_exception_throw PPC_PARAMS(id _Nonnull object); +extern int glue_objc_sync_enter PPC_PARAMS(id _Nullable object); +extern int glue_objc_sync_exit PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_getProperty PPC_PARAMS(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, bool atomic); +extern void glue_objc_setProperty PPC_PARAMS(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, id _Nullable value, bool atomic, signed char copy); +extern void glue_objc_getPropertyStruct PPC_PARAMS(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong); +extern void glue_objc_setPropertyStruct PPC_PARAMS(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong); +extern void glue_objc_enumerationMutation PPC_PARAMS(id _Nonnull object); +extern int glue___gnu_objc_personality PPC_PARAMS(int version, int actions, uint64_t *_Nonnull exClass, void *_Nonnull ex, void *_Nonnull ctx); +extern id _Nullable glue_objc_retain PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_retainBlock PPC_PARAMS(id _Nullable block); +extern id _Nullable glue_objc_retainAutorelease PPC_PARAMS(id _Nullable object); +extern void glue_objc_release PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_autorelease PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_autoreleaseReturnValue PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_retainAutoreleaseReturnValue PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_retainAutoreleasedReturnValue PPC_PARAMS(id _Nullable object); +extern id _Nullable glue_objc_storeStrong PPC_PARAMS(id _Nullable *_Nonnull object, id _Nullable value); +extern id _Nullable glue_objc_storeWeak PPC_PARAMS(id _Nullable *_Nonnull object, id _Nullable value); +extern id _Nullable glue_objc_loadWeakRetained PPC_PARAMS(id _Nullable *_Nonnull object); +extern id _Nullable glue_objc_initWeak PPC_PARAMS(id _Nullable *_Nonnull object, id _Nullable value); +extern void glue_objc_destroyWeak PPC_PARAMS(id _Nullable *_Nonnull object); +extern id _Nullable glue_objc_loadWeak PPC_PARAMS(id _Nullable *_Nonnull object); +extern void glue_objc_copyWeak PPC_PARAMS(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src); +extern void glue_objc_moveWeak PPC_PARAMS(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src); +extern SEL _Nonnull glue_sel_registerName PPC_PARAMS(const char *_Nonnull name); +extern const char *_Nonnull glue_sel_getName PPC_PARAMS(SEL _Nonnull selector); +extern bool glue_sel_isEqual PPC_PARAMS(SEL _Nonnull selector1, SEL _Nonnull selector2); +extern Class _Nonnull glue_objc_allocateClassPair PPC_PARAMS(Class _Nullable superclass, const char *_Nonnull name, size_t extraBytes); +extern void glue_objc_registerClassPair PPC_PARAMS(Class _Nonnull class); +extern unsigned int glue_objc_getClassList PPC_PARAMS(Class _Nonnull *_Nullable buffer, unsigned int count); +extern Class _Nonnull *_Nonnull glue_objc_copyClassList PPC_PARAMS(unsigned int *_Nullable length); +extern bool glue_class_isMetaClass PPC_PARAMS(Class _Nullable class); +extern const char *_Nullable glue_class_getName PPC_PARAMS(Class _Nullable class); +extern Class _Nullable glue_class_getSuperclass PPC_PARAMS(Class _Nullable class); +extern unsigned long glue_class_getInstanceSize PPC_PARAMS(Class _Nullable class); +extern bool glue_class_respondsToSelector PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector); +extern bool glue_class_conformsToProtocol PPC_PARAMS(Class _Nullable class, Protocol *_Nonnull p); +extern IMP _Nullable glue_class_getMethodImplementation PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector); +extern IMP _Nullable glue_class_getMethodImplementation_stret PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector); +extern Method _Nullable glue_class_getInstanceMethod PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector); +extern bool glue_class_addMethod PPC_PARAMS(Class _Nonnull class, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding); +extern IMP _Nullable glue_class_replaceMethod PPC_PARAMS(Class _Nonnull class, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding); +extern Class _Nullable glue_object_getClass PPC_PARAMS(id _Nullable object); +extern Class _Nullable glue_object_setClass PPC_PARAMS(id _Nullable object, Class _Nonnull class); +extern const char *_Nullable glue_object_getClassName PPC_PARAMS(id _Nullable object); +extern const char *_Nonnull glue_protocol_getName PPC_PARAMS(Protocol *_Nonnull protocol); +extern bool glue_protocol_isEqual PPC_PARAMS(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2); +extern bool glue_protocol_conformsToProtocol PPC_PARAMS(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2); +extern _Nullable objc_uncaught_exception_handler_t glue_objc_setUncaughtExceptionHandler PPC_PARAMS(objc_uncaught_exception_handler_t _Nullable handler); +extern void glue_objc_setForwardHandler PPC_PARAMS(IMP _Nullable forward, IMP _Nullable stretForward); +extern void glue_objc_setEnumerationMutationHandler PPC_PARAMS(objc_enumeration_mutation_handler_t _Nullable hadler); +extern id _Nullable glue_objc_constructInstance PPC_PARAMS(Class _Nullable class, void *_Nullable bytes); +extern void glue_objc_exit(void); +extern Ivar _Nullable *_Nullable glue_class_copyIvarList PPC_PARAMS(Class _Nullable class, unsigned int *_Nullable outCount); +extern const char *_Nonnull glue_ivar_getName PPC_PARAMS(Ivar _Nonnull ivar); +extern const char *_Nonnull glue_ivar_getTypeEncoding PPC_PARAMS(Ivar _Nonnull ivar); +extern ptrdiff_t glue_ivar_getOffset PPC_PARAMS(Ivar _Nonnull ivar); +extern Method _Nullable *_Nullable glue_class_copyMethodList PPC_PARAMS(Class _Nullable class, unsigned int *_Nullable outCount); +extern SEL _Nonnull glue_method_getName PPC_PARAMS(Method _Nonnull method); +extern const char *_Nullable glue_method_getTypeEncoding PPC_PARAMS(Method _Nonnull method); +extern objc_property_t _Nullable *_Nullable glue_class_copyPropertyList PPC_PARAMS(Class _Nullable class, unsigned int *_Nullable outCount); +extern const char *_Nonnull glue_property_getName PPC_PARAMS(objc_property_t _Nonnull property); +extern char *_Nullable glue_property_copyAttributeValue PPC_PARAMS(objc_property_t _Nonnull property, const char *_Nonnull name); +extern void *_Nullable glue_objc_destructInstance PPC_PARAMS(id _Nullable object); +extern void *_Null_unspecified glue_objc_autoreleasePoolPush(void); +extern void glue_objc_autoreleasePoolPop PPC_PARAMS(void *_Null_unspecified pool); +extern id _Nullable glue__objc_rootAutorelease PPC_PARAMS(id _Nullable object); +extern struct objc_hashtable *_Nonnull glue_objc_hashtable_new PPC_PARAMS(objc_hashtable_hash_func hash, objc_hashtable_equal_func equal, uint32_t size); +extern void glue_objc_hashtable_set PPC_PARAMS(struct objc_hashtable *_Nonnull table, const void *_Nonnull key, const void *_Nonnull object); +extern void *_Nullable glue_objc_hashtable_get PPC_PARAMS(struct objc_hashtable *_Nonnull table, const void *_Nonnull key); +extern void glue_objc_hashtable_delete PPC_PARAMS(struct objc_hashtable *_Nonnull table, const void *_Nonnull key); +extern void glue_objc_hashtable_free PPC_PARAMS(struct objc_hashtable *_Nonnull table); +extern void glue_objc_setTaggedPointerSecret PPC_PARAMS(uintptr_t secret); +extern int glue_objc_registerTaggedPointerClass PPC_PARAMS(Class _Nonnull class); +extern bool glue_object_isTaggedPointer PPC_PARAMS(id _Nullable object); +extern uintptr_t glue_object_getTaggedPointerValue PPC_PARAMS(id _Nonnull object); +extern id _Nullable glue_objc_createTaggedPointer PPC_PARAMS(int class, uintptr_t value); Index: src/runtime/amiga-glue.m ================================================================== --- src/runtime/amiga-glue.m +++ src/runtime/amiga-glue.m @@ -13,24 +13,15 @@ * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ +/* This file is automatically generated from library.xml */ + #include "config.h" -#import "ObjFWRT.h" -#import "amiga-library.h" -#import "macros.h" -#import "private.h" - -#ifdef OF_AMIGAOS_M68K -# define PPC_PARAMS(...) (void) -# define M68K_ARG OBJC_M68K_ARG -#else -# define PPC_PARAMS(...) (__VA_ARGS__) -# define M68K_ARG(...) -#endif +#import "amiga-glue.h" #ifdef OF_MORPHOS /* All __saveds functions in this file need to use the SysV ABI */ __asm__ ( ".section .text\n" @@ -49,580 +40,558 @@ return objc_init(version, libc); } void __saveds -glue___objc_exec_class PPC_PARAMS(struct objc_module *module) +glue___objc_exec_class PPC_PARAMS(struct objc_module *_Nonnull module) { - M68K_ARG(struct objc_module *, module, a0) + M68K_ARG(struct objc_module *_Nonnull, module, a0) __objc_exec_class(module); } -IMP __saveds -glue_objc_msg_lookup PPC_PARAMS(id object, SEL selector) +IMP _Nonnull __saveds +glue_objc_msg_lookup PPC_PARAMS(id _Nullable object, SEL _Nonnull selector) { - M68K_ARG(id, object, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(id _Nullable, object, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return objc_msg_lookup(object, selector); } -IMP __saveds -glue_objc_msg_lookup_stret PPC_PARAMS(id object, SEL selector) +IMP _Nonnull __saveds +glue_objc_msg_lookup_stret PPC_PARAMS(id _Nullable object, SEL _Nonnull selector) { - M68K_ARG(id, object, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(id _Nullable, object, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return objc_msg_lookup_stret(object, selector); } -IMP __saveds -glue_objc_msg_lookup_super PPC_PARAMS(struct objc_super *super, SEL selector) +IMP _Nonnull __saveds +glue_objc_msg_lookup_super PPC_PARAMS(struct objc_super *_Nonnull super, SEL _Nonnull selector) { - M68K_ARG(struct objc_super *, super, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(struct objc_super *_Nonnull, super, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return objc_msg_lookup_super(super, selector); } -IMP __saveds -glue_objc_msg_lookup_super_stret PPC_PARAMS(struct objc_super *super, - SEL selector) +IMP _Nonnull __saveds +glue_objc_msg_lookup_super_stret PPC_PARAMS(struct objc_super *_Nonnull super, SEL _Nonnull selector) { - M68K_ARG(struct objc_super *, super, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(struct objc_super *_Nonnull, super, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return objc_msg_lookup_super_stret(super, selector); } -Class __saveds -glue_objc_lookUpClass PPC_PARAMS(const char *name) +Class _Nullable __saveds +glue_objc_lookUpClass PPC_PARAMS(const char *_Nonnull name) { - M68K_ARG(const char *, name, a0) + M68K_ARG(const char *_Nonnull, name, a0) return objc_lookUpClass(name); } -Class __saveds -glue_objc_getClass PPC_PARAMS(const char *name) +Class _Nullable __saveds +glue_objc_getClass PPC_PARAMS(const char *_Nonnull name) { - M68K_ARG(const char *, name, a0) + M68K_ARG(const char *_Nonnull, name, a0) return objc_getClass(name); } -Class __saveds -glue_objc_getRequiredClass PPC_PARAMS(const char *name) +Class _Nonnull __saveds +glue_objc_getRequiredClass PPC_PARAMS(const char *_Nonnull name) { - M68K_ARG(const char *, name, a0) + M68K_ARG(const char *_Nonnull, name, a0) return objc_getRequiredClass(name); } -Class __saveds -glue_objc_lookup_class PPC_PARAMS(const char *name) +Class _Nullable __saveds +glue_objc_lookup_class PPC_PARAMS(const char *_Nonnull name) { - M68K_ARG(const char *, name, a0) + M68K_ARG(const char *_Nonnull, name, a0) return objc_lookup_class(name); } -Class __saveds -glue_objc_get_class PPC_PARAMS(const char *name) +Class _Nonnull __saveds +glue_objc_get_class PPC_PARAMS(const char *_Nonnull name) { - M68K_ARG(const char *, name, a0) + M68K_ARG(const char *_Nonnull, name, a0) return objc_get_class(name); } void __saveds -glue_objc_exception_throw PPC_PARAMS(id object) +glue_objc_exception_throw PPC_PARAMS(id _Nonnull object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nonnull, object, a0) objc_exception_throw(object); - - OF_UNREACHABLE } int __saveds -glue_objc_sync_enter PPC_PARAMS(id object) +glue_objc_sync_enter PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_sync_enter(object); } int __saveds -glue_objc_sync_exit PPC_PARAMS(id object) +glue_objc_sync_exit PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_sync_exit(object); } -id __saveds -glue_objc_getProperty PPC_PARAMS(id self, SEL _cmd, ptrdiff_t offset, - bool atomic) +id _Nullable __saveds +glue_objc_getProperty PPC_PARAMS(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, bool atomic) { - M68K_ARG(id, self, a0) - M68K_ARG(SEL, _cmd, a1) + M68K_ARG(id _Nonnull, self, a0) + M68K_ARG(SEL _Nonnull, _cmd, a1) M68K_ARG(ptrdiff_t, offset, d0) M68K_ARG(bool, atomic, d1) return objc_getProperty(self, _cmd, offset, atomic); } void __saveds -glue_objc_setProperty PPC_PARAMS(id self, SEL _cmd, ptrdiff_t offset, id value, - bool atomic, signed char copy) +glue_objc_setProperty PPC_PARAMS(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, id _Nullable value, bool atomic, signed char copy) { - M68K_ARG(id, self, a0) - M68K_ARG(SEL, _cmd, a1) + M68K_ARG(id _Nonnull, self, a0) + M68K_ARG(SEL _Nonnull, _cmd, a1) M68K_ARG(ptrdiff_t, offset, d0) - M68K_ARG(id, value, a2) + M68K_ARG(id _Nullable, value, a2) M68K_ARG(bool, atomic, d1) M68K_ARG(signed char, copy, d2) objc_setProperty(self, _cmd, offset, value, atomic, copy); } void __saveds -glue_objc_getPropertyStruct PPC_PARAMS(void *dest, const void *src, - ptrdiff_t size, bool atomic, bool strong) +glue_objc_getPropertyStruct PPC_PARAMS(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong) { - M68K_ARG(void *, dest, a0) - M68K_ARG(const void *, src, a1) + M68K_ARG(void *_Nonnull, dest, a0) + M68K_ARG(const void *_Nonnull, src, a1) M68K_ARG(ptrdiff_t, size, d0) M68K_ARG(bool, atomic, d1) M68K_ARG(bool, strong, d2) objc_getPropertyStruct(dest, src, size, atomic, strong); } void __saveds -glue_objc_setPropertyStruct PPC_PARAMS(void *dest, const void *src, - ptrdiff_t size, bool atomic, bool strong) +glue_objc_setPropertyStruct PPC_PARAMS(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong) { - M68K_ARG(void *, dest, a0) - M68K_ARG(const void *, src, a1) + M68K_ARG(void *_Nonnull, dest, a0) + M68K_ARG(const void *_Nonnull, src, a1) M68K_ARG(ptrdiff_t, size, d0) M68K_ARG(bool, atomic, d1) M68K_ARG(bool, strong, d2) objc_setPropertyStruct(dest, src, size, atomic, strong); } void __saveds -glue_objc_enumerationMutation PPC_PARAMS(id object) +glue_objc_enumerationMutation PPC_PARAMS(id _Nonnull object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nonnull, object, a0) objc_enumerationMutation(object); } int __saveds -glue___gnu_objc_personality PPC_PARAMS(int version, int actions, - uint64_t exClass, void *ex, void *ctx) +glue___gnu_objc_personality PPC_PARAMS(int version, int actions, uint64_t *_Nonnull exClass, void *_Nonnull ex, void *_Nonnull ctx) { M68K_ARG(int, version, d0) M68K_ARG(int, actions, d1) - M68K_ARG(uint64_t *, exClassPtr, d2) - M68K_ARG(void *, ex, a0) - M68K_ARG(void *, ctx, a1) -#ifdef OF_AMIGAOS_M68K - uint64_t exClass = *exClassPtr; -#endif - -#ifdef HAVE_SJLJ_EXCEPTIONS - return __gnu_objc_personality_sj0(version, actions, exClass, ex, ctx); -#else - return __gnu_objc_personality_v0(version, actions, exClass, ex, ctx); -#endif -} - -id __saveds -glue_objc_retain PPC_PARAMS(id object) -{ - M68K_ARG(id, object, a0) + M68K_ARG(uint64_t *_Nonnull, exClass, d2) + M68K_ARG(void *_Nonnull, ex, a0) + M68K_ARG(void *_Nonnull, ctx, a1) + + return __gnu_objc_personality(version, actions, exClass, ex, ctx); +} + +id _Nullable __saveds +glue_objc_retain PPC_PARAMS(id _Nullable object) +{ + M68K_ARG(id _Nullable, object, a0) return objc_retain(object); } -id __saveds -glue_objc_retainBlock PPC_PARAMS(id block) +id _Nullable __saveds +glue_objc_retainBlock PPC_PARAMS(id _Nullable block) { - M68K_ARG(id, block, a0) + M68K_ARG(id _Nullable, block, a0) return objc_retainBlock(block); } -id __saveds -glue_objc_retainAutorelease PPC_PARAMS(id object) +id _Nullable __saveds +glue_objc_retainAutorelease PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_retainAutorelease(object); } void __saveds -glue_objc_release PPC_PARAMS(id object) +glue_objc_release PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) objc_release(object); } -id __saveds -glue_objc_autorelease PPC_PARAMS(id object) +id _Nullable __saveds +glue_objc_autorelease PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_autorelease(object); } -id __saveds -glue_objc_autoreleaseReturnValue PPC_PARAMS(id object) +id _Nullable __saveds +glue_objc_autoreleaseReturnValue PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_autoreleaseReturnValue(object); } -id __saveds -glue_objc_retainAutoreleaseReturnValue PPC_PARAMS(id object) +id _Nullable __saveds +glue_objc_retainAutoreleaseReturnValue PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_retainAutoreleaseReturnValue(object); } -id __saveds -glue_objc_retainAutoreleasedReturnValue PPC_PARAMS(id object) +id _Nullable __saveds +glue_objc_retainAutoreleasedReturnValue PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_retainAutoreleasedReturnValue(object); } -id __saveds -glue_objc_storeStrong PPC_PARAMS(id *object, id value) +id _Nullable __saveds +glue_objc_storeStrong PPC_PARAMS(id _Nullable *_Nonnull object, id _Nullable value) { - M68K_ARG(id *, object, a0) - M68K_ARG(id, value, a1) + M68K_ARG(id _Nullable *_Nonnull, object, a0) + M68K_ARG(id _Nullable, value, a1) return objc_storeStrong(object, value); } -id __saveds -glue_objc_storeWeak PPC_PARAMS(id *object, id value) +id _Nullable __saveds +glue_objc_storeWeak PPC_PARAMS(id _Nullable *_Nonnull object, id _Nullable value) { - M68K_ARG(id *, object, a0) - M68K_ARG(id, value, a1) + M68K_ARG(id _Nullable *_Nonnull, object, a0) + M68K_ARG(id _Nullable, value, a1) return objc_storeWeak(object, value); } -id __saveds -glue_objc_loadWeakRetained PPC_PARAMS(id *object) +id _Nullable __saveds +glue_objc_loadWeakRetained PPC_PARAMS(id _Nullable *_Nonnull object) { - M68K_ARG(id *, object, a0) + M68K_ARG(id _Nullable *_Nonnull, object, a0) return objc_loadWeakRetained(object); } -id __saveds -glue_objc_initWeak PPC_PARAMS(id *object, id value) +id _Nullable __saveds +glue_objc_initWeak PPC_PARAMS(id _Nullable *_Nonnull object, id _Nullable value) { - M68K_ARG(id *, object, a0) - M68K_ARG(id, value, a1) + M68K_ARG(id _Nullable *_Nonnull, object, a0) + M68K_ARG(id _Nullable, value, a1) return objc_initWeak(object, value); } void __saveds -glue_objc_destroyWeak PPC_PARAMS(id *object) +glue_objc_destroyWeak PPC_PARAMS(id _Nullable *_Nonnull object) { - M68K_ARG(id *, object, a0) + M68K_ARG(id _Nullable *_Nonnull, object, a0) objc_destroyWeak(object); } -id __saveds -glue_objc_loadWeak PPC_PARAMS(id *object) +id _Nullable __saveds +glue_objc_loadWeak PPC_PARAMS(id _Nullable *_Nonnull object) { - M68K_ARG(id *, object, a0) + M68K_ARG(id _Nullable *_Nonnull, object, a0) return objc_loadWeak(object); } void __saveds -glue_objc_copyWeak PPC_PARAMS(id *dest, id *src) +glue_objc_copyWeak PPC_PARAMS(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src) { - M68K_ARG(id *, dest, a0) - M68K_ARG(id *, src, a1) + M68K_ARG(id _Nullable *_Nonnull, dest, a0) + M68K_ARG(id _Nullable *_Nonnull, src, a1) objc_copyWeak(dest, src); } void __saveds -glue_objc_moveWeak PPC_PARAMS(id *dest, id *src) +glue_objc_moveWeak PPC_PARAMS(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src) { - M68K_ARG(id *, dest, a0) - M68K_ARG(id *, src, a1) + M68K_ARG(id _Nullable *_Nonnull, dest, a0) + M68K_ARG(id _Nullable *_Nonnull, src, a1) objc_moveWeak(dest, src); } -SEL __saveds -glue_sel_registerName PPC_PARAMS(const char *name) +SEL _Nonnull __saveds +glue_sel_registerName PPC_PARAMS(const char *_Nonnull name) { - M68K_ARG(const char *, name, a0) + M68K_ARG(const char *_Nonnull, name, a0) return sel_registerName(name); } -const char *__saveds -glue_sel_getName PPC_PARAMS(SEL selector) +const char *_Nonnull __saveds +glue_sel_getName PPC_PARAMS(SEL _Nonnull selector) { - M68K_ARG(SEL, selector, a0) + M68K_ARG(SEL _Nonnull, selector, a0) return sel_getName(selector); } bool __saveds -glue_sel_isEqual PPC_PARAMS(SEL selector1, SEL selector2) +glue_sel_isEqual PPC_PARAMS(SEL _Nonnull selector1, SEL _Nonnull selector2) { - M68K_ARG(SEL, selector1, a0) - M68K_ARG(SEL, selector2, a1) + M68K_ARG(SEL _Nonnull, selector1, a0) + M68K_ARG(SEL _Nonnull, selector2, a1) return sel_isEqual(selector1, selector2); } -Class __saveds -glue_objc_allocateClassPair PPC_PARAMS(Class superclass, const char *name, - size_t extraBytes) +Class _Nonnull __saveds +glue_objc_allocateClassPair PPC_PARAMS(Class _Nullable superclass, const char *_Nonnull name, size_t extraBytes) { - M68K_ARG(Class, superclass, a0) - M68K_ARG(const char *, name, a1) + M68K_ARG(Class _Nullable, superclass, a0) + M68K_ARG(const char *_Nonnull, name, a1) M68K_ARG(size_t, extraBytes, d0) return objc_allocateClassPair(superclass, name, extraBytes); } void __saveds -glue_objc_registerClassPair PPC_PARAMS(Class class) +glue_objc_registerClassPair PPC_PARAMS(Class _Nonnull class) { - M68K_ARG(Class, class, a0) + M68K_ARG(Class _Nonnull, class, a0) objc_registerClassPair(class); } unsigned int __saveds -glue_objc_getClassList PPC_PARAMS(Class *buffer, unsigned int count) +glue_objc_getClassList PPC_PARAMS(Class _Nonnull *_Nullable buffer, unsigned int count) { - M68K_ARG(Class *, buffer, a0) + M68K_ARG(Class _Nonnull *_Nullable, buffer, a0) M68K_ARG(unsigned int, count, d0) return objc_getClassList(buffer, count); } -Class *__saveds -glue_objc_copyClassList PPC_PARAMS(unsigned int *length) +Class _Nonnull *_Nonnull __saveds +glue_objc_copyClassList PPC_PARAMS(unsigned int *_Nullable length) { - M68K_ARG(unsigned int *, length, a0) + M68K_ARG(unsigned int *_Nullable, length, a0) return objc_copyClassList(length); } bool __saveds -glue_class_isMetaClass PPC_PARAMS(Class class) +glue_class_isMetaClass PPC_PARAMS(Class _Nullable class) { - M68K_ARG(Class, class, a0) + M68K_ARG(Class _Nullable, class, a0) return class_isMetaClass(class); } -const char *__saveds -glue_class_getName PPC_PARAMS(Class class) +const char *_Nullable __saveds +glue_class_getName PPC_PARAMS(Class _Nullable class) { - M68K_ARG(Class, class, a0) + M68K_ARG(Class _Nullable, class, a0) return class_getName(class); } -Class __saveds -glue_class_getSuperclass PPC_PARAMS(Class class) +Class _Nullable __saveds +glue_class_getSuperclass PPC_PARAMS(Class _Nullable class) { - M68K_ARG(Class, class, a0) + M68K_ARG(Class _Nullable, class, a0) return class_getSuperclass(class); } unsigned long __saveds -glue_class_getInstanceSize PPC_PARAMS(Class class) +glue_class_getInstanceSize PPC_PARAMS(Class _Nullable class) { - M68K_ARG(Class, class, a0) + M68K_ARG(Class _Nullable, class, a0) return class_getInstanceSize(class); } bool __saveds -glue_class_respondsToSelector PPC_PARAMS(Class class, SEL selector) +glue_class_respondsToSelector PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector) { - M68K_ARG(Class, class, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return class_respondsToSelector(class, selector); } bool __saveds -glue_class_conformsToProtocol PPC_PARAMS(Class class, Protocol *protocol) +glue_class_conformsToProtocol PPC_PARAMS(Class _Nullable class, Protocol *_Nonnull p) { - M68K_ARG(Class, class, a0) - M68K_ARG(Protocol *, protocol, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(Protocol *_Nonnull, p, a1) - return class_conformsToProtocol(class, protocol); + return class_conformsToProtocol(class, p); } -IMP __saveds -glue_class_getMethodImplementation PPC_PARAMS(Class class, SEL selector) +IMP _Nullable __saveds +glue_class_getMethodImplementation PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector) { - M68K_ARG(Class, class, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return class_getMethodImplementation(class, selector); } -IMP __saveds -glue_class_getMethodImplementation_stret PPC_PARAMS(Class class, SEL selector) +IMP _Nullable __saveds +glue_class_getMethodImplementation_stret PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector) { - M68K_ARG(Class, class, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return class_getMethodImplementation_stret(class, selector); } -Method __saveds -glue_class_getInstanceMethod PPC_PARAMS(Class class, SEL selector) +Method _Nullable __saveds +glue_class_getInstanceMethod PPC_PARAMS(Class _Nullable class, SEL _Nonnull selector) { - M68K_ARG(Class, class, a0) - M68K_ARG(SEL, selector, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(SEL _Nonnull, selector, a1) return class_getInstanceMethod(class, selector); } bool __saveds -glue_class_addMethod PPC_PARAMS(Class class, SEL selector, IMP implementation, - const char *typeEncoding) +glue_class_addMethod PPC_PARAMS(Class _Nonnull class, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding) { - M68K_ARG(Class, class, a0) - M68K_ARG(SEL, selector, a1) - M68K_ARG(IMP, implementation, a2) - M68K_ARG(const char *, typeEncoding, a3) + M68K_ARG(Class _Nonnull, class, a0) + M68K_ARG(SEL _Nonnull, selector, a1) + M68K_ARG(IMP _Nonnull, implementation, a2) + M68K_ARG(const char *_Nullable, typeEncoding, a3) return class_addMethod(class, selector, implementation, typeEncoding); } -IMP __saveds -glue_class_replaceMethod PPC_PARAMS(Class class, SEL selector, - IMP implementation, const char *typeEncoding) -{ - M68K_ARG(Class, class, a0) - M68K_ARG(SEL, selector, a1) - M68K_ARG(IMP, implementation, a2) - M68K_ARG(const char *, typeEncoding, a3) - - return class_replaceMethod(class, selector, implementation, - typeEncoding); -} - -Class __saveds -glue_object_getClass PPC_PARAMS(id object) -{ - M68K_ARG(id, object, a0) +IMP _Nullable __saveds +glue_class_replaceMethod PPC_PARAMS(Class _Nonnull class, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding) +{ + M68K_ARG(Class _Nonnull, class, a0) + M68K_ARG(SEL _Nonnull, selector, a1) + M68K_ARG(IMP _Nonnull, implementation, a2) + M68K_ARG(const char *_Nullable, typeEncoding, a3) + + return class_replaceMethod(class, selector, implementation, typeEncoding); +} + +Class _Nullable __saveds +glue_object_getClass PPC_PARAMS(id _Nullable object) +{ + M68K_ARG(id _Nullable, object, a0) return object_getClass(object); } -Class __saveds -glue_object_setClass PPC_PARAMS(id object, Class class) +Class _Nullable __saveds +glue_object_setClass PPC_PARAMS(id _Nullable object, Class _Nonnull class) { - M68K_ARG(id, object, a0) - M68K_ARG(Class, class, a1) + M68K_ARG(id _Nullable, object, a0) + M68K_ARG(Class _Nonnull, class, a1) return object_setClass(object, class); } -const char *__saveds -glue_object_getClassName PPC_PARAMS(id object) +const char *_Nullable __saveds +glue_object_getClassName PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return object_getClassName(object); } -const char *__saveds -glue_protocol_getName PPC_PARAMS(Protocol *protocol) +const char *_Nonnull __saveds +glue_protocol_getName PPC_PARAMS(Protocol *_Nonnull protocol) { - M68K_ARG(Protocol *, protocol, a0) + M68K_ARG(Protocol *_Nonnull, protocol, a0) return protocol_getName(protocol); } bool __saveds -glue_protocol_isEqual PPC_PARAMS(Protocol *protocol1, Protocol *protocol2) +glue_protocol_isEqual PPC_PARAMS(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2) { - M68K_ARG(Protocol *, protocol1, a0) - M68K_ARG(Protocol *, protocol2, a1) + M68K_ARG(Protocol *_Nonnull, protocol1, a0) + M68K_ARG(Protocol *_Nonnull, protocol2, a1) return protocol_isEqual(protocol1, protocol2); } bool __saveds -glue_protocol_conformsToProtocol PPC_PARAMS(Protocol *protocol1, - Protocol *protocol2) +glue_protocol_conformsToProtocol PPC_PARAMS(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2) { - M68K_ARG(Protocol *, protocol1, a0) - M68K_ARG(Protocol *, protocol2, a1) + M68K_ARG(Protocol *_Nonnull, protocol1, a0) + M68K_ARG(Protocol *_Nonnull, protocol2, a1) return protocol_conformsToProtocol(protocol1, protocol2); } -objc_uncaught_exception_handler_t __saveds -glue_objc_setUncaughtExceptionHandler PPC_PARAMS( - objc_uncaught_exception_handler_t handler) +_Nullable objc_uncaught_exception_handler_t __saveds +glue_objc_setUncaughtExceptionHandler PPC_PARAMS(objc_uncaught_exception_handler_t _Nullable handler) { - M68K_ARG(objc_uncaught_exception_handler_t, handler, a0) + M68K_ARG(objc_uncaught_exception_handler_t _Nullable, handler, a0) return objc_setUncaughtExceptionHandler(handler); } void __saveds -glue_objc_setForwardHandler PPC_PARAMS(IMP forward, IMP stretForward) +glue_objc_setForwardHandler PPC_PARAMS(IMP _Nullable forward, IMP _Nullable stretForward) { - M68K_ARG(IMP, forward, a0) - M68K_ARG(IMP, stretForward, a1) + M68K_ARG(IMP _Nullable, forward, a0) + M68K_ARG(IMP _Nullable, stretForward, a1) objc_setForwardHandler(forward, stretForward); } void __saveds -glue_objc_setEnumerationMutationHandler PPC_PARAMS( - objc_enumeration_mutation_handler_t handler) +glue_objc_setEnumerationMutationHandler PPC_PARAMS(objc_enumeration_mutation_handler_t _Nullable hadler) { - M68K_ARG(objc_enumeration_mutation_handler_t, handler, a0) + M68K_ARG(objc_enumeration_mutation_handler_t _Nullable, hadler, a0) - objc_setEnumerationMutationHandler(handler); + objc_setEnumerationMutationHandler(hadler); } -id __saveds -glue_objc_constructInstance PPC_PARAMS(Class class, void *bytes) +id _Nullable __saveds +glue_objc_constructInstance PPC_PARAMS(Class _Nullable class, void *_Nullable bytes) { - M68K_ARG(Class, class, a0) - M68K_ARG(void *, bytes, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(void *_Nullable, bytes, a1) return objc_constructInstance(class, bytes); } void __saveds @@ -629,171 +598,166 @@ glue_objc_exit(void) { objc_exit(); } -Ivar *__saveds -glue_class_copyIvarList PPC_PARAMS(Class class, unsigned int *outCount) +Ivar _Nullable *_Nullable __saveds +glue_class_copyIvarList PPC_PARAMS(Class _Nullable class, unsigned int *_Nullable outCount) { - M68K_ARG(Class, class, a0) - M68K_ARG(unsigned int *, outCount, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(unsigned int *_Nullable, outCount, a1) return class_copyIvarList(class, outCount); } -const char *__saveds -glue_ivar_getName PPC_PARAMS(Ivar ivar) +const char *_Nonnull __saveds +glue_ivar_getName PPC_PARAMS(Ivar _Nonnull ivar) { - M68K_ARG(Ivar, ivar, a0) + M68K_ARG(Ivar _Nonnull, ivar, a0) return ivar_getName(ivar); } -const char *__saveds -glue_ivar_getTypeEncoding PPC_PARAMS(Ivar ivar) +const char *_Nonnull __saveds +glue_ivar_getTypeEncoding PPC_PARAMS(Ivar _Nonnull ivar) { - M68K_ARG(Ivar, ivar, a0) + M68K_ARG(Ivar _Nonnull, ivar, a0) return ivar_getTypeEncoding(ivar); } ptrdiff_t __saveds -glue_ivar_getOffset PPC_PARAMS(Ivar ivar) +glue_ivar_getOffset PPC_PARAMS(Ivar _Nonnull ivar) { - M68K_ARG(Ivar, ivar, a0) + M68K_ARG(Ivar _Nonnull, ivar, a0) return ivar_getOffset(ivar); } -Method *__saveds -glue_class_copyMethodList PPC_PARAMS(Class class, unsigned int *outCount) +Method _Nullable *_Nullable __saveds +glue_class_copyMethodList PPC_PARAMS(Class _Nullable class, unsigned int *_Nullable outCount) { - M68K_ARG(Class, class, a0) - M68K_ARG(unsigned int *, outCount, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(unsigned int *_Nullable, outCount, a1) return class_copyMethodList(class, outCount); } -SEL __saveds -glue_method_getName PPC_PARAMS(Method method) +SEL _Nonnull __saveds +glue_method_getName PPC_PARAMS(Method _Nonnull method) { - M68K_ARG(Method, method, a0) + M68K_ARG(Method _Nonnull, method, a0) return method_getName(method); } -const char *__saveds -glue_method_getTypeEncoding PPC_PARAMS(Method method) +const char *_Nullable __saveds +glue_method_getTypeEncoding PPC_PARAMS(Method _Nonnull method) { - M68K_ARG(Method, method, a0) + M68K_ARG(Method _Nonnull, method, a0) return method_getTypeEncoding(method); } -objc_property_t *__saveds -glue_class_copyPropertyList PPC_PARAMS(Class class, unsigned int *outCount) +objc_property_t _Nullable *_Nullable __saveds +glue_class_copyPropertyList PPC_PARAMS(Class _Nullable class, unsigned int *_Nullable outCount) { - M68K_ARG(Class, class, a0) - M68K_ARG(unsigned int *, outCount, a1) + M68K_ARG(Class _Nullable, class, a0) + M68K_ARG(unsigned int *_Nullable, outCount, a1) return class_copyPropertyList(class, outCount); } -const char *__saveds -glue_property_getName PPC_PARAMS(objc_property_t property) +const char *_Nonnull __saveds +glue_property_getName PPC_PARAMS(objc_property_t _Nonnull property) { - M68K_ARG(objc_property_t, property, a0) + M68K_ARG(objc_property_t _Nonnull, property, a0) return property_getName(property); } -char *__saveds -glue_property_copyAttributeValue PPC_PARAMS(objc_property_t property, - const char *name) +char *_Nullable __saveds +glue_property_copyAttributeValue PPC_PARAMS(objc_property_t _Nonnull property, const char *_Nonnull name) { - M68K_ARG(objc_property_t, property, a0) - M68K_ARG(const char *, name, a1) + M68K_ARG(objc_property_t _Nonnull, property, a0) + M68K_ARG(const char *_Nonnull, name, a1) return property_copyAttributeValue(property, name); } -void *__saveds -glue_objc_destructInstance PPC_PARAMS(id object) +void *_Nullable __saveds +glue_objc_destructInstance PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return objc_destructInstance(object); } -void *__saveds +void *_Null_unspecified __saveds glue_objc_autoreleasePoolPush(void) { return objc_autoreleasePoolPush(); } void __saveds -glue_objc_autoreleasePoolPop PPC_PARAMS(void *pool) +glue_objc_autoreleasePoolPop PPC_PARAMS(void *_Null_unspecified pool) { - M68K_ARG(void *, pool, a0) + M68K_ARG(void *_Null_unspecified, pool, a0) objc_autoreleasePoolPop(pool); } -id __saveds -glue__objc_rootAutorelease PPC_PARAMS(id object) +id _Nullable __saveds +glue__objc_rootAutorelease PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return _objc_rootAutorelease(object); } -struct objc_hashtable *__saveds -glue_objc_hashtable_new PPC_PARAMS(objc_hashtable_hash_func hash, - objc_hashtable_equal_func equal, uint32_t size) +struct objc_hashtable *_Nonnull __saveds +glue_objc_hashtable_new PPC_PARAMS(objc_hashtable_hash_func hash, objc_hashtable_equal_func equal, uint32_t size) { M68K_ARG(objc_hashtable_hash_func, hash, a0) M68K_ARG(objc_hashtable_equal_func, equal, a1) M68K_ARG(uint32_t, size, d0) return objc_hashtable_new(hash, equal, size); } void __saveds -glue_objc_hashtable_set PPC_PARAMS(struct objc_hashtable *table, - const void *key, const void *object) +glue_objc_hashtable_set PPC_PARAMS(struct objc_hashtable *_Nonnull table, const void *_Nonnull key, const void *_Nonnull object) { - M68K_ARG(struct objc_hashtable *, table, a0) - M68K_ARG(const void *, key, a1) - M68K_ARG(const void *, object, a2) + M68K_ARG(struct objc_hashtable *_Nonnull, table, a0) + M68K_ARG(const void *_Nonnull, key, a1) + M68K_ARG(const void *_Nonnull, object, a2) objc_hashtable_set(table, key, object); } -void *__saveds -glue_objc_hashtable_get PPC_PARAMS(struct objc_hashtable *table, - const void *key) +void *_Nullable __saveds +glue_objc_hashtable_get PPC_PARAMS(struct objc_hashtable *_Nonnull table, const void *_Nonnull key) { - M68K_ARG(struct objc_hashtable *, table, a0) - M68K_ARG(const void *, key, a1) + M68K_ARG(struct objc_hashtable *_Nonnull, table, a0) + M68K_ARG(const void *_Nonnull, key, a1) return objc_hashtable_get(table, key); } void __saveds -glue_objc_hashtable_delete PPC_PARAMS(struct objc_hashtable *table, - const void *key) +glue_objc_hashtable_delete PPC_PARAMS(struct objc_hashtable *_Nonnull table, const void *_Nonnull key) { - M68K_ARG(struct objc_hashtable *, table, a0) - M68K_ARG(const void *, key, a1) + M68K_ARG(struct objc_hashtable *_Nonnull, table, a0) + M68K_ARG(const void *_Nonnull, key, a1) objc_hashtable_delete(table, key); } void __saveds -glue_objc_hashtable_free PPC_PARAMS(struct objc_hashtable *table) +glue_objc_hashtable_free PPC_PARAMS(struct objc_hashtable *_Nonnull table) { - M68K_ARG(struct objc_hashtable *, table, a0) + M68K_ARG(struct objc_hashtable *_Nonnull, table, a0) objc_hashtable_free(table); } void __saveds @@ -803,36 +767,36 @@ objc_setTaggedPointerSecret(secret); } int __saveds -glue_objc_registerTaggedPointerClass PPC_PARAMS(Class class) +glue_objc_registerTaggedPointerClass PPC_PARAMS(Class _Nonnull class) { - M68K_ARG(Class, class, a0) + M68K_ARG(Class _Nonnull, class, a0) return objc_registerTaggedPointerClass(class); } bool __saveds -glue_object_isTaggedPointer PPC_PARAMS(id object) +glue_object_isTaggedPointer PPC_PARAMS(id _Nullable object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nullable, object, a0) return object_isTaggedPointer(object); } uintptr_t __saveds -glue_object_getTaggedPointerValue PPC_PARAMS(id object) +glue_object_getTaggedPointerValue PPC_PARAMS(id _Nonnull object) { - M68K_ARG(id, object, a0) + M68K_ARG(id _Nonnull, object, a0) return object_getTaggedPointerValue(object); } -id __saveds +id _Nullable __saveds glue_objc_createTaggedPointer PPC_PARAMS(int class, uintptr_t value) { M68K_ARG(int, class, d0) M68K_ARG(uintptr_t, value, d1) return objc_createTaggedPointer(class, value); } DELETED src/runtime/amiga-library.h Index: src/runtime/amiga-library.h ================================================================== --- src/runtime/amiga-library.h +++ src/runtime/amiga-library.h @@ -1,71 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, - * 2018, 2019, 2020 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#import "macros.h" - -#ifdef OF_MORPHOS -# include -# define OBJC_M68K_ARG(type, name, reg) type name = (type)REG_##reg; -#else -# define OBJC_M68K_ARG(type, name, reg) \ - register type reg_##name __asm__(#reg); \ - type name = reg_##name; -#endif - -struct objc_libc { - void *_Nullable (*_Nonnull malloc)(size_t); - void *_Nullable (*_Nonnull calloc)(size_t, size_t); - void *_Nullable (*_Nonnull realloc)(void *_Nullable, size_t); - void (*_Nonnull free)(void *_Nullable); -# ifdef HAVE_SJLJ_EXCEPTIONS - int (*_Nonnull _Unwind_SjLj_RaiseException)(void *_Nonnull); -# else - int (*_Nonnull _Unwind_RaiseException)(void *_Nonnull); -# endif - void (*_Nonnull _Unwind_DeleteException)(void *_Nonnull); - void *_Nullable (*_Nonnull _Unwind_GetLanguageSpecificData)( - void *_Nonnull); - uintptr_t (*_Nonnull _Unwind_GetRegionStart)(void *_Nonnull); - uintptr_t (*_Nonnull _Unwind_GetDataRelBase)(void *_Nonnull); - uintptr_t (*_Nonnull _Unwind_GetTextRelBase)(void *_Nonnull); - uintptr_t (*_Nonnull _Unwind_GetIP)(void *_Nonnull); - uintptr_t (*_Nonnull _Unwind_GetGR)(void *_Nonnull, int); - void (*_Nonnull _Unwind_SetIP)(void *_Nonnull, uintptr_t); - void (*_Nonnull _Unwind_SetGR)(void *_Nonnull, int, uintptr_t); -# ifdef HAVE_SJLJ_EXCEPTIONS - void (*_Nonnull _Unwind_SjLj_Resume)(void *_Nonnull); -# else - void (*_Nonnull _Unwind_Resume)(void *_Nonnull); -# endif -# ifdef OF_AMIGAOS_M68K - void (*_Nonnull __register_frame_info)(const void *_Nonnull, - void *_Nonnull); - void *(*_Nonnull __deregister_frame_info)(const void *_Nonnull); -# endif -# ifdef OF_MORPHOS - void (*_Nonnull __register_frame)(void *_Nonnull); - void (*_Nonnull __deregister_frame)(void *_Nonnull); -# endif -# ifdef OF_AMIGAOS_M68K - int (*_Nonnull vsnprintf)(char *restrict _Nonnull str, size_t size, - const char *_Nonnull restrict fmt, va_list args); -# endif - int (*_Nonnull atexit)(void (*_Nonnull)(void)); - void (*_Nonnull exit)(int); -}; - -extern bool objc_init(unsigned int, struct objc_libc *_Nonnull); Index: src/runtime/amiga-library.m ================================================================== --- src/runtime/amiga-library.m +++ src/runtime/amiga-library.m @@ -16,12 +16,13 @@ */ #include "config.h" #import "ObjFWRT.h" -#import "amiga-library.h" #import "private.h" + +#import "amiga-glue.h" #include #include #include #include @@ -68,101 +69,10 @@ extern uintptr_t __CTOR_LIST__[]; extern const void *_EH_FRAME_BEGINS__; extern void *_EH_FRAME_OBJECTS__; #endif -extern bool glue_objc_init(void); -extern void glue___objc_exec_class(void); -extern IMP glue_objc_msg_lookup(void); -extern IMP glue_objc_msg_lookup_stret(void); -extern IMP glue_objc_msg_lookup_super(void); -extern IMP glue_objc_msg_lookup_super_stret(void); -extern Class glue_objc_lookUpClass(void); -extern Class glue_objc_getClass(void); -extern Class glue_objc_getRequiredClass(void); -extern Class glue_objc_lookup_class(void); -extern Class glue_objc_get_class(void); -extern void glue_objc_exception_throw(void); -extern int glue_objc_sync_enter(void); -extern int glue_objc_sync_exit(void); -extern id glue_objc_getProperty(void); -extern void glue_objc_setProperty(void); -extern void glue_objc_getPropertyStruct(void); -extern void glue_objc_setPropertyStruct(void); -extern void glue_objc_enumerationMutation(void); -extern int glue___gnu_objc_personality(void); -extern id glue_objc_retain(void); -extern id glue_objc_retainBlock(void); -extern id glue_objc_retainAutorelease(void); -extern void glue_objc_release(void); -extern id glue_objc_autorelease(void); -extern id glue_objc_autoreleaseReturnValue(void); -extern id glue_objc_retainAutoreleaseReturnValue(void); -extern id glue_objc_retainAutoreleasedReturnValue(void); -extern id glue_objc_storeStrong(void); -extern id glue_objc_storeWeak(void); -extern id glue_objc_loadWeakRetained(void); -extern id glue_objc_initWeak(void); -extern void glue_objc_destroyWeak(void); -extern id glue_objc_loadWeak(void); -extern void glue_objc_copyWeak(void); -extern void glue_objc_moveWeak(void); -extern SEL glue_sel_registerName(void); -extern const char *glue_sel_getName(void); -extern bool glue_sel_isEqual(void); -extern Class glue_objc_allocateClassPair(void); -extern void glue_objc_registerClassPair(void); -extern unsigned int glue_objc_getClassList(void); -extern Class *glue_objc_copyClassList(void); -extern bool glue_class_isMetaClass(void); -extern const char *glue_class_getName(void); -extern Class glue_class_getSuperclass(void); -extern unsigned long glue_class_getInstanceSize(void); -extern bool glue_class_respondsToSelector(void); -extern bool glue_class_conformsToProtocol(void); -extern IMP glue_class_getMethodImplementation(void); -extern IMP glue_class_getMethodImplementation_stret(void); -extern Method glue_class_getInstanceMethod(void); -extern bool glue_class_addMethod(void); -extern IMP glue_class_replaceMethod(void); -extern Class glue_object_getClass(void); -extern Class glue_object_setClass(void); -extern const char *glue_object_getClassName(void); -extern const char *glue_protocol_getName(void); -extern bool glue_protocol_isEqual(void); -extern bool glue_protocol_conformsToProtocol(void); -extern objc_uncaught_exception_handler_t - glue_objc_setUncaughtExceptionHandler(void); -extern void glue_objc_setForwardHandler(void); -extern void glue_objc_setEnumerationMutationHandler(void); -extern id glue_objc_constructInstance(void); -extern void glue_objc_exit(void); -extern Ivar *glue_class_copyIvarList(void); -extern const char *glue_ivar_getName(void); -extern const char *glue_ivar_getTypeEncoding(void); -extern ptrdiff_t glue_ivar_getOffset(void); -extern Method *glue_class_copyMethodList(void); -extern SEL glue_method_getName(void); -extern const char *glue_method_getTypeEncoding(void); -extern objc_property_t *glue_class_copyPropertyList(void); -extern const char *glue_property_getName(void); -extern char *glue_property_copyAttributeValue(void); -extern void *glue_objc_destructInstance(void); -extern void *glue_objc_autoreleasePoolPush(void); -extern void glue_objc_autoreleasePoolPop(void); -extern id glue__objc_rootAutorelease(void); -extern struct objc_hashtable *glue_objc_hashtable_new(void); -extern void glue_objc_hashtable_set(void); -extern void *glue_objc_hashtable_get(void); -extern void glue_objc_hashtable_delete(void); -extern void glue_objc_hashtable_free(void); -extern void glue_objc_setTaggedPointerSecret(void); -extern int glue_objc_registerTaggedPointerClass(void); -extern bool glue_object_isTaggedPointer(void); -extern uintptr_t glue_object_getTaggedPointerValue(void); -extern id glue_objc_createTaggedPointer(void); - #ifdef OF_MORPHOS const ULONG __abox__ = 1; #endif struct ExecBase *SysBase; struct objc_libc libc; @@ -624,99 +534,11 @@ (CONST_APTR)lib_null, #ifdef OF_MORPHOS (CONST_APTR)-1, (CONST_APTR)FUNCARRAY_32BIT_SYSTEMV, #endif - (CONST_APTR)glue_objc_init, - (CONST_APTR)glue___objc_exec_class, - (CONST_APTR)glue_objc_msg_lookup, - (CONST_APTR)glue_objc_msg_lookup_stret, - (CONST_APTR)glue_objc_msg_lookup_super, - (CONST_APTR)glue_objc_msg_lookup_super_stret, - (CONST_APTR)glue_objc_lookUpClass, - (CONST_APTR)glue_objc_getClass, - (CONST_APTR)glue_objc_getRequiredClass, - (CONST_APTR)glue_objc_lookup_class, - (CONST_APTR)glue_objc_get_class, - (CONST_APTR)glue_objc_exception_throw, - (CONST_APTR)glue_objc_sync_enter, - (CONST_APTR)glue_objc_sync_exit, - (CONST_APTR)glue_objc_getProperty, - (CONST_APTR)glue_objc_setProperty, - (CONST_APTR)glue_objc_getPropertyStruct, - (CONST_APTR)glue_objc_setPropertyStruct, - (CONST_APTR)glue_objc_enumerationMutation, - (CONST_APTR)glue___gnu_objc_personality, - (CONST_APTR)glue_objc_retain, - (CONST_APTR)glue_objc_retainBlock, - (CONST_APTR)glue_objc_retainAutorelease, - (CONST_APTR)glue_objc_release, - (CONST_APTR)glue_objc_autorelease, - (CONST_APTR)glue_objc_autoreleaseReturnValue, - (CONST_APTR)glue_objc_retainAutoreleaseReturnValue, - (CONST_APTR)glue_objc_retainAutoreleasedReturnValue, - (CONST_APTR)glue_objc_storeStrong, - (CONST_APTR)glue_objc_storeWeak, - (CONST_APTR)glue_objc_loadWeakRetained, - (CONST_APTR)glue_objc_initWeak, - (CONST_APTR)glue_objc_destroyWeak, - (CONST_APTR)glue_objc_loadWeak, - (CONST_APTR)glue_objc_copyWeak, - (CONST_APTR)glue_objc_moveWeak, - (CONST_APTR)glue_sel_registerName, - (CONST_APTR)glue_sel_getName, - (CONST_APTR)glue_sel_isEqual, - (CONST_APTR)glue_objc_allocateClassPair, - (CONST_APTR)glue_objc_registerClassPair, - (CONST_APTR)glue_objc_getClassList, - (CONST_APTR)glue_objc_copyClassList, - (CONST_APTR)glue_class_isMetaClass, - (CONST_APTR)glue_class_getName, - (CONST_APTR)glue_class_getSuperclass, - (CONST_APTR)glue_class_getInstanceSize, - (CONST_APTR)glue_class_respondsToSelector, - (CONST_APTR)glue_class_conformsToProtocol, - (CONST_APTR)glue_class_getMethodImplementation, - (CONST_APTR)glue_class_getMethodImplementation_stret, - (CONST_APTR)glue_class_getInstanceMethod, - (CONST_APTR)glue_class_addMethod, - (CONST_APTR)glue_class_replaceMethod, - (CONST_APTR)glue_object_getClass, - (CONST_APTR)glue_object_setClass, - (CONST_APTR)glue_object_getClassName, - (CONST_APTR)glue_protocol_getName, - (CONST_APTR)glue_protocol_isEqual, - (CONST_APTR)glue_protocol_conformsToProtocol, - (CONST_APTR)glue_objc_setUncaughtExceptionHandler, - (CONST_APTR)glue_objc_setForwardHandler, - (CONST_APTR)glue_objc_setEnumerationMutationHandler, - (CONST_APTR)glue_objc_constructInstance, - (CONST_APTR)glue_objc_exit, - (CONST_APTR)glue_class_copyIvarList, - (CONST_APTR)glue_ivar_getName, - (CONST_APTR)glue_ivar_getTypeEncoding, - (CONST_APTR)glue_ivar_getOffset, - (CONST_APTR)glue_class_copyMethodList, - (CONST_APTR)glue_method_getName, - (CONST_APTR)glue_method_getTypeEncoding, - (CONST_APTR)glue_class_copyPropertyList, - (CONST_APTR)glue_property_getName, - (CONST_APTR)glue_property_copyAttributeValue, - (CONST_APTR)glue_objc_destructInstance, - (CONST_APTR)glue_objc_autoreleasePoolPush, - (CONST_APTR)glue_objc_autoreleasePoolPop, - (CONST_APTR)glue__objc_rootAutorelease, - (CONST_APTR)glue_objc_hashtable_new, - (CONST_APTR)glue_objc_hashtable_set, - (CONST_APTR)glue_objc_hashtable_get, - (CONST_APTR)glue_objc_hashtable_delete, - (CONST_APTR)glue_objc_hashtable_free, - (CONST_APTR)glue_objc_setTaggedPointerSecret, - (CONST_APTR)glue_objc_registerTaggedPointerClass, - (CONST_APTR)glue_object_isTaggedPointer, - (CONST_APTR)glue_object_getTaggedPointerValue, - (CONST_APTR)glue_objc_createTaggedPointer, +#include "amiga-funcarray.inc" (CONST_APTR)-1, #ifdef OF_MORPHOS (CONST_APTR)FUNCARRAY_END #endif }; ADDED src/runtime/library.xml Index: src/runtime/library.xml ================================================================== --- src/runtime/library.xml +++ src/runtime/library.xml @@ -0,0 +1,345 @@ + + ObjFWRT.h + private.h + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/runtime/linklib/Makefile ================================================================== --- src/runtime/linklib/Makefile +++ src/runtime/linklib/Makefile @@ -1,11 +1,12 @@ include ../../../extra.mk STATIC_LIB = libobjfwrt.library.a -SRCS = linklib.m +SRCS = init.m \ + linklib.m include ../../../buildsys.mk CPPFLAGS += -I.. -I../.. -I../../.. \ -DOBJC_COMPILING_AMIGA_LINKLIB \ -DOBJFWRT_AMIGA_LIB=\"${OBJFWRT_AMIGA_LIB}\" \ -DOBJFWRT_LIB_MINOR=${OBJFWRT_LIB_MINOR} ADDED src/runtime/linklib/init.m Index: src/runtime/linklib/init.m ================================================================== --- src/runtime/linklib/init.m +++ src/runtime/linklib/init.m @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, + * 2018, 2019, 2020 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#include "config.h" + +#import "ObjFWRT.h" +#import "private.h" +#import "amiga-library.h" + +#include +#include + +struct ObjFWRTBase; + +#include +#include + +#if defined(OF_AMIGAOS_M68K) +# include +#elif defined(OF_MORPHOS) +# include +#endif + +#ifdef HAVE_SJLJ_EXCEPTIONS +extern int _Unwind_SjLj_RaiseException(void *); +#else +extern int _Unwind_RaiseException(void *); +#endif +extern void _Unwind_DeleteException(void *); +extern void *_Unwind_GetLanguageSpecificData(void *); +extern uintptr_t _Unwind_GetRegionStart(void *); +extern uintptr_t _Unwind_GetDataRelBase(void *); +extern uintptr_t _Unwind_GetTextRelBase(void *); +extern uintptr_t _Unwind_GetIP(void *); +extern uintptr_t _Unwind_GetGR(void *, int); +extern void _Unwind_SetIP(void *, uintptr_t); +extern void _Unwind_SetGR(void *, int, uintptr_t); +#ifdef HAVE_SJLJ_EXCEPTIONS +extern void _Unwind_SjLj_Resume(void *); +#else +extern void _Unwind_Resume(void *); +#endif +#ifdef OF_AMIGAOS_M68K +extern void __register_frame_info(const void *, void *); +extern void *__deregister_frame_info(const void *); +#endif +#ifdef OF_MORPHOS +extern void __register_frame(void *); +extern void __deregister_frame(void *); +#endif + +struct Library *ObjFWRTBase; +void *__objc_class_name_Protocol; + +extern bool objc_init(unsigned int version, struct objc_libc *libc); + +static void +error(const char *string, ULONG arg) +{ + struct Library *IntuitionBase = OpenLibrary("intuition.library", 0); + + if (IntuitionBase != NULL) { + struct EasyStruct easy = { + .es_StructSize = sizeof(easy), + .es_Flags = 0, + .es_Title = (void *)NULL, + .es_TextFormat = (void *)string, + (void *)"OK" + }; + + EasyRequest(NULL, &easy, NULL, arg); + + CloseLibrary(IntuitionBase); + } + + exit(EXIT_FAILURE); +} + +static void __attribute__((__used__)) +ctor(void) +{ + static bool initialized = false; + struct objc_libc libc = { + .malloc = malloc, + .calloc = calloc, + .realloc = realloc, + .free = free, +#ifdef HAVE_SJLJ_EXCEPTIONS + ._Unwind_SjLj_RaiseException = _Unwind_SjLj_RaiseException, +#else + ._Unwind_RaiseException = _Unwind_RaiseException, +#endif + ._Unwind_DeleteException = _Unwind_DeleteException, + ._Unwind_GetLanguageSpecificData = + _Unwind_GetLanguageSpecificData, + ._Unwind_GetRegionStart = _Unwind_GetRegionStart, + ._Unwind_GetDataRelBase = _Unwind_GetDataRelBase, + ._Unwind_GetTextRelBase = _Unwind_GetTextRelBase, + ._Unwind_GetIP = _Unwind_GetIP, + ._Unwind_GetGR = _Unwind_GetGR, + ._Unwind_SetIP = _Unwind_SetIP, + ._Unwind_SetGR = _Unwind_SetGR, +#ifdef HAVE_SJLJ_EXCEPTIONS + ._Unwind_SjLj_Resume = _Unwind_SjLj_Resume, +#else + ._Unwind_Resume = _Unwind_Resume, +#endif +#ifdef OF_AMIGAOS_M68K + .__register_frame_info = __register_frame_info, + .__deregister_frame_info = __deregister_frame_info, +#endif +#ifdef OF_MORPHOS + .__register_frame = __register_frame, + .__deregister_frame = __deregister_frame, +#endif +#ifdef OF_AMIGAOS_M68K + .vsnprintf = vsnprintf, +#endif + .atexit = atexit, + .exit = exit, + }; + + if (initialized) + return; + + if ((ObjFWRTBase = OpenLibrary(OBJFWRT_AMIGA_LIB, + OBJFWRT_LIB_MINOR)) == NULL) + error("Failed to open " OBJFWRT_AMIGA_LIB " version %lu!", + OBJFWRT_LIB_MINOR); + + if (!objc_init(1, &libc)) + error("Failed to initialize " OBJFWRT_AMIGA_LIB "!", 0); + + initialized = true; +} + +static void __attribute__((__used__)) +dtor(void) +{ + CloseLibrary(ObjFWRTBase); +} + +#if defined(OF_AMIGAOS_M68K) +ADD2INIT(ctor, -5); +ADD2EXIT(dtor, -5); +#elif defined(OF_MORPHOS) +CONSTRUCTOR_P(ObjFWRT, 4000) +{ + ctor(); + + return 0; +} + +DESTRUCTOR_P(ObjFWRT, 4000) +{ + dtor(); +} +#endif + +extern int __gnu_objc_personality(int version, int actions, uint64_t *exClass, + void *ex, void *ctx); + +int +#ifdef HAVE_SJLJ_EXCEPTIONS +__gnu_objc_personality_sj0( +#else +__gnu_objc_personality_v0( +#endif + int version, int actions, uint64_t exClass, void *ex, void *ctx) +{ +#ifdef OF_AMIGAOS_M68K + return __gnu_objc_personality(version, actions, &exClass, ex, ctx); +#else + return __gnu_objc_personality(version, actions, &exClass, ex, ctx); +#endif +} Index: src/runtime/linklib/linklib.m ================================================================== --- src/runtime/linklib/linklib.m +++ src/runtime/linklib/linklib.m @@ -13,763 +13,1528 @@ * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ +/* This file is automatically generated from library.xml */ + #include "config.h" #import "ObjFWRT.h" -#import "amiga-library.h" -#import "macros.h" #import "private.h" -#include -#define USE_INLINE_STDARG -#include - -struct ObjFWRTBase; - -#import "inline.h" - -#include -#include - -#if defined(OF_AMIGAOS_M68K) -# include -# define SYM(name) __asm__("_" name) -#elif defined(OF_MORPHOS) -# include -# define SYM(name) __asm__(name) -#endif - -#ifdef HAVE_SJLJ_EXCEPTIONS -extern int _Unwind_SjLj_RaiseException(void *); -#else -extern int _Unwind_RaiseException(void *); -#endif -extern void _Unwind_DeleteException(void *); -extern void *_Unwind_GetLanguageSpecificData(void *); -extern uintptr_t _Unwind_GetRegionStart(void *); -extern uintptr_t _Unwind_GetDataRelBase(void *); -extern uintptr_t _Unwind_GetTextRelBase(void *); -extern uintptr_t _Unwind_GetIP(void *); -extern uintptr_t _Unwind_GetGR(void *, int); -extern void _Unwind_SetIP(void *, uintptr_t); -extern void _Unwind_SetGR(void *, int, uintptr_t); -#ifdef HAVE_SJLJ_EXCEPTIONS -extern void _Unwind_SjLj_Resume(void *); -#else -extern void _Unwind_Resume(void *); -#endif -#ifdef OF_AMIGAOS_M68K -extern void __register_frame_info(const void *, void *); -extern void *__deregister_frame_info(const void *); -#endif -#ifdef OF_MORPHOS -extern void __register_frame(void *); -extern void __deregister_frame(void *); -#endif - -struct Library *ObjFWRTBase; -void *__objc_class_name_Protocol; - -static void -error(const char *string, ULONG arg) -{ - struct Library *IntuitionBase = OpenLibrary("intuition.library", 0); - - if (IntuitionBase != NULL) { - struct EasyStruct easy = { - .es_StructSize = sizeof(easy), - .es_Flags = 0, - .es_Title = (void *)NULL, - .es_TextFormat = (void *)string, - (void *)"OK" - }; - - EasyRequest(NULL, &easy, NULL, arg); - - CloseLibrary(IntuitionBase); - } - - exit(EXIT_FAILURE); -} - -static void __attribute__((__used__)) -ctor(void) -{ - static bool initialized = false; - struct objc_libc libc = { - .malloc = malloc, - .calloc = calloc, - .realloc = realloc, - .free = free, -#ifdef HAVE_SJLJ_EXCEPTIONS - ._Unwind_SjLj_RaiseException = _Unwind_SjLj_RaiseException, -#else - ._Unwind_RaiseException = _Unwind_RaiseException, -#endif - ._Unwind_DeleteException = _Unwind_DeleteException, - ._Unwind_GetLanguageSpecificData = - _Unwind_GetLanguageSpecificData, - ._Unwind_GetRegionStart = _Unwind_GetRegionStart, - ._Unwind_GetDataRelBase = _Unwind_GetDataRelBase, - ._Unwind_GetTextRelBase = _Unwind_GetTextRelBase, - ._Unwind_GetIP = _Unwind_GetIP, - ._Unwind_GetGR = _Unwind_GetGR, - ._Unwind_SetIP = _Unwind_SetIP, - ._Unwind_SetGR = _Unwind_SetGR, -#ifdef HAVE_SJLJ_EXCEPTIONS - ._Unwind_SjLj_Resume = _Unwind_SjLj_Resume, -#else - ._Unwind_Resume = _Unwind_Resume, -#endif -#ifdef OF_AMIGAOS_M68K - .__register_frame_info = __register_frame_info, - .__deregister_frame_info = __deregister_frame_info, -#endif -#ifdef OF_MORPHOS - .__register_frame = __register_frame, - .__deregister_frame = __deregister_frame, -#endif -#ifdef OF_AMIGAOS_M68K - .vsnprintf = vsnprintf, -#endif - .atexit = atexit, - .exit = exit, - }; - - if (initialized) - return; - - if ((ObjFWRTBase = OpenLibrary(OBJFWRT_AMIGA_LIB, - OBJFWRT_LIB_MINOR)) == NULL) - error("Failed to open " OBJFWRT_AMIGA_LIB " version %lu!", - OBJFWRT_LIB_MINOR); - - if (!glue_objc_init(1, &libc)) - error("Failed to initialize " OBJFWRT_AMIGA_LIB "!", 0); - - initialized = true; -} - -static void __attribute__((__used__)) -dtor(void) -{ - CloseLibrary(ObjFWRTBase); -} - -#if defined(OF_AMIGAOS_M68K) -ADD2INIT(ctor, -2); -ADD2EXIT(dtor, -2); -#elif defined(OF_MORPHOS) -CONSTRUCTOR_P(ObjFWRT, 4000) -{ - ctor(); - - return 0; -} - -DESTRUCTOR_P(ObjFWRT, 4000) -{ - dtor(); -} -#endif - -void -__objc_exec_class(struct objc_module *module) -{ - /* - * The compiler generates constructors that call into this, so it is - * possible that we are not set up yet when we get called. - */ - ctor(); - - glue___objc_exec_class(module); -} - -IMP -objc_msg_lookup(id object, SEL selector) -{ - return glue_objc_msg_lookup(object, selector); -} - -IMP -objc_msg_lookup_stret(id object, SEL selector) -{ - return glue_objc_msg_lookup_stret(object, selector); -} - -IMP -objc_msg_lookup_super(struct objc_super *super, SEL selector) -{ - return glue_objc_msg_lookup_super(super, selector); -} - -IMP -objc_msg_lookup_super_stret(struct objc_super *super, SEL selector) -{ - return glue_objc_msg_lookup_super_stret(super, selector); -} - -Class -objc_lookUpClass(const char *name) -{ - return glue_objc_lookUpClass(name); -} - -Class -objc_getClass(const char *name) -{ - return glue_objc_getClass(name); -} - -Class -objc_getRequiredClass(const char *name) -{ - return glue_objc_getRequiredClass(name); -} - -Class -objc_lookup_class(const char *name) -{ - return glue_objc_lookup_class(name); -} - -Class -objc_get_class(const char *name) -{ - return glue_objc_get_class(name); -} - -void -objc_exception_throw(id object) -{ -#ifdef OF_AMIGAOS_M68K - /* - * This does not use the glue code to hack around a compiler bug. - * - * When using the generated inline stubs, the compiler does not emit - * any frame information, making the unwind fail. As unwind always - * starts from objc_exception_throw(), this means exceptions would - * never work. If, however, we're using a function pointer instead of - * the inline stub, the compiler does generate a frame and everything - * works fine. - */ - register void *a6 __asm__("a6") = ObjFWRTBase; - uintptr_t throw = (((uintptr_t)ObjFWRTBase) - 0x60); - ((void (*)(id __asm__("a0")))throw)(object); - (void)a6; -#else - glue_objc_exception_throw(object); +extern struct Library *ObjFWRTBase; + +bool +objc_init(unsigned int version, struct objc_libc *libc) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(unsigned int __asm__("d0"), struct objc_libc *__asm__("a0")))(((uintptr_t)ObjFWRTBase) - 30))(version, libc); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(unsigned int, struct objc_libc *))*(void **)(((uintptr_t)ObjFWRTBase) - 28))(version, libc); +#endif +} + +void +__objc_exec_class(struct objc_module *_Nonnull module) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(struct objc_module *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 36))(module); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(struct objc_module *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 34))(module); +#endif +} + +IMP _Nonnull +objc_msg_lookup(id _Nullable object, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nonnull (*)(id _Nullable __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 42))(object, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nonnull (*)(id _Nullable, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 40))(object, selector); +#endif +} + +IMP _Nonnull +objc_msg_lookup_stret(id _Nullable object, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nonnull (*)(id _Nullable __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 48))(object, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nonnull (*)(id _Nullable, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 46))(object, selector); +#endif +} + +IMP _Nonnull +objc_msg_lookup_super(struct objc_super *_Nonnull super, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nonnull (*)(struct objc_super *_Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 54))(super, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nonnull (*)(struct objc_super *_Nonnull, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 52))(super, selector); +#endif +} + +IMP _Nonnull +objc_msg_lookup_super_stret(struct objc_super *_Nonnull super, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nonnull (*)(struct objc_super *_Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 60))(super, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nonnull (*)(struct objc_super *_Nonnull, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 58))(super, selector); +#endif +} + +Class _Nullable +objc_lookUpClass(const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nullable (*)(const char *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 66))(name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nullable (*)(const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 64))(name); +#endif +} + +Class _Nullable +objc_getClass(const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nullable (*)(const char *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 72))(name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nullable (*)(const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 70))(name); +#endif +} + +Class _Nonnull +objc_getRequiredClass(const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nonnull (*)(const char *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 78))(name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nonnull (*)(const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 76))(name); +#endif +} + +Class _Nullable +objc_lookup_class(const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nullable (*)(const char *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 84))(name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nullable (*)(const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 82))(name); +#endif +} + +Class _Nonnull +objc_get_class(const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nonnull (*)(const char *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 90))(name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nonnull (*)(const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 88))(name); +#endif +} + +void +objc_exception_throw(id _Nonnull object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 96))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 94))(object); #endif OF_UNREACHABLE } int -objc_sync_enter(id object) -{ - return glue_objc_sync_enter(object); -} - -int -objc_sync_exit(id object) -{ - return glue_objc_sync_exit(object); -} - -id -objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, bool atomic) -{ - return glue_objc_getProperty(self, _cmd, offset, atomic); -} - -void -objc_setProperty(id self, SEL _cmd, ptrdiff_t offset, id value, bool atomic, - signed char copy) -{ - glue_objc_setProperty(self, _cmd, offset, value, atomic, copy); -} - -void -objc_getPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, - bool strong) -{ - glue_objc_getPropertyStruct(dest, src, size, atomic, strong); -} - -void -objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, - bool strong) -{ - glue_objc_setPropertyStruct(dest, src, size, atomic, strong); -} - -void -objc_enumerationMutation(id object) -{ -#ifdef OF_AMIGAOS_M68K - /* - * This does not use the glue code to hack around a compiler bug. - * - * When using the generated inline stubs, the compiler does not emit - * any frame information, making the unwind fail. As a result - * objc_enumerationMutation() might throw an exception that could never - * be caught. If, however, we're using a function pointer instead of - * the inline stub, the compiler does generate a frame and everything - * works fine. - */ - register void *a6 __asm__("a6") = ObjFWRTBase; - uintptr_t enumerationMutation = (((uintptr_t)ObjFWRTBase) - 0x8A); - ((void (*)(id __asm__("a0")))enumerationMutation)(object); - (void)a6; -#else - glue_objc_enumerationMutation(object); -#endif - - OF_UNREACHABLE -} - -#ifdef HAVE_SJLJ_EXCEPTIONS -int -__gnu_objc_personality_sj0(int version, int actions, uint64_t exClass, - void *ex, void *ctx) -{ -# ifdef OF_AMIGAOS_M68K - return glue___gnu_objc_personality(version, actions, &exClass, ex, ctx); -# else - return glue___gnu_objc_personality(version, actions, exClass, ex, ctx); -# endif -} -#else -int -__gnu_objc_personality_v0(int version, int actions, uint64_t exClass, - void *ex, void *ctx) -{ -# ifdef OF_AMIGAOS_M68K - return glue___gnu_objc_personality(version, actions, &exClass, ex, ctx); -# else - return glue___gnu_objc_personality(version, actions, exClass, ex, ctx); -# endif -} -#endif - -id -objc_retain(id object) -{ - return glue_objc_retain(object); -} - -id -objc_retainBlock(id block) -{ - return glue_objc_retainBlock(block); -} - -id -objc_retainAutorelease(id object) -{ - return glue_objc_retainAutorelease(object); -} - -void -objc_release(id object) -{ - glue_objc_release(object); -} - -id -objc_autorelease(id object) -{ - return glue_objc_autorelease(object); -} - -id -objc_autoreleaseReturnValue(id object) -{ - return glue_objc_autoreleaseReturnValue(object); -} - -id -objc_retainAutoreleaseReturnValue(id object) -{ - return glue_objc_retainAutoreleaseReturnValue(object); -} - -id -objc_retainAutoreleasedReturnValue(id object) -{ - return glue_objc_retainAutoreleasedReturnValue(object); -} - -id -objc_storeStrong(id *object, id value) -{ - return glue_objc_storeStrong(object, value); -} - -id -objc_storeWeak(id *object, id value) -{ - return glue_objc_storeWeak(object, value); -} - -id -objc_loadWeakRetained(id *object) -{ - return glue_objc_loadWeakRetained(object); -} - -id -objc_initWeak(id *object, id value) -{ - return glue_objc_initWeak(object, value); -} - -void -objc_destroyWeak(id *object) -{ - glue_objc_destroyWeak(object); -} - -id -objc_loadWeak(id *object) -{ - return glue_objc_loadWeak(object); -} - -void -objc_copyWeak(id *dest, id *src) -{ - glue_objc_copyWeak(dest, src); -} - -void -objc_moveWeak(id *dest, id *src) -{ - glue_objc_moveWeak(dest, src); -} - -SEL -sel_registerName(const char *name) -{ - return glue_sel_registerName(name); -} - -const char * -sel_getName(SEL selector) -{ - return glue_sel_getName(selector); -} - -bool -sel_isEqual(SEL selector1, SEL selector2) -{ - return glue_sel_isEqual(selector1, selector2); -} - -Class -objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes) -{ - return glue_objc_allocateClassPair(superclass, name, extraBytes); -} - -void -objc_registerClassPair(Class class) -{ - glue_objc_registerClassPair(class); +objc_sync_enter(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((int (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 102))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((int (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 100))(object); +#endif +} + +int +objc_sync_exit(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((int (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 108))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((int (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 106))(object); +#endif +} + +id _Nullable +objc_getProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, bool atomic) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1"), ptrdiff_t __asm__("d0"), bool __asm__("d1")))(((uintptr_t)ObjFWRTBase) - 114))(self, _cmd, offset, atomic); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nonnull, SEL _Nonnull, ptrdiff_t, bool))*(void **)(((uintptr_t)ObjFWRTBase) - 112))(self, _cmd, offset, atomic); +#endif +} + +void +objc_setProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, id _Nullable value, bool atomic, signed char copy) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1"), ptrdiff_t __asm__("d0"), id _Nullable __asm__("a2"), bool __asm__("d1"), signed char __asm__("d2")))(((uintptr_t)ObjFWRTBase) - 120))(self, _cmd, offset, value, atomic, copy); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nonnull, SEL _Nonnull, ptrdiff_t, id _Nullable, bool, signed char))*(void **)(((uintptr_t)ObjFWRTBase) - 118))(self, _cmd, offset, value, atomic, copy); +#endif +} + +void +objc_getPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(void *_Nonnull __asm__("a0"), const void *_Nonnull __asm__("a1"), ptrdiff_t __asm__("d0"), bool __asm__("d1"), bool __asm__("d2")))(((uintptr_t)ObjFWRTBase) - 126))(dest, src, size, atomic, strong); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(void *_Nonnull, const void *_Nonnull, ptrdiff_t, bool, bool))*(void **)(((uintptr_t)ObjFWRTBase) - 124))(dest, src, size, atomic, strong); +#endif +} + +void +objc_setPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(void *_Nonnull __asm__("a0"), const void *_Nonnull __asm__("a1"), ptrdiff_t __asm__("d0"), bool __asm__("d1"), bool __asm__("d2")))(((uintptr_t)ObjFWRTBase) - 132))(dest, src, size, atomic, strong); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(void *_Nonnull, const void *_Nonnull, ptrdiff_t, bool, bool))*(void **)(((uintptr_t)ObjFWRTBase) - 130))(dest, src, size, atomic, strong); +#endif +} + +void +objc_enumerationMutation(id _Nonnull object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 138))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 136))(object); +#endif +} + +int +__gnu_objc_personality(int version, int actions, uint64_t *_Nonnull exClass, void *_Nonnull ex, void *_Nonnull ctx) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((int (*)(int __asm__("d0"), int __asm__("d1"), uint64_t *_Nonnull __asm__("d2"), void *_Nonnull __asm__("a0"), void *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 144))(version, actions, exClass, ex, ctx); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((int (*)(int, int, uint64_t *_Nonnull, void *_Nonnull, void *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 142))(version, actions, exClass, ex, ctx); +#endif +} + +id _Nullable +objc_retain(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 150))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 148))(object); +#endif +} + +id _Nullable +objc_retainBlock(id _Nullable block) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 156))(block); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 154))(block); +#endif +} + +id _Nullable +objc_retainAutorelease(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 162))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 160))(object); +#endif +} + +void +objc_release(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 168))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 166))(object); +#endif +} + +id _Nullable +objc_autorelease(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 174))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 172))(object); +#endif +} + +id _Nullable +objc_autoreleaseReturnValue(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 180))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 178))(object); +#endif +} + +id _Nullable +objc_retainAutoreleaseReturnValue(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 186))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 184))(object); +#endif +} + +id _Nullable +objc_retainAutoreleasedReturnValue(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 192))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 190))(object); +#endif +} + +id _Nullable +objc_storeStrong(id _Nullable *_Nonnull object, id _Nullable value) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable *_Nonnull __asm__("a0"), id _Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 198))(object, value); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable *_Nonnull, id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 196))(object, value); +#endif +} + +id _Nullable +objc_storeWeak(id _Nullable *_Nonnull object, id _Nullable value) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable *_Nonnull __asm__("a0"), id _Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 204))(object, value); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable *_Nonnull, id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 202))(object, value); +#endif +} + +id _Nullable +objc_loadWeakRetained(id _Nullable *_Nonnull object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 210))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 208))(object); +#endif +} + +id _Nullable +objc_initWeak(id _Nullable *_Nonnull object, id _Nullable value) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable *_Nonnull __asm__("a0"), id _Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 216))(object, value); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable *_Nonnull, id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 214))(object, value); +#endif +} + +void +objc_destroyWeak(id _Nullable *_Nonnull object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nullable *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 222))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nullable *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 220))(object); +#endif +} + +id _Nullable +objc_loadWeak(id _Nullable *_Nonnull object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 228))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 226))(object); +#endif +} + +void +objc_copyWeak(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nullable *_Nonnull __asm__("a0"), id _Nullable *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 234))(dest, src); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nullable *_Nonnull, id _Nullable *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 232))(dest, src); +#endif +} + +void +objc_moveWeak(id _Nullable *_Nonnull dest, id _Nullable *_Nonnull src) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(id _Nullable *_Nonnull __asm__("a0"), id _Nullable *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 240))(dest, src); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(id _Nullable *_Nonnull, id _Nullable *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 238))(dest, src); +#endif +} + +SEL _Nonnull +sel_registerName(const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((SEL _Nonnull (*)(const char *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 246))(name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((SEL _Nonnull (*)(const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 244))(name); +#endif +} + +const char *_Nonnull +sel_getName(SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nonnull (*)(SEL _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 252))(selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nonnull (*)(SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 250))(selector); +#endif +} + +bool +sel_isEqual(SEL _Nonnull selector1, SEL _Nonnull selector2) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(SEL _Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 258))(selector1, selector2); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(SEL _Nonnull, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 256))(selector1, selector2); +#endif +} + +Class _Nonnull +objc_allocateClassPair(Class _Nullable superclass, const char *_Nonnull name, size_t extraBytes) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nonnull (*)(Class _Nullable __asm__("a0"), const char *_Nonnull __asm__("a1"), size_t __asm__("d0")))(((uintptr_t)ObjFWRTBase) - 264))(superclass, name, extraBytes); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nonnull (*)(Class _Nullable, const char *_Nonnull, size_t))*(void **)(((uintptr_t)ObjFWRTBase) - 262))(superclass, name, extraBytes); +#endif +} + +void +objc_registerClassPair(Class _Nonnull class) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(Class _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 270))(class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(Class _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 268))(class); +#endif } unsigned int -objc_getClassList(Class *buffer, unsigned int count) +objc_getClassList(Class _Nonnull *_Nullable buffer, unsigned int count) { - return glue_objc_getClassList(buffer, count); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((unsigned int (*)(Class _Nonnull *_Nullable __asm__("a0"), unsigned int __asm__("d0")))(((uintptr_t)ObjFWRTBase) - 276))(buffer, count); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((unsigned int (*)(Class _Nonnull *_Nullable, unsigned int))*(void **)(((uintptr_t)ObjFWRTBase) - 274))(buffer, count); +#endif } -Class * -objc_copyClassList(unsigned int *length) +Class _Nonnull *_Nonnull +objc_copyClassList(unsigned int *_Nullable length) { - return glue_objc_copyClassList(length); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nonnull *_Nonnull (*)(unsigned int *_Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 282))(length); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nonnull *_Nonnull (*)(unsigned int *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 280))(length); +#endif } bool -class_isMetaClass(Class class) -{ - return glue_class_isMetaClass(class); -} - -const char * -class_getName(Class class) -{ - return glue_class_getName(class); -} - -Class -class_getSuperclass(Class class) -{ - return glue_class_getSuperclass(class); +class_isMetaClass(Class _Nullable class) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(Class _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 288))(class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(Class _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 286))(class); +#endif +} + +const char *_Nullable +class_getName(Class _Nullable class) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nullable (*)(Class _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 294))(class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nullable (*)(Class _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 292))(class); +#endif +} + +Class _Nullable +class_getSuperclass(Class _Nullable class) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nullable (*)(Class _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 300))(class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nullable (*)(Class _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 298))(class); +#endif } unsigned long -class_getInstanceSize(Class class) -{ - return glue_class_getInstanceSize(class); -} - -bool -class_respondsToSelector(Class class, SEL selector) -{ - return glue_class_respondsToSelector(class, selector); -} - -bool -class_conformsToProtocol(Class class, Protocol *protocol) -{ - return glue_class_conformsToProtocol(class, protocol); -} - -IMP -class_getMethodImplementation(Class class, SEL selector) -{ - return glue_class_getMethodImplementation(class, selector); -} - -IMP -class_getMethodImplementation_stret(Class class, SEL selector) -{ - return glue_class_getMethodImplementation_stret(class, selector); -} - -Method -class_getInstanceMethod(Class class, SEL selector) -{ - return glue_class_getInstanceMethod(class, selector); -} - -bool -class_addMethod(Class class, SEL selector, IMP implementation, - const char *typeEncoding) -{ - return glue_class_addMethod(class, selector, implementation, - typeEncoding); -} - -IMP -class_replaceMethod(Class class, SEL selector, IMP implementation, - const char *typeEncoding) -{ - return glue_class_replaceMethod(class, selector, implementation, - typeEncoding); -} - -Class -object_getClass(id object) -{ - return glue_object_getClass(object); -} - -Class -object_setClass(id object, Class class) -{ - return glue_object_setClass(object, class); -} - -const char * -object_getClassName(id object) -{ - return glue_object_getClassName(object); -} - -const char * -protocol_getName(Protocol *protocol) -{ - return glue_protocol_getName(protocol); -} - -bool -protocol_isEqual(Protocol *protocol1, Protocol *protocol2) -{ - return glue_protocol_isEqual(protocol1, protocol2); -} - -bool -protocol_conformsToProtocol(Protocol *protocol1, Protocol *protocol2) -{ - return glue_protocol_conformsToProtocol(protocol1, protocol2); -} - -objc_uncaught_exception_handler_t -objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t handler) -{ - return glue_objc_setUncaughtExceptionHandler(handler); -} - -void -objc_setForwardHandler(IMP forward, IMP stretForward) -{ - glue_objc_setForwardHandler(forward, stretForward); -} - -void -objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t handler) -{ - glue_objc_setEnumerationMutationHandler(handler); -} - -id -objc_constructInstance(Class class, void *_Nullable bytes) -{ - return glue_objc_constructInstance(class, bytes); -} - -void -objc_exit(void) -{ - glue_objc_exit(); -} - -Ivar * -class_copyIvarList(Class class, unsigned int *outCount) -{ - return glue_class_copyIvarList(class, outCount); -} - -const char * -ivar_getName(Ivar ivar) -{ - return glue_ivar_getName(ivar); -} - -const char * -ivar_getTypeEncoding(Ivar ivar) -{ - return glue_ivar_getTypeEncoding(ivar); -} - -ptrdiff_t -ivar_getOffset(Ivar ivar) -{ - return glue_ivar_getOffset(ivar); -} - -Method * -class_copyMethodList(Class class, unsigned int *outCount) -{ - return glue_class_copyMethodList(class, outCount); -} - -SEL -method_getName(Method method) -{ - return glue_method_getName(method); -} - -const char * -method_getTypeEncoding(Method method) -{ - return glue_method_getTypeEncoding(method); -} - -objc_property_t * -class_copyPropertyList(Class class, unsigned int *outCount) -{ - return glue_class_copyPropertyList(class, outCount); -} - -const char * -property_getName(objc_property_t property) -{ - return glue_property_getName(property); -} - -char * -property_copyAttributeValue(objc_property_t property, const char *name) -{ - return glue_property_copyAttributeValue(property, name); -} - -void * -objc_destructInstance(id object) -{ - return glue_objc_destructInstance(object); -} - -void * -objc_autoreleasePoolPush(void) -{ - return glue_objc_autoreleasePoolPush(); -} - -void -objc_autoreleasePoolPop(void *pool) -{ - glue_objc_autoreleasePoolPop(pool); -} - -id -_objc_rootAutorelease(id object) -{ - return glue__objc_rootAutorelease(object); -} - -struct objc_hashtable * -objc_hashtable_new(objc_hashtable_hash_func hash, - objc_hashtable_equal_func equal, uint32_t size) -{ - return glue_objc_hashtable_new(hash, equal, size); -} - -void -objc_hashtable_set(struct objc_hashtable *table, const void *key, - const void *object) -{ - glue_objc_hashtable_set(table, key, object); -} - -void * -objc_hashtable_get(struct objc_hashtable *table, const void *key) -{ - return glue_objc_hashtable_get(table, key); -} - -void -objc_hashtable_delete(struct objc_hashtable *table, const void *key) -{ - glue_objc_hashtable_delete(table, key); -} - -void -objc_hashtable_free(struct objc_hashtable *table) -{ - glue_objc_hashtable_free(table); +class_getInstanceSize(Class _Nullable class) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((unsigned long (*)(Class _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 306))(class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((unsigned long (*)(Class _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 304))(class); +#endif +} + +bool +class_respondsToSelector(Class _Nullable class, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(Class _Nullable __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 312))(class, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(Class _Nullable, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 310))(class, selector); +#endif +} + +bool +class_conformsToProtocol(Class _Nullable class, Protocol *_Nonnull p) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(Class _Nullable __asm__("a0"), Protocol *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 318))(class, p); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(Class _Nullable, Protocol *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 316))(class, p); +#endif +} + +IMP _Nullable +class_getMethodImplementation(Class _Nullable class, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nullable (*)(Class _Nullable __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 324))(class, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nullable (*)(Class _Nullable, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 322))(class, selector); +#endif +} + +IMP _Nullable +class_getMethodImplementation_stret(Class _Nullable class, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nullable (*)(Class _Nullable __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 330))(class, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nullable (*)(Class _Nullable, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 328))(class, selector); +#endif +} + +Method _Nullable +class_getInstanceMethod(Class _Nullable class, SEL _Nonnull selector) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Method _Nullable (*)(Class _Nullable __asm__("a0"), SEL _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 336))(class, selector); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Method _Nullable (*)(Class _Nullable, SEL _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 334))(class, selector); +#endif +} + +bool +class_addMethod(Class _Nonnull class, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(Class _Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1"), IMP _Nonnull __asm__("a2"), const char *_Nullable __asm__("a3")))(((uintptr_t)ObjFWRTBase) - 342))(class, selector, implementation, typeEncoding); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(Class _Nonnull, SEL _Nonnull, IMP _Nonnull, const char *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 340))(class, selector, implementation, typeEncoding); +#endif +} + +IMP _Nullable +class_replaceMethod(Class _Nonnull class, SEL _Nonnull selector, IMP _Nonnull implementation, const char *_Nullable typeEncoding) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((IMP _Nullable (*)(Class _Nonnull __asm__("a0"), SEL _Nonnull __asm__("a1"), IMP _Nonnull __asm__("a2"), const char *_Nullable __asm__("a3")))(((uintptr_t)ObjFWRTBase) - 348))(class, selector, implementation, typeEncoding); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((IMP _Nullable (*)(Class _Nonnull, SEL _Nonnull, IMP _Nonnull, const char *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 346))(class, selector, implementation, typeEncoding); +#endif +} + +Class _Nullable +object_getClass(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 354))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 352))(object); +#endif +} + +Class _Nullable +object_setClass(id _Nullable object, Class _Nonnull class) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Class _Nullable (*)(id _Nullable __asm__("a0"), Class _Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 360))(object, class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Class _Nullable (*)(id _Nullable, Class _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 358))(object, class); +#endif +} + +const char *_Nullable +object_getClassName(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 366))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 364))(object); +#endif +} + +const char *_Nonnull +protocol_getName(Protocol *_Nonnull protocol) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nonnull (*)(Protocol *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 372))(protocol); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nonnull (*)(Protocol *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 370))(protocol); +#endif +} + +bool +protocol_isEqual(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(Protocol *_Nonnull __asm__("a0"), Protocol *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 378))(protocol1, protocol2); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(Protocol *_Nonnull, Protocol *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 376))(protocol1, protocol2); +#endif +} + +bool +protocol_conformsToProtocol(Protocol *_Nonnull protocol1, Protocol *_Nonnull protocol2) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(Protocol *_Nonnull __asm__("a0"), Protocol *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 384))(protocol1, protocol2); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(Protocol *_Nonnull, Protocol *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 382))(protocol1, protocol2); +#endif +} + +_Nullable objc_uncaught_exception_handler_t +objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler_t _Nullable handler) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((_Nullable objc_uncaught_exception_handler_t (*)(objc_uncaught_exception_handler_t _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 390))(handler); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((_Nullable objc_uncaught_exception_handler_t (*)(objc_uncaught_exception_handler_t _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 388))(handler); +#endif +} + +void +objc_setForwardHandler(IMP _Nullable forward, IMP _Nullable stretForward) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(IMP _Nullable __asm__("a0"), IMP _Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 396))(forward, stretForward); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(IMP _Nullable, IMP _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 394))(forward, stretForward); +#endif +} + +void +objc_setEnumerationMutationHandler(objc_enumeration_mutation_handler_t _Nullable hadler) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(objc_enumeration_mutation_handler_t _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 402))(hadler); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(objc_enumeration_mutation_handler_t _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 400))(hadler); +#endif +} + +id _Nullable +objc_constructInstance(Class _Nullable class, void *_Nullable bytes) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(Class _Nullable __asm__("a0"), void *_Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 408))(class, bytes); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(Class _Nullable, void *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 406))(class, bytes); +#endif +} + +void +objc_exit() +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)())(((uintptr_t)ObjFWRTBase) - 414))(); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)())*(void **)(((uintptr_t)ObjFWRTBase) - 412))(); +#endif +} + +Ivar _Nullable *_Nullable +class_copyIvarList(Class _Nullable class, unsigned int *_Nullable outCount) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Ivar _Nullable *_Nullable (*)(Class _Nullable __asm__("a0"), unsigned int *_Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 420))(class, outCount); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Ivar _Nullable *_Nullable (*)(Class _Nullable, unsigned int *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 418))(class, outCount); +#endif +} + +const char *_Nonnull +ivar_getName(Ivar _Nonnull ivar) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nonnull (*)(Ivar _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 426))(ivar); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nonnull (*)(Ivar _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 424))(ivar); +#endif +} + +const char *_Nonnull +ivar_getTypeEncoding(Ivar _Nonnull ivar) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nonnull (*)(Ivar _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 432))(ivar); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nonnull (*)(Ivar _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 430))(ivar); +#endif +} + +ptrdiff_t +ivar_getOffset(Ivar _Nonnull ivar) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((ptrdiff_t (*)(Ivar _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 438))(ivar); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((ptrdiff_t (*)(Ivar _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 436))(ivar); +#endif +} + +Method _Nullable *_Nullable +class_copyMethodList(Class _Nullable class, unsigned int *_Nullable outCount) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((Method _Nullable *_Nullable (*)(Class _Nullable __asm__("a0"), unsigned int *_Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 444))(class, outCount); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((Method _Nullable *_Nullable (*)(Class _Nullable, unsigned int *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 442))(class, outCount); +#endif +} + +SEL _Nonnull +method_getName(Method _Nonnull method) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((SEL _Nonnull (*)(Method _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 450))(method); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((SEL _Nonnull (*)(Method _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 448))(method); +#endif +} + +const char *_Nullable +method_getTypeEncoding(Method _Nonnull method) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nullable (*)(Method _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 456))(method); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nullable (*)(Method _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 454))(method); +#endif +} + +objc_property_t _Nullable *_Nullable +class_copyPropertyList(Class _Nullable class, unsigned int *_Nullable outCount) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((objc_property_t _Nullable *_Nullable (*)(Class _Nullable __asm__("a0"), unsigned int *_Nullable __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 462))(class, outCount); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((objc_property_t _Nullable *_Nullable (*)(Class _Nullable, unsigned int *_Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 460))(class, outCount); +#endif +} + +const char *_Nonnull +property_getName(objc_property_t _Nonnull property) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((const char *_Nonnull (*)(objc_property_t _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 468))(property); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((const char *_Nonnull (*)(objc_property_t _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 466))(property); +#endif +} + +char *_Nullable +property_copyAttributeValue(objc_property_t _Nonnull property, const char *_Nonnull name) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((char *_Nullable (*)(objc_property_t _Nonnull __asm__("a0"), const char *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 474))(property, name); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((char *_Nullable (*)(objc_property_t _Nonnull, const char *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 472))(property, name); +#endif +} + +void *_Nullable +objc_destructInstance(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((void *_Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 480))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((void *_Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 478))(object); +#endif +} + +void *_Null_unspecified +objc_autoreleasePoolPush() +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((void *_Null_unspecified (*)())(((uintptr_t)ObjFWRTBase) - 486))(); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((void *_Null_unspecified (*)())*(void **)(((uintptr_t)ObjFWRTBase) - 484))(); +#endif +} + +void +objc_autoreleasePoolPop(void *_Null_unspecified pool) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(void *_Null_unspecified __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 492))(pool); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(void *_Null_unspecified))*(void **)(((uintptr_t)ObjFWRTBase) - 490))(pool); +#endif +} + +id _Nullable +_objc_rootAutorelease(id _Nullable object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 498))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 496))(object); +#endif +} + +struct objc_hashtable *_Nonnull +objc_hashtable_new(objc_hashtable_hash_func hash, objc_hashtable_equal_func equal, uint32_t size) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((struct objc_hashtable *_Nonnull (*)(objc_hashtable_hash_func __asm__("a0"), objc_hashtable_equal_func __asm__("a1"), uint32_t __asm__("d0")))(((uintptr_t)ObjFWRTBase) - 504))(hash, equal, size); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((struct objc_hashtable *_Nonnull (*)(objc_hashtable_hash_func, objc_hashtable_equal_func, uint32_t))*(void **)(((uintptr_t)ObjFWRTBase) - 502))(hash, equal, size); +#endif +} + +void +objc_hashtable_set(struct objc_hashtable *_Nonnull table, const void *_Nonnull key, const void *_Nonnull object) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(struct objc_hashtable *_Nonnull __asm__("a0"), const void *_Nonnull __asm__("a1"), const void *_Nonnull __asm__("a2")))(((uintptr_t)ObjFWRTBase) - 510))(table, key, object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(struct objc_hashtable *_Nonnull, const void *_Nonnull, const void *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 508))(table, key, object); +#endif +} + +void *_Nullable +objc_hashtable_get(struct objc_hashtable *_Nonnull table, const void *_Nonnull key) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((void *_Nullable (*)(struct objc_hashtable *_Nonnull __asm__("a0"), const void *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 516))(table, key); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((void *_Nullable (*)(struct objc_hashtable *_Nonnull, const void *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 514))(table, key); +#endif +} + +void +objc_hashtable_delete(struct objc_hashtable *_Nonnull table, const void *_Nonnull key) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(struct objc_hashtable *_Nonnull __asm__("a0"), const void *_Nonnull __asm__("a1")))(((uintptr_t)ObjFWRTBase) - 522))(table, key); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(struct objc_hashtable *_Nonnull, const void *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 520))(table, key); +#endif +} + +void +objc_hashtable_free(struct objc_hashtable *_Nonnull table) +{ +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(struct objc_hashtable *_Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 528))(table); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(struct objc_hashtable *_Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 526))(table); +#endif } void objc_setTaggedPointerSecret(uintptr_t secret) { - glue_objc_setTaggedPointerSecret(secret); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + ((void (*)(uintptr_t __asm__("d0")))(((uintptr_t)ObjFWRTBase) - 534))(secret); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + __extension__ ((void (*)(uintptr_t))*(void **)(((uintptr_t)ObjFWRTBase) - 532))(secret); +#endif } int -objc_registerTaggedPointerClass(Class class) +objc_registerTaggedPointerClass(Class _Nonnull class) { - return glue_objc_registerTaggedPointerClass(class); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((int (*)(Class _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 540))(class); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((int (*)(Class _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 538))(class); +#endif } bool -object_isTaggedPointer(id object) +object_isTaggedPointer(id _Nullable object) { - return glue_object_isTaggedPointer(object); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((bool (*)(id _Nullable __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 546))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((bool (*)(id _Nullable))*(void **)(((uintptr_t)ObjFWRTBase) - 544))(object); +#endif } uintptr_t -object_getTaggedPointerValue(id object) +object_getTaggedPointerValue(id _Nonnull object) { - return glue_object_getTaggedPointerValue(object); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((uintptr_t (*)(id _Nonnull __asm__("a0")))(((uintptr_t)ObjFWRTBase) - 552))(object); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((uintptr_t (*)(id _Nonnull))*(void **)(((uintptr_t)ObjFWRTBase) - 550))(object); +#endif } -id +id _Nullable objc_createTaggedPointer(int class, uintptr_t value) { - return glue_objc_createTaggedPointer(class, value); +#if defined(OF_AMIGAOS_M68K) + register struct Library *a6 __asm__("a6") = ObjFWRTBase; + (void)a6; + return ((id _Nullable (*)(int __asm__("d0"), uintptr_t __asm__("d1")))(((uintptr_t)ObjFWRTBase) - 558))(class, value); +#elif defined(OF_MORPHOS) + __asm__ __volatile__ ( + "mr %%r12, %0" + :: "r"(ObjFWRTBase) : "r12" + ); + + return __extension__ ((id _Nullable (*)(int, uintptr_t))*(void **)(((uintptr_t)ObjFWRTBase) - 556))(class, value); +#endif } Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -13,10 +13,12 @@ * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ +#include "config.h" + #import "macros.h" #import "platform.h" #if !defined(__has_feature) || !__has_feature(nullability) # ifndef _Nonnull @@ -213,10 +215,75 @@ #else IMP _Nullable buckets[256]; #endif } *_Nonnull buckets[256]; }; + +#if defined(OBJC_COMPILING_AMIGA_LIBRARY) || \ + defined(OBJC_COMPILING_AMIGA_LINKLIB) +struct objc_libc { + void *_Nullable (*_Nonnull malloc)(size_t); + void *_Nullable (*_Nonnull calloc)(size_t, size_t); + void *_Nullable (*_Nonnull realloc)(void *_Nullable, size_t); + void (*_Nonnull free)(void *_Nullable); +# ifdef HAVE_SJLJ_EXCEPTIONS + int (*_Nonnull _Unwind_SjLj_RaiseException)(void *_Nonnull); +# else + int (*_Nonnull _Unwind_RaiseException)(void *_Nonnull); +# endif + void (*_Nonnull _Unwind_DeleteException)(void *_Nonnull); + void *_Nullable (*_Nonnull _Unwind_GetLanguageSpecificData)( + void *_Nonnull); + uintptr_t (*_Nonnull _Unwind_GetRegionStart)(void *_Nonnull); + uintptr_t (*_Nonnull _Unwind_GetDataRelBase)(void *_Nonnull); + uintptr_t (*_Nonnull _Unwind_GetTextRelBase)(void *_Nonnull); + uintptr_t (*_Nonnull _Unwind_GetIP)(void *_Nonnull); + uintptr_t (*_Nonnull _Unwind_GetGR)(void *_Nonnull, int); + void (*_Nonnull _Unwind_SetIP)(void *_Nonnull, uintptr_t); + void (*_Nonnull _Unwind_SetGR)(void *_Nonnull, int, uintptr_t); +# ifdef HAVE_SJLJ_EXCEPTIONS + void (*_Nonnull _Unwind_SjLj_Resume)(void *_Nonnull); +# else + void (*_Nonnull _Unwind_Resume)(void *_Nonnull); +# endif +# ifdef OF_AMIGAOS_M68K + void (*_Nonnull __register_frame_info)(const void *_Nonnull, + void *_Nonnull); + void *(*_Nonnull __deregister_frame_info)(const void *_Nonnull); +# endif +# ifdef OF_MORPHOS + void (*_Nonnull __register_frame)(void *_Nonnull); + void (*_Nonnull __deregister_frame)(void *_Nonnull); +# endif +# ifdef OF_AMIGAOS_M68K + int (*_Nonnull vsnprintf)(char *restrict _Nonnull str, size_t size, + const char *_Nonnull restrict fmt, va_list args); +# endif + int (*_Nonnull atexit)(void (*_Nonnull)(void)); + void (*_Nonnull exit)(int); +}; +#endif + +#ifdef OBJC_COMPILING_AMIGA_LIBRARY +# if defined(__MORPHOS__) +# include +# define OBJC_M68K_ARG(type, name, reg) type name = (type)REG_##reg; +# else +# define OBJC_M68K_ARG(type, name, reg) \ + register type reg_##name __asm__(#reg); \ + type name = reg_##name; +# endif + +extern bool objc_init(unsigned int, struct objc_libc *); +# ifdef HAVE_SJLJ_EXCEPTIONS +# define __gnu_objc_personality(version, actions, exClass, ex, ctx) \ + __gnu_objc_personality_sj0(version, actions, *exClass, ex, ctx) +# else +# define __gnu_objc_personality(version, actions, exClass, ex, ctx) \ + __gnu_objc_personality_v0(version, actions, *exClass, ex, ctx) +# endif +#endif extern void objc_register_all_categories(struct objc_symtab *_Nonnull); extern struct objc_category *_Nullable *_Nullable objc_categories_for_class(Class _Nonnull); extern void objc_unregister_all_categories(void); Index: tests/OFStringTests.m ================================================================== --- tests/OFStringTests.m +++ tests/OFStringTests.m @@ -1081,10 +1081,11 @@ C(@"\r\n+123 ").longLongValue == 123 && C(@"-500\t").longLongValue == -500 && [C(@"-0x10\t") longLongValueWithBase: 0] == -0x10 && C(@"\t\t\r\n").longLongValue == 0 && [C(@"123f") longLongValueWithBase: 16] == 0x123f && + [C(@"-1234") longLongValueWithBase: 0] == -1234 && [C(@"\t\n0xABcd\r") longLongValueWithBase: 0] == 0xABCD && [C(@"1234567") longLongValueWithBase: 8] == 01234567 && [C(@"\r\n0123") longLongValueWithBase: 0] == 0123 && [C(@"765\t") longLongValueWithBase: 8] == 0765 && [C(@"\t\t\r\n") longLongValueWithBase: 8] == 0) @@ -1092,10 +1093,11 @@ TEST(@"-[unsignedLongLongValue]", C(@"1234").unsignedLongLongValue == 1234 && C(@"\r\n+123 ").unsignedLongLongValue == 123 && C(@"\t\t\r\n").unsignedLongLongValue == 0 && [C(@"123f") unsignedLongLongValueWithBase: 16] == 0x123f && + [C(@"1234") unsignedLongLongValueWithBase: 0] == 1234 && [C(@"\t\n0xABcd\r") unsignedLongLongValueWithBase: 0] == 0xABCD && [C(@"1234567") unsignedLongLongValueWithBase: 8] == 01234567 && [C(@"\r\n0123") unsignedLongLongValueWithBase: 0] == 0123 && [C(@"765\t") unsignedLongLongValueWithBase: 8] == 0765 && [C(@"\t\t\r\n") unsignedLongLongValueWithBase: 8] == 0)