summaryrefslogtreecommitdiff
path: root/chromium/v8/src/builtins/builtins-string-gen.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/v8/src/builtins/builtins-string-gen.cc')
-rw-r--r--chromium/v8/src/builtins/builtins-string-gen.cc16
1 files changed, 10 insertions, 6 deletions
diff --git a/chromium/v8/src/builtins/builtins-string-gen.cc b/chromium/v8/src/builtins/builtins-string-gen.cc
index 7ccb99792ed..9920369136a 100644
--- a/chromium/v8/src/builtins/builtins-string-gen.cc
+++ b/chromium/v8/src/builtins/builtins-string-gen.cc
@@ -1164,10 +1164,11 @@ void StringBuiltinsAssembler::MaybeCallFunctionAtSymbol(
DescriptorIndexNameValue additional_property_to_check,
const NodeFunction0& regexp_call, const NodeFunction1& generic_call) {
Label out(this);
+ Label get_property_lookup(this);
- // Smis definitely don't have an attached symbol.
- GotoIf(TaggedIsSmi(object), &out);
- TNode<HeapObject> heap_object = CAST(object);
+ // Smis have to go through the GetProperty lookup in case Number.prototype or
+ // Object.prototype was modified.
+ GotoIf(TaggedIsSmi(object), &get_property_lookup);
// Take the fast path for RegExps.
// There's two conditions: {object} needs to be a fast regexp, and
@@ -1176,6 +1177,8 @@ void StringBuiltinsAssembler::MaybeCallFunctionAtSymbol(
{
Label stub_call(this), slow_lookup(this);
+ TNode<HeapObject> heap_object = CAST(object);
+
GotoIf(TaggedIsSmi(maybe_string), &slow_lookup);
GotoIfNot(IsString(CAST(maybe_string)), &slow_lookup);
@@ -1196,10 +1199,10 @@ void StringBuiltinsAssembler::MaybeCallFunctionAtSymbol(
regexp_call();
BIND(&slow_lookup);
+ // Special case null and undefined to skip the property lookup.
+ Branch(IsNullOrUndefined(heap_object), &out, &get_property_lookup);
}
- GotoIf(IsNullOrUndefined(heap_object), &out);
-
// Fall back to a slow lookup of {heap_object[symbol]}.
//
// The spec uses GetMethod({heap_object}, {symbol}), which has a few quirks:
@@ -1208,7 +1211,8 @@ void StringBuiltinsAssembler::MaybeCallFunctionAtSymbol(
// We handle the former by jumping to {out} for null values as well, while
// the latter is already handled by the Call({maybe_func}) operation.
- const TNode<Object> maybe_func = GetProperty(context, heap_object, symbol);
+ BIND(&get_property_lookup);
+ const TNode<Object> maybe_func = GetProperty(context, object, symbol);
GotoIf(IsUndefined(maybe_func), &out);
GotoIf(IsNull(maybe_func), &out);