Commit 3f9151c6 authored by Aleksey Konovalov's avatar Aleksey Konovalov

Merge branch 'master' into cpp_wide_strings_support

Conflicts:
	test-suite/objc/DjinniObjcTest.xcodeproj/project.pbxproj
parents bf31ef21 2a896c73
...@@ -428,7 +428,6 @@ Run `make test` to invoke the test suite, found in the test-suite subdirectory. ...@@ -428,7 +428,6 @@ Run `make test` to invoke the test suite, found in the test-suite subdirectory.
* [Slides](https://bit.ly/djinnitalk2) and [video](https://bit.ly/djinnivideo2) from the CppCon 2015 about Djinni implementatino techniques, and the addition of Python. * [Slides](https://bit.ly/djinnitalk2) and [video](https://bit.ly/djinnivideo2) from the CppCon 2015 about Djinni implementatino techniques, and the addition of Python.
* You can see a [CppCon 2014 talk](https://www.youtube.com/watch?v=5AZMEm3rZ2Y) by app developers at Dropbox about their cross-platform experiences. * You can see a [CppCon 2014 talk](https://www.youtube.com/watch?v=5AZMEm3rZ2Y) by app developers at Dropbox about their cross-platform experiences.
## Authors ## Authors
- Kannan Goundan - Kannan Goundan
- Tony Grue - Tony Grue
...@@ -439,5 +438,5 @@ Run `make test` to invoke the test suite, found in the test-suite subdirectory. ...@@ -439,5 +438,5 @@ Run `make test` to invoke the test suite, found in the test-suite subdirectory.
- Andrew Twyman - Andrew Twyman
## Contacts ## Contacts
- Jacob Potter - `djinni@j4cbo.com`
- Andrew Twyman - `atwyman@dropbox.com` - Andrew Twyman - `atwyman@dropbox.com`
- Jacob Potter - `djinni@j4cbo.com`
...@@ -35,11 +35,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -35,11 +35,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
def writeJniHppFile(name: String, origin: String, includes: Iterable[String], fwds: Iterable[String], f: IndentWriter => Unit, f2: IndentWriter => Unit = (w => {})) = def writeJniHppFile(name: String, origin: String, includes: Iterable[String], fwds: Iterable[String], f: IndentWriter => Unit, f2: IndentWriter => Unit = (w => {})) =
writeHppFileGeneric(spec.jniHeaderOutFolder.get, spec.jniNamespace, spec.jniFileIdentStyle)(name, origin, includes, fwds, f, f2) writeHppFileGeneric(spec.jniHeaderOutFolder.get, spec.jniNamespace, spec.jniFileIdentStyle)(name, origin, includes, fwds, f, f2)
class JNIRefs(name: String) { class JNIRefs(name: String, cppPrefixOverride: Option[String]=None) {
var jniHpp = mutable.TreeSet[String]() var jniHpp = mutable.TreeSet[String]()
var jniCpp = mutable.TreeSet[String]() var jniCpp = mutable.TreeSet[String]()
jniHpp.add("#include " + q(spec.jniIncludeCppPrefix + spec.cppFileIdentStyle(name) + "." + spec.cppHeaderExt)) val cppPrefix = cppPrefixOverride.getOrElse(spec.jniIncludeCppPrefix)
jniHpp.add("#include " + q(cppPrefix + spec.cppFileIdentStyle(name) + "." + spec.cppHeaderExt))
jniHpp.add("#include " + q(spec.jniBaseLibIncludePrefix + "djinni_support.hpp")) jniHpp.add("#include " + q(spec.jniBaseLibIncludePrefix + "djinni_support.hpp"))
spec.cppNnHeader match { spec.cppNnHeader match {
case Some(nnHdr) => jniHpp.add("#include " + nnHdr) case Some(nnHdr) => jniHpp.add("#include " + nnHdr)
...@@ -82,7 +83,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -82,7 +83,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
} }
override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: Record) { override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: Record) {
val refs = new JNIRefs(ident.name) val prefixOverride: Option[String] = if (r.ext.cpp) {
Some(spec.cppExtendedRecordIncludePrefix)
} else {
None
}
val refs = new JNIRefs(ident.name, prefixOverride)
r.fields.foreach(f => refs.find(f.ty)) r.fields.foreach(f => refs.find(f.ty))
val jniHelper = jniMarshal.helperClass(ident) val jniHelper = jniMarshal.helperClass(ident)
......
...@@ -58,7 +58,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) { ...@@ -58,7 +58,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
List(ImportRef(include(d.name))) List(ImportRef(include(d.name)))
case DInterface => case DInterface =>
val ext = d.body.asInstanceOf[Interface].ext val ext = d.body.asInstanceOf[Interface].ext
if (ext.cpp && !ext.objc) { if (!ext.objc) {
List(ImportRef("<Foundation/Foundation.h>"), DeclRef(s"@class ${typename(d.name, d.body)};", None)) List(ImportRef("<Foundation/Foundation.h>"), DeclRef(s"@class ${typename(d.name, d.body)};", None))
} }
else { else {
...@@ -119,7 +119,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) { ...@@ -119,7 +119,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
case DRecord => (idObjc.ty(d.name), true) case DRecord => (idObjc.ty(d.name), true)
case DInterface => case DInterface =>
val ext = d.body.asInstanceOf[Interface].ext val ext = d.body.asInstanceOf[Interface].ext
if (ext.cpp && !ext.objc) if (!ext.objc)
(idObjc.ty(d.name), true) (idObjc.ty(d.name), true)
else else
(s"id<${idObjc.ty(d.name)}>", false) (s"id<${idObjc.ty(d.name)}>", false)
......
...@@ -73,6 +73,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -73,6 +73,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
refs.privHeader.add("#include <memory>") refs.privHeader.add("#include <memory>")
refs.privHeader.add("!#include " + q(spec.objcppIncludeCppPrefix + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt)) refs.privHeader.add("!#include " + q(spec.objcppIncludeCppPrefix + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt))
refs.body.add("!#import " + q(spec.objcppIncludeObjcPrefix + headerName(ident))) refs.body.add("!#import " + q(spec.objcppIncludeObjcPrefix + headerName(ident)))
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(ident.name)))
spec.cppNnHeader match { spec.cppNnHeader match {
case Some(nnHdr) => refs.privHeader.add("#include " + nnHdr) case Some(nnHdr) => refs.privHeader.add("#include " + nnHdr)
...@@ -120,7 +121,6 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -120,7 +121,6 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
}) })
if (i.ext.cpp) { if (i.ext.cpp) {
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(ident.name)))
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJICppWrapperCache+Private.h")) refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJICppWrapperCache+Private.h"))
refs.body.add("#include <utility>") refs.body.add("#include <utility>")
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIError.h")) refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIError.h"))
...@@ -129,7 +129,10 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -129,7 +129,10 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
if (i.ext.objc) { if (i.ext.objc) {
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIObjcWrapperCache+Private.h")) refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIObjcWrapperCache+Private.h"))
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(ident.name))) }
if (!i.ext.cpp && !i.ext.objc) {
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIError.h"))
} }
writeObjcFile(privateBodyName(ident.name), origin, refs.body, w => { writeObjcFile(privateBodyName(ident.name), origin, refs.body, w => {
...@@ -249,7 +252,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -249,7 +252,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
// we don't have to do any casting at all, just access cppRef directly. // we don't have to do any casting at all, just access cppRef directly.
w.wl("return " + nnCheck("objc->_cppRefHandle.get()") + ";") w.wl("return " + nnCheck("objc->_cppRefHandle.get()") + ";")
//w.wl(s"return ${spec.cppNnCheckExpression.getOrElse("")}(objc->_cppRefHandle.get());") //w.wl(s"return ${spec.cppNnCheckExpression.getOrElse("")}(objc->_cppRefHandle.get());")
} else { } else if (i.ext.cpp || i.ext.objc) {
// ObjC only, or ObjC and C++. // ObjC only, or ObjC and C++.
if (i.ext.cpp) { if (i.ext.cpp) {
// If it could be implemented in C++, we might have to unwrap a proxy object. // If it could be implemented in C++, we might have to unwrap a proxy object.
...@@ -260,6 +263,9 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -260,6 +263,9 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
} }
val getProxyExpr = s"::djinni::get_objc_proxy<ObjcProxy>(objc)" val getProxyExpr = s"::djinni::get_objc_proxy<ObjcProxy>(objc)"
w.wl(s"return ${nnCheck(getProxyExpr)};") w.wl(s"return ${nnCheck(getProxyExpr)};")
} else {
// Neither ObjC nor C++. Unusable, but generate compilable code.
w.wl("DJINNI_UNIMPLEMENTED(@\"Interface not implementable in any language.\");")
} }
} }
w.wl w.wl
...@@ -272,7 +278,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -272,7 +278,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
// 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).Handle::get();")
} else { } 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.
...@@ -281,6 +287,9 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) { ...@@ -281,6 +287,9 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
} }
} }
w.wl(s"return ::djinni::get_cpp_proxy<$objcSelf>(cpp);") w.wl(s"return ::djinni::get_cpp_proxy<$objcSelf>(cpp);")
} else {
// Neither ObjC nor C++. Unusable, but generate compilable code.
w.wl("DJINNI_UNIMPLEMENTED(@\"Interface not implementable in any language.\");")
} }
} }
}) })
......
...@@ -174,7 +174,7 @@ namespace djinni ...@@ -174,7 +174,7 @@ namespace djinni
static LocalRef<JniType> fromCpp(JNIEnv* jniEnv, const CppType& c) static LocalRef<JniType> fromCpp(JNIEnv* jniEnv, const CppType& c)
{ {
return {jniEnv, jniStringFromUTF8(jniEnv, c.c_str())}; return {jniEnv, jniStringFromUTF8(jniEnv, c)};
} }
}; };
...@@ -249,7 +249,7 @@ namespace djinni ...@@ -249,7 +249,7 @@ namespace djinni
// Using .data() on an empty vector is UB // Using .data() on an empty vector is UB
if(!c.empty()) if(!c.empty())
{ {
jniEnv->SetByteArrayRegion(j.get(), 0, c.size(), reinterpret_cast<const jbyte*>(c.data())); jniEnv->SetByteArrayRegion(j.get(), 0, jsize(c.size()), reinterpret_cast<const jbyte*>(c.data()));
} }
return j; return j;
} }
......
...@@ -366,7 +366,7 @@ jstring jniStringFromUTF8(JNIEnv * env, const std::string & str) { ...@@ -366,7 +366,7 @@ jstring jniStringFromUTF8(JNIEnv * env, const std::string & str) {
utf16_encode(utf8_decode(str, i), utf16); utf16_encode(utf8_decode(str, i), utf16);
jstring res = env->NewString( jstring res = env->NewString(
reinterpret_cast<const jchar *>(utf16.data()), utf16.length()); reinterpret_cast<const jchar *>(utf16.data()), jsize(utf16.length()));
DJINNI_ASSERT(res, env); DJINNI_ASSERT(res, env);
return res; return res;
} }
......
...@@ -18,11 +18,17 @@ ...@@ -18,11 +18,17 @@
namespace djinni { namespace djinni {
// Throws an exception for an unimplemented method call.
[[noreturn]] void throwUnimplemented(const char * ctx, NSString * msg);
// Helper function for exception translation. Do not call directly! // Helper function for exception translation. Do not call directly!
[[noreturn]] void throwNSExceptionFromCurrent(const char * ctx); [[noreturn]] void throwNSExceptionFromCurrent(const char * ctx);
} // namespace djinni } // namespace djinni
#define DJINNI_UNIMPLEMENTED(msg) \
::djinni::throwUnimplemented(__PRETTY_FUNCTION__, msg);
#define DJINNI_TRANSLATE_EXCEPTIONS() \ #define DJINNI_TRANSLATE_EXCEPTIONS() \
catch (const std::exception & e) { \ catch (const std::exception & e) { \
::djinni::throwNSExceptionFromCurrent(__PRETTY_FUNCTION__); \ ::djinni::throwNSExceptionFromCurrent(__PRETTY_FUNCTION__); \
......
...@@ -21,6 +21,11 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -21,6 +21,11 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
namespace djinni { namespace djinni {
[[noreturn]] __attribute__((weak)) void throwUnimplemented(const char * /*ctx*/, NSString * message) {
[NSException raise:NSInternalInconsistencyException format:@"Unimplemented: %@", message];
__builtin_unreachable();
}
[[noreturn]] __attribute__((weak)) void throwNSExceptionFromCurrent(const char * /*ctx*/) { [[noreturn]] __attribute__((weak)) void throwNSExceptionFromCurrent(const char * /*ctx*/) {
try { try {
throw; throw;
......
...@@ -5,5 +5,7 @@ java_only_listener = interface +j {} ...@@ -5,5 +5,7 @@ java_only_listener = interface +j {}
# on references to interfaces they don't need. # on references to interfaces they don't need.
uses_single_language_listeners = interface +o +j +c { uses_single_language_listeners = interface +o +j +c {
callForObjC(l: objc_only_listener); callForObjC(l: objc_only_listener);
returnForObjC(): objc_only_listener;
callForJava(l: java_only_listener); callForJava(l: java_only_listener);
returnForJava(): java_only_listener;
} }
...@@ -20,7 +20,11 @@ public: ...@@ -20,7 +20,11 @@ public:
virtual void callForObjC(const std::shared_ptr<ObjcOnlyListener> & l) = 0; virtual void callForObjC(const std::shared_ptr<ObjcOnlyListener> & l) = 0;
virtual std::shared_ptr<ObjcOnlyListener> returnForObjC() = 0;
virtual void callForJava(const std::shared_ptr<JavaOnlyListener> & l) = 0; virtual void callForJava(const std::shared_ptr<JavaOnlyListener> & l) = 0;
virtual std::shared_ptr<JavaOnlyListener> returnForJava() = 0;
}; };
} // namespace testsuite } // namespace testsuite
...@@ -14,8 +14,14 @@ import javax.annotation.Nonnull; ...@@ -14,8 +14,14 @@ import javax.annotation.Nonnull;
public abstract class UsesSingleLanguageListeners { public abstract class UsesSingleLanguageListeners {
public abstract void callForObjC(@CheckForNull ObjcOnlyListener l); public abstract void callForObjC(@CheckForNull ObjcOnlyListener l);
@CheckForNull
public abstract ObjcOnlyListener returnForObjC();
public abstract void callForJava(@CheckForNull JavaOnlyListener l); public abstract void callForJava(@CheckForNull JavaOnlyListener l);
@CheckForNull
public abstract JavaOnlyListener returnForJava();
private static final class CppProxy extends UsesSingleLanguageListeners private static final class CppProxy extends UsesSingleLanguageListeners
{ {
private final long nativeRef; private final long nativeRef;
...@@ -47,6 +53,14 @@ public abstract class UsesSingleLanguageListeners { ...@@ -47,6 +53,14 @@ public abstract class UsesSingleLanguageListeners {
} }
private native void native_callForObjC(long _nativeRef, ObjcOnlyListener l); private native void native_callForObjC(long _nativeRef, ObjcOnlyListener l);
@Override
public ObjcOnlyListener returnForObjC()
{
assert !this.destroyed.get() : "trying to use a destroyed object";
return native_returnForObjC(this.nativeRef);
}
private native ObjcOnlyListener native_returnForObjC(long _nativeRef);
@Override @Override
public void callForJava(JavaOnlyListener l) public void callForJava(JavaOnlyListener l)
{ {
...@@ -54,5 +68,13 @@ public abstract class UsesSingleLanguageListeners { ...@@ -54,5 +68,13 @@ public abstract class UsesSingleLanguageListeners {
native_callForJava(this.nativeRef, l); native_callForJava(this.nativeRef, l);
} }
private native void native_callForJava(long _nativeRef, JavaOnlyListener l); private native void native_callForJava(long _nativeRef, JavaOnlyListener l);
@Override
public JavaOnlyListener returnForJava()
{
assert !this.destroyed.get() : "trying to use a destroyed object";
return native_returnForJava(this.nativeRef);
}
private native JavaOnlyListener native_returnForJava(long _nativeRef);
} }
} }
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
#pragma once #pragma once
#include "../../handwritten-src/cpp/extended_record.hpp"
#include "djinni_support.hpp" #include "djinni_support.hpp"
#include "extended_record.hpp"
namespace djinni_generated { namespace djinni_generated {
......
...@@ -23,6 +23,14 @@ void NativeUsesSingleLanguageListeners::JavaProxy::callForObjC(const std::shared ...@@ -23,6 +23,14 @@ void NativeUsesSingleLanguageListeners::JavaProxy::callForObjC(const std::shared
::djinni::get(::djinni_generated::NativeObjcOnlyListener::fromCpp(jniEnv, c_l))); ::djinni::get(::djinni_generated::NativeObjcOnlyListener::fromCpp(jniEnv, c_l)));
::djinni::jniExceptionCheck(jniEnv); ::djinni::jniExceptionCheck(jniEnv);
} }
std::shared_ptr<::testsuite::ObjcOnlyListener> NativeUsesSingleLanguageListeners::JavaProxy::returnForObjC() {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeUsesSingleLanguageListeners>::get();
auto jret = jniEnv->CallObjectMethod(Handle::get().get(), data.method_returnForObjC);
::djinni::jniExceptionCheck(jniEnv);
return ::djinni_generated::NativeObjcOnlyListener::toCpp(jniEnv, jret);
}
void NativeUsesSingleLanguageListeners::JavaProxy::callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) { void NativeUsesSingleLanguageListeners::JavaProxy::callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) {
auto jniEnv = ::djinni::jniGetThreadEnv(); auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10); ::djinni::JniLocalScope jscope(jniEnv, 10);
...@@ -31,6 +39,14 @@ void NativeUsesSingleLanguageListeners::JavaProxy::callForJava(const std::shared ...@@ -31,6 +39,14 @@ void NativeUsesSingleLanguageListeners::JavaProxy::callForJava(const std::shared
::djinni::get(::djinni_generated::NativeJavaOnlyListener::fromCpp(jniEnv, c_l))); ::djinni::get(::djinni_generated::NativeJavaOnlyListener::fromCpp(jniEnv, c_l)));
::djinni::jniExceptionCheck(jniEnv); ::djinni::jniExceptionCheck(jniEnv);
} }
std::shared_ptr<::testsuite::JavaOnlyListener> NativeUsesSingleLanguageListeners::JavaProxy::returnForJava() {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeUsesSingleLanguageListeners>::get();
auto jret = jniEnv->CallObjectMethod(Handle::get().get(), data.method_returnForJava);
::djinni::jniExceptionCheck(jniEnv);
return ::djinni_generated::NativeJavaOnlyListener::toCpp(jniEnv, jret);
}
CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_nativeDestroy(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef) CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_nativeDestroy(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef)
{ {
...@@ -49,6 +65,16 @@ CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners ...@@ -49,6 +65,16 @@ CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, )
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1returnForObjC(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef)
{
try {
DJINNI_FUNCTION_PROLOGUE1(jniEnv, nativeRef);
const auto& ref = ::djinni::objectFromHandleAddress<::testsuite::UsesSingleLanguageListeners>(nativeRef);
auto r = ref->returnForObjC();
return ::djinni::release(::djinni_generated::NativeObjcOnlyListener::fromCpp(jniEnv, r));
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
}
CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1callForJava(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef, jobject j_l) CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1callForJava(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef, jobject j_l)
{ {
try { try {
...@@ -58,4 +84,14 @@ CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners ...@@ -58,4 +84,14 @@ CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, )
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1returnForJava(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef)
{
try {
DJINNI_FUNCTION_PROLOGUE1(jniEnv, nativeRef);
const auto& ref = ::djinni::objectFromHandleAddress<::testsuite::UsesSingleLanguageListeners>(nativeRef);
auto r = ref->returnForJava();
return ::djinni::release(::djinni_generated::NativeJavaOnlyListener::fromCpp(jniEnv, r));
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
}
} // namespace djinni_generated } // namespace djinni_generated
...@@ -34,7 +34,9 @@ private: ...@@ -34,7 +34,9 @@ private:
~JavaProxy(); ~JavaProxy();
void callForObjC(const std::shared_ptr<::testsuite::ObjcOnlyListener> & l) override; void callForObjC(const std::shared_ptr<::testsuite::ObjcOnlyListener> & l) override;
std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override;
void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & l) override; void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & l) override;
std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override;
private: private:
friend ::djinni::JniInterface<::testsuite::UsesSingleLanguageListeners, ::djinni_generated::NativeUsesSingleLanguageListeners>; friend ::djinni::JniInterface<::testsuite::UsesSingleLanguageListeners, ::djinni_generated::NativeUsesSingleLanguageListeners>;
...@@ -42,7 +44,9 @@ private: ...@@ -42,7 +44,9 @@ private:
const ::djinni::GlobalRef<jclass> clazz { ::djinni::jniFindClass("com/dropbox/djinni/test/UsesSingleLanguageListeners") }; const ::djinni::GlobalRef<jclass> clazz { ::djinni::jniFindClass("com/dropbox/djinni/test/UsesSingleLanguageListeners") };
const jmethodID method_callForObjC { ::djinni::jniGetMethodID(clazz.get(), "callForObjC", "(Lcom/dropbox/djinni/test/ObjcOnlyListener;)V") }; const jmethodID method_callForObjC { ::djinni::jniGetMethodID(clazz.get(), "callForObjC", "(Lcom/dropbox/djinni/test/ObjcOnlyListener;)V") };
const jmethodID method_returnForObjC { ::djinni::jniGetMethodID(clazz.get(), "returnForObjC", "()Lcom/dropbox/djinni/test/ObjcOnlyListener;") };
const jmethodID method_callForJava { ::djinni::jniGetMethodID(clazz.get(), "callForJava", "(Lcom/dropbox/djinni/test/JavaOnlyListener;)V") }; const jmethodID method_callForJava { ::djinni::jniGetMethodID(clazz.get(), "callForJava", "(Lcom/dropbox/djinni/test/JavaOnlyListener;)V") };
const jmethodID method_returnForJava { ::djinni::jniGetMethodID(clazz.get(), "returnForJava", "()Lcom/dropbox/djinni/test/JavaOnlyListener;") };
}; };
} // namespace djinni_generated } // namespace djinni_generated
// AUTOGENERATED FILE - DO NOT MODIFY! // AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from single_language_interfaces.djinni // This file generated by Djinni from single_language_interfaces.djinni
#import "DBJavaOnlyListener+Private.h"
#import "DBJavaOnlyListener.h" #import "DBJavaOnlyListener.h"
#import "DJIError.h"
static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file"); static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file");
...@@ -12,7 +14,7 @@ auto JavaOnlyListener::toCpp(ObjcType objc) -> CppType ...@@ -12,7 +14,7 @@ auto JavaOnlyListener::toCpp(ObjcType objc) -> CppType
if (!objc) { if (!objc) {
return nullptr; return nullptr;
} }
return ::djinni::get_objc_proxy<ObjcProxy>(objc); DJINNI_UNIMPLEMENTED(@"Interface not implementable in any language.");
} }
auto JavaOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType auto JavaOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
...@@ -20,7 +22,7 @@ auto JavaOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType ...@@ -20,7 +22,7 @@ auto JavaOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) { if (!cpp) {
return nil; return nil;
} }
return ::djinni::get_cpp_proxy<DBJavaOnlyListener>(cpp); DJINNI_UNIMPLEMENTED(@"Interface not implementable in any language.");
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -37,12 +37,26 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -37,12 +37,26 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
- (void)callForJava:(nullable id<DBJavaOnlyListener>)l { - (nullable id<DBObjcOnlyListener>)returnForObjC {
try {
auto r = _cppRefHandle.get()->returnForObjC();
return ::djinni_generated::ObjcOnlyListener::fromCpp(r);
} DJINNI_TRANSLATE_EXCEPTIONS()
}
- (void)callForJava:(nullable DBJavaOnlyListener *)l {
try { try {
_cppRefHandle.get()->callForJava(::djinni_generated::JavaOnlyListener::toCpp(l)); _cppRefHandle.get()->callForJava(::djinni_generated::JavaOnlyListener::toCpp(l));
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
- (nullable DBJavaOnlyListener *)returnForJava {
try {
auto r = _cppRefHandle.get()->returnForJava();
return ::djinni_generated::JavaOnlyListener::fromCpp(r);
} DJINNI_TRANSLATE_EXCEPTIONS()
}
namespace djinni_generated { namespace djinni_generated {
class UsesSingleLanguageListeners::ObjcProxy final class UsesSingleLanguageListeners::ObjcProxy final
...@@ -57,12 +71,26 @@ public: ...@@ -57,12 +71,26 @@ public:
[Handle::get() callForObjC:(::djinni_generated::ObjcOnlyListener::fromCpp(c_l))]; [Handle::get() callForObjC:(::djinni_generated::ObjcOnlyListener::fromCpp(c_l))];
} }
} }
std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override
{
@autoreleasepool {
auto r = [Handle::get() returnForObjC];
return ::djinni_generated::ObjcOnlyListener::toCpp(r);
}
}
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))]; [Handle::get() callForJava:(::djinni_generated::JavaOnlyListener::fromCpp(c_l))];
} }
} }
std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override
{
@autoreleasepool {
auto r = [Handle::get() returnForJava];
return ::djinni_generated::JavaOnlyListener::toCpp(r);
}
}
}; };
} // namespace djinni_generated } // namespace djinni_generated
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// This file generated by Djinni from single_language_interfaces.djinni // This file generated by Djinni from single_language_interfaces.djinni
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@protocol DBJavaOnlyListener; @class DBJavaOnlyListener;
@protocol DBObjcOnlyListener; @protocol DBObjcOnlyListener;
...@@ -14,6 +14,10 @@ ...@@ -14,6 +14,10 @@
- (void)callForObjC:(nullable id<DBObjcOnlyListener>)l; - (void)callForObjC:(nullable id<DBObjcOnlyListener>)l;
- (void)callForJava:(nullable id<DBJavaOnlyListener>)l; - (nullable id<DBObjcOnlyListener>)returnForObjC;
- (void)callForJava:(nullable DBJavaOnlyListener *)l;
- (nullable DBJavaOnlyListener *)returnForJava;
@end @end
...@@ -76,7 +76,8 @@ bool TestHelpers::check_map_list_record(const MapListRecord & rec) { ...@@ -76,7 +76,8 @@ bool TestHelpers::check_map_list_record(const MapListRecord & rec) {
} }
static const std::string HELLO_WORLD = "Hello World!"; static const std::string HELLO_WORLD = "Hello World!";
static const std::string NON_ASCII = "Non-ASCII / 非 ASCII 字符"; static const std::string NON_ASCII("Non-ASCII /\0 非 ASCII 字符",
sizeof("Non-ASCII /\0 非 ASCII 字符")-1);
void TestHelpers::check_client_interface_ascii(const std::shared_ptr<ClientInterface> & i) { void TestHelpers::check_client_interface_ascii(const std::shared_ptr<ClientInterface> & i) {
ClientReturnedRecord cReturnedRecord = i->get_record(5, HELLO_WORLD, {}); ClientReturnedRecord cReturnedRecord = i->get_record(5, HELLO_WORLD, {});
......
...@@ -5,7 +5,7 @@ import javax.annotation.CheckForNull; ...@@ -5,7 +5,7 @@ import javax.annotation.CheckForNull;
public class ClientInterfaceImpl extends ClientInterface { public class ClientInterfaceImpl extends ClientInterface {
@Override @Override
public ClientReturnedRecord getRecord(long id, String utf8string, String misc) { public ClientReturnedRecord getRecord(long id, String utf8string, String misc) {
if (!utf8string.equals("Non-ASCII / 非 ASCII 字符") && !utf8string.equals("Hello World!")) { if (!utf8string.equals("Non-ASCII /\0 非 ASCII 字符") && !utf8string.equals("Hello World!")) {
throw new RuntimeException("Unexpected string. Check UTF-8?"); throw new RuntimeException("Unexpected string. Check UTF-8?");
} }
return new ClientReturnedRecord(id, utf8string, misc); return new ClientReturnedRecord(id, utf8string, misc);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#import "DBClientReturnedRecord+Private.h" #import "DBClientReturnedRecord+Private.h"
static NSString *DBHelloWorld = @"Hello World!"; static NSString *DBHelloWorld = @"Hello World!";
static NSString *DBNonAscii = @"Non-ASCII / 非 ASCII 字符"; static NSString *DBNonAscii = @"Non-ASCII /\0 非 ASCII 字符";
@implementation DBClientInterfaceImpl @implementation DBClientInterfaceImpl
......
FROM fedora:24
# Get Java 8 (64-bit)
RUN dnf install -y java-1.8.0-openjdk-devel
# Get other build utils
RUN dnf install -y cmake wget tar make gcc-c++
# Select Java 8
RUN echo 1 | update-alternatives --config java
RUN echo 1 | update-alternatives --config javac
# Get modern ant
RUN yum install -y ant
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.92-5.b14.fc24.x86_64
VOLUME /opt/djinni
CMD /opt/djinni/test-suite/java/docker/build_and_run_tests.sh
...@@ -77,6 +77,9 @@ ...@@ -77,6 +77,9 @@
B5D8FC371C23E2F40045ADCF /* DBConstantRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5D8FC351C23E2F40045ADCF /* DBConstantRecord+Private.mm */; }; B5D8FC371C23E2F40045ADCF /* DBConstantRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5D8FC351C23E2F40045ADCF /* DBConstantRecord+Private.mm */; };
B5E9C93B1C1F9D9D0073C123 /* reverse_client_interface_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5E9C9391C1F9D9D0073C123 /* reverse_client_interface_impl.cpp */; }; B5E9C93B1C1F9D9D0073C123 /* reverse_client_interface_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5E9C9391C1F9D9D0073C123 /* reverse_client_interface_impl.cpp */; };
B5E9C9401C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5E9C93F1C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm */; }; B5E9C9401C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5E9C93F1C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm */; };
B5F06AB11D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5F06AA81D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm */; };
B5F06AB21D499379005BE736 /* DBObjcOnlyListener+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5F06AAB1D499379005BE736 /* DBObjcOnlyListener+Private.mm */; };
B5F06AB31D499379005BE736 /* DBJavaOnlyListener+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5F06AAE1D499379005BE736 /* DBJavaOnlyListener+Private.mm */; };
CFAED8751B54291900E3B8A3 /* DBEmptyRecord.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFAED8721B54291900E3B8A3 /* DBEmptyRecord.mm */; }; CFAED8751B54291900E3B8A3 /* DBEmptyRecord.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFAED8721B54291900E3B8A3 /* DBEmptyRecord.mm */; };
CFAED8761B54291900E3B8A3 /* DBEmptyRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFAED8741B54291900E3B8A3 /* DBEmptyRecord+Private.mm */; }; CFAED8761B54291900E3B8A3 /* DBEmptyRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFAED8741B54291900E3B8A3 /* DBEmptyRecord+Private.mm */; };
CFC5D9D01B15105100BF2DF8 /* extern_record_with_derivings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFC5D9CE1B15105100BF2DF8 /* extern_record_with_derivings.cpp */; }; CFC5D9D01B15105100BF2DF8 /* extern_record_with_derivings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFC5D9CE1B15105100BF2DF8 /* extern_record_with_derivings.cpp */; };
...@@ -297,6 +300,18 @@ ...@@ -297,6 +300,18 @@
B5E9C93D1C1F9E9E0073C123 /* DBReverseClientInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBReverseClientInterface.h; sourceTree = "<group>"; }; B5E9C93D1C1F9E9E0073C123 /* DBReverseClientInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBReverseClientInterface.h; sourceTree = "<group>"; };
B5E9C93E1C1F9E9E0073C123 /* DBReverseClientInterface+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBReverseClientInterface+Private.h"; sourceTree = "<group>"; }; B5E9C93E1C1F9E9E0073C123 /* DBReverseClientInterface+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBReverseClientInterface+Private.h"; sourceTree = "<group>"; };
B5E9C93F1C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBReverseClientInterface+Private.mm"; sourceTree = "<group>"; }; B5E9C93F1C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBReverseClientInterface+Private.mm"; sourceTree = "<group>"; };
B5F06AA81D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBUsesSingleLanguageListeners+Private.mm"; sourceTree = "<group>"; };
B5F06AA91D499379005BE736 /* DBUsesSingleLanguageListeners+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBUsesSingleLanguageListeners+Private.h"; sourceTree = "<group>"; };
B5F06AAA1D499379005BE736 /* DBUsesSingleLanguageListeners.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBUsesSingleLanguageListeners.h; sourceTree = "<group>"; };
B5F06AAB1D499379005BE736 /* DBObjcOnlyListener+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBObjcOnlyListener+Private.mm"; sourceTree = "<group>"; };
B5F06AAC1D499379005BE736 /* DBObjcOnlyListener+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBObjcOnlyListener+Private.h"; sourceTree = "<group>"; };
B5F06AAD1D499379005BE736 /* DBObjcOnlyListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBObjcOnlyListener.h; sourceTree = "<group>"; };
B5F06AAE1D499379005BE736 /* DBJavaOnlyListener+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBJavaOnlyListener+Private.mm"; sourceTree = "<group>"; };
B5F06AAF1D499379005BE736 /* DBJavaOnlyListener+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBJavaOnlyListener+Private.h"; sourceTree = "<group>"; };
B5F06AB01D499379005BE736 /* DBJavaOnlyListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBJavaOnlyListener.h; sourceTree = "<group>"; };
B5F06AB41D49950C005BE736 /* uses_single_language_listeners.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = uses_single_language_listeners.hpp; sourceTree = "<group>"; };
B5F06AB51D49950C005BE736 /* objc_only_listener.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = objc_only_listener.hpp; sourceTree = "<group>"; };
B5F06AB61D49950C005BE736 /* java_only_listener.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = java_only_listener.hpp; sourceTree = "<group>"; };
CFAED8711B54291900E3B8A3 /* DBEmptyRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBEmptyRecord.h; sourceTree = "<group>"; }; CFAED8711B54291900E3B8A3 /* DBEmptyRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBEmptyRecord.h; sourceTree = "<group>"; };
CFAED8721B54291900E3B8A3 /* DBEmptyRecord.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBEmptyRecord.mm; sourceTree = "<group>"; }; CFAED8721B54291900E3B8A3 /* DBEmptyRecord.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBEmptyRecord.mm; sourceTree = "<group>"; };
CFAED8731B54291900E3B8A3 /* DBEmptyRecord+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBEmptyRecord+Private.h"; sourceTree = "<group>"; }; CFAED8731B54291900E3B8A3 /* DBEmptyRecord+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBEmptyRecord+Private.h"; sourceTree = "<group>"; };
...@@ -478,6 +493,15 @@ ...@@ -478,6 +493,15 @@
728E11181D37DE0B005A554D /* DBWcharTestRec.mm */, 728E11181D37DE0B005A554D /* DBWcharTestRec.mm */,
728E11191D37DE0B005A554D /* DBWcharTestRec+Private.h */, 728E11191D37DE0B005A554D /* DBWcharTestRec+Private.h */,
728E111A1D37DE0B005A554D /* DBWcharTestRec+Private.mm */, 728E111A1D37DE0B005A554D /* DBWcharTestRec+Private.mm */,
B5F06AA81D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm */,
B5F06AA91D499379005BE736 /* DBUsesSingleLanguageListeners+Private.h */,
B5F06AAA1D499379005BE736 /* DBUsesSingleLanguageListeners.h */,
B5F06AAB1D499379005BE736 /* DBObjcOnlyListener+Private.mm */,
B5F06AAC1D499379005BE736 /* DBObjcOnlyListener+Private.h */,
B5F06AAD1D499379005BE736 /* DBObjcOnlyListener.h */,
B5F06AAE1D499379005BE736 /* DBJavaOnlyListener+Private.mm */,
B5F06AAF1D499379005BE736 /* DBJavaOnlyListener+Private.h */,
B5F06AB01D499379005BE736 /* DBJavaOnlyListener.h */,
B5D8FC321C23E2F40045ADCF /* DBConstantRecord.h */, B5D8FC321C23E2F40045ADCF /* DBConstantRecord.h */,
B5D8FC331C23E2F40045ADCF /* DBConstantRecord.mm */, B5D8FC331C23E2F40045ADCF /* DBConstantRecord.mm */,
B5D8FC341C23E2F40045ADCF /* DBConstantRecord+Private.h */, B5D8FC341C23E2F40045ADCF /* DBConstantRecord+Private.h */,
...@@ -600,6 +624,9 @@ ...@@ -600,6 +624,9 @@
children = ( children = (
728E11121D37DDFB005A554D /* wchar_test_helpers.hpp */, 728E11121D37DDFB005A554D /* wchar_test_helpers.hpp */,
728E11131D37DDFB005A554D /* wchar_test_rec.hpp */, 728E11131D37DDFB005A554D /* wchar_test_rec.hpp */,
B5F06AB41D49950C005BE736 /* uses_single_language_listeners.hpp */,
B5F06AB51D49950C005BE736 /* objc_only_listener.hpp */,
B5F06AB61D49950C005BE736 /* java_only_listener.hpp */,
B5D8FC381C23E30D0045ADCF /* constant_record.hpp */, B5D8FC381C23E30D0045ADCF /* constant_record.hpp */,
B5E9C93C1C1F9DCA0073C123 /* reverse_client_interface.hpp */, B5E9C93C1C1F9DCA0073C123 /* reverse_client_interface.hpp */,
A209B57B1BBA2A180070C310 /* opt_color_record.hpp */, A209B57B1BBA2A180070C310 /* opt_color_record.hpp */,
...@@ -735,6 +762,7 @@ ...@@ -735,6 +762,7 @@
655168421C404B81003682A4 /* DBFirstListener+Private.mm in Sources */, 655168421C404B81003682A4 /* DBFirstListener+Private.mm in Sources */,
A24850271AF96EBC00AFE907 /* DBClientReturnedRecord.mm in Sources */, A24850271AF96EBC00AFE907 /* DBClientReturnedRecord.mm in Sources */,
CFC5D9D61B15106400BF2DF8 /* DBExternRecordWithDerivings.mm in Sources */, CFC5D9D61B15106400BF2DF8 /* DBExternRecordWithDerivings.mm in Sources */,
B5F06AB31D499379005BE736 /* DBJavaOnlyListener+Private.mm in Sources */,
CFC5DA0E1B15330000BF2DF8 /* record_with_duration_and_derivings.cpp in Sources */, CFC5DA0E1B15330000BF2DF8 /* record_with_duration_and_derivings.cpp in Sources */,
A238CA941AF84B7100CDDCE5 /* DBMapDateRecord+Private.mm in Sources */, A238CA941AF84B7100CDDCE5 /* DBMapDateRecord+Private.mm in Sources */,
CFFD588F1B019E79001E10B6 /* DBTestHelpers+Private.mm in Sources */, CFFD588F1B019E79001E10B6 /* DBTestHelpers+Private.mm in Sources */,
...@@ -758,10 +786,12 @@ ...@@ -758,10 +786,12 @@
A24249741AF192FC003BF8F0 /* constants.cpp in Sources */, A24249741AF192FC003BF8F0 /* constants.cpp in Sources */,
CFFD588B1B019E79001E10B6 /* DBClientInterface+Private.mm in Sources */, CFFD588B1B019E79001E10B6 /* DBClientInterface+Private.mm in Sources */,
B52DA5691B103F72005CE75F /* DBAssortedPrimitives.mm in Sources */, B52DA5691B103F72005CE75F /* DBAssortedPrimitives.mm in Sources */,
B5F06AB21D499379005BE736 /* DBObjcOnlyListener+Private.mm in Sources */,
A24850281AF96EBC00AFE907 /* DBConstants.mm in Sources */, A24850281AF96EBC00AFE907 /* DBConstants.mm in Sources */,
655168431C404B81003682A4 /* DBSecondListener+Private.mm in Sources */, 655168431C404B81003682A4 /* DBSecondListener+Private.mm in Sources */,
CFFD58B71B041BFD001E10B6 /* constants_interface.cpp in Sources */, CFFD58B71B041BFD001E10B6 /* constants_interface.cpp in Sources */,
CFAED8751B54291900E3B8A3 /* DBEmptyRecord.mm in Sources */, CFAED8751B54291900E3B8A3 /* DBEmptyRecord.mm in Sources */,
B5F06AB11D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm in Sources */,
A238CA9A1AF84B7100CDDCE5 /* DBNestedCollection+Private.mm in Sources */, A238CA9A1AF84B7100CDDCE5 /* DBNestedCollection+Private.mm in Sources */,
CFFD58911B019E79001E10B6 /* DBUserToken+Private.mm in Sources */, CFFD58911B019E79001E10B6 /* DBUserToken+Private.mm in Sources */,
A2CB54B419BA6E6000A9E600 /* DJIError.mm in Sources */, A2CB54B419BA6E6000A9E600 /* DJIError.mm in Sources */,
......
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