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) {
w.wl(s"auto jniEnv = ::djinni::jniGetThreadEnv();")
w.wl(s"::djinni::JniLocalScope jscope(jniEnv, 10);")
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)
val javaMethodName = idJava.method(m.ident)
w.w(s"getGlobalRef(), data.method_$javaMethodName")
......@@ -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(m: MExpr, f: String => String, needRef: Boolean): String = m.base match {
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 MBinary => s"static_cast<jbyteArray>(${f("Object")})"
case MBinary => "(jbyteArray)" + f("Object")
case _ => f("Object")
}
......
......@@ -7,4 +7,5 @@ client_returned_record = record {
client_interface = interface +j +o {
# Returns record of given string
get_record(record_id: i64, utf8string: string, misc: optional<string>): client_returned_record;
return_str(): string;
}
......@@ -14,4 +14,6 @@ public:
/** 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 std::string return_str() = 0;
};
......@@ -6,4 +6,6 @@ package com.dropbox.djinni.test;
public abstract class ClientInterface {
/** Returns record of given string */
public abstract ClientReturnedRecord getRecord(long recordId, String utf8string, String misc);
public abstract String returnStr();
}
......@@ -26,5 +26,13 @@ NativeClientInterface::JavaProxy::~JavaProxy() = default;
::djinni::jniExceptionCheck(jniEnv);
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
......@@ -32,6 +32,7 @@ private:
~JavaProxy();
::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:
using ::djinni::JavaProxyCacheEntry::getGlobalRef;
......@@ -41,6 +42,7 @@ private:
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_returnStr { ::djinni::jniGetMethodID(clazz.get(), "returnStr", "()Ljava/lang/String;") };
};
} // namespace djinni_generated
......@@ -24,8 +24,8 @@ auto NativeClientReturnedRecord::toCpp(JNIEnv* jniEnv, JniType j) -> CppType {
assert(j != nullptr);
const auto& data = ::djinni::JniClass<NativeClientReturnedRecord>::get();
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::Optional<std::experimental::optional, ::djinni::String>::toCpp(jniEnv, static_cast<jstring>(jniEnv->GetObjectField(j, data.field_mMisc)))};
::djinni::String::toCpp(jniEnv, (jstring)jniEnv->GetObjectField(j, data.field_mContent)),
::djinni::Optional<std::experimental::optional, ::djinni::String>::toCpp(jniEnv, (jstring)jniEnv->GetObjectField(j, data.field_mMisc))};
}
} // namespace djinni_generated
......@@ -23,7 +23,7 @@ auto NativeConstants::toCpp(JNIEnv* jniEnv, JniType j) -> CppType {
assert(j != nullptr);
const auto& data = ::djinni::JniClass<NativeConstants>::get();
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
......@@ -23,7 +23,7 @@ auto NativeRecordWithDerivings::toCpp(JNIEnv* jniEnv, JniType j) -> CppType {
assert(j != nullptr);
const auto& data = ::djinni::JniClass<NativeRecordWithDerivings>::get();
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
......@@ -26,6 +26,13 @@ public:
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
......
......@@ -12,4 +12,6 @@
utf8string:(nonnull NSString *)utf8string
misc:(nullable NSString *)misc;
- (nonnull NSString *)returnStr;
@end
......@@ -10,4 +10,8 @@ public class ClientInterfaceImpl extends ClientInterface {
}
return new ClientReturnedRecord(id, utf8string, misc);
}
@Override
public String returnStr() {
return "test";
}
}
......@@ -12,4 +12,9 @@ static NSString *DBNonAscii = @"Non-ASCII / 非 ASCII 字符";
return [[DBClientReturnedRecord alloc] initWithRecordId:ident content:utf8string misc:misc];
}
- (NSString *)returnStr
{
return @"test";
}
@end
......@@ -620,6 +620,7 @@
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
......@@ -657,6 +658,7 @@
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
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