Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Unified Diff: src/hydrogen.cc

Issue 12263004: Allow full inlining of f.apply(this, arguments) calls. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index e1cf70a0250cb2f281dda7e356fd318b7778754a..591ffe1547100c96b21599917edbd81ba16da93a 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -7754,6 +7754,19 @@ bool HOptimizedGraphBuilder::TryInlineSetter(Handle<JSFunction> setter,
}
+bool HOptimizedGraphBuilder::TryInlineApply(Handle<JSFunction> function,
+ Call* expr,
+ int arguments_count) {
+ return TryInline(CALL_AS_METHOD,
+ function,
+ arguments_count,
+ NULL,
+ expr->id(),
+ expr->ReturnId(),
+ NORMAL_RETURN);
+}
+
+
bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr,
bool drop_extra) {
if (!expr->target()->shared()->HasBuiltinFunctionId()) return false;
@@ -7981,22 +7994,32 @@ bool HOptimizedGraphBuilder::TryCallApply(Call* expr) {
// TODO(mstarzinger): For now we just ensure arguments are pushed
// right after HEnterInlined, but we could be smarter about this.
EnsureArgumentsArePushedForAccess();
- HValue* context = environment()->LookupContext();
-
- HValue* wrapped_receiver =
- AddInstruction(new(zone()) HWrapReceiver(receiver, function));
- PushAndAdd(new(zone()) HPushArgument(wrapped_receiver));
-
HEnvironment* arguments_env = environment()->arguments_environment();
-
int parameter_count = arguments_env->parameter_count();
+ PushAndAdd(new(zone()) HWrapReceiver(receiver, function));
+ for (int i = 1; i < arguments_env->parameter_count(); i++) {
+ Push(arguments_env->Lookup(i));
+ }
+
+ Handle<JSFunction> known_function;
+ if (function->IsConstant()) {
+ HConstant* constant_function = HConstant::cast(function);
+ known_function = Handle<JSFunction>::cast(constant_function->handle());
+ int arguments_count = parameter_count - 1; // Excluding receiver.
+ if (TryInlineApply(known_function, expr, arguments_count)) return true;
+ }
+
+ Drop(parameter_count - 1);
+ PushAndAdd(new(zone()) HPushArgument(Pop()));
for (int i = 1; i < arguments_env->parameter_count(); i++) {
PushAndAdd(new(zone()) HPushArgument(arguments_env->Lookup(i)));
}
+ HValue* context = environment()->LookupContext();
HInvokeFunction* call = new(zone()) HInvokeFunction(
context,
function,
+ known_function,
parameter_count);
Drop(parameter_count);
call->set_position(expr->position());

Powered by Google App Engine
This is Rietveld 408576698