648ba1f7dd
This cl: https://chromium-review.googlesource.com/c/v8/v8/+/1421077 changed the implementation of SetProperty to infer the language mode. Language mode is only required when there is an error to decide if we have to throw an error or not. However we used to compute language mode eagerly for PropertyCallbackInfo. This causes regressions in some benchmarks. This cl changes it by deferring it further by computing it only when it is actually required. BUG: v8:8580, chromium:925289 Change-Id: Iba70ec5f9bb3deec16414a1ec418b3963f2144f9 Reviewed-on: https://chromium-review.googlesource.com/c/1454608 Reviewed-by: Adam Klein <adamk@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Commit-Queue: Mythri Alle <mythria@chromium.org> Cr-Commit-Position: refs/heads/master@{#59450}
55 lines
2.1 KiB
C++
55 lines
2.1 KiB
C++
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "src/api-arguments.h"
|
|
|
|
#include "src/api-arguments-inl.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
PropertyCallbackArguments::PropertyCallbackArguments(
|
|
Isolate* isolate, Object data, Object self, JSObject holder,
|
|
Maybe<ShouldThrow> should_throw)
|
|
: Super(isolate) {
|
|
slot_at(T::kThisIndex).store(self);
|
|
slot_at(T::kHolderIndex).store(holder);
|
|
slot_at(T::kDataIndex).store(data);
|
|
slot_at(T::kIsolateIndex).store(Object(reinterpret_cast<Address>(isolate)));
|
|
int value = Internals::kInferShouldThrowMode;
|
|
if (should_throw.IsJust()) {
|
|
value = should_throw.FromJust();
|
|
}
|
|
slot_at(T::kShouldThrowOnErrorIndex).store(Smi::FromInt(value));
|
|
|
|
// Here the hole is set as default value.
|
|
// It cannot escape into js as it's removed in Call below.
|
|
HeapObject the_hole = ReadOnlyRoots(isolate).the_hole_value();
|
|
slot_at(T::kReturnValueDefaultValueIndex).store(the_hole);
|
|
slot_at(T::kReturnValueIndex).store(the_hole);
|
|
DCHECK((*slot_at(T::kHolderIndex))->IsHeapObject());
|
|
DCHECK((*slot_at(T::kIsolateIndex))->IsSmi());
|
|
}
|
|
|
|
FunctionCallbackArguments::FunctionCallbackArguments(
|
|
internal::Isolate* isolate, internal::Object data,
|
|
internal::HeapObject callee, internal::Object holder,
|
|
internal::HeapObject new_target, internal::Address* argv, int argc)
|
|
: Super(isolate), argv_(argv), argc_(argc) {
|
|
slot_at(T::kDataIndex).store(data);
|
|
slot_at(T::kHolderIndex).store(holder);
|
|
slot_at(T::kNewTargetIndex).store(new_target);
|
|
slot_at(T::kIsolateIndex).store(Object(reinterpret_cast<Address>(isolate)));
|
|
// Here the hole is set as default value.
|
|
// It cannot escape into js as it's remove in Call below.
|
|
HeapObject the_hole = ReadOnlyRoots(isolate).the_hole_value();
|
|
slot_at(T::kReturnValueDefaultValueIndex).store(the_hole);
|
|
slot_at(T::kReturnValueIndex).store(the_hole);
|
|
DCHECK((*slot_at(T::kHolderIndex))->IsHeapObject());
|
|
DCHECK((*slot_at(T::kIsolateIndex))->IsSmi());
|
|
}
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|