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
xcodebuild -workspace example/objc/TextSort.xcworkspace \
-scheme TextSort \
-configuration 'Debug' \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 6s,OS=10.1'
-sdk iphonesimulator
# this target implicitly depends on GypAndroid.mk since gradle will try to make it
example_android: GypAndroid.mk
......
......@@ -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
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
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-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: `""`).
......
......@@ -13,6 +13,7 @@
'DEAD_CODE_STRIPPING': 'YES',
'SKIP_INSTALL': 'YES',
'CLANG_ENABLE_OBJC_ARC': 'YES',
'IPHONEOS_DEPLOYMENT_TARGET': '8.0',
},
"conditions": [
['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:
header: '"MLB/MLBRecord1.h"'
# 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.
# 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.
boxed: 'MLBRecord1'
# Specifies whether the unboxed type is a pointer.
......
......@@ -13,14 +13,15 @@ namespace djinni_generated {
class TextboxListener::ObjcProxy final
: public ::textsort::TextboxListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::TextboxListener;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
void update(const ::textsort::ItemList & c_items) override
{
@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
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
......@@ -150,7 +150,7 @@
isa = PBXProject;
attributes = {
CLASSPREFIX = TXS;
LastUpgradeCheck = 0510;
LastUpgradeCheck = 0820;
ORGANIZATIONNAME = "Dropbox, Inc.";
};
buildConfigurationList = 65834DD819AC599E0061AD3F /* Build configuration list for PBXProject "TextSort" */;
......@@ -231,13 +231,19 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
......@@ -250,7 +256,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
......@@ -271,20 +277,25 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../support-lib/objc $(SRCROOT)/../generated-src/objc";
......@@ -301,6 +312,7 @@
GCC_PREFIX_HEADER = "TextSort/TextSort-Prefix.pch";
INFOPLIST_FILE = "TextSort/TextSort-Info.plist";
LIBRARY_SEARCH_PATHS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = 1;
WRAPPER_EXTENSION = app;
......@@ -316,6 +328,7 @@
GCC_PREFIX_HEADER = "TextSort/TextSort-Prefix.pch";
INFOPLIST_FILE = "TextSort/TextSort-Info.plist";
LIBRARY_SEARCH_PATHS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
TARGETED_DEVICE_FAMILY = 1;
WRAPPER_EXTENSION = app;
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0510"
LastUpgradeVersion = "0820"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
......@@ -23,10 +23,10 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
......@@ -38,17 +38,21 @@
ReferencedContainer = "container:TextSort.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65834DDC19AC599E0061AD3F"
......@@ -61,12 +65,13 @@
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65834DDC19AC599E0061AD3F"
......
......@@ -9,7 +9,7 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>Dropbox.${PRODUCT_NAME:rfc1034identifier}</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
......
......@@ -166,7 +166,7 @@ class YamlLexer implements FlexLexer {
/* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error",
"Unknown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
......@@ -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
* yypushback(int) and a match-all fallback rule) this method
......
......@@ -243,7 +243,7 @@ public class _DjinniLexer implements FlexLexer {
/* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error",
"Unknown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
......@@ -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
* yypushback(int) and a match-all fallback rule) this method
......
......@@ -208,17 +208,18 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
wrapNamespace(w, spec.objcppNamespace, w => {
w.wl(s"class $helperClass::ObjcProxy final")
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.wl(s"friend class ${objcppMarshal.helperClassWithNs(ident)};")
w.wlOutdent("public:")
w.wl("using Handle::Handle;")
w.wl("using ObjcProxyBase::ObjcProxyBase;")
for (m <- i.methods) {
val ret = cppMarshal.fqReturnType(m.ret)
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.w("@autoreleasepool").braced {
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))})"))
w.wl(";")
m.ret.fold()(ty => {
......@@ -284,13 +285,13 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
if (i.ext.objc && !i.ext.cpp) {
// 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.
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) {
// C++ only, or C++ and ObjC.
if (i.ext.objc) {
// 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.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);")
......
......@@ -53,6 +53,8 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
def helperClass(name: String) = idCpp.ty(name)
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 helperName(tm: MExpr): String = tm.base match {
......
......@@ -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
......@@ -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>
* 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,
* to minimize duplication of code and make it so the unordered_map is as contained as
......
{
"targets": [
{
"target_name": "djinni_jni",
"type": "static_library",
"sources": [
"djinni_common.hpp",
"jni/djinni_support.cpp",
"jni/djinni_support.hpp",
"jni/Marshal.hpp",
],
"include_dirs": [
"jni",
],
"direct_dependent_settings": {
"include_dirs": [
"jni",
],
},
"targets": [
{
"target_name": "djinni_jni",
"type": "static_library",
"sources": [
"djinni_common.hpp",
"jni/djinni_support.cpp",
"jni/djinni_support.hpp",
"jni/Marshal.hpp",
],
"include_dirs": [
"jni",
],
"direct_dependent_settings": {
"include_dirs": [
"jni",
],
},
},
{
"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",
"type": "static_library",
"xcode_settings": {
"CLANG_ENABLE_OBJC_ARC": "YES",
},
"sources": [
"objc/DJICppWrapperCache+Private.h",
"objc/DJIError.h",
"objc/DJIError.mm",
"objc/DJIMarshal+Private.h",
"objc/DJIObjcWrapperCache+Private.h",
"objc/DJIProxyCaches.mm",
"proxy_cache_impl.hpp",
"proxy_cache_interface.hpp",
],
"include_dirs": [
"objc",
],
"direct_dependent_settings": {
"include_dirs": [
"objc",
],
},
},
],
},
},
{
"target_name": "djinni_objc",
"type": "static_library",
"xcode_settings": {
"CLANG_ENABLE_OBJC_ARC": "YES",
},
"sources": [
"objc/DJICppWrapperCache+Private.h",
"objc/DJIError.h",
"objc/DJIError.mm",
"objc/DJIMarshal+Private.h",
"objc/DJIObjcWrapperCache+Private.h",
"objc/DJIProxyCaches.mm",
"proxy_cache_impl.hpp",
"proxy_cache_interface.hpp",
],
"include_dirs": [
"objc",
],
"direct_dependent_settings": {
"include_dirs": [
"objc",
],
},
},
],
}
......@@ -6,7 +6,7 @@ djinni:
./run_djinni.sh
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
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 "../djinni/vendor/third-party/date.djinni"
@extern "./vendor/third-party/date.yaml"
@import "./varnames.djinni"
@import "../djinni/varnames.djinni"
......@@ -14,46 +14,47 @@ namespace djinni_generated {
class ClientInterface::ObjcProxy final
: public ::testsuite::ClientInterface
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::ClientInterface;
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
{
@autoreleasepool {
auto objcpp_result_ = [Handle::get() getRecord:(::djinni::I64::fromCpp(c_record_id))
utf8string:(::djinni::String::fromCpp(c_utf8string))
misc:(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(c_misc))];
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() getRecord:(::djinni::I64::fromCpp(c_record_id))
utf8string:(::djinni::String::fromCpp(c_utf8string))
misc:(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(c_misc))];
return ::djinni_generated::ClientReturnedRecord::toCpp(objcpp_result_);
}
}
double identifier_check(const std::vector<uint8_t> & c_data, int32_t c_r, int64_t c_jret) override
{
@autoreleasepool {
auto objcpp_result_ = [Handle::get() identifierCheck:(::djinni::Binary::fromCpp(c_data))
r:(::djinni::I32::fromCpp(c_r))
jret:(::djinni::I64::fromCpp(c_jret))];
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() identifierCheck:(::djinni::Binary::fromCpp(c_data))
r:(::djinni::I32::fromCpp(c_r))
jret:(::djinni::I64::fromCpp(c_jret))];
return ::djinni::F64::toCpp(objcpp_result_);
}
}
std::string return_str() override
{
@autoreleasepool {
auto objcpp_result_ = [Handle::get() returnStr];
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() returnStr];
return ::djinni::String::toCpp(objcpp_result_);
}
}
std::string meth_taking_interface(const std::shared_ptr<::testsuite::ClientInterface> & c_i) override
{
@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_);
}
}
std::string meth_taking_optional_interface(const std::shared_ptr<::testsuite::ClientInterface> & c_i) override
{
@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_);
}
}
......@@ -76,7 +77,7 @@ auto ClientInterface::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
......@@ -71,42 +71,43 @@ namespace djinni_generated {
class EnumUsageInterface::ObjcProxy final
: public ::testsuite::EnumUsageInterface
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::EnumUsageInterface;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
::testsuite::color e(::testsuite::color c_e) override
{
@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_);
}
}
std::experimental::optional<::testsuite::color> o(std::experimental::optional<::testsuite::color> c_o) override
{
@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_);
}
}
std::vector<::testsuite::color> l(const std::vector<::testsuite::color> & c_l) override
{
@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_);
}
}
std::unordered_set<::testsuite::color> s(const std::unordered_set<::testsuite::color> & c_s) override
{
@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_);
}
}
std::unordered_map<::testsuite::color, ::testsuite::color> m(const std::unordered_map<::testsuite::color, ::testsuite::color> & c_m) override
{
@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_);
}
}
......@@ -133,7 +134,7 @@ auto EnumUsageInterface::fromCppOpt(const CppOptType& cpp) -> ObjcType
return nil;
}
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);
}
......
......@@ -14,14 +14,15 @@ namespace djinni_generated {
class ExternInterface2::ObjcProxy final
: public ::ExternInterface2
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::ExternInterface2;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
::ExternRecordWithDerivings foo(const std::shared_ptr<::testsuite::TestHelpers> & c_i) override
{
@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_);
}
}
......@@ -44,7 +45,7 @@ auto ExternInterface2::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
......@@ -12,14 +12,15 @@ namespace djinni_generated {
class FirstListener::ObjcProxy final
: public ::testsuite::FirstListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::FirstListener;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
void first() override
{
@autoreleasepool {
[Handle::get() first];
[djinni_private_get_proxied_objc_object() first];
}
}
};
......@@ -41,7 +42,7 @@ auto FirstListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
......@@ -12,10 +12,11 @@ namespace djinni_generated {
class ObjcOnlyListener::ObjcProxy final
: public ::testsuite::ObjcOnlyListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::ObjcOnlyListener;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
};
} // namespace djinni_generated
......@@ -35,7 +36,7 @@ auto ObjcOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
......@@ -12,14 +12,15 @@ namespace djinni_generated {
class SecondListener::ObjcProxy final
: public ::testsuite::SecondListener
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::SecondListener;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
void second() override
{
@autoreleasepool {
[Handle::get() second];
[djinni_private_get_proxied_objc_object() second];
}
}
};
......@@ -41,7 +42,7 @@ auto SecondListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) {
return nil;
}
return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();
return dynamic_cast<ObjcProxy&>(*cpp).djinni_private_get_proxied_objc_object();
}
} // namespace djinni_generated
......@@ -42,14 +42,15 @@ namespace djinni_generated {
class UserToken::ObjcProxy final
: public ::testsuite::UserToken
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::UserToken;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
std::string whoami() override
{
@autoreleasepool {
auto objcpp_result_ = [Handle::get() whoami];
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() whoami];
return ::djinni::String::toCpp(objcpp_result_);
}
}
......@@ -76,7 +77,7 @@ auto UserToken::fromCppOpt(const CppOptType& cpp) -> ObjcType
return nil;
}
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);
}
......
......@@ -62,33 +62,34 @@ namespace djinni_generated {
class UsesSingleLanguageListeners::ObjcProxy final
: public ::testsuite::UsesSingleLanguageListeners
, public ::djinni::ObjcProxyCache::Handle<ObjcType>
, private ::djinni::ObjcProxyBase<ObjcType>
{
friend class ::djinni_generated::UsesSingleLanguageListeners;
public:
using Handle::Handle;
using ObjcProxyBase::ObjcProxyBase;
void callForObjC(const std::shared_ptr<::testsuite::ObjcOnlyListener> & c_l) override
{
@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
{
@autoreleasepool {
auto objcpp_result_ = [Handle::get() returnForObjC];
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() returnForObjC];
return ::djinni_generated::ObjcOnlyListener::toCpp(objcpp_result_);
}
}
void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) override
{
@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
{
@autoreleasepool {
auto objcpp_result_ = [Handle::get() returnForJava];
auto objcpp_result_ = [djinni_private_get_proxied_objc_object() returnForJava];
return ::djinni_generated::JavaOnlyListener::toCpp(objcpp_result_);
}
}
......@@ -115,7 +116,7 @@ auto UsesSingleLanguageListeners::fromCppOpt(const CppOptType& cpp) -> ObjcType
return nil;
}
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);
}
......
......@@ -553,7 +553,7 @@ public:
template <class 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 @@
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>Dropbox.${PRODUCT_NAME:rfc1034identifier}</string>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
......
......@@ -819,7 +819,7 @@
isa = PBXProject;
attributes = {
CLASSPREFIX = "";
LastUpgradeCheck = 0510;
LastUpgradeCheck = 0820;
ORGANIZATIONNAME = "Dropbox, Inc";
};
buildConfigurationList = 65868B451989FE4200D60EEE /* Build configuration list for PBXProject "DjinniObjcTest" */;
......@@ -1022,12 +1022,18 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
......@@ -1047,7 +1053,7 @@
"$(SRCROOT)/DjinniObjcTest/objc",
"$(SRCROOT)/DjinniObjcTest/cpp",
);
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
......@@ -1066,12 +1072,17 @@
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
......@@ -1085,7 +1096,7 @@
"$(SRCROOT)/DjinniObjcTest/objc",
"$(SRCROOT)/DjinniObjcTest/cpp",
);
IPHONEOS_DEPLOYMENT_TARGET = 7.1;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
......@@ -1127,7 +1138,6 @@
isa = XCBuildConfiguration;
buildSettings = {
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
"$(DEVELOPER_FRAMEWORKS_DIR)",
);
......@@ -1138,6 +1148,7 @@
"$(inherited)",
);
INFOPLIST_FILE = "../handwritten-src/objc/tests/DjinniObjcTestTests-Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = DjinniObjcTestTests;
WARNING_CFLAGS = (
"-Wextra",
......@@ -1151,13 +1162,13 @@
isa = XCBuildConfiguration;
buildSettings = {
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
"$(DEVELOPER_FRAMEWORKS_DIR)",
);
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = "../handwritten-src/objc/tests/DjinniObjcTestTests-Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "Dropbox.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = DjinniObjcTestTests;
WARNING_CFLAGS = (
"-Wextra",
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0510"
LastUpgradeVersion = "0820"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
......@@ -23,10 +23,10 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
......@@ -39,24 +39,36 @@
</BuildableReference>
</TestableReference>
</Testables>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65868B491989FE4200D60EEE"
BuildableName = "libDjinniObjcTest.a"
BlueprintName = "DjinniObjcTest"
ReferencedContainer = "container:DjinniObjcTest.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
</ProfileAction>
<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