Commit a535ed4b authored by machenbach's avatar machenbach Committed by Commit bot

Revert of [runtime] Initial step towards switching Execution::Call to...

Revert of [runtime] Initial step towards switching Execution::Call to callable. (patchset #1 id:1 of https://codereview.chromium.org/1353723002/ )

Reason for revert:
[Sheriff] Causes a dcheck failure in layout tests (and some test changes in release):
https://storage.googleapis.com/chromium-layout-test-archives/V8-Blink_Linux_64__dbg_/1442/layout-test-results/virtual/android/fullscreen/api/element-request-fullscreen-top-stderr.txt
from
http://build.chromium.org/p/client.v8.fyi/builders/V8-Blink%20Linux%2064%20%28dbg%29/builds/1442

Original issue's description:
> [runtime] Initial step towards switching Execution::Call to callable.
>
> Currently Execution::Call (and friends) still duplicate a lot of the
> Call sequence logic that should be encapsulated in the Call and
> CallFunction builtins. So the plan now is to switch Execution::Call
> to accept any Callable and just pass that through to the Call builtin.
>
> CQ_INCLUDE_TRYBOTS=tryserver.v8:v8_linux_nosnap_dbg
> R=jarin@chromium.org
> BUG=v8:4413
> LOG=n
>
> Committed: https://crrev.com/359645f48156e15f235e9a9ede7910e0bcd9ae45
> Cr-Commit-Position: refs/heads/master@{#30791}

TBR=jarin@chromium.org,bmeurer@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=v8:4413

Review URL: https://codereview.chromium.org/1346763005

Cr-Commit-Position: refs/heads/master@{#30793}
parent b185ed40
This diff is collapsed.
...@@ -798,7 +798,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, ...@@ -798,7 +798,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS); CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
__ CallStub(&stub); __ CallStub(&stub);
} else { } else {
__ Call(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); ParameterCount actual(r0);
__ InvokeFunction(r1, actual, CALL_FUNCTION, NullCallWrapper());
} }
// Exit the JS frame and remove the parameters (except function), and // Exit the JS frame and remove the parameters (except function), and
// return. // return.
......
...@@ -835,7 +835,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, ...@@ -835,7 +835,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS); CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
__ CallStub(&stub); __ CallStub(&stub);
} else { } else {
__ Call(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); ParameterCount actual(x0);
__ InvokeFunction(function, actual, CALL_FUNCTION, NullCallWrapper());
} }
// Exit the JS internal frame and remove the parameters (except function), // Exit the JS internal frame and remove the parameters (except function),
// and return. // and return.
......
...@@ -489,8 +489,8 @@ Handle<Code> TurboFanCodeStub::GenerateCode() { ...@@ -489,8 +489,8 @@ Handle<Code> TurboFanCodeStub::GenerateCode() {
Handle<Object> call_conv = factory->InternalizeUtf8String(name); Handle<Object> call_conv = factory->InternalizeUtf8String(name);
Handle<Object> minor_key = factory->NewNumber(MinorKey()); Handle<Object> minor_key = factory->NewNumber(MinorKey());
Handle<Object> args[] = {call_conv, minor_key}; Handle<Object> args[] = {call_conv, minor_key};
MaybeHandle<Object> result = MaybeHandle<Object> result = Execution::Call(
Execution::Call(isolate(), outer, factory->undefined_value(), 2, args); isolate(), outer, factory->undefined_value(), 2, args, false);
Handle<JSFunction> inner = Handle<JSFunction>::cast(result.ToHandleChecked()); Handle<JSFunction> inner = Handle<JSFunction>::cast(result.ToHandleChecked());
// Just to make sure nobody calls this... // Just to make sure nobody calls this...
inner->set_code(isolate()->builtins()->builtin(Builtins::kIllegal)); inner->set_code(isolate()->builtins()->builtin(Builtins::kIllegal));
......
...@@ -53,26 +53,21 @@ static void PrintDeserializedCodeInfo(Handle<JSFunction> function) { ...@@ -53,26 +53,21 @@ static void PrintDeserializedCodeInfo(Handle<JSFunction> function) {
} }
namespace { MUST_USE_RESULT static MaybeHandle<Object> Invoke(
bool is_construct,
MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct, Handle<JSFunction> function,
Handle<JSFunction> function, Handle<Object> receiver,
Handle<Object> receiver, int argc, int argc,
Handle<Object> args[]) { Handle<Object> args[]) {
Isolate* const isolate = function->GetIsolate(); Isolate* isolate = function->GetIsolate();
// Convert calls on global objects to be calls on the global
// receiver instead to avoid having a 'this' pointer which refers
// directly to a global object.
if (receiver->IsGlobalObject()) {
receiver =
handle(Handle<GlobalObject>::cast(receiver)->global_proxy(), isolate);
}
// api callbacks can be called directly. // api callbacks can be called directly.
if (!is_construct && function->shared()->IsApiFunction()) { if (!is_construct && function->shared()->IsApiFunction()) {
SaveContext save(isolate); SaveContext save(isolate);
isolate->set_context(function->context()); isolate->set_context(function->context());
if (receiver->IsGlobalObject()) {
receiver = handle(Handle<GlobalObject>::cast(receiver)->global_proxy());
}
DCHECK(function->context()->global_object()->IsGlobalObject()); DCHECK(function->context()->global_object()->IsGlobalObject());
auto value = Builtins::InvokeApiFunction(function, receiver, argc, args); auto value = Builtins::InvokeApiFunction(function, receiver, argc, args);
bool has_exception = value.is_null(); bool has_exception = value.is_null();
...@@ -108,6 +103,13 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct, ...@@ -108,6 +103,13 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct,
? isolate->factory()->js_construct_entry_code() ? isolate->factory()->js_construct_entry_code()
: isolate->factory()->js_entry_code(); : isolate->factory()->js_entry_code();
// Convert calls on global objects to be calls on the global
// receiver instead to avoid having a 'this' pointer which refers
// directly to a global object.
if (receiver->IsGlobalObject()) {
receiver = handle(Handle<GlobalObject>::cast(receiver)->global_proxy());
}
// Make sure that the global object of the context we're about to // Make sure that the global object of the context we're about to
// make the current one is indeed a global object. // make the current one is indeed a global object.
DCHECK(function->context()->global_object()->IsGlobalObject()); DCHECK(function->context()->global_object()->IsGlobalObject());
...@@ -120,12 +122,13 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct, ...@@ -120,12 +122,13 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct,
JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry()); JSEntryFunction stub_entry = FUNCTION_CAST<JSEntryFunction>(code->entry());
// Call the function through the right JS entry stub. // Call the function through the right JS entry stub.
byte* ignored = nullptr; // TODO(bmeurer): Remove this altogether. byte* function_entry = function->code()->entry();
JSFunction* func = *function; JSFunction* func = *function;
Object* recv = *receiver; Object* recv = *receiver;
Object*** argv = reinterpret_cast<Object***>(args); Object*** argv = reinterpret_cast<Object***>(args);
if (FLAG_profile_deserialization) PrintDeserializedCodeInfo(function); if (FLAG_profile_deserialization) PrintDeserializedCodeInfo(function);
value = CALL_GENERATED_CODE(stub_entry, ignored, func, recv, argc, argv); value =
CALL_GENERATED_CODE(stub_entry, function_entry, func, recv, argc, argv);
} }
#ifdef VERIFY_HEAP #ifdef VERIFY_HEAP
...@@ -151,18 +154,31 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct, ...@@ -151,18 +154,31 @@ MUST_USE_RESULT MaybeHandle<Object> Invoke(bool is_construct,
return Handle<Object>(value, isolate); return Handle<Object>(value, isolate);
} }
} // namespace
MaybeHandle<Object> Execution::Call(Isolate* isolate, Handle<Object> callable, MaybeHandle<Object> Execution::Call(Isolate* isolate,
Handle<Object> receiver, int argc, Handle<Object> callable,
Handle<Object> argv[]) { Handle<Object> receiver,
int argc,
Handle<Object> argv[],
bool convert_receiver) {
if (!callable->IsJSFunction()) { if (!callable->IsJSFunction()) {
ASSIGN_RETURN_ON_EXCEPTION(isolate, callable, ASSIGN_RETURN_ON_EXCEPTION(isolate, callable,
GetFunctionDelegate(isolate, callable), Object); GetFunctionDelegate(isolate, callable), Object);
} }
Handle<JSFunction> func = Handle<JSFunction>::cast(callable); Handle<JSFunction> func = Handle<JSFunction>::cast(callable);
// In sloppy mode, convert receiver.
if (convert_receiver && !receiver->IsJSReceiver() &&
!func->shared()->native() && is_sloppy(func->shared()->language_mode())) {
if (receiver->IsUndefined() || receiver->IsNull()) {
receiver = handle(func->global_proxy());
DCHECK(!receiver->IsJSBuiltinsObject());
} else {
ASSIGN_RETURN_ON_EXCEPTION(
isolate, receiver, ToObject(isolate, receiver), Object);
}
}
return Invoke(false, func, receiver, argc, argv); return Invoke(false, func, receiver, argc, argv);
} }
...@@ -191,7 +207,7 @@ MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func, ...@@ -191,7 +207,7 @@ MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func,
catcher.SetVerbose(false); catcher.SetVerbose(false);
catcher.SetCaptureMessage(false); catcher.SetCaptureMessage(false);
maybe_result = Call(isolate, func, receiver, argc, args); maybe_result = Invoke(false, func, receiver, argc, args);
if (maybe_result.is_null()) { if (maybe_result.is_null()) {
DCHECK(catcher.HasCaught()); DCHECK(catcher.HasCaught());
......
...@@ -19,16 +19,23 @@ class JSRegExp; ...@@ -19,16 +19,23 @@ class JSRegExp;
class Execution final : public AllStatic { class Execution final : public AllStatic {
public: public:
// Call a function, the caller supplies a receiver and an array // Call a function, the caller supplies a receiver and an array
// of arguments. // of arguments. Arguments are Object* type. After function returns,
// pointers in 'args' might be invalid.
//
// *pending_exception tells whether the invoke resulted in
// a pending exception.
// //
// When the function called is not in strict mode, receiver is // When convert_receiver is set, and the receiver is not an object,
// converted to an object. // and the function called is not in strict mode, receiver is converted to
// an object.
// //
MUST_USE_RESULT static MaybeHandle<Object> Call(Isolate* isolate, MUST_USE_RESULT static MaybeHandle<Object> Call(
Handle<Object> callable, Isolate* isolate,
Handle<Object> receiver, Handle<Object> callable,
int argc, Handle<Object> receiver,
Handle<Object> argv[]); int argc,
Handle<Object> argv[],
bool convert_receiver = false);
// Construct object from function, the caller supplies an array of // Construct object from function, the caller supplies an array of
// arguments. Arguments are Object* type. After function returns, // arguments. Arguments are Object* type. After function returns,
......
...@@ -534,7 +534,9 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, ...@@ -534,7 +534,9 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS); CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
__ CallStub(&stub); __ CallStub(&stub);
} else { } else {
__ Call(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); ParameterCount actual(eax);
__ InvokeFunction(edi, actual, CALL_FUNCTION,
NullCallWrapper());
} }
// Exit the internal frame. Notice that this also removes the empty. // Exit the internal frame. Notice that this also removes the empty.
......
...@@ -796,7 +796,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, ...@@ -796,7 +796,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS); CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
__ CallStub(&stub); __ CallStub(&stub);
} else { } else {
__ Call(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); ParameterCount actual(a0);
__ InvokeFunction(a1, actual, CALL_FUNCTION, NullCallWrapper());
} }
// Leave internal frame. // Leave internal frame.
......
...@@ -794,7 +794,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, ...@@ -794,7 +794,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS); CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
__ CallStub(&stub); __ CallStub(&stub);
} else { } else {
__ Call(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); ParameterCount actual(a0);
__ InvokeFunction(a1, actual, CALL_FUNCTION, NullCallWrapper());
} }
// Leave internal frame. // Leave internal frame.
......
...@@ -841,7 +841,7 @@ MaybeHandle<Object> Object::GetPropertyWithDefinedGetter( ...@@ -841,7 +841,7 @@ MaybeHandle<Object> Object::GetPropertyWithDefinedGetter(
// TODO(rossberg): should this apply to getters that are function proxies? // TODO(rossberg): should this apply to getters that are function proxies?
if (debug->is_active()) debug->HandleStepIn(getter, false); if (debug->is_active()) debug->HandleStepIn(getter, false);
return Execution::Call(isolate, getter, receiver, 0, NULL); return Execution::Call(isolate, getter, receiver, 0, NULL, true);
} }
...@@ -858,7 +858,7 @@ MaybeHandle<Object> Object::SetPropertyWithDefinedSetter( ...@@ -858,7 +858,7 @@ MaybeHandle<Object> Object::SetPropertyWithDefinedSetter(
Handle<Object> argv[] = { value }; Handle<Object> argv[] = { value };
RETURN_ON_EXCEPTION(isolate, Execution::Call(isolate, setter, receiver, RETURN_ON_EXCEPTION(isolate, Execution::Call(isolate, setter, receiver,
arraysize(argv), argv), arraysize(argv), argv, true),
Object); Object);
return value; return value;
} }
......
...@@ -522,7 +522,7 @@ RUNTIME_FUNCTION(Runtime_Call) { ...@@ -522,7 +522,7 @@ RUNTIME_FUNCTION(Runtime_Call) {
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, isolate, result,
Execution::Call(isolate, target, receiver, argc, argv.start())); Execution::Call(isolate, target, receiver, argc, argv.start(), true));
return *result; return *result;
} }
...@@ -559,7 +559,8 @@ RUNTIME_FUNCTION(Runtime_Apply) { ...@@ -559,7 +559,8 @@ RUNTIME_FUNCTION(Runtime_Apply) {
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, Execution::Call(isolate, fun, receiver, argc, argv)); isolate, result,
Execution::Call(isolate, fun, receiver, argc, argv, true));
return *result; return *result;
} }
...@@ -626,7 +627,8 @@ RUNTIME_FUNCTION(Runtime_CallFunction) { ...@@ -626,7 +627,8 @@ RUNTIME_FUNCTION(Runtime_CallFunction) {
Handle<Object> hreceiver(receiver, isolate); Handle<Object> hreceiver(receiver, isolate);
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, Execution::Call(isolate, hfun, hreceiver, argc, argv)); isolate, result,
Execution::Call(isolate, hfun, hreceiver, argc, argv, true));
return *result; return *result;
} }
......
...@@ -593,7 +593,9 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, ...@@ -593,7 +593,9 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS); CallConstructStub stub(masm->isolate(), NO_CALL_CONSTRUCTOR_FLAGS);
__ CallStub(&stub); __ CallStub(&stub);
} else { } else {
__ Call(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); ParameterCount actual(rax);
// Function must be in rdi.
__ InvokeFunction(rdi, actual, CALL_FUNCTION, NullCallWrapper());
} }
// Exit the internal frame. Notice that this also removes the empty // Exit the internal frame. Notice that this also removes the empty
// context and the function left on the stack by the code // context and the function left on the stack by the code
......
...@@ -51,13 +51,13 @@ class FunctionTester : public InitializedHandleScope { ...@@ -51,13 +51,13 @@ class FunctionTester : public InitializedHandleScope {
MaybeHandle<Object> Call(Handle<Object> a, Handle<Object> b) { MaybeHandle<Object> Call(Handle<Object> a, Handle<Object> b) {
Handle<Object> args[] = {a, b}; Handle<Object> args[] = {a, b};
return Execution::Call(isolate, function, undefined(), 2, args); return Execution::Call(isolate, function, undefined(), 2, args, false);
} }
MaybeHandle<Object> Call(Handle<Object> a, Handle<Object> b, Handle<Object> c, MaybeHandle<Object> Call(Handle<Object> a, Handle<Object> b, Handle<Object> c,
Handle<Object> d) { Handle<Object> d) {
Handle<Object> args[] = {a, b, c, d}; Handle<Object> args[] = {a, b, c, d};
return Execution::Call(isolate, function, undefined(), 4, args); return Execution::Call(isolate, function, undefined(), 4, args, false);
} }
void CheckThrows(Handle<Object> a, Handle<Object> b) { void CheckThrows(Handle<Object> a, Handle<Object> b) {
......
...@@ -25,7 +25,8 @@ static const char kFunctionName[] = "f"; ...@@ -25,7 +25,8 @@ static const char kFunctionName[] = "f";
static MaybeHandle<Object> CallFunction(Isolate* isolate, static MaybeHandle<Object> CallFunction(Isolate* isolate,
Handle<JSFunction> function) { Handle<JSFunction> function) {
return Execution::Call(isolate, function, return Execution::Call(isolate, function,
isolate->factory()->undefined_value(), 0, nullptr); isolate->factory()->undefined_value(), 0, nullptr,
false);
} }
...@@ -36,7 +37,7 @@ static MaybeHandle<Object> CallFunction(Isolate* isolate, ...@@ -36,7 +37,7 @@ static MaybeHandle<Object> CallFunction(Isolate* isolate,
Handle<Object> argv[] = {args...}; Handle<Object> argv[] = {args...};
return Execution::Call(isolate, function, return Execution::Call(isolate, function,
isolate->factory()->undefined_value(), sizeof...(args), isolate->factory()->undefined_value(), sizeof...(args),
argv); argv, false);
} }
......
...@@ -82,7 +82,7 @@ class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> { ...@@ -82,7 +82,7 @@ class SimplifiedLoweringTester : public GraphBuilderTester<ReturnType> {
Handle<JSFunction> fun = FunctionTester::ForMachineGraph(this->graph()); Handle<JSFunction> fun = FunctionTester::ForMachineGraph(this->graph());
Handle<Object>* args = NULL; Handle<Object>* args = NULL;
MaybeHandle<Object> result = Execution::Call( MaybeHandle<Object> result = Execution::Call(
this->isolate(), fun, factory()->undefined_value(), 0, args); this->isolate(), fun, factory()->undefined_value(), 0, args, false);
return T::cast(*result.ToHandleChecked()); return T::cast(*result.ToHandleChecked());
} }
......
...@@ -18,7 +18,8 @@ namespace interpreter { ...@@ -18,7 +18,8 @@ namespace interpreter {
static MaybeHandle<Object> CallInterpreter(Isolate* isolate, static MaybeHandle<Object> CallInterpreter(Isolate* isolate,
Handle<JSFunction> function) { Handle<JSFunction> function) {
return Execution::Call(isolate, function, return Execution::Call(isolate, function,
isolate->factory()->undefined_value(), 0, nullptr); isolate->factory()->undefined_value(), 0, nullptr,
false);
} }
...@@ -29,7 +30,7 @@ static MaybeHandle<Object> CallInterpreter(Isolate* isolate, ...@@ -29,7 +30,7 @@ static MaybeHandle<Object> CallInterpreter(Isolate* isolate,
Handle<Object> argv[] = { args... }; Handle<Object> argv[] = { args... };
return Execution::Call(isolate, function, return Execution::Call(isolate, function,
isolate->factory()->undefined_value(), sizeof...(args), isolate->factory()->undefined_value(), sizeof...(args),
argv); argv, false);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment