in yoko-rmi-impl/src/main/java/org/apache/yoko/rmi/impl/MethodDescriptor.java [656:757]
void writeLocalCall(PrintWriter pw) {
Class thisClass = reflected_method.getDeclaringClass();
pw.println("\t\t\t" + SERVANT + " so = _servant_preinvoke (");
pw.println("\t\t\t\t\"" + getIDLName() + "\",");
pw.print("\t\t\t\t");
writeJavaType(pw, thisClass);
pw.println(".class);");
pw
.print("\t\t\tif (so==null || so.servant==null || !(so.servant instanceof ");
writeJavaType(pw, thisClass);
pw.print("))");
pw.println(" { marshal=true; continue marshal; }");
pw.println("\t\t\ttry {");
// copy arguments
Class[] args = reflected_method.getParameterTypes();
if (args.length == 1) {
if (repo.getDescriptor(args[0]).copyInStub()) {
pw.print("\t\t\t\targ0 = (");
writeJavaType(pw, args[0]);
pw.println(")" + UTIL + ".copyObject(arg0, _orb());");
}
} else if (args.length > 1) {
boolean[] copy = new boolean[args.length];
int copyCount = 0;
for (int i = 0; i < args.length; i++) {
TypeDescriptor td = repo.getDescriptor(args[i]);
copy[i] = td.copyInStub();
if (copy[i]) {
copyCount += 1;
}
}
if (copyCount > 0) {
pw.println("\t\t\t\tObject[] args = new Object[" + copyCount
+ "];");
int pos = 0;
for (int i = 0; i < args.length; i++) {
if (copy[i]) {
pw.println("\t\t\t\targs[" + (pos++) + "] = arg" + i
+ ";");
}
}
pw.println("\t\t\t\targs=" + UTIL
+ ".copyObjects(args,_orb());");
pos = 0;
for (int i = 0; i < args.length; i++) {
if (copy[i]) {
pw.print("\t\t\t\targ" + i + "=(");
writeJavaType(pw, args[i]);
pw.println(")args[" + (pos++) + "];");
}
}
}
}
// now, invoke!
Class out = reflected_method.getReturnType();
pw.print("\t\t\t\t");
if (out != Void.TYPE) {
writeJavaType(pw, out);
pw.print(" result = ");
}
pw.print("((");
writeJavaType(pw, thisClass);
pw.print(")so.servant).");
pw.print(java_name);
pw.print("(");
for (int i = 0; i < args.length; i++) {
if (i != 0) {
pw.print(',');
}
pw.print("arg" + i);
}
pw.println(");");
pw.print("\t\t\t\treturn ");
if (out != Void.TYPE) {
TypeDescriptor td = repo.getDescriptor(out);
if (td.copyInStub()) {
pw.print('(');
writeJavaType(pw, out);
pw.print(')');
pw.println(UTIL + ".copyObject (result, _orb());");
} else {
pw.println("result;");
}
} else {
pw.println(";");
}
pw.println("\t\t\t} finally {");
pw.println("\t\t\t\t_servant_postinvoke (so);");
pw.println("\t\t\t}");
}