| // Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| #import <Foundation/NSThread.h> | |
| #include "arc_test.h" | |
| #if !__has_feature(objc_arc) | |
| #error "This file must be compiled with ARC enabled" | |
| #endif | |
| @implementation ArcTestObject | |
| + (instancetype)allocTheThing { | |
| return [ArcTestObject alloc]; | |
| } | |
| + (instancetype)newWithCounter:(int32_t*) _counter { | |
| return [[ArcTestObject alloc] initWithCounter: _counter]; | |
| } | |
| - (instancetype)initWithCounter:(int32_t*) _counter { | |
| counter = _counter; | |
| ++*counter; | |
| return [super init]; | |
| } | |
| + (instancetype)makeAndAutorelease:(int32_t*) _counter { | |
| return [[ArcTestObject alloc] initWithCounter: _counter]; | |
| } | |
| - (void)setCounter:(int32_t*) _counter { | |
| counter = _counter; | |
| ++*counter; | |
| } | |
| - (void)dealloc { | |
| --*counter; | |
| } | |
| - (ArcTestObject*)copyMe { | |
| return [[ArcTestObject alloc] initWithCounter: counter]; | |
| } | |
| - (ArcTestObject*)mutableCopyMe { | |
| return [[ArcTestObject alloc] initWithCounter: counter]; | |
| } | |
| - (id)copyWithZone:(NSZone*) zone { | |
| return [[ArcTestObject alloc] initWithCounter: counter]; | |
| } | |
| - (ArcTestObject*)returnsRetained NS_RETURNS_RETAINED { | |
| return [self copyMe]; | |
| } | |
| - (ArcTestObject*)copyMeNoRetain __attribute__((ns_returns_not_retained)) { | |
| return [self copyMe]; | |
| } | |
| - (ArcTestObject*)copyMeAutorelease __attribute__((ns_returns_autoreleased)) { | |
| return [self copyMe]; | |
| } | |
| - (ArcTestObject*)copyMeConsumeSelf __attribute__((ns_consumes_self)) { | |
| return [self copyMe]; | |
| } | |
| + (void)consumeArg:(ArcTestObject*) __attribute((ns_consumed)) arg {} | |
| @end | |
| @implementation ArcDtorTestObject | |
| - (instancetype)initWithCounters:(int32_t*) _dtorCounter | |
| onMainThread: (int32_t*) _dtorOnMainThreadCounter { | |
| dtorCounter = _dtorCounter; | |
| dtorOnMainThreadCounter = _dtorOnMainThreadCounter; | |
| return [super init]; | |
| } | |
| - (void)dealloc { | |
| ++*dtorCounter; | |
| if ([NSThread isMainThread]) { | |
| ++*dtorOnMainThreadCounter; | |
| } | |
| } | |
| @end |