Index: src/interpreter/interpreter.cc |
diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
index 999a795a56fbcb37406055a31491d347b5bf6efa..c4c9f7dfc513f6eeacd79856decdf01ee60a16e4 100644 |
--- a/src/interpreter/interpreter.cc |
+++ b/src/interpreter/interpreter.cc |
@@ -2011,21 +2011,47 @@ void Interpreter::DoCreateRegExpLiteral(InterpreterAssembler* assembler) { |
// CreateArrayLiteral <element_idx> <literal_idx> <flags> |
// |
-// Creates an array literal for literal index <literal_idx> with flags <flags> |
-// and constant elements in <element_idx>. |
+// Creates an array literal for literal index <literal_idx> with |
+// CreateArrayLiteral flags <flags> and constant elements in <element_idx>. |
void Interpreter::DoCreateArrayLiteral(InterpreterAssembler* assembler) { |
- Node* index = __ BytecodeOperandIdx(0); |
- Node* constant_elements = __ LoadConstantPoolEntry(index); |
Node* literal_index_raw = __ BytecodeOperandIdx(1); |
Node* literal_index = __ SmiTag(literal_index_raw); |
- Node* flags_raw = __ BytecodeOperandFlag(2); |
- Node* flags = __ SmiTag(flags_raw); |
Node* closure = __ LoadRegister(Register::function_closure()); |
Node* context = __ GetContext(); |
- Node* result = __ CallRuntime(Runtime::kCreateArrayLiteral, context, closure, |
- literal_index, constant_elements, flags); |
- __ SetAccumulator(result); |
- __ Dispatch(); |
+ Node* bytecode_flags = __ BytecodeOperandFlag(2); |
+ |
+ Label fast_shallow_clone(assembler), |
+ call_runtime(assembler, Label::kDeferred); |
+ Node* use_fast_shallow_clone = __ Word32And( |
+ bytecode_flags, |
+ __ Int32Constant(CreateArrayLiteralFlags::FastShallowCloneBit::kMask)); |
+ __ BranchIf(use_fast_shallow_clone, &fast_shallow_clone, &call_runtime); |
+ |
+ __ Bind(&fast_shallow_clone); |
+ { |
+ DCHECK(FLAG_allocation_site_pretenuring); |
+ Node* result = FastCloneShallowArrayStub::Generate( |
+ assembler, closure, literal_index, context, &call_runtime, |
+ TRACK_ALLOCATION_SITE); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
+ } |
+ |
+ __ Bind(&call_runtime); |
+ { |
+ STATIC_ASSERT(CreateArrayLiteralFlags::FlagsBits::kShift == 0); |
+ Node* flags_raw = __ Word32And( |
+ bytecode_flags, |
+ __ Int32Constant(CreateArrayLiteralFlags::FlagsBits::kMask)); |
+ Node* flags = __ SmiTag(flags_raw); |
+ Node* index = __ BytecodeOperandIdx(0); |
+ Node* constant_elements = __ LoadConstantPoolEntry(index); |
+ Node* result = |
+ __ CallRuntime(Runtime::kCreateArrayLiteral, context, closure, |
+ literal_index, constant_elements, flags); |
+ __ SetAccumulator(result); |
+ __ Dispatch(); |
+ } |
} |
// CreateObjectLiteral <element_idx> <literal_idx> <flags> |