Commit a440560c authored by Kenny Kaye's avatar Kenny Kaye

Merge remote-tracking branch 'upstream/master' into kkaye/include-paths

parents f9f21869 6a497f5c
...@@ -44,8 +44,7 @@ example_ios: ./build_ios/example/libtextsort.xcodeproj ...@@ -44,8 +44,7 @@ example_ios: ./build_ios/example/libtextsort.xcodeproj
xcodebuild -workspace example/objc/TextSort.xcworkspace \ xcodebuild -workspace example/objc/TextSort.xcworkspace \
-scheme TextSort \ -scheme TextSort \
-configuration 'Debug' \ -configuration 'Debug' \
-sdk iphonesimulator \ -sdk iphonesimulator
-destination 'platform=iOS Simulator,name=iPhone 6s,OS=10.1'
# this target implicitly depends on GypAndroid.mk since gradle will try to make it # this target implicitly depends on GypAndroid.mk since gradle will try to make it
example_android: GypAndroid.mk example_android: GypAndroid.mk
......
...@@ -267,7 +267,7 @@ When generating the interface for your project and wish to make it available to ...@@ -267,7 +267,7 @@ When generating the interface for your project and wish to make it available to
in all of C++/Objective-C/Java you can tell Djinni to generate a special YAML file as part in all of C++/Objective-C/Java you can tell Djinni to generate a special YAML file as part
of the code generation process. This file then contains all the information Djinni requires of the code generation process. This file then contains all the information Djinni requires
to include your types in a different project. Instructing Djinni to create these YAML files to include your types in a different project. Instructing Djinni to create these YAML files
is controlled by the follwoing arguments: is controlled by the following arguments:
- `--yaml-out`: The output folder for YAML files (Generator disabled if unspecified). - `--yaml-out`: The output folder for YAML files (Generator disabled if unspecified).
- `--yaml-out-file`: If specified all types are merged into a single YAML file instead of generating one file per type (relative to `--yaml-out`). - `--yaml-out-file`: If specified all types are merged into a single YAML file instead of generating one file per type (relative to `--yaml-out`).
- `--yaml-prefix`: The prefix to add to type names stored in YAML files (default: `""`). - `--yaml-prefix`: The prefix to add to type names stored in YAML files (default: `""`).
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
'DEAD_CODE_STRIPPING': 'YES', 'DEAD_CODE_STRIPPING': 'YES',
'SKIP_INSTALL': 'YES', 'SKIP_INSTALL': 'YES',
'CLANG_ENABLE_OBJC_ARC': 'YES', 'CLANG_ENABLE_OBJC_ARC': 'YES',
'IPHONEOS_DEPLOYMENT_TARGET': '8.0',
}, },
"conditions": [ "conditions": [
['OS=="ios"', { ['OS=="ios"', {
......
// AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from textsort.djinni
#import "TXSTextboxListener+Private.h"
#import "TXSTextboxListener.h"
#import "DJIObjcWrapperCache+Private.h"
#import "collections/generated-src/objc/TXSItemList+Private.h"
#include <stdexcept>
static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file");
namespace djinni_generated {
class TextboxListener::ObjcProxy final
: public ::textsort::TextboxListener
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::TextboxListener;
public:
using ObjcProxyBase::ObjcProxyBase;
void update(const ::collections::ItemList & c_items) override
{
@autoreleasepool {
[djinni_private_get_proxied_objc_object() update:(::djinni_generated::ItemList::fromCpp(c_items))];
}
}
};
} // namespace djinni_generated
namespace djinni_generated {
auto TextboxListener::toCpp(ObjcType objc) -> CppType
{
if (!objc) {
return nullptr;
}
return ::djinni::get_objc_proxy<ObjcProxy>(objc);
}
auto TextboxListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
{
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
...@@ -30,7 +30,7 @@ objc: ...@@ -30,7 +30,7 @@ objc:
header: '"MLB/MLBRecord1.h"' header: '"MLB/MLBRecord1.h"'
# Only used for "record" types: determines the type used when boxing the record is required. # Only used for "record" types: determines the type used when boxing the record is required.
# Should not contain the pointer asterisk "*", protocols are not supported. # Should not contain the pointer asterisk "*", protocols are not supported.
# This fiels is the same as "typename" most of the time as records are typically NSObjects and require no special boxing. # This files is the same as "typename" most of the time as records are typically NSObjects and require no special boxing.
# However, some may not, for example NSTimeInterval is boxed to NSNumber. # However, some may not, for example NSTimeInterval is boxed to NSNumber.
boxed: 'MLBRecord1' boxed: 'MLBRecord1'
# Specifies whether the unboxed type is a pointer. # Specifies whether the unboxed type is a pointer.
......
...@@ -13,14 +13,15 @@ namespace djinni_generated { ...@@ -13,14 +13,15 @@ namespace djinni_generated {
class TextboxListener::ObjcProxy final class TextboxListener::ObjcProxy final
: public ::textsort::TextboxListener : public ::textsort::TextboxListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::TextboxListener;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
void update(const ::textsort::ItemList & c_items) override void update(const ::textsort::ItemList & c_items) override
{ {
@autoreleasepool { @autoreleasepool {
[Handle::get() update:(::djinni_generated::ItemList::fromCpp(c_items))]; [djinni_private_get_proxied_objc_object() update:(::djinni_generated::ItemList::fromCpp(c_items))];
} }
} }
}; };
...@@ -42,7 +43,7 @@ auto TextboxListener::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -42,7 +43,7 @@ auto TextboxListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get(); return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -150,7 +150,7 @@ ...@@ -150,7 +150,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
CLASSPREFIX = TXS; CLASSPREFIX = TXS;
LastUpgradeCheck = 0510; LastUpgradeCheck = 0820;
ORGANIZATIONNAME = "Dropbox, Inc."; ORGANIZATIONNAME = "Dropbox, Inc.";
}; };
buildConfigurationList = 65834DD819AC599E0061AD3F /* Build configuration list for PBXProject "TextSort" */; buildConfigurationList = 65834DD819AC599E0061AD3F /* Build configuration list for PBXProject "TextSort" */;
...@@ -231,13 +231,19 @@ ...@@ -231,13 +231,19 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0; GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1", "DEBUG=1",
...@@ -250,7 +256,7 @@ ...@@ -250,7 +256,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.1; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
...@@ -271,20 +277,25 @@ ...@@ -271,20 +277,25 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.1; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../support-lib/objc $(SRCROOT)/../generated-src/objc"; USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../support-lib/objc $(SRCROOT)/../generated-src/objc";
...@@ -301,6 +312,7 @@ ...@@ -301,6 +312,7 @@
GCC_PREFIX_HEADER = "TextSort/TextSort-Prefix.pch"; GCC_PREFIX_HEADER = "TextSort/TextSort-Prefix.pch";
INFOPLIST_FILE = "TextSort/TextSort-Info.plist"; INFOPLIST_FILE = "TextSort/TextSort-Info.plist";
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = 1; TARGETED_DEVICE_FAMILY = 1;
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
...@@ -316,6 +328,7 @@ ...@@ -316,6 +328,7 @@
GCC_PREFIX_HEADER = "TextSort/TextSort-Prefix.pch"; GCC_PREFIX_HEADER = "TextSort/TextSort-Prefix.pch";
INFOPLIST_FILE = "TextSort/TextSort-Info.plist"; INFOPLIST_FILE = "TextSort/TextSort-Info.plist";
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = 1; TARGETED_DEVICE_FAMILY = 1;
WRAPPER_EXTENSION = app; WRAPPER_EXTENSION = app;
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0510" LastUpgradeVersion = "0820"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES">
buildConfiguration = "Debug">
<Testables> <Testables>
</Testables> </Testables>
<MacroExpansion> <MacroExpansion>
...@@ -38,17 +38,21 @@ ...@@ -38,17 +38,21 @@
ReferencedContainer = "container:TextSort.xcodeproj"> ReferencedContainer = "container:TextSort.xcodeproj">
</BuildableReference> </BuildableReference>
</MacroExpansion> </MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<BuildableProductRunnable> <BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "65834DDC19AC599E0061AD3F" BlueprintIdentifier = "65834DDC19AC599E0061AD3F"
...@@ -61,12 +65,13 @@ ...@@ -61,12 +65,13 @@
</AdditionalOptions> </AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES">
<BuildableProductRunnable> <BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "65834DDC19AC599E0061AD3F" BlueprintIdentifier = "65834DDC19AC599E0061AD3F"
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string> <string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>Dropbox.${PRODUCT_NAME:rfc1034identifier}</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
......
...@@ -166,7 +166,7 @@ class YamlLexer implements FlexLexer { ...@@ -166,7 +166,7 @@ class YamlLexer implements FlexLexer {
/* error messages for the codes above */ /* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = { private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error", "Unknown internal scanner error",
"Error: could not match input", "Error: could not match input",
"Error: pushback value was too large" "Error: pushback value was too large"
}; };
...@@ -350,7 +350,7 @@ class YamlLexer implements FlexLexer { ...@@ -350,7 +350,7 @@ class YamlLexer implements FlexLexer {
/** /**
* Reports an error that occured while scanning. * Reports an error that occurred while scanning.
* *
* In a wellformed scanner (no or only correct usage of * In a wellformed scanner (no or only correct usage of
* yypushback(int) and a match-all fallback rule) this method * yypushback(int) and a match-all fallback rule) this method
......
...@@ -243,7 +243,7 @@ public class _DjinniLexer implements FlexLexer { ...@@ -243,7 +243,7 @@ public class _DjinniLexer implements FlexLexer {
/* error messages for the codes above */ /* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = { private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error", "Unknown internal scanner error",
"Error: could not match input", "Error: could not match input",
"Error: pushback value was too large" "Error: pushback value was too large"
}; };
...@@ -429,7 +429,7 @@ public class _DjinniLexer implements FlexLexer { ...@@ -429,7 +429,7 @@ public class _DjinniLexer implements FlexLexer {
/** /**
* Reports an error that occured while scanning. * Reports an error that occurred while scanning.
* *
* In a wellformed scanner (no or only correct usage of * In a wellformed scanner (no or only correct usage of
* yypushback(int) and a match-all fallback rule) this method * yypushback(int) and a match-all fallback rule) this method
......
...@@ -208,17 +208,18 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -208,17 +208,18 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
wrapNamespace(w, spec.objcppNamespace, w => { wrapNamespace(w, spec.objcppNamespace, w => {
w.wl(s"class $helperClass::ObjcProxy final") w.wl(s"class $helperClass::ObjcProxy final")
w.wl(s": public $cppSelf") w.wl(s": public $cppSelf")
w.wl(s", public ::djinni::ObjcProxyCache::Handle<ObjcType>") // Use base class to avoid name conflicts with user-defined methods having the same name as this new data member w.wl(s", private ::djinni::ObjcProxyBase<ObjcType>")
w.bracedSemi { w.bracedSemi {
w.wl(s"friend class ${objcppMarshal.helperClassWithNs(ident)};")
w.wlOutdent("public:") w.wlOutdent("public:")
w.wl("using Handle::Handle;") w.wl("using ObjcProxyBase::ObjcProxyBase;")
for (m <- i.methods) { for (m <- i.methods) {
val ret = cppMarshal.fqReturnType(m.ret) val ret = cppMarshal.fqReturnType(m.ret)
val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " c_" + idCpp.local(p.ident)) val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " c_" + idCpp.local(p.ident))
w.wl(s"$ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")} override").braced { w.wl(s"$ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")} override").braced {
w.w("@autoreleasepool").braced { w.w("@autoreleasepool").braced {
val ret = m.ret.fold("")(_ => "auto objcpp_result_ = ") val ret = m.ret.fold("")(_ => "auto objcpp_result_ = ")
val call = s"[Handle::get() ${idObjc.method(m.ident)}" val call = s"[djinni_private_get_proxied_objc_object() ${idObjc.method(m.ident)}"
writeAlignedObjcCall(w, ret + call, m.params, "]", p => (idObjc.field(p.ident), s"(${objcppMarshal.fromCpp(p.ty, "c_" + idCpp.local(p.ident))})")) writeAlignedObjcCall(w, ret + call, m.params, "]", p => (idObjc.field(p.ident), s"(${objcppMarshal.fromCpp(p.ty, "c_" + idCpp.local(p.ident))})"))
w.wl(";") w.wl(";")
m.ret.fold()(ty => { m.ret.fold()(ty => {
...@@ -284,13 +285,13 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -284,13 +285,13 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
if (i.ext.objc && !i.ext.cpp) { if (i.ext.objc && !i.ext.cpp) {
// ObjC only. In this case we *must* unwrap a proxy object - the dynamic_cast will // ObjC only. In this case we *must* unwrap a proxy object - the dynamic_cast will
// throw bad_cast if we gave it something of the wrong type. // throw bad_cast if we gave it something of the wrong type.
w.wl(s"return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();") w.wl(s"return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();")
} else if (i.ext.objc || i.ext.cpp) { } else if (i.ext.objc || i.ext.cpp) {
// C++ only, or C++ and ObjC. // C++ only, or C++ and ObjC.
if (i.ext.objc) { if (i.ext.objc) {
// If it could be implemented in ObjC, we might have to unwrap a proxy object. // If it could be implemented in ObjC, we might have to unwrap a proxy object.
w.w(s"if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get()))").braced { w.w(s"if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get()))").braced {
w.wl("return cppPtr->Handle::get();") w.wl("return cppPtr->djinni_private_get_proxied_objc_object();")
} }
} }
w.wl(s"return ::djinni::get_cpp_proxy<$objcSelf>(cpp);") w.wl(s"return ::djinni::get_cpp_proxy<$objcSelf>(cpp);")
......
...@@ -53,6 +53,8 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -53,6 +53,8 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
def helperClass(name: String) = idCpp.ty(name) def helperClass(name: String) = idCpp.ty(name)
private def helperClass(tm: MExpr): String = helperName(tm) + helperTemplates(tm) private def helperClass(tm: MExpr): String = helperName(tm) + helperTemplates(tm)
def helperClassWithNs(name: String) = withNs(Some(spec.objcppNamespace), helperClass(name))
def privateHeaderName(ident: String): String = idObjc.ty(ident) + "+Private." + spec.objcHeaderExt def privateHeaderName(ident: String): String = idObjc.ty(ident) + "+Private." + spec.objcHeaderExt
def helperName(tm: MExpr): String = tm.base match { def helperName(tm: MExpr): String = tm.base match {
......
...@@ -53,4 +53,51 @@ static std::shared_ptr<CppType> get_objc_proxy(ObjcType * objcRef) { ...@@ -53,4 +53,51 @@ static std::shared_ptr<CppType> get_objc_proxy(ObjcType * objcRef) {
)); ));
} }
// Private implementation base class for all ObjC proxies, which manages the
// Handle, and ensures that it is created and destroyed in a safe way, inside
// of an @autoreleasepool to avoid leaks. The complexity here is just necessary
// to gain explicit control of construction and destruction time of the member
// Handle, to make sure it's inside the @autoreleasepool block.
// An optional<HandleType> would meet our needs, but we can't use it directly
// since the support-lib doesn't know which optional implementation might be in
// use, if any. We can't take OptionalType as a template arg here, because we
// also need to know where to find nullopt in order to implement the destructor
// above. This class uses the same technique as at least one optional
// implementation: The union ensures proper alignment, while leaving construction
// and destruction under our direct control.
template <typename ObjcType>
class ObjcProxyBase {
using HandleType = ::djinni::ObjcProxyCache::Handle<ObjcType>;
public:
ObjcProxyBase(ObjcType objc) {
@autoreleasepool {
new (&m_djinni_private_proxy_handle) HandleType(objc);
}
}
ObjcProxyBase(const ObjcProxyBase&) = delete;
ObjcProxyBase& operator=(const ObjcProxyBase&) = delete;
// Not intended for polymorphic use, so dtor is not virtual
~ObjcProxyBase() {
@autoreleasepool {
m_djinni_private_proxy_handle.~HandleType();
}
}
// Long name to minimize likelyhood of collision with interface methods.
// Return by reference to make it clear there's nothing for ARC to do here.
// Call site should have its own autoreleasepool if necessary.
const ObjcType & djinni_private_get_proxied_objc_object() const {
return m_djinni_private_proxy_handle.get();
}
private:
union {
// Long names to minimize likelyhood of collision with interface methods.
char m_djinni_private_dummy;
HandleType m_djinni_private_proxy_handle;
};
};
} // namespace djinni } // namespace djinni
...@@ -90,7 +90,7 @@ template <typename T> static inline T * get_unowning(T * ptr) { return ptr; } ...@@ -90,7 +90,7 @@ template <typename T> static inline T * get_unowning(T * ptr) { return ptr; }
* *
* The cache contains a map from pair<ImplType, UnowningImplPointer> * The cache contains a map from pair<ImplType, UnowningImplPointer>
* to WeakProxyPointer, allowing it to answer the question: "given this * to WeakProxyPointer, allowing it to answer the question: "given this
* impl, do we already have a proxy in existance?" * impl, do we already have a proxy in existence?"
* *
* We use one map for all translated types, rather than a separate one for each type, * We use one map for all translated types, rather than a separate one for each type,
* to minimize duplication of code and make it so the unordered_map is as contained as * to minimize duplication of code and make it so the unordered_map is as contained as
......
...@@ -18,6 +18,18 @@ ...@@ -18,6 +18,18 @@
], ],
}, },
}, },
{
"target_name": "djinni_jni_main",
"type": "static_library",
"sources": [
"jni/djinni_main.cpp",
],
"link_settings": {
"aosp_build_settings": {
"LOCAL_WHOLE_STATIC_LIBRARIES": [ 'djinni_jni_main' ], # Ensure JNI symbols are exposed
},
},
},
{ {
"target_name": "djinni_objc", "target_name": "djinni_objc",
"type": "static_library", "type": "static_library",
......
...@@ -6,7 +6,7 @@ djinni: ...@@ -6,7 +6,7 @@ djinni:
./run_djinni.sh ./run_djinni.sh
objc: djinni objc: djinni
cd objc; xcodebuild -sdk iphonesimulator -project DjinniObjcTest.xcodeproj -scheme DjinniObjcTest test -destination 'platform=iOS Simulator,name=iPhone 6s,OS=10.1' cd objc; xcodebuild -sdk iphonesimulator -project DjinniObjcTest.xcodeproj -scheme DjinniObjcTest test -destination 'platform=iOS Simulator,name=iPhone 7,OS=latest'
java: djinni java: djinni
cd java && ant compile test cd java && ant compile test
......
// AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from inner_class.djinni
#import "DBInnerClass+Private.h"
#import "DBInnerClass.h"
#import "DJIMarshal+Private.h"
#import "DJIObjcWrapperCache+Private.h"
#include <stdexcept>
static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file");
namespace djinni_generated {
class InnerClass::ObjcProxy final
: public ::package1::InnerClass
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::InnerClass;
public:
using ObjcProxyBase::ObjcProxyBase;
std::string get_name() override
{
@autoreleasepool {
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() getName];
return ::djinni::String::toCpp(objcpp_result_);
}
}
};
} // namespace djinni_generated
namespace djinni_generated {
auto InnerClass::toCpp(ObjcType objc) -> CppType
{
if (!objc) {
return nullptr;
}
return ::djinni::get_objc_proxy<ObjcProxy>(objc);
}
auto InnerClass::fromCppOpt(const CppOptType& cpp) -> ObjcType
{
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
@import "./vendor/third-party/date.djinni" @import "./varnames.djinni"
@import "../djinni/vendor/third-party/date.djinni" @import "../djinni/varnames.djinni"
@extern "./vendor/third-party/date.yaml"
...@@ -14,14 +14,15 @@ namespace djinni_generated { ...@@ -14,14 +14,15 @@ namespace djinni_generated {
class ClientInterface::ObjcProxy final class ClientInterface::ObjcProxy final
: public ::testsuite::ClientInterface : public ::testsuite::ClientInterface
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::ClientInterface;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
::testsuite::ClientReturnedRecord get_record(int64_t c_record_id, const std::string & c_utf8string, const std::experimental::optional<std::string> & c_misc) override ::testsuite::ClientReturnedRecord get_record(int64_t c_record_id, const std::string & c_utf8string, const std::experimental::optional<std::string> & c_misc) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() getRecord:(::djinni::I64::fromCpp(c_record_id)) auto objcpp_result_ = [djinni_private_get_proxied_objc_object() getRecord:(::djinni::I64::fromCpp(c_record_id))
utf8string:(::djinni::String::fromCpp(c_utf8string)) utf8string:(::djinni::String::fromCpp(c_utf8string))
misc:(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(c_misc))]; misc:(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(c_misc))];
return ::djinni_generated::ClientReturnedRecord::toCpp(objcpp_result_); return ::djinni_generated::ClientReturnedRecord::toCpp(objcpp_result_);
...@@ -30,7 +31,7 @@ public: ...@@ -30,7 +31,7 @@ public:
double identifier_check(const std::vector<uint8_t> & c_data, int32_t c_r, int64_t c_jret) override double identifier_check(const std::vector<uint8_t> & c_data, int32_t c_r, int64_t c_jret) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() identifierCheck:(::djinni::Binary::fromCpp(c_data)) auto objcpp_result_ = [djinni_private_get_proxied_objc_object() identifierCheck:(::djinni::Binary::fromCpp(c_data))
r:(::djinni::I32::fromCpp(c_r)) r:(::djinni::I32::fromCpp(c_r))
jret:(::djinni::I64::fromCpp(c_jret))]; jret:(::djinni::I64::fromCpp(c_jret))];
return ::djinni::F64::toCpp(objcpp_result_); return ::djinni::F64::toCpp(objcpp_result_);
...@@ -39,21 +40,21 @@ public: ...@@ -39,21 +40,21 @@ public:
std::string return_str() override std::string return_str() override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() returnStr]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() returnStr];
return ::djinni::String::toCpp(objcpp_result_); return ::djinni::String::toCpp(objcpp_result_);
} }
} }
std::string meth_taking_interface(const std::shared_ptr<::testsuite::ClientInterface> & c_i) override std::string meth_taking_interface(const std::shared_ptr<::testsuite::ClientInterface> & c_i) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() methTakingInterface:(::djinni_generated::ClientInterface::fromCpp(c_i))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() methTakingInterface:(::djinni_generated::ClientInterface::fromCpp(c_i))];
return ::djinni::String::toCpp(objcpp_result_); return ::djinni::String::toCpp(objcpp_result_);
} }
} }
std::string meth_taking_optional_interface(const std::shared_ptr<::testsuite::ClientInterface> & c_i) override std::string meth_taking_optional_interface(const std::shared_ptr<::testsuite::ClientInterface> & c_i) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() methTakingOptionalInterface:(::djinni::Optional<std::experimental::optional, ::djinni_generated::ClientInterface>::fromCpp(c_i))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() methTakingOptionalInterface:(::djinni::Optional<std::experimental::optional, ::djinni_generated::ClientInterface>::fromCpp(c_i))];
return ::djinni::String::toCpp(objcpp_result_); return ::djinni::String::toCpp(objcpp_result_);
} }
} }
...@@ -76,7 +77,7 @@ auto ClientInterface::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -76,7 +77,7 @@ auto ClientInterface::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get(); return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -71,42 +71,43 @@ namespace djinni_generated { ...@@ -71,42 +71,43 @@ namespace djinni_generated {
class EnumUsageInterface::ObjcProxy final class EnumUsageInterface::ObjcProxy final
: public ::testsuite::EnumUsageInterface : public ::testsuite::EnumUsageInterface
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::EnumUsageInterface;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
::testsuite::color e(::testsuite::color c_e) override ::testsuite::color e(::testsuite::color c_e) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() e:(::djinni::Enum<::testsuite::color, DBColor>::fromCpp(c_e))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() e:(::djinni::Enum<::testsuite::color, DBColor>::fromCpp(c_e))];
return ::djinni::Enum<::testsuite::color, DBColor>::toCpp(objcpp_result_); return ::djinni::Enum<::testsuite::color, DBColor>::toCpp(objcpp_result_);
} }
} }
std::experimental::optional<::testsuite::color> o(std::experimental::optional<::testsuite::color> c_o) override std::experimental::optional<::testsuite::color> o(std::experimental::optional<::testsuite::color> c_o) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() o:(::djinni::Optional<std::experimental::optional, ::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_o))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() o:(::djinni::Optional<std::experimental::optional, ::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_o))];
return ::djinni::Optional<std::experimental::optional, ::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_); return ::djinni::Optional<std::experimental::optional, ::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_);
} }
} }
std::vector<::testsuite::color> l(const std::vector<::testsuite::color> & c_l) override std::vector<::testsuite::color> l(const std::vector<::testsuite::color> & c_l) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() l:(::djinni::List<::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_l))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() l:(::djinni::List<::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_l))];
return ::djinni::List<::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_); return ::djinni::List<::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_);
} }
} }
std::unordered_set<::testsuite::color> s(const std::unordered_set<::testsuite::color> & c_s) override std::unordered_set<::testsuite::color> s(const std::unordered_set<::testsuite::color> & c_s) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() s:(::djinni::Set<::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_s))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() s:(::djinni::Set<::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_s))];
return ::djinni::Set<::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_); return ::djinni::Set<::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_);
} }
} }
std::unordered_map<::testsuite::color, ::testsuite::color> m(const std::unordered_map<::testsuite::color, ::testsuite::color> & c_m) override std::unordered_map<::testsuite::color, ::testsuite::color> m(const std::unordered_map<::testsuite::color, ::testsuite::color> & c_m) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() m:(::djinni::Map<::djinni::Enum<::testsuite::color, DBColor>, ::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_m))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() m:(::djinni::Map<::djinni::Enum<::testsuite::color, DBColor>, ::djinni::Enum<::testsuite::color, DBColor>>::fromCpp(c_m))];
return ::djinni::Map<::djinni::Enum<::testsuite::color, DBColor>, ::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_); return ::djinni::Map<::djinni::Enum<::testsuite::color, DBColor>, ::djinni::Enum<::testsuite::color, DBColor>>::toCpp(objcpp_result_);
} }
} }
...@@ -133,7 +134,7 @@ auto EnumUsageInterface::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -133,7 +134,7 @@ auto EnumUsageInterface::fromCppOpt(const CppOptType& cpp) -> ObjcType
return nil; return nil;
} }
if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get())) { if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get())) {
return cppPtr->Handle::get(); return cppPtr->djinni_private_get_proxied_objc_object();
} }
return ::djinni::get_cpp_proxy<DBEnumUsageInterfaceCppProxy>(cpp); return ::djinni::get_cpp_proxy<DBEnumUsageInterfaceCppProxy>(cpp);
} }
......
...@@ -14,14 +14,15 @@ namespace djinni_generated { ...@@ -14,14 +14,15 @@ namespace djinni_generated {
class ExternInterface2::ObjcProxy final class ExternInterface2::ObjcProxy final
: public ::ExternInterface2 : public ::ExternInterface2
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::ExternInterface2;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
::ExternRecordWithDerivings foo(const std::shared_ptr<::testsuite::TestHelpers> & c_i) override ::ExternRecordWithDerivings foo(const std::shared_ptr<::testsuite::TestHelpers> & c_i) override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() foo:(::djinni_generated::TestHelpers::fromCpp(c_i))]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() foo:(::djinni_generated::TestHelpers::fromCpp(c_i))];
return ::djinni_generated::ExternRecordWithDerivings::toCpp(objcpp_result_); return ::djinni_generated::ExternRecordWithDerivings::toCpp(objcpp_result_);
} }
} }
...@@ -44,7 +45,7 @@ auto ExternInterface2::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -44,7 +45,7 @@ auto ExternInterface2::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get(); return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -12,14 +12,15 @@ namespace djinni_generated { ...@@ -12,14 +12,15 @@ namespace djinni_generated {
class FirstListener::ObjcProxy final class FirstListener::ObjcProxy final
: public ::testsuite::FirstListener : public ::testsuite::FirstListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::FirstListener;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
void first() override void first() override
{ {
@autoreleasepool { @autoreleasepool {
[Handle::get() first]; [djinni_private_get_proxied_objc_object() first];
} }
} }
}; };
...@@ -41,7 +42,7 @@ auto FirstListener::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -41,7 +42,7 @@ auto FirstListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get(); return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -12,10 +12,11 @@ namespace djinni_generated { ...@@ -12,10 +12,11 @@ namespace djinni_generated {
class ObjcOnlyListener::ObjcProxy final class ObjcOnlyListener::ObjcProxy final
: public ::testsuite::ObjcOnlyListener : public ::testsuite::ObjcOnlyListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::ObjcOnlyListener;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
}; };
} // namespace djinni_generated } // namespace djinni_generated
...@@ -35,7 +36,7 @@ auto ObjcOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -35,7 +36,7 @@ auto ObjcOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get(); return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -12,14 +12,15 @@ namespace djinni_generated { ...@@ -12,14 +12,15 @@ namespace djinni_generated {
class SecondListener::ObjcProxy final class SecondListener::ObjcProxy final
: public ::testsuite::SecondListener : public ::testsuite::SecondListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::SecondListener;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
void second() override void second() override
{ {
@autoreleasepool { @autoreleasepool {
[Handle::get() second]; [djinni_private_get_proxied_objc_object() second];
} }
} }
}; };
...@@ -41,7 +42,7 @@ auto SecondListener::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -41,7 +42,7 @@ auto SecondListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get(); return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -42,14 +42,15 @@ namespace djinni_generated { ...@@ -42,14 +42,15 @@ namespace djinni_generated {
class UserToken::ObjcProxy final class UserToken::ObjcProxy final
: public ::testsuite::UserToken : public ::testsuite::UserToken
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::UserToken;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
std::string whoami() override std::string whoami() override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() whoami]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() whoami];
return ::djinni::String::toCpp(objcpp_result_); return ::djinni::String::toCpp(objcpp_result_);
} }
} }
...@@ -76,7 +77,7 @@ auto UserToken::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -76,7 +77,7 @@ auto UserToken::fromCppOpt(const CppOptType& cpp) -> ObjcType
return nil; return nil;
} }
if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get())) { if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get())) {
return cppPtr->Handle::get(); return cppPtr->djinni_private_get_proxied_objc_object();
} }
return ::djinni::get_cpp_proxy<DBUserTokenCppProxy>(cpp); return ::djinni::get_cpp_proxy<DBUserTokenCppProxy>(cpp);
} }
......
...@@ -62,33 +62,34 @@ namespace djinni_generated { ...@@ -62,33 +62,34 @@ namespace djinni_generated {
class UsesSingleLanguageListeners::ObjcProxy final class UsesSingleLanguageListeners::ObjcProxy final
: public ::testsuite::UsesSingleLanguageListeners : public ::testsuite::UsesSingleLanguageListeners
, public ::djinni::ObjcProxyCache::Handle<ObjcType> , private ::djinni::ObjcProxyBase<ObjcType>
{ {
friend class ::djinni_generated::UsesSingleLanguageListeners;
public: public:
using Handle::Handle; using ObjcProxyBase::ObjcProxyBase;
void callForObjC(const std::shared_ptr<::testsuite::ObjcOnlyListener> & c_l) override void callForObjC(const std::shared_ptr<::testsuite::ObjcOnlyListener> & c_l) override
{ {
@autoreleasepool { @autoreleasepool {
[Handle::get() callForObjC:(::djinni_generated::ObjcOnlyListener::fromCpp(c_l))]; [djinni_private_get_proxied_objc_object() callForObjC:(::djinni_generated::ObjcOnlyListener::fromCpp(c_l))];
} }
} }
std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() returnForObjC]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() returnForObjC];
return ::djinni_generated::ObjcOnlyListener::toCpp(objcpp_result_); return ::djinni_generated::ObjcOnlyListener::toCpp(objcpp_result_);
} }
} }
void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) override void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) override
{ {
@autoreleasepool { @autoreleasepool {
[Handle::get() callForJava:(::djinni_generated::JavaOnlyListener::fromCpp(c_l))]; [djinni_private_get_proxied_objc_object() callForJava:(::djinni_generated::JavaOnlyListener::fromCpp(c_l))];
} }
} }
std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override
{ {
@autoreleasepool { @autoreleasepool {
auto objcpp_result_ = [Handle::get() returnForJava]; auto objcpp_result_ = [djinni_private_get_proxied_objc_object() returnForJava];
return ::djinni_generated::JavaOnlyListener::toCpp(objcpp_result_); return ::djinni_generated::JavaOnlyListener::toCpp(objcpp_result_);
} }
} }
...@@ -115,7 +116,7 @@ auto UsesSingleLanguageListeners::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -115,7 +116,7 @@ auto UsesSingleLanguageListeners::fromCppOpt(const CppOptType& cpp) -> ObjcType
return nil; return nil;
} }
if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get())) { if (auto cppPtr = dynamic_cast<ObjcProxy*>(cpp.get())) {
return cppPtr->Handle::get(); return cppPtr->djinni_private_get_proxied_objc_object();
} }
return ::djinni::get_cpp_proxy<DBUsesSingleLanguageListenersCppProxy>(cpp); return ::djinni::get_cpp_proxy<DBUsesSingleLanguageListenersCppProxy>(cpp);
} }
......
...@@ -553,7 +553,7 @@ public: ...@@ -553,7 +553,7 @@ public:
template <class T> template <class T>
class optional<T&&> class optional<T&&>
{ {
static_assert( sizeof(T) == 0, "optional rvalue referencs disallowed" ); static_assert( sizeof(T) == 0, "optional rvalue references disallowed" );
}; };
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string> <string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>Dropbox.${PRODUCT_NAME:rfc1034identifier}</string> <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
......
...@@ -819,7 +819,7 @@ ...@@ -819,7 +819,7 @@
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
CLASSPREFIX = ""; CLASSPREFIX = "";
LastUpgradeCheck = 0510; LastUpgradeCheck = 0820;
ORGANIZATIONNAME = "Dropbox, Inc"; ORGANIZATIONNAME = "Dropbox, Inc";
}; };
buildConfigurationList = 65868B451989FE4200D60EEE /* Build configuration list for PBXProject "DjinniObjcTest" */; buildConfigurationList = 65868B451989FE4200D60EEE /* Build configuration list for PBXProject "DjinniObjcTest" */;
...@@ -1022,12 +1022,18 @@ ...@@ -1022,12 +1022,18 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0; GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1", "DEBUG=1",
...@@ -1047,7 +1053,7 @@ ...@@ -1047,7 +1053,7 @@
"$(SRCROOT)/DjinniObjcTest/objc", "$(SRCROOT)/DjinniObjcTest/objc",
"$(SRCROOT)/DjinniObjcTest/cpp", "$(SRCROOT)/DjinniObjcTest/cpp",
); );
IPHONEOS_DEPLOYMENT_TARGET = 7.1; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
}; };
...@@ -1066,12 +1072,17 @@ ...@@ -1066,12 +1072,17 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES; GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
...@@ -1085,7 +1096,7 @@ ...@@ -1085,7 +1096,7 @@
"$(SRCROOT)/DjinniObjcTest/objc", "$(SRCROOT)/DjinniObjcTest/objc",
"$(SRCROOT)/DjinniObjcTest/cpp", "$(SRCROOT)/DjinniObjcTest/cpp",
); );
IPHONEOS_DEPLOYMENT_TARGET = 7.1; IPHONEOS_DEPLOYMENT_TARGET = 8.0;
SDKROOT = iphoneos; SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
...@@ -1127,7 +1138,6 @@ ...@@ -1127,7 +1138,6 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)", "$(inherited)",
"$(DEVELOPER_FRAMEWORKS_DIR)", "$(DEVELOPER_FRAMEWORKS_DIR)",
); );
...@@ -1138,6 +1148,7 @@ ...@@ -1138,6 +1148,7 @@
"$(inherited)", "$(inherited)",
); );
INFOPLIST_FILE = "../handwritten-src/objc/tests/DjinniObjcTestTests-Info.plist"; INFOPLIST_FILE = "../handwritten-src/objc/tests/DjinniObjcTestTests-Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = DjinniObjcTestTests; PRODUCT_NAME = DjinniObjcTestTests;
WARNING_CFLAGS = ( WARNING_CFLAGS = (
"-Wextra", "-Wextra",
...@@ -1151,13 +1162,13 @@ ...@@ -1151,13 +1162,13 @@
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)", "$(inherited)",
"$(DEVELOPER_FRAMEWORKS_DIR)", "$(DEVELOPER_FRAMEWORKS_DIR)",
); );
GCC_PRECOMPILE_PREFIX_HEADER = NO; GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = ""; GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = "../handwritten-src/objc/tests/DjinniObjcTestTests-Info.plist"; INFOPLIST_FILE = "../handwritten-src/objc/tests/DjinniObjcTestTests-Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = DjinniObjcTestTests; PRODUCT_NAME = DjinniObjcTestTests;
WARNING_CFLAGS = ( WARNING_CFLAGS = (
"-Wextra", "-Wextra",
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "0510" LastUpgradeVersion = "0820"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES">
buildConfiguration = "Debug">
<Testables> <Testables>
<TestableReference <TestableReference
skipped = "NO"> skipped = "NO">
...@@ -39,24 +39,36 @@ ...@@ -39,24 +39,36 @@
</BuildableReference> </BuildableReference>
</TestableReference> </TestableReference>
</Testables> </Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65868B491989FE4200D60EEE"
BuildableName = "libDjinniObjcTest.a"
BlueprintName = "DjinniObjcTest"
ReferencedContainer = "container:DjinniObjcTest.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions> <AdditionalOptions>
</AdditionalOptions> </AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES" shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment