Skip to content

furbytm/arcify

Repository files navigation

arcify

arcify dry-run output

cli tool that makes objective-c/c++ projects arc-compliant. safe to run on already arc-compliant code.

install

make install
make install PREFIX=~/.local

usage

arcify <path>               # patch files in place
arcify <path> --dry-run     # preview changes with colored diff
arcify <path> --verbose     # show each patched file
arcify --version

swiftpm projects (those with a Package.swift) automatically skip .build/.

what it does

retain / release / autorelease — wrapped in #if !__has_feature(objc_arc), consecutive calls grouped into one block

[_commandBuffer retain];
[_argEncoderBuffer release];
[_argEncoderSampler release];
[_argEncoderTexture release];

// ->

#if !__has_feature(objc_arc)
[_commandBuffer retain];
#endif // !__has_feature(objc_arc)

#if !__has_feature(objc_arc)
[_argEncoderBuffer release];
[_argEncoderSampler release];
[_argEncoderTexture release];
#endif // !__has_feature(objc_arc)

NSAutoreleasePool — alloc/init and drain/release each get their own guard

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool drain];

// ->

#if !__has_feature(objc_arc)
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
#endif // !__has_feature(objc_arc)
#if !__has_feature(objc_arc)
[pool drain];
#endif // !__has_feature(objc_arc)

(void*) bridge casts — only when the source is self or a message send

context->userData = (void*)self;          ->  (__bridge void*)self
context->handler  = (void*)[obj handler]; ->  (__bridge void*)[obj handler]

implicit void* return — objc alloc/init returned as void*

return [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];
// ->  return (__bridge void*)[[NSOpenGLPixelFormat alloc] initWithAttributes:attribs];

id<Protocol> casts

colorTexture = id<MTLTexture>(res->GetRawResource());
// ->  (__bridge id<MTLTexture>)(void*)(res->GetRawResource())

metal type upcastingid<MTLResource> upcasted to the specific type implied by the getter

id<MTLResource> buf = metalBuffer->GetBufferId();  ->  id<MTLBuffer>
id<MTLResource> tex = metalTex->GetTextureId();    ->  id<MTLTexture>

example output

────────────────────────────────────────────────────────────
  pxr/imaging/hgiMetal/hgi.mm
────────────────────────────────────────────────────────────
      _commandBuffer = [_commandQueue commandBuffer];
+ #if !__has_feature(objc_arc)
      [_commandBuffer retain];
+ #endif // !__has_feature(objc_arc)

────────────────────────────────────────────────────────────
arcify: scanned 24 files, would patch 14.

requires swift 6.1+. run make help for all targets.