CL 24800 changed the error representation from strings to objects. However, since native errors types are not immediately compatible across languages, wrapper types were introduced to bridge the gap. This CL remove those wrappers and instead special case the error proxy types to conform to their language error protocol. Specifically: - The ObjC proxy for Go errors now extends NSError and calls initWithDomain to store the error message. - The Go proxy for ObjC NSError return the localizedDescription property for calls to Error. - The Java proxy for Go errors ow extends Exception and overrides getMessage() to return the error message. - The Go proxy for Java Exceptions returns getMessage whenever Error is called. The end result is that error values behave more like normal objects across the language boundary. In particular, instance identity is now preserved: an error passed across the boundary and back will result in the same instance. There are two semantic changes that followed this change: - The domain for wrapped Go errors is now always "go". The domain wasn't useful before this CL: the domains were set to the package name of function or method where the error happened to cross the language boundary. - If a Go method that returns an error is implemented in ObjC, the implementation must now both return NO _and_ set the error result for the calling Go code to receive a non-nil error. Before this CL, because errors were always wrapped, a nil ObjC could be represented with a non-nil wrapper. Change-Id: Idb415b6b13ecf79ccceb60f675059942bfc48fec Reviewed-on: https://go-review.googlesource.com/29298 Reviewed-by: David Crawshaw <crawshaw@golang.org>
186 lines
4.1 KiB
Plaintext
186 lines
4.1 KiB
Plaintext
// Objective-C API for talking to structs Go package.
|
|
// gobind -lang=objc structs
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
|
|
#include <Foundation/Foundation.h>
|
|
#include "seq.h"
|
|
#include "_cgo_export.h"
|
|
#include "GoStructs.h"
|
|
|
|
|
|
@implementation GoStructsS {
|
|
}
|
|
|
|
- (id)initWithRef:(id)ref {
|
|
self = [super init];
|
|
if (self) { __ref = ref; }
|
|
return self;
|
|
}
|
|
|
|
- (double)x {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
double r0 = proxystructs_S_X_Get(refnum);
|
|
double _r0 = (double)r0;
|
|
return _r0;
|
|
}
|
|
|
|
- (void)setX:(double)v {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
double _v = (double)v;
|
|
proxystructs_S_X_Set(refnum, _v);
|
|
}
|
|
|
|
- (double)y {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
double r0 = proxystructs_S_Y_Get(refnum);
|
|
double _r0 = (double)r0;
|
|
return _r0;
|
|
}
|
|
|
|
- (void)setY:(double)v {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
double _v = (double)v;
|
|
proxystructs_S_Y_Set(refnum, _v);
|
|
}
|
|
|
|
- (BOOL)identity:(GoStructsS**)ret0_ error:(NSError**)error {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
struct proxystructs_S_Identity_return res = proxystructs_S_Identity(refnum);
|
|
GoStructsS* _ret0_ = nil;
|
|
GoSeqRef* _ret0__ref = go_seq_from_refnum(res.r0);
|
|
if (_ret0__ref != NULL) {
|
|
_ret0_ = _ret0__ref.obj;
|
|
if (_ret0_ == nil) {
|
|
_ret0_ = [[GoStructsS alloc] initWithRef:_ret0__ref];
|
|
}
|
|
}
|
|
GoUniverseerror* _error = nil;
|
|
GoSeqRef* _error_ref = go_seq_from_refnum(res.r1);
|
|
if (_error_ref != NULL) {
|
|
_error = _error_ref.obj;
|
|
if (_error == nil) {
|
|
_error = [[GoUniverseerror alloc] initWithRef:_error_ref];
|
|
}
|
|
}
|
|
*ret0_ = _ret0_;
|
|
if (_error != nil && error != nil) {
|
|
*error = _error;
|
|
}
|
|
return (_error == nil);
|
|
}
|
|
|
|
- (double)sum {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
double r0 = proxystructs_S_Sum(refnum);
|
|
double _ret0_ = (double)r0;
|
|
return _ret0_;
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
@implementation GoStructsS2 {
|
|
}
|
|
|
|
- (id)initWithRef:(id)ref {
|
|
self = [super init];
|
|
if (self) { __ref = ref; }
|
|
return self;
|
|
}
|
|
|
|
- (void)m {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
proxystructs_S2_M(refnum);
|
|
}
|
|
|
|
- (NSString*)string {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
nstring r0 = proxystructs_S2_String(refnum);
|
|
NSString *_ret0_ = go_seq_to_objc_string(r0);
|
|
return _ret0_;
|
|
}
|
|
|
|
@end
|
|
|
|
@implementation GoStructsI {
|
|
}
|
|
|
|
- (instancetype)initWithRef:(id)ref {
|
|
self = [super init];
|
|
if (self) { __ref = ref; }
|
|
return self;
|
|
}
|
|
|
|
- (void)m {
|
|
int32_t refnum = go_seq_go_to_refnum(self._ref);
|
|
proxystructs_I_M(refnum);
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
|
|
GoStructsS* GoStructsIdentity(GoStructsS* s) {
|
|
int32_t _s;
|
|
if ([(id<NSObject>)(s) isKindOfClass:[GoStructsS class]]) {
|
|
id<goSeqRefInterface> s_proxy = (id<goSeqRefInterface>)(s);
|
|
_s = go_seq_go_to_refnum(s_proxy._ref);
|
|
} else {
|
|
_s = go_seq_to_refnum(s);
|
|
}
|
|
int32_t r0 = proxystructs__Identity(_s);
|
|
GoStructsS* _ret0_ = nil;
|
|
GoSeqRef* _ret0__ref = go_seq_from_refnum(r0);
|
|
if (_ret0__ref != NULL) {
|
|
_ret0_ = _ret0__ref.obj;
|
|
if (_ret0_ == nil) {
|
|
_ret0_ = [[GoStructsS alloc] initWithRef:_ret0__ref];
|
|
}
|
|
}
|
|
return _ret0_;
|
|
}
|
|
|
|
BOOL GoStructsIdentityWithError(GoStructsS* s, GoStructsS** ret0_, NSError** error) {
|
|
int32_t _s;
|
|
if ([(id<NSObject>)(s) isKindOfClass:[GoStructsS class]]) {
|
|
id<goSeqRefInterface> s_proxy = (id<goSeqRefInterface>)(s);
|
|
_s = go_seq_go_to_refnum(s_proxy._ref);
|
|
} else {
|
|
_s = go_seq_to_refnum(s);
|
|
}
|
|
struct proxystructs__IdentityWithError_return res = proxystructs__IdentityWithError(_s);
|
|
GoStructsS* _ret0_ = nil;
|
|
GoSeqRef* _ret0__ref = go_seq_from_refnum(res.r0);
|
|
if (_ret0__ref != NULL) {
|
|
_ret0_ = _ret0__ref.obj;
|
|
if (_ret0_ == nil) {
|
|
_ret0_ = [[GoStructsS alloc] initWithRef:_ret0__ref];
|
|
}
|
|
}
|
|
GoUniverseerror* _error = nil;
|
|
GoSeqRef* _error_ref = go_seq_from_refnum(res.r1);
|
|
if (_error_ref != NULL) {
|
|
_error = _error_ref.obj;
|
|
if (_error == nil) {
|
|
_error = [[GoUniverseerror alloc] initWithRef:_error_ref];
|
|
}
|
|
}
|
|
*ret0_ = _ret0_;
|
|
if (_error != nil && error != nil) {
|
|
*error = _error;
|
|
}
|
|
return (_error == nil);
|
|
}
|
|
|
|
void cproxystructs_I_M(int32_t refnum) {
|
|
@autoreleasepool {
|
|
GoStructsI* o = go_seq_objc_from_refnum(refnum);
|
|
[o m];
|
|
}
|
|
}
|
|
|
|
__attribute__((constructor)) static void init() {
|
|
init_seq();
|
|
}
|