307 sb.append(PRI_MODS + "FunctionDescriptor " + fnName + "$DESC = "); 308 addFunction(desc); 309 sb.append(";\n"); 310 indent(); 311 sb.append(PUB_MODS + "MemoryAddress " + fnName + "$make(MethodHandle handle) {\n"); 312 incrAlign(); 313 indent(); 314 sb.append("return RuntimeHelper.upcallStub(handle, " + fnName + "$DESC);\n"); 315 decrAlign(); 316 indent(); 317 sb.append("}\n"); 318 decrAlign(); 319 } 320 321 protected void addStaticFunctionWrapper(Declaration.Function f, MethodType mtype) { 322 incrAlign(); 323 indent(); 324 sb.append(PUB_MODS + mtype.returnType().getName() + " " + f.name() + " ("); 325 String delim = ""; 326 List<String> pNames = new ArrayList<>(); 327 for (int i = 0 ; i < f.parameters().size() ; i++) { 328 String pName = f.parameters().get(i).name(); 329 if (pName.isEmpty()) { 330 pName = "x" + i; 331 } 332 pNames.add(pName); 333 sb.append(delim + mtype.parameterType(i).getName() + " " + pName); 334 delim = ", "; 335 } 336 if (f.type().varargs()) { 337 String lastArg = "x" + f.parameters().size(); 338 sb.append(", Object... " + lastArg); 339 pNames.add(lastArg); 340 } 341 sb.append(") {\n"); 342 incrAlign(); 343 indent(); 344 sb.append("try {\n"); 345 incrAlign(); 346 indent(); 347 if (!mtype.returnType().equals(void.class)) { 348 sb.append("return (" + mtype.returnType().getName() + ")"); 349 } 350 sb.append(f.name() + ".invokeExact(" + String.join(", ", pNames) + ");\n"); 351 decrAlign(); 352 indent(); 353 sb.append("} catch (Throwable ex) {\n"); 354 incrAlign(); 355 indent(); 356 sb.append("throw new AssertionError(ex);\n"); 357 decrAlign(); 358 indent(); | 307 sb.append(PRI_MODS + "FunctionDescriptor " + fnName + "$DESC = "); 308 addFunction(desc); 309 sb.append(";\n"); 310 indent(); 311 sb.append(PUB_MODS + "MemoryAddress " + fnName + "$make(MethodHandle handle) {\n"); 312 incrAlign(); 313 indent(); 314 sb.append("return RuntimeHelper.upcallStub(handle, " + fnName + "$DESC);\n"); 315 decrAlign(); 316 indent(); 317 sb.append("}\n"); 318 decrAlign(); 319 } 320 321 protected void addStaticFunctionWrapper(Declaration.Function f, MethodType mtype) { 322 incrAlign(); 323 indent(); 324 sb.append(PUB_MODS + mtype.returnType().getName() + " " + f.name() + " ("); 325 String delim = ""; 326 List<String> pNames = new ArrayList<>(); 327 final int numParams = f.parameters().size(); 328 for (int i = 0 ; i < numParams; i++) { 329 String pName = f.parameters().get(i).name(); 330 if (pName.isEmpty()) { 331 pName = "x" + i; 332 } 333 pNames.add(pName); 334 sb.append(delim + mtype.parameterType(i).getName() + " " + pName); 335 delim = ", "; 336 } 337 if (f.type().varargs()) { 338 String lastArg = "x" + numParams; 339 if (numParams > 0) { 340 sb.append(", "); 341 } 342 sb.append("Object... " + lastArg); 343 pNames.add(lastArg); 344 } 345 sb.append(") {\n"); 346 incrAlign(); 347 indent(); 348 sb.append("try {\n"); 349 incrAlign(); 350 indent(); 351 if (!mtype.returnType().equals(void.class)) { 352 sb.append("return (" + mtype.returnType().getName() + ")"); 353 } 354 sb.append(f.name() + ".invokeExact(" + String.join(", ", pNames) + ");\n"); 355 decrAlign(); 356 indent(); 357 sb.append("} catch (Throwable ex) {\n"); 358 incrAlign(); 359 indent(); 360 sb.append("throw new AssertionError(ex);\n"); 361 decrAlign(); 362 indent(); |