266 return newCallNode; 267 } 268 269 return callNode; 270 } 271 272 private void pushExplodedArgs(final FunctionNode functionNode) { 273 int start = 0; 274 275 final MethodType actualCallSiteType = compiler.getCallSiteType(functionNode); 276 if (actualCallSiteType == null) { 277 throw new TransformFailedException(lc.getCurrentFunction(), "No callsite type"); 278 } 279 assert actualCallSiteType.parameterType(actualCallSiteType.parameterCount() - 1) != Object[].class : "error vararg callsite passed to apply2call " + functionNode.getName() + " " + actualCallSiteType; 280 281 final TypeMap ptm = compiler.getTypeMap(); 282 if (ptm.needsCallee()) { 283 start++; 284 } 285 286 start++; //we always uses this 287 288 final List<IdentNode> params = functionNode.getParameters(); 289 final List<IdentNode> newParams = new ArrayList<>(); 290 final long to = Math.max(params.size(), actualCallSiteType.parameterCount() - start); 291 for (int i = 0; i < to; i++) { 292 if (i >= params.size()) { 293 newParams.add(new IdentNode(functionNode.getToken(), functionNode.getFinish(), EXPLODED_ARGUMENT_PREFIX.symbolName() + (i))); 294 } else { 295 newParams.add(params.get(i)); 296 } 297 } 298 299 callSiteTypes.push(actualCallSiteType); 300 explodedArguments.push(newParams); 301 } 302 303 @Override 304 public boolean enterFunctionNode(final FunctionNode functionNode) { 305 if (!USE_APPLY2CALL) { 306 return false; 307 } 308 309 if (!Global.isBuiltinFunctionPrototypeApply()) { 310 log.fine("Apply transform disabled: apply/call overridden"); 311 assert !Global.isBuiltinFunctionPrototypeCall() : "call and apply should have the same SwitchPoint"; 312 return false; 313 } 314 315 if (!compiler.isOnDemandCompilation()) { 316 return false; 317 } 318 319 if (functionNode.hasEval()) { 320 return false; 321 } 322 323 if (!hasApplies(functionNode)) { 324 return false; 325 } 326 327 if (log.isEnabled()) { 328 log.info("Trying to specialize apply to call in '", 329 functionNode.getName(), 330 "' params=", 331 functionNode.getParameters(), 332 " id=", 333 functionNode.getId(), 334 " source=", 335 massageURL(functionNode.getSource().getURL())); | 266 return newCallNode; 267 } 268 269 return callNode; 270 } 271 272 private void pushExplodedArgs(final FunctionNode functionNode) { 273 int start = 0; 274 275 final MethodType actualCallSiteType = compiler.getCallSiteType(functionNode); 276 if (actualCallSiteType == null) { 277 throw new TransformFailedException(lc.getCurrentFunction(), "No callsite type"); 278 } 279 assert actualCallSiteType.parameterType(actualCallSiteType.parameterCount() - 1) != Object[].class : "error vararg callsite passed to apply2call " + functionNode.getName() + " " + actualCallSiteType; 280 281 final TypeMap ptm = compiler.getTypeMap(); 282 if (ptm.needsCallee()) { 283 start++; 284 } 285 286 start++; // we always use this 287 288 assert functionNode.getNumOfParams() == 0 : "apply2call on function with named paramaters!"; 289 final List<IdentNode> newParams = new ArrayList<>(); 290 final long to = actualCallSiteType.parameterCount() - start; 291 for (int i = 0; i < to; i++) { 292 newParams.add(new IdentNode(functionNode.getToken(), functionNode.getFinish(), EXPLODED_ARGUMENT_PREFIX.symbolName() + (i))); 293 } 294 295 callSiteTypes.push(actualCallSiteType); 296 explodedArguments.push(newParams); 297 } 298 299 @Override 300 public boolean enterFunctionNode(final FunctionNode functionNode) { 301 if (!USE_APPLY2CALL) { 302 return false; 303 } 304 305 if (!Global.isBuiltinFunctionPrototypeApply()) { 306 log.fine("Apply transform disabled: apply/call overridden"); 307 assert !Global.isBuiltinFunctionPrototypeCall() : "call and apply should have the same SwitchPoint"; 308 return false; 309 } 310 311 if (!compiler.isOnDemandCompilation()) { 312 return false; 313 } 314 315 if (functionNode.getNumOfParams() != 0) { 316 return false; 317 } 318 319 if (functionNode.hasEval()) { 320 return false; 321 } 322 323 if (!hasApplies(functionNode)) { 324 return false; 325 } 326 327 if (log.isEnabled()) { 328 log.info("Trying to specialize apply to call in '", 329 functionNode.getName(), 330 "' params=", 331 functionNode.getParameters(), 332 " id=", 333 functionNode.getId(), 334 " source=", 335 massageURL(functionNode.getSource().getURL())); |