Commit b5acda73 authored by Maya Lekova's avatar Maya Lekova Committed by Commit Bot

Reland "Add fast path to ObjectGetOwnPropertyDescriptor"

Bug: v8:6557
Change-Id: I01f065b74e3c568e577a3ee2caca68f24293c1cb
Reviewed-on: https://chromium-review.googlesource.com/686763Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Commit-Queue: Igor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48495}
parent b9340619
This diff is collapsed.
...@@ -16,12 +16,6 @@ class ProxiesCodeStubAssembler : public CodeStubAssembler { ...@@ -16,12 +16,6 @@ class ProxiesCodeStubAssembler : public CodeStubAssembler {
explicit ProxiesCodeStubAssembler(compiler::CodeAssemblerState* state) explicit ProxiesCodeStubAssembler(compiler::CodeAssemblerState* state)
: CodeStubAssembler(state) {} : CodeStubAssembler(state) {}
void BranchIfAccessorPair(Node* value, Label* if_accessor_pair,
Label* if_not_accessor_pair) {
GotoIf(TaggedIsSmi(value), if_not_accessor_pair);
Branch(IsAccessorPair(value), if_accessor_pair, if_not_accessor_pair);
}
// ES6 section 9.5.8 [[Get]] ( P, Receiver ) // ES6 section 9.5.8 [[Get]] ( P, Receiver )
// name should not be an index. // name should not be an index.
Node* ProxyGetProperty(Node* context, Node* proxy, Node* name, Node* ProxyGetProperty(Node* context, Node* proxy, Node* name,
......
...@@ -6204,7 +6204,8 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary, ...@@ -6204,7 +6204,8 @@ void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary,
// Returns either the original value, or the result of the getter call. // Returns either the original value, or the result of the getter call.
Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details, Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details,
Node* context, Node* receiver, Node* context, Node* receiver,
Label* if_bailout) { Label* if_bailout,
GetOwnPropertyMode mode) {
VARIABLE(var_value, MachineRepresentation::kTagged, value); VARIABLE(var_value, MachineRepresentation::kTagged, value);
Label done(this), if_accessor_info(this, Label::kDeferred); Label done(this), if_accessor_info(this, Label::kDeferred);
...@@ -6216,23 +6217,26 @@ Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details, ...@@ -6216,23 +6217,26 @@ Node* CodeStubAssembler::CallGetterIfAccessor(Node* value, Node* details,
// AccessorPair case. // AccessorPair case.
{ {
Node* accessor_pair = value; if (mode == kCallJSGetter) {
Node* getter = LoadObjectField(accessor_pair, AccessorPair::kGetterOffset); Node* accessor_pair = value;
Node* getter_map = LoadMap(getter); Node* getter =
Node* instance_type = LoadMapInstanceType(getter_map); LoadObjectField(accessor_pair, AccessorPair::kGetterOffset);
// FunctionTemplateInfo getters are not supported yet. Node* getter_map = LoadMap(getter);
GotoIf( Node* instance_type = LoadMapInstanceType(getter_map);
Word32Equal(instance_type, Int32Constant(FUNCTION_TEMPLATE_INFO_TYPE)), // FunctionTemplateInfo getters are not supported yet.
if_bailout); GotoIf(Word32Equal(instance_type,
Int32Constant(FUNCTION_TEMPLATE_INFO_TYPE)),
// Return undefined if the {getter} is not callable. if_bailout);
var_value.Bind(UndefinedConstant());
GotoIfNot(IsCallableMap(getter_map), &done); // Return undefined if the {getter} is not callable.
var_value.Bind(UndefinedConstant());
// Call the accessor. GotoIfNot(IsCallableMap(getter_map), &done);
Callable callable = CodeFactory::Call(isolate());
Node* result = CallJS(callable, context, getter, receiver); // Call the accessor.
var_value.Bind(result); Callable callable = CodeFactory::Call(isolate());
Node* result = CallJS(callable, context, getter, receiver);
var_value.Bind(result);
}
Goto(&done); Goto(&done);
} }
...@@ -6309,7 +6313,7 @@ void CodeStubAssembler::TryGetOwnProperty( ...@@ -6309,7 +6313,7 @@ void CodeStubAssembler::TryGetOwnProperty(
Node* context, Node* receiver, Node* object, Node* map, Node* instance_type, Node* context, Node* receiver, Node* object, Node* map, Node* instance_type,
Node* unique_name, Label* if_found_value, Variable* var_value, Node* unique_name, Label* if_found_value, Variable* var_value,
Variable* var_details, Variable* var_raw_value, Label* if_not_found, Variable* var_details, Variable* var_raw_value, Label* if_not_found,
Label* if_bailout) { Label* if_bailout, GetOwnPropertyMode mode) {
DCHECK_EQ(MachineRepresentation::kTagged, var_value->rep()); DCHECK_EQ(MachineRepresentation::kTagged, var_value->rep());
Comment("TryGetOwnProperty"); Comment("TryGetOwnProperty");
...@@ -6356,11 +6360,12 @@ void CodeStubAssembler::TryGetOwnProperty( ...@@ -6356,11 +6360,12 @@ void CodeStubAssembler::TryGetOwnProperty(
// Here we have details and value which could be an accessor. // Here we have details and value which could be an accessor.
BIND(&if_found); BIND(&if_found);
{ {
// TODO(ishell): Execute C++ accessor in case of accessor info
if (var_raw_value) { if (var_raw_value) {
var_raw_value->Bind(var_value->value()); var_raw_value->Bind(var_value->value());
} }
Node* value = CallGetterIfAccessor(var_value->value(), var_details->value(), Node* value = CallGetterIfAccessor(var_value->value(), var_details->value(),
context, receiver, if_bailout); context, receiver, if_bailout, mode);
var_value->Bind(value); var_value->Bind(value);
Goto(if_found_value); Goto(if_found_value);
} }
......
...@@ -1113,6 +1113,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -1113,6 +1113,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Int32Constant(0)); Int32Constant(0));
} }
// Returns true if none of the mask's bits in given |word32| are set.
TNode<BoolT> IsNotSetWord32(SloppyTNode<Word32T> word32, uint32_t mask) {
return Word32Equal(Word32And(word32, Int32Constant(mask)),
Int32Constant(0));
}
// Returns true if any of the |T|'s bits in given |word| are set. // Returns true if any of the |T|'s bits in given |word| are set.
template <typename T> template <typename T>
Node* IsSetWord(Node* word) { Node* IsSetWord(Node* word) {
...@@ -1325,6 +1331,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -1325,6 +1331,9 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* unique_name, Label* if_found, Node* unique_name, Label* if_found,
Label* if_not_found, Label* if_bailout); Label* if_not_found, Label* if_bailout);
// Operating mode for TryGetOwnProperty and CallGetterIfAccessor
// kReturnAccessorPair is used when we're only getting the property descriptor
enum GetOwnPropertyMode { kCallJSGetter, kReturnAccessorPair };
// Tries to get {object}'s own {unique_name} property value. If the property // Tries to get {object}'s own {unique_name} property value. If the property
// is an accessor then it also calls a getter. If the property is a double // is an accessor then it also calls a getter. If the property is a double
// field it re-wraps value in an immutable heap number. // field it re-wraps value in an immutable heap number.
...@@ -1336,7 +1345,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -1336,7 +1345,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* instance_type, Node* unique_name, Node* instance_type, Node* unique_name,
Label* if_found, Variable* var_value, Label* if_found, Variable* var_value,
Variable* var_details, Variable* var_raw_value, Variable* var_details, Variable* var_raw_value,
Label* if_not_found, Label* if_bailout); Label* if_not_found, Label* if_bailout,
GetOwnPropertyMode mode = kCallJSGetter);
Node* GetProperty(Node* context, Node* receiver, Handle<Name> name) { Node* GetProperty(Node* context, Node* receiver, Handle<Name> name) {
return GetProperty(context, receiver, HeapConstant(name)); return GetProperty(context, receiver, HeapConstant(name));
...@@ -1579,6 +1589,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -1579,6 +1589,12 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* lhs, Node* rhs, Label* if_true, Node* lhs, Node* rhs, Label* if_true,
Label* if_false); Label* if_false);
void BranchIfAccessorPair(Node* value, Label* if_accessor_pair,
Label* if_not_accessor_pair) {
GotoIf(TaggedIsSmi(value), if_not_accessor_pair);
Branch(IsAccessorPair(value), if_accessor_pair, if_not_accessor_pair);
}
void GotoIfNumberGreaterThanOrEqual(Node* lhs, Node* rhs, Label* if_false); void GotoIfNumberGreaterThanOrEqual(Node* lhs, Node* rhs, Label* if_false);
Node* Equal(Node* lhs, Node* rhs, Node* context, Node* Equal(Node* lhs, Node* rhs, Node* context,
...@@ -1673,7 +1689,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler { ...@@ -1673,7 +1689,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler : public compiler::CodeAssembler {
Node* DescriptorArrayGetKey(Node* descriptors, Node* descriptor_number); Node* DescriptorArrayGetKey(Node* descriptors, Node* descriptor_number);
Node* CallGetterIfAccessor(Node* value, Node* details, Node* context, Node* CallGetterIfAccessor(Node* value, Node* details, Node* context,
Node* receiver, Label* if_bailout); Node* receiver, Label* if_bailout,
GetOwnPropertyMode mode = kCallJSGetter);
Node* TryToIntptr(Node* key, Label* miss); Node* TryToIntptr(Node* key, Label* miss);
......
...@@ -342,6 +342,8 @@ class PropertyDetails BASE_EMBEDDED { ...@@ -342,6 +342,8 @@ class PropertyDetails BASE_EMBEDDED {
(READ_ONLY << AttributesField::kShift); (READ_ONLY << AttributesField::kShift);
static const int kAttributesDontDeleteMask = static const int kAttributesDontDeleteMask =
(DONT_DELETE << AttributesField::kShift); (DONT_DELETE << AttributesField::kShift);
static const int kAttributesDontEnumMask =
(DONT_ENUM << AttributesField::kShift);
// Bit fields for normalized objects. // Bit fields for normalized objects.
class PropertyCellTypeField class PropertyCellTypeField
......
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