Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pkgs/objective_c/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 4.0.1-wip

- Reduces the changes of duplicate symbols by adding a `DOBJC_` prefix.

## 4.0.0

- Use ffigen 16.0.0
Expand Down
20 changes: 10 additions & 10 deletions pkgs/objective_c/ffigen_c.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,24 @@ functions:
- 'sel_getName'
- 'protocol_getMethodDescription'
- 'protocol_getName'
- 'disposeObjCBlockWithClosure'
- 'isValidBlock'
- 'isValidObject'
- 'Dart_InitializeApiDL'
- 'newFinalizableHandle'
- 'newBlockFinalizableHandle'
- 'deleteFinalizableHandle'
- 'newFinalizableBool'
- 'DOBJC_.*'
leaf:
include:
- '.*'
exclude:
- 'objc_msgSend.*'
- 'disposeObjCBlockWithClosure'
- 'newFinalizableHandle'
- 'deleteFinalizableHandle'
- 'newFinalizableBool'
- 'DOBJC_deleteFinalizableHandle'
- 'DOBJC_disposeObjCBlockWithClosure'
- 'DOBJC_newFinalizableBool'
- 'DOBJC_newFinalizableHandle'
rename:
'DOBJC_disposeObjCBlockWithClosure': 'disposeObjCBlockWithClosure'
'DOBJC_isValidBlock': 'isValidBlock'
'DOBJC_newFinalizableHandle': 'newFinalizableHandle'
'DOBJC_deleteFinalizableHandle': 'deleteFinalizableHandle'
'DOBJC_newFinalizableBool': 'newFinalizableBool'
'sel_registerName': 'registerName'
'sel_getName': 'getName'
'objc_getClass': 'getClass'
Expand Down
10 changes: 7 additions & 3 deletions pkgs/objective_c/ffigen_objc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ external-versions:
objc-interfaces:
# Keep in sync with ffigen's ObjCBuiltInFunctions.builtInInterfaces.
include:
- DartInputStreamAdapter
- DartProxy
- DartProxyBuilder
- DOBJCDartInputStreamAdapter
- DOBJCDartProxy
- DOBJCDartProxyBuilder
- NSArray
- NSCharacterSet
- NSCoder
Expand Down Expand Up @@ -63,6 +63,10 @@ objc-interfaces:
- NSURLHandle
- NSValue
- Protocol
rename:
'DOBJCDartInputStreamAdapter': 'DartInputStreamAdapter'
'DOBJCDartProxy': 'DartProxy'
'DOBJCDartProxyBuilder': 'DartProxyBuilder'
objc-protocols:
include:
- NSStreamDelegate
Expand Down
25 changes: 20 additions & 5 deletions pkgs/objective_c/lib/src/c_bindings_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ library;

import 'dart:ffi' as ffi;

@ffi.Native<
ffi.Void Function(
ffi.Pointer<
ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>,
ffi.Pointer<ffi.Void>)>(isLeaf: true)
external void DOBJC_runOnMainThread(
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>> fn,
ffi.Pointer<ffi.Void> arg,
);

/// \mainpage Dynamically Linked Dart API
///
/// This exposes a subset of symbols from dart_api.h and dart_native_api.h
Expand Down Expand Up @@ -72,13 +82,15 @@ external ffi.Pointer<ffi.Pointer<ObjCObject>> copyClassList(
ffi.Pointer<ffi.UnsignedInt> count,
);

@ffi.Native<ffi.Void Function(Dart_FinalizableHandle, ffi.Handle)>()
@ffi.Native<ffi.Void Function(Dart_FinalizableHandle, ffi.Handle)>(
symbol: "DOBJC_deleteFinalizableHandle")
external void deleteFinalizableHandle(
Dart_FinalizableHandle handle,
Object owner,
);

@ffi.Native<ffi.Void Function(ffi.Pointer<ObjCBlockImpl>)>()
@ffi.Native<ffi.Void Function(ffi.Pointer<ObjCBlockImpl>)>(
symbol: "DOBJC_disposeObjCBlockWithClosure")
external void disposeObjCBlockWithClosure(
ffi.Pointer<ObjCBlockImpl> block,
);
Expand Down Expand Up @@ -126,7 +138,8 @@ external ffi.Pointer<ffi.Char> getProtocolName(
ffi.Pointer<ObjCProtocol> proto,
);

@ffi.Native<ffi.Bool Function(ffi.Pointer<ObjCBlockImpl>)>(isLeaf: true)
@ffi.Native<ffi.Bool Function(ffi.Pointer<ObjCBlockImpl>)>(
symbol: "DOBJC_isValidBlock", isLeaf: true)
external bool isValidBlock(
ffi.Pointer<ObjCBlockImpl> block,
);
Expand All @@ -140,13 +153,15 @@ external void msgSendFpret();
@ffi.Native<ffi.Void Function()>(symbol: "objc_msgSend_stret")
external void msgSendStret();

@ffi.Native<ffi.Pointer<ffi.Bool> Function(ffi.Handle)>()
@ffi.Native<ffi.Pointer<ffi.Bool> Function(ffi.Handle)>(
symbol: "DOBJC_newFinalizableBool")
external ffi.Pointer<ffi.Bool> newFinalizableBool(
Object owner,
);

@ffi.Native<
Dart_FinalizableHandle Function(ffi.Handle, ffi.Pointer<ObjCObject>)>()
Dart_FinalizableHandle Function(ffi.Handle, ffi.Pointer<ObjCObject>)>(
symbol: "DOBJC_newFinalizableHandle")
external Dart_FinalizableHandle newFinalizableHandle(
Object owner,
ffi.Pointer<ObjCObject> object,
Expand Down
44 changes: 23 additions & 21 deletions pkgs/objective_c/lib/src/objective_c_bindings_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,13 @@ class DartInputStreamAdapter extends NSInputStream {

/// Returns whether [obj] is an instance of [DartInputStreamAdapter].
static bool isInstance(objc.ObjCObjectBase obj) {
return _objc_msgSend_69e0x1(
obj.ref.pointer, _sel_isKindOfClass_, _class_DartInputStreamAdapter);
return _objc_msgSend_69e0x1(obj.ref.pointer, _sel_isKindOfClass_,
_class_DOBJCDartInputStreamAdapter);
}

/// inputStreamWithData:
static DartInputStreamAdapter? inputStreamWithData_(NSData data) {
final _ret = _objc_msgSend_62nh5j(_class_DartInputStreamAdapter,
final _ret = _objc_msgSend_62nh5j(_class_DOBJCDartInputStreamAdapter,
_sel_inputStreamWithData_, data.ref.pointer);
return _ret.address == 0
? null
Expand All @@ -109,7 +109,7 @@ class DartInputStreamAdapter extends NSInputStream {

/// inputStreamWithFileAtPath:
static DartInputStreamAdapter? inputStreamWithFileAtPath_(NSString path) {
final _ret = _objc_msgSend_62nh5j(_class_DartInputStreamAdapter,
final _ret = _objc_msgSend_62nh5j(_class_DOBJCDartInputStreamAdapter,
_sel_inputStreamWithFileAtPath_, path.ref.pointer);
return _ret.address == 0
? null
Expand All @@ -122,15 +122,15 @@ class DartInputStreamAdapter extends NSInputStream {
/// -1 => The `NSInputStream` has been closed and the port can be closed.
/// _ => The number of types being required in a `read:maxLength` call.
static DartInputStreamAdapter inputStreamWithPort_(int sendPort) {
final _ret = _objc_msgSend_r25hnf(
_class_DartInputStreamAdapter, _sel_inputStreamWithPort_, sendPort);
final _ret = _objc_msgSend_r25hnf(_class_DOBJCDartInputStreamAdapter,
_sel_inputStreamWithPort_, sendPort);
return DartInputStreamAdapter.castFromPointer(_ret,
retain: true, release: true);
}

/// inputStreamWithURL:
static DartInputStreamAdapter? inputStreamWithURL_(NSURL url) {
final _ret = _objc_msgSend_62nh5j(_class_DartInputStreamAdapter,
final _ret = _objc_msgSend_62nh5j(_class_DOBJCDartInputStreamAdapter,
_sel_inputStreamWithURL_, url.ref.pointer);
return _ret.address == 0
? null
Expand Down Expand Up @@ -186,14 +186,14 @@ class DartInputStreamAdapter extends NSInputStream {
void stream_handleEvent_(NSStream aStream, NSStreamEvent eventCode) {
if (!objc.respondsToSelector(this.ref.pointer, _sel_stream_handleEvent_)) {
throw objc.UnimplementedOptionalMethodException(
'DartInputStreamAdapter', 'stream:handleEvent:');
'DOBJCDartInputStreamAdapter', 'stream:handleEvent:');
}
_objc_msgSend_hglvhy(this.ref.pointer, _sel_stream_handleEvent_,
aStream.ref.pointer, eventCode.value);
}
}

/// DartProxy
/// DOBJCDartProxy
class DartProxy extends NSProxy {
DartProxy._(ffi.Pointer<objc.ObjCObject> pointer,
{bool retain = false, bool release = false})
Expand All @@ -211,19 +211,19 @@ class DartProxy extends NSProxy {
/// Returns whether [obj] is an instance of [DartProxy].
static bool isInstance(objc.ObjCObjectBase obj) {
return _objc_msgSend_69e0x1(
obj.ref.pointer, _sel_isKindOfClass_, _class_DartProxy);
obj.ref.pointer, _sel_isKindOfClass_, _class_DOBJCDartProxy);
}

/// alloc
static objc.ObjCObjectBase alloc() {
final _ret = _objc_msgSend_1x359cv(_class_DartProxy, _sel_alloc);
final _ret = _objc_msgSend_1x359cv(_class_DOBJCDartProxy, _sel_alloc);
return objc.ObjCObjectBase(_ret, retain: false, release: true);
}

/// newFromBuilder:
static DartProxy newFromBuilder_(DartProxyBuilder builder) {
final _ret = _objc_msgSend_62nh5j(
_class_DartProxy, _sel_newFromBuilder_, builder.ref.pointer);
_class_DOBJCDartProxy, _sel_newFromBuilder_, builder.ref.pointer);
return DartProxy.castFromPointer(_ret, retain: false, release: true);
}

Expand Down Expand Up @@ -273,7 +273,7 @@ class DartProxy extends NSProxy {
}
}

/// DartProxyBuilder
/// DOBJCDartProxyBuilder
class DartProxyBuilder extends NSObject {
DartProxyBuilder._(ffi.Pointer<objc.ObjCObject> pointer,
{bool retain = false, bool release = false})
Expand All @@ -291,25 +291,26 @@ class DartProxyBuilder extends NSObject {
/// Returns whether [obj] is an instance of [DartProxyBuilder].
static bool isInstance(objc.ObjCObjectBase obj) {
return _objc_msgSend_69e0x1(
obj.ref.pointer, _sel_isKindOfClass_, _class_DartProxyBuilder);
obj.ref.pointer, _sel_isKindOfClass_, _class_DOBJCDartProxyBuilder);
}

/// alloc
static DartProxyBuilder alloc() {
final _ret = _objc_msgSend_1x359cv(_class_DartProxyBuilder, _sel_alloc);
final _ret =
_objc_msgSend_1x359cv(_class_DOBJCDartProxyBuilder, _sel_alloc);
return DartProxyBuilder.castFromPointer(_ret, retain: false, release: true);
}

/// allocWithZone:
static DartProxyBuilder allocWithZone_(ffi.Pointer<_NSZone> zone) {
final _ret = _objc_msgSend_hzlb60(
_class_DartProxyBuilder, _sel_allocWithZone_, zone);
_class_DOBJCDartProxyBuilder, _sel_allocWithZone_, zone);
return DartProxyBuilder.castFromPointer(_ret, retain: false, release: true);
}

/// new
static DartProxyBuilder new1() {
final _ret = _objc_msgSend_1x359cv(_class_DartProxyBuilder, _sel_new);
final _ret = _objc_msgSend_1x359cv(_class_DOBJCDartProxyBuilder, _sel_new);
return DartProxyBuilder.castFromPointer(_ret, retain: false, release: true);
}

Expand Down Expand Up @@ -10826,10 +10827,11 @@ class Protocol extends objc.ObjCObjectBase {

final class _NSZone extends ffi.Opaque {}

late final _class_DartInputStreamAdapter =
objc.getClass("DartInputStreamAdapter");
late final _class_DartProxy = objc.getClass("DartProxy");
late final _class_DartProxyBuilder = objc.getClass("DartProxyBuilder");
late final _class_DOBJCDartInputStreamAdapter =
objc.getClass("DOBJCDartInputStreamAdapter");
late final _class_DOBJCDartProxy = objc.getClass("DOBJCDartProxy");
late final _class_DOBJCDartProxyBuilder =
objc.getClass("DOBJCDartProxyBuilder");
late final _class_NSArray = objc.getClass("NSArray");
late final _class_NSCharacterSet = objc.getClass("NSCharacterSet");
late final _class_NSCoder = objc.getClass("NSCoder");
Expand Down
2 changes: 1 addition & 1 deletion pkgs/objective_c/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

name: objective_c
description: 'A library to access Objective C from Flutter that acts as a support library for package:ffigen.'
version: 4.0.0
version: 4.0.1-wip
repository: https://github.com/dart-lang/native/tree/main/pkgs/objective_c
issue_tracker: https://github.com/dart-lang/native/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Aobjective_c

Expand Down
7 changes: 1 addition & 6 deletions pkgs/objective_c/src/input_stream_adapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@
// 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.

#ifndef INPUT_STREAM_ADAPTER_H_
#define INPUT_STREAM_ADAPTER_H_

#include "include/dart_api_dl.h"

#import <Foundation/NSObject.h>
#import <Foundation/NSStream.h>

/// Helper class to adapt a Dart stream into a `NSInputStream`.
@interface DartInputStreamAdapter : NSInputStream <NSStreamDelegate>
@interface DOBJCDartInputStreamAdapter : NSInputStream <NSStreamDelegate>

/// Creates the adapter.
/// @param sendPort A port to that is will receive two types of messages:
Expand All @@ -23,5 +20,3 @@
- (void)setDone;
- (void)setError:(NSError *)error;
@end

#endif // INPUT_STREAM_ADAPTER_H_
4 changes: 2 additions & 2 deletions pkgs/objective_c/src/input_stream_adapter.m
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#import <Foundation/Foundation.h>
#include <os/log.h>

@implementation DartInputStreamAdapter {
@implementation DOBJCDartInputStreamAdapter {
Dart_Port _sendPort;
NSCondition *_dataCondition;
NSMutableData *_data;
Expand All @@ -18,7 +18,7 @@ @implementation DartInputStreamAdapter {
}

+ (instancetype)inputStreamWithPort:(Dart_Port)sendPort {
DartInputStreamAdapter *stream = [[DartInputStreamAdapter alloc] init];
DOBJCDartInputStreamAdapter *stream = [[DOBJCDartInputStreamAdapter alloc] init];
if (stream != nil) {
stream->_sendPort = sendPort;
stream->_dataCondition = [[NSCondition alloc] init];
Expand Down
18 changes: 9 additions & 9 deletions pkgs/objective_c/src/objective_c.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,35 +12,35 @@

// Dispose helper for ObjC blocks that wrap a Dart closure. For these blocks,
// the target is an int ID, and the dispose_port is listening for these IDs.
void disposeObjCBlockWithClosure(ObjCBlockImpl* block) {
void DOBJC_disposeObjCBlockWithClosure(ObjCBlockImpl* block) {
Dart_PostInteger_DL(block->dispose_port, (int64_t)block->target);
}

bool isValidBlock(ObjCBlockImpl* block) {
bool DOBJC_isValidBlock(ObjCBlockImpl* block) {
if (block == NULL) return false;
void* isa = block->isa;
return isa == &_NSConcreteStackBlock || isa == &_NSConcreteMallocBlock ||
isa == &_NSConcreteAutoBlock || isa == &_NSConcreteFinalizingBlock ||
isa == &_NSConcreteGlobalBlock || isa == &_NSConcreteWeakBlockVariable;
}

void finalizeObject(void* isolate_callback_data, void* peer) {
void DOBJC_finalizeObject(void* isolate_callback_data, void* peer) {
// objc_release works for Objects and Blocks.
runOnMainThread((void (*)(void*))objc_release, peer);
DOBJC_runOnMainThread((void (*)(void*))objc_release, peer);
}

Dart_FinalizableHandle newFinalizableHandle(Dart_Handle owner,
Dart_FinalizableHandle DOBJC_newFinalizableHandle(Dart_Handle owner,
ObjCObject* object) {
return Dart_NewFinalizableHandle_DL(owner, object, 0, finalizeObject);
return Dart_NewFinalizableHandle_DL(owner, object, 0, DOBJC_finalizeObject);
}

void deleteFinalizableHandle(Dart_FinalizableHandle handle, Dart_Handle owner) {
void DOBJC_deleteFinalizableHandle(Dart_FinalizableHandle handle, Dart_Handle owner) {
Dart_DeleteFinalizableHandle_DL(handle, owner);
}

void finalizeMalloc(void* isolate_callback_data, void* peer) { free(peer); }
static void finalizeMalloc(void* isolate_callback_data, void* peer) { free(peer); }

bool* newFinalizableBool(Dart_Handle owner) {
bool* DOBJC_newFinalizableBool(Dart_Handle owner) {
bool* pointer = (bool*)malloc(1);
*pointer = false;
Dart_NewFinalizableHandle_DL(owner, pointer, 1, finalizeMalloc);
Expand Down
Loading