Commit 0521e806 authored by Miro Knejp's avatar Miro Knejp Committed by Jacob Potter

Fix name clashes between parameters and locals in +o+j

fixes #105
parent 1af60e92
......@@ -14,12 +14,12 @@ NativeTextboxListener::JavaProxy::JavaProxy(JniType j) : JavaProxyCacheEntry(j)
NativeTextboxListener::JavaProxy::~JavaProxy() = default;
void NativeTextboxListener::JavaProxy::update(const ::textsort::ItemList & items) {
void NativeTextboxListener::JavaProxy::update(const ::textsort::ItemList & c_items) {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeTextboxListener>::get();
jniEnv->CallVoidMethod(getGlobalRef(), data.method_update,
::djinni::get(::djinni_generated::NativeItemList::fromCpp(jniEnv, items)));
::djinni::get(::djinni_generated::NativeItemList::fromCpp(jniEnv, c_items)));
::djinni::jniExceptionCheck(jniEnv);
}
......
......@@ -16,10 +16,10 @@ class TextboxListener::ObjcProxy final
{
public:
using Handle::Handle;
void update(const ::textsort::ItemList & items) override
void update(const ::textsort::ItemList & c_items) override
{
@autoreleasepool {
[(ObjcType)Handle::get() update:(::djinni_generated::ItemList::fromCpp(items))];
[(ObjcType)Handle::get() update:(::djinni_generated::ItemList::fromCpp(c_items))];
}
}
};
......
......@@ -248,7 +248,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
w.wl
for (m <- i.methods) {
val ret = cppMarshal.fqReturnType(m.ret)
val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " " + idCpp.local(p.ident))
val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " c_" + idCpp.local(p.ident))
writeJniTypeParams(w, typeParams)
w.w(s"$ret $jniSelfWithParams::JavaProxy::${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")}").braced {
w.wl(s"auto jniEnv = ::djinni::jniGetThreadEnv();")
......@@ -261,7 +261,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
if(!m.params.isEmpty){
w.wl(",")
writeAlignedCall(w, " " * call.length(), m.params, ")", p => {
val param = jniMarshal.fromCpp(p.ty, idCpp.local(p.ident))
val param = jniMarshal.fromCpp(p.ty, "c_" + idCpp.local(p.ident))
s"::djinni::get($param)"
})
}
......
......@@ -174,12 +174,12 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
w.wl("using Handle::Handle;")
for (m <- i.methods) {
val ret = cppMarshal.fqReturnType(m.ret)
val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " " + idCpp.local(p.ident))
val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " c_" + idCpp.local(p.ident))
w.wl(s"$ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")} override").braced {
w.w("@autoreleasepool").braced {
val ret = m.ret.fold("")(_ => "auto r = ")
val call = s"[(ObjcType)Handle::get() ${idObjc.method(m.ident)}"
writeAlignedObjcCall(w, ret + call, m.params, "]", p => (idObjc.field(p.ident), s"(${objcppMarshal.fromCpp(p.ty, idCpp.local(p.ident))})"))
writeAlignedObjcCall(w, ret + call, m.params, "]", p => (idObjc.field(p.ident), s"(${objcppMarshal.fromCpp(p.ty, "c_" + idCpp.local(p.ident))})"))
w.wl(";")
m.ret.fold()(r => { w.wl(s"return ${objcppMarshal.toCpp(r, "r")};") })
}
......
......@@ -7,5 +7,6 @@ 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;
identifier_check(data: binary, r: i32, jret: i64): f64;
return_str(): string;
}
......@@ -7,6 +7,7 @@
#include <cstdint>
#include <experimental/optional>
#include <string>
#include <vector>
class ClientInterface {
public:
......@@ -15,5 +16,7 @@ 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 double identifier_check(const std::vector<uint8_t> & data, int32_t r, int64_t jret) = 0;
virtual std::string return_str() = 0;
};
......@@ -11,6 +11,8 @@ public abstract class ClientInterface {
@Nonnull
public abstract ClientReturnedRecord getRecord(long recordId, @Nonnull String utf8string, @CheckForNull String misc);
public abstract double identifierCheck(@Nonnull byte[] data, int r, long jret);
@Nonnull
public abstract String returnStr();
}
......@@ -15,17 +15,28 @@ NativeClientInterface::JavaProxy::JavaProxy(JniType j) : JavaProxyCacheEntry(j)
NativeClientInterface::JavaProxy::~JavaProxy() = default;
::ClientReturnedRecord NativeClientInterface::JavaProxy::get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional<std::string> & misc) {
::ClientReturnedRecord NativeClientInterface::JavaProxy::get_record(int64_t c_record_id, const std::string & c_utf8string, const std::experimental::optional<std::string> & c_misc) {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeClientInterface>::get();
auto jret = jniEnv->CallObjectMethod(getGlobalRef(), data.method_getRecord,
::djinni::get(::djinni::I64::fromCpp(jniEnv, record_id)),
::djinni::get(::djinni::String::fromCpp(jniEnv, utf8string)),
::djinni::get(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(jniEnv, misc)));
::djinni::get(::djinni::I64::fromCpp(jniEnv, c_record_id)),
::djinni::get(::djinni::String::fromCpp(jniEnv, c_utf8string)),
::djinni::get(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(jniEnv, c_misc)));
::djinni::jniExceptionCheck(jniEnv);
return ::djinni_generated::NativeClientReturnedRecord::toCpp(jniEnv, jret);
}
double NativeClientInterface::JavaProxy::identifier_check(const std::vector<uint8_t> & c_data, int32_t c_r, int64_t c_jret) {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeClientInterface>::get();
auto jret = jniEnv->CallDoubleMethod(getGlobalRef(), data.method_identifierCheck,
::djinni::get(::djinni::Binary::fromCpp(jniEnv, c_data)),
::djinni::get(::djinni::I32::fromCpp(jniEnv, c_r)),
::djinni::get(::djinni::I64::fromCpp(jniEnv, c_jret)));
::djinni::jniExceptionCheck(jniEnv);
return ::djinni::F64::toCpp(jniEnv, jret);
}
std::string NativeClientInterface::JavaProxy::return_str() {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
......
......@@ -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;
double identifier_check(const std::vector<uint8_t> & data, int32_t r, int64_t jret) override;
std::string return_str() override;
private:
......@@ -42,6 +43,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_identifierCheck { ::djinni::jniGetMethodID(clazz.get(), "identifierCheck", "([BIJ)D") };
const jmethodID method_returnStr { ::djinni::jniGetMethodID(clazz.get(), "returnStr", "()Ljava/lang/String;") };
};
......
......@@ -17,15 +17,24 @@ class ClientInterface::ObjcProxy final
{
public:
using Handle::Handle;
::ClientReturnedRecord get_record(int64_t record_id, const std::string & utf8string, const std::experimental::optional<std::string> & misc) override
::ClientReturnedRecord get_record(int64_t c_record_id, const std::string & c_utf8string, const std::experimental::optional<std::string> & c_misc) override
{
@autoreleasepool {
auto r = [(ObjcType)Handle::get() getRecord:(::djinni::I64::fromCpp(record_id))
utf8string:(::djinni::String::fromCpp(utf8string))
misc:(::djinni::Optional<std::experimental::optional, ::djinni::String>::fromCpp(misc))];
auto r = [(ObjcType)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))];
return ::djinni_generated::ClientReturnedRecord::toCpp(r);
}
}
double identifier_check(const std::vector<uint8_t> & c_data, int32_t c_r, int64_t c_jret) override
{
@autoreleasepool {
auto r = [(ObjcType)Handle::get() identifierCheck:(::djinni::Binary::fromCpp(c_data))
r:(::djinni::I32::fromCpp(c_r))
jret:(::djinni::I64::fromCpp(c_jret))];
return ::djinni::F64::toCpp(r);
}
}
std::string return_str() override
{
@autoreleasepool {
......
......@@ -12,6 +12,10 @@
utf8string:(nonnull NSString *)utf8string
misc:(nullable NSString *)misc;
- (double)identifierCheck:(nonnull NSData *)data
r:(int32_t)r
jret:(int64_t)jret;
- (nonnull NSString *)returnStr;
@end
......@@ -9,6 +9,11 @@ public class ClientInterfaceImpl extends ClientInterface {
return new ClientReturnedRecord(id, utf8string, misc);
}
@Override
public double identifierCheck(byte[] data, int r, long jret)
{
return 0.0;
}
@Override
public String returnStr() {
return "test";
}
......
......@@ -12,6 +12,14 @@ static NSString *DBNonAscii = @"Non-ASCII / 非 ASCII 字符";
return [[DBClientReturnedRecord alloc] initWithRecordId:ident content:utf8string misc:misc];
}
- (double)identifierCheck:(nonnull NSData *)data r:(int32_t)r jret:(int64_t)jret
{
(void)data;
(void)r;
(void)jret;
return 0.0;
}
- (NSString *)returnStr
{
return @"test";
......
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