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("}");