From cbaf5c4c4a385ae5f3c79a9520efe527d89ead76 Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Tue, 24 Jun 2025 21:29:05 +0300 Subject: [PATCH] Avoid non-main-thread calls --- Cocoa/Document.m | 207 ++++++++++++++++++++++++----------------------- 1 file changed, 106 insertions(+), 101 deletions(-) diff --git a/Cocoa/Document.m b/Cocoa/Document.m index 0298bc5..a3189cc 100644 --- a/Cocoa/Document.m +++ b/Cocoa/Document.m @@ -1998,124 +1998,130 @@ enum GBWindowResizeAction - (IBAction)hexGoTo:(id)sender { + NSString *expression = [sender stringValue]; + __block uint16_t addr = 0; + __block uint16_t bank = 0; + __block bool fail = false; NSString *error = [self captureOutputForBlock:^{ - uint16_t addr; - uint16_t bank; - if (GB_debugger_evaluate(&_gb, [[sender stringValue] UTF8String], &addr, &bank)) { - return; + if (GB_debugger_evaluate(&_gb, [expression UTF8String], &addr, &bank)) { + fail = true; } - - if (bank != (typeof(bank))-1) { - GB_memory_mode_t mode = [(GBMemoryByteArray *)(_hexController.byteArray) mode]; - if (addr < 0x4000) { - if (bank == 0) { - if (mode != GBMemoryROM && mode != GBMemoryEntireSpace) { - mode = GBMemoryEntireSpace; - } - } - else { - addr |= 0x4000; - mode = GBMemoryROM; - } - } - else if (addr < 0x8000) { - mode = GBMemoryROM; - } - else if (addr < 0xA000) { - mode = GBMemoryVRAM; - } - else if (addr < 0xC000) { - mode = GBMemoryExternalRAM; - } - else if (addr < 0xD000) { - if (mode != GBMemoryRAM && mode != GBMemoryEntireSpace) { - mode = GBMemoryEntireSpace; - } - } - else if (addr < 0xE000) { - mode = GBMemoryRAM; - } - else { - mode = GBMemoryEntireSpace; - } - [_memorySpaceButton selectItemAtIndex:mode]; - [self hexUpdateSpace:_memorySpaceButton.cell]; - [_memoryBankInput setStringValue:[NSString stringWithFormat:@"$%02x", bank]]; - [self hexUpdateBank:_memoryBankInput]; - } - addr -= _lineRep.valueOffset; - if (addr >= _hexController.byteArray.length) { - GB_log(&_gb, "Value $%04x is out of range.\n", addr); - return; - } - - dispatch_async(dispatch_get_main_queue(), ^{ - [_hexController setSelectedContentsRanges:@[[HFRangeWrapper withRange:HFRangeMake(addr, 0)]]]; - [_hexController _ensureVisibilityOfLocation:addr]; - for (HFRepresenter *representer in _hexController.representers) { - if ([representer isKindOfClass:[HFHexTextRepresenter class]]) { - [self.memoryWindow makeFirstResponder:representer.view]; - break; - } - } - }); }]; + if (error) { NSBeep(); [GBWarningPopover popoverWithContents:error onView:sender]; } + if (fail) return; + + + if (bank != (typeof(bank))-1) { + GB_memory_mode_t mode = [(GBMemoryByteArray *)(_hexController.byteArray) mode]; + if (addr < 0x4000) { + if (bank == 0) { + if (mode != GBMemoryROM && mode != GBMemoryEntireSpace) { + mode = GBMemoryEntireSpace; + } + } + else { + addr |= 0x4000; + mode = GBMemoryROM; + } + } + else if (addr < 0x8000) { + mode = GBMemoryROM; + } + else if (addr < 0xA000) { + mode = GBMemoryVRAM; + } + else if (addr < 0xC000) { + mode = GBMemoryExternalRAM; + } + else if (addr < 0xD000) { + if (mode != GBMemoryRAM && mode != GBMemoryEntireSpace) { + mode = GBMemoryEntireSpace; + } + } + else if (addr < 0xE000) { + mode = GBMemoryRAM; + } + else { + mode = GBMemoryEntireSpace; + } + [_memorySpaceButton selectItemAtIndex:mode]; + [self hexUpdateSpace:_memorySpaceButton.cell]; + [_memoryBankInput setStringValue:[NSString stringWithFormat:@"$%02x", bank]]; + [self hexUpdateBank:_memoryBankInput]; + } + addr -= _lineRep.valueOffset; + if (addr >= _hexController.byteArray.length) { + GB_log(&_gb, "Value $%04x is out of range.\n", addr); + return; + } + + [_hexController setSelectedContentsRanges:@[[HFRangeWrapper withRange:HFRangeMake(addr, 0)]]]; + [_hexController _ensureVisibilityOfLocation:addr]; + for (HFRepresenter *representer in _hexController.representers) { + if ([representer isKindOfClass:[HFHexTextRepresenter class]]) { + [self.memoryWindow makeFirstResponder:representer.view]; + break; + } + } } - (void)hexUpdateBank:(NSControl *)sender ignoreErrors: (bool)ignore_errors { + NSString *expression = [sender stringValue]; + __block uint16_t addr, bank; + __block bool fail = false; NSString *error = [self captureOutputForBlock:^{ - uint16_t addr, bank; - if (GB_debugger_evaluate(&_gb, [[sender stringValue] UTF8String], &addr, &bank)) { + if (GB_debugger_evaluate(&_gb, [expression UTF8String], &addr, &bank)) { + fail = true; return; } - - if (bank == (uint16_t) -1) { - bank = addr; - } - - uint16_t n_banks = 1; - switch ([(GBMemoryByteArray *)(_hexController.byteArray) mode]) { - case GBMemoryROM: { - size_t rom_size; - GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_ROM, &rom_size, NULL); - n_banks = rom_size / 0x4000; - break; - } - case GBMemoryVRAM: - n_banks = GB_is_cgb(&_gb) ? 2 : 1; - break; - case GBMemoryExternalRAM: { - size_t ram_size; - GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_CART_RAM, &ram_size, NULL); - n_banks = (ram_size + 0x1FFF) / 0x2000; - break; - } - case GBMemoryRAM: - n_banks = GB_is_cgb(&_gb) ? 8 : 1; - break; - case GBMemoryEntireSpace: - break; - } - - bank %= n_banks; - - [sender setStringValue:[NSString stringWithFormat:@"$%x", bank]]; - [(GBMemoryByteArray *)(_hexController.byteArray) setSelectedBank:bank]; - _statusRep.bankForDescription = bank; - dispatch_async(dispatch_get_main_queue(), ^{ - [_hexController reloadData]; - }); }]; if (error && !ignore_errors) { NSBeep(); [GBWarningPopover popoverWithContents:error onView:sender]; } + + if (fail) return; + + if (bank == (uint16_t) -1) { + bank = addr; + } + + uint16_t n_banks = 1; + switch ([(GBMemoryByteArray *)(_hexController.byteArray) mode]) { + case GBMemoryROM: { + size_t rom_size; + GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_ROM, &rom_size, NULL); + n_banks = rom_size / 0x4000; + break; + } + case GBMemoryVRAM: + n_banks = GB_is_cgb(&_gb) ? 2 : 1; + break; + case GBMemoryExternalRAM: { + size_t ram_size; + GB_get_direct_access(&_gb, GB_DIRECT_ACCESS_CART_RAM, &ram_size, NULL); + n_banks = (ram_size + 0x1FFF) / 0x2000; + break; + } + case GBMemoryRAM: + n_banks = GB_is_cgb(&_gb) ? 8 : 1; + break; + case GBMemoryEntireSpace: + break; + } + + bank %= n_banks; + + [(GBMemoryByteArray *)(_hexController.byteArray) setSelectedBank:bank]; + _statusRep.bankForDescription = bank; + [sender setStringValue:[NSString stringWithFormat:@"$%x", bank]]; + [_hexController reloadData]; } - (IBAction)hexUpdateBank:(NSControl *)sender @@ -2153,9 +2159,8 @@ enum GBWindowResizeAction } byteArray.selectedBank = bank; _statusRep.bankForDescription = bank; - if (bank != (uint16_t)-1) { - [self.memoryBankInput setStringValue:[NSString stringWithFormat:@"$%x", byteArray.selectedBank]]; - } + [self.memoryBankInput setStringValue:(bank == (uint16_t)-1)? @"" : + [NSString stringWithFormat:@"$%x", byteArray.selectedBank]]; [_hexController reloadData]; for (NSView *view in self.memoryView.subviews) {