Commit 0fc73a73 authored by Jacob Potter's avatar Jacob Potter

Fix bad 'auto jret =' placement around return values that need a cast, and add test

parent 1af0fea6
...@@ -254,7 +254,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -254,7 +254,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
w.wl(s"auto jniEnv = ::djinni::jniGetThreadEnv();") w.wl(s"auto jniEnv = ::djinni::jniGetThreadEnv();")
w.wl(s"::djinni::JniLocalScope jscope(jniEnv, 10);") w.wl(s"::djinni::JniLocalScope jscope(jniEnv, 10);")
w.wl(s"const auto& data = ::djinni::JniClass<${withNs(Some(spec.jniNamespace), jniSelf)}>::get();") w.wl(s"const auto& data = ::djinni::JniClass<${withNs(Some(spec.jniNamespace), jniSelf)}>::get();")
val call = m.ret.fold("jniEnv->CallVoidMethod(")(r => toJniCall(r, (jt: String) => s"auto jret = jniEnv->Call${jt}Method(")) val call = m.ret.fold("jniEnv->CallVoidMethod(")(r => "auto jret = " + toJniCall(r, (jt: String) => s"jniEnv->Call${jt}Method("))
w.w(call) w.w(call)
val javaMethodName = idJava.method(m.ident) val javaMethodName = idJava.method(m.ident)
w.w(s"getGlobalRef(), data.method_$javaMethodName") w.w(s"getGlobalRef(), data.method_$javaMethodName")
...@@ -350,9 +350,9 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -350,9 +350,9 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
def toJniCall(ty: TypeRef, f: String => String): String = toJniCall(ty.resolved, f, false) def toJniCall(ty: TypeRef, f: String => String): String = toJniCall(ty.resolved, f, false)
def toJniCall(m: MExpr, f: String => String, needRef: Boolean): String = m.base match { def toJniCall(m: MExpr, f: String => String, needRef: Boolean): String = m.base match {
case p: MPrimitive => f(if (needRef) "Object" else IdentStyle.camelUpper(p.jName)) case p: MPrimitive => f(if (needRef) "Object" else IdentStyle.camelUpper(p.jName))
case MString => s"static_cast<jstring>(${f("Object")})" case MString => "(jstring)" + f("Object")
case MOptional => toJniCall(m.args.head, f, true) case MOptional => toJniCall(m.args.head, f, true)
case MBinary => s"static_cast<jbyteArray>(${f("Object")})" case MBinary => "(jbyteArray)" + f("Object")
case _ => f("Object") case _ => f("Object")
} }
......
...@@ -7,4 +7,5 @@ client_returned_record = record { ...@@ -7,4 +7,5 @@ client_returned_record = record {
client_interface = interface +j +o { client_interface = interface +j +o {
# Returns record of given string # Returns record of given string
get_record(record_id: i64, utf8string: string, misc: optional<string>): client_returned_record; get_record(record_id: i64, utf8string: string, misc: optional<string>): client_returned_record;
return_str(): string;
} }
...@@ -14,4 +14,6 @@ public: ...@@ -14,4 +14,6 @@ public:
/** Returns record of given string */ /** Returns record of given string */
virtual ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional<std::string> & misc) = 0; virtual ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional<std::string> & misc) = 0;
virtual std::string return_str() = 0;
}; };
...@@ -6,4 +6,6 @@ package com.dropbox.djinni.test; ...@@ -6,4 +6,6 @@ package com.dropbox.djinni.test;
public abstract class ClientInterface { public abstract class ClientInterface {
/** Returns record of given string */ /** Returns record of given string */
public abstract ClientReturnedRecord getRecord(long recordId, String utf8string, String misc); public abstract ClientReturnedRecord getRecord(long recordId, String utf8string, String misc);
public abstract String returnStr();
} }
...@@ -26,5 +26,13 @@ NativeClientInterface::JavaProxy::~JavaProxy() = default; ...@@ -26,5 +26,13 @@ NativeClientInterface::JavaProxy::~JavaProxy() = default;
::djinni::jniExceptionCheck(jniEnv); ::djinni::jniExceptionCheck(jniEnv);
return ::djinni_generated::NativeClientReturnedRecord::toCpp(jniEnv, jret); return ::djinni_generated::NativeClientReturnedRecord::toCpp(jniEnv, jret);
} }
std::string NativeClientInterface::JavaProxy::return_str() {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeClientInterface>::get();
auto jret = (jstring)jniEnv->CallObjectMethod(getGlobalRef(), data.method_returnStr);
::djinni::jniExceptionCheck(jniEnv);
return ::djinni::String::toCpp(jniEnv, jret);
}
} // namespace djinni_generated } // namespace djinni_generated
...@@ -32,6 +32,7 @@ private: ...@@ -32,6 +32,7 @@ private:
~JavaProxy(); ~JavaProxy();
::ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional<std::string> & misc) override; ::ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional<std::string> & misc) override;
std::string return_str() override;
private: private:
using ::djinni::JavaProxyCacheEntry::getGlobalRef; using ::djinni::JavaProxyCacheEntry::getGlobalRef;
...@@ -41,6 +42,7 @@ private: ...@@ -41,6 +42,7 @@ private:
const ::djinni::GlobalRef<jclass> clazz { ::djinni::jniFindClass("com/dropbox/djinni/test/ClientInterface") }; const ::djinni::GlobalRef<jclass> clazz { ::djinni::jniFindClass("com/dropbox/djinni/test/ClientInterface") };
const jmethodID method_getRecord { ::djinni::jniGetMethodID(clazz.get(), "getRecord", "(JLjava/lang/String;Ljava/lang/String;)Lcom/dropbox/djinni/test/ClientReturnedRecord;") }; const jmethodID method_getRecord { ::djinni::jniGetMethodID(clazz.get(), "getRecord", "(JLjava/lang/String;Ljava/lang/String;)Lcom/dropbox/djinni/test/ClientReturnedRecord;") };
const jmethodID method_returnStr { ::djinni::jniGetMethodID(clazz.get(), "returnStr", "()Ljava/lang/String;") };
}; };
} // namespace djinni_generated } // namespace djinni_generated
...@@ -24,8 +24,8 @@ auto NativeClientReturnedRecord::toCpp(JNIEnv* jniEnv, JniType j) -> CppType { ...@@ -24,8 +24,8 @@ auto NativeClientReturnedRecord::toCpp(JNIEnv* jniEnv, JniType j) -> CppType {
assert(j != nullptr); assert(j != nullptr);
const auto& data = ::djinni::JniClass<NativeClientReturnedRecord>::get(); const auto& data = ::djinni::JniClass<NativeClientReturnedRecord>::get();
return {::djinni::I64::toCpp(jniEnv, jniEnv->GetLongField(j, data.field_mRecordId)), return {::djinni::I64::toCpp(jniEnv, jniEnv->GetLongField(j, data.field_mRecordId)),
::djinni::String::toCpp(jniEnv, static_cast<jstring>(jniEnv->GetObjectField(j, data.field_mContent))), ::djinni::String::toCpp(jniEnv, (jstring)jniEnv->GetObjectField(j, data.field_mContent)),
::djinni::Optional<std::experimental::optional, ::djinni::String>::toCpp(jniEnv, static_cast<jstring>(jniEnv->GetObjectField(j, data.field_mMisc)))}; ::djinni::Optional<std::experimental::optional, ::djinni::String>::toCpp(jniEnv, (jstring)jniEnv->GetObjectField(j, data.field_mMisc))};
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -23,7 +23,7 @@ auto NativeConstants::toCpp(JNIEnv* jniEnv, JniType j) -> CppType { ...@@ -23,7 +23,7 @@ auto NativeConstants::toCpp(JNIEnv* jniEnv, JniType j) -> CppType {
assert(j != nullptr); assert(j != nullptr);
const auto& data = ::djinni::JniClass<NativeConstants>::get(); const auto& data = ::djinni::JniClass<NativeConstants>::get();
return {::djinni::I32::toCpp(jniEnv, jniEnv->GetIntField(j, data.field_mSomeInteger)), return {::djinni::I32::toCpp(jniEnv, jniEnv->GetIntField(j, data.field_mSomeInteger)),
::djinni::String::toCpp(jniEnv, static_cast<jstring>(jniEnv->GetObjectField(j, data.field_mSomeString)))}; ::djinni::String::toCpp(jniEnv, (jstring)jniEnv->GetObjectField(j, data.field_mSomeString))};
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -23,7 +23,7 @@ auto NativeRecordWithDerivings::toCpp(JNIEnv* jniEnv, JniType j) -> CppType { ...@@ -23,7 +23,7 @@ auto NativeRecordWithDerivings::toCpp(JNIEnv* jniEnv, JniType j) -> CppType {
assert(j != nullptr); assert(j != nullptr);
const auto& data = ::djinni::JniClass<NativeRecordWithDerivings>::get(); const auto& data = ::djinni::JniClass<NativeRecordWithDerivings>::get();
return {::djinni::I32::toCpp(jniEnv, jniEnv->GetIntField(j, data.field_mKey1)), return {::djinni::I32::toCpp(jniEnv, jniEnv->GetIntField(j, data.field_mKey1)),
::djinni::String::toCpp(jniEnv, static_cast<jstring>(jniEnv->GetObjectField(j, data.field_mKey2)))}; ::djinni::String::toCpp(jniEnv, (jstring)jniEnv->GetObjectField(j, data.field_mKey2))};
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -26,6 +26,13 @@ public: ...@@ -26,6 +26,13 @@ public:
return ::djinni_generated::ClientReturnedRecord::toCpp(r); return ::djinni_generated::ClientReturnedRecord::toCpp(r);
} }
} }
std::string return_str() override
{
@autoreleasepool {
auto r = [Handle::get() returnStr];
return ::djinni::String::toCpp(r);
}
}
}; };
auto ClientInterface::toCpp(ObjcType objc) -> CppType auto ClientInterface::toCpp(ObjcType objc) -> CppType
......
...@@ -12,4 +12,6 @@ ...@@ -12,4 +12,6 @@
utf8string:(nonnull NSString *)utf8string utf8string:(nonnull NSString *)utf8string
misc:(nullable NSString *)misc; misc:(nullable NSString *)misc;
- (nonnull NSString *)returnStr;
@end @end
...@@ -10,4 +10,8 @@ public class ClientInterfaceImpl extends ClientInterface { ...@@ -10,4 +10,8 @@ public class ClientInterfaceImpl extends ClientInterface {
} }
return new ClientReturnedRecord(id, utf8string, misc); return new ClientReturnedRecord(id, utf8string, misc);
} }
@Override
public String returnStr() {
return "test";
}
} }
...@@ -12,4 +12,9 @@ static NSString *DBNonAscii = @"Non-ASCII / 非 ASCII 字符"; ...@@ -12,4 +12,9 @@ static NSString *DBNonAscii = @"Non-ASCII / 非 ASCII 字符";
return [[DBClientReturnedRecord alloc] initWithRecordId:ident content:utf8string misc:misc]; return [[DBClientReturnedRecord alloc] initWithRecordId:ident content:utf8string misc:misc];
} }
- (NSString *)returnStr
{
return @"test";
}
@end @end
...@@ -620,6 +620,7 @@ ...@@ -620,6 +620,7 @@
"$(inherited)", "$(inherited)",
); );
GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_SYMBOLS_PRIVATE_EXTERN = NO;
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;
GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES;
...@@ -657,6 +658,7 @@ ...@@ -657,6 +658,7 @@
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
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;
GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES;
......
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