Argument passing with reflected C++ invoke functions.
Bug: 5972398
Change-Id: I3c4c1f59c15a7e3fa094a9ddcf74b6a1c1899c71
diff --git a/slang_rs_reflection_cpp.cpp b/slang_rs_reflection_cpp.cpp
index fe1aa46..b548927 100644
--- a/slang_rs_reflection_cpp.cpp
+++ b/slang_rs_reflection_cpp.cpp
@@ -133,9 +133,9 @@
" v) {");
stringstream tmp;
tmp << slot;
- write(string(" setVar(") + tmp.str() + ", &v, sizeof(v));");
- write(string(" __") + ev->getName() + " = v;");
- write("}");
+ write(string(" setVar(") + tmp.str() + ", &v, sizeof(v));");
+ write(string(" __") + ev->getName() + " = v;");
+ write("}");
}
write(string(rtd.type->c_name) + " get_" + ev->getName() + "() const {");
if (ev->isConst()) {
@@ -178,7 +178,7 @@
tmp << rtd.type->c_name << " " << (*i)->getName();
}
}
- tmp << ") const;";
+ tmp << ");";
write(tmp);
}
@@ -280,7 +280,7 @@
} else {
tmp << "android::sp<const android::renderscriptCpp::Allocation> aout";
}
- tmp << ") const {";
+ tmp << ") {";
write(tmp);
tmp.str("");
@@ -309,8 +309,30 @@
makeFunctionSignature(ss, true, ef);
write(ss);
ss.str("");
+ const RSExportRecordType *params = ef->getParamPacketType();
+ size_t param_len = 0;
+ if (params) {
+ param_len = RSExportType::GetTypeAllocSize(params);
+ ss << " FieldPacker __fp(" << param_len << ");";
+ write(ss);
+ for (RSExportFunc::const_param_iterator i = ef->params_begin(),
+ e = ef->params_end(); i != e; i++) {
+ RSReflectionTypeData rtd;
+ (*i)->getType()->convertToRTD(&rtd);
+ ss.str("");
+ ss << " __fp.add(" << (*i)->getName() << ");";
+ write(ss);
+ }
- ss << " invoke(" << slot << ", NULL, 0);";
+ }
+
+ ss.str("");
+ ss << " invoke(" << slot;
+ if (params) {
+ ss << ", __fp.getData(), " << param_len << ");";
+ } else {
+ ss << ", NULL, 0);";
+ }
write(ss);
write("}");