summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc')
-rw-r--r--deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc69
1 files changed, 50 insertions, 19 deletions
diff --git a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
index 999490518e..e9b996ea09 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
@@ -8,6 +8,7 @@
#include "src/interpreter/bytecode-array-iterator.h"
#include "src/interpreter/bytecode-label.h"
#include "src/interpreter/bytecode-register-allocator.h"
+#include "src/objects-inl.h"
#include "test/unittests/test-utils.h"
namespace v8 {
@@ -77,8 +78,8 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
// Emit global load / store operations.
Handle<String> name = factory->NewStringFromStaticChars("var_name");
- builder.LoadGlobal(1, TypeofMode::NOT_INSIDE_TYPEOF)
- .LoadGlobal(1, TypeofMode::INSIDE_TYPEOF)
+ builder.LoadGlobal(name, 1, TypeofMode::NOT_INSIDE_TYPEOF)
+ .LoadGlobal(name, 1, TypeofMode::INSIDE_TYPEOF)
.StoreGlobal(name, 1, LanguageMode::SLOPPY)
.StoreGlobal(name, 1, LanguageMode::STRICT);
@@ -115,18 +116,19 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.LoadLookupGlobalSlot(name, TypeofMode::INSIDE_TYPEOF, 1, 0);
// Emit closure operations.
- builder.CreateClosure(0, NOT_TENURED);
+ builder.CreateClosure(0, 1, NOT_TENURED);
// Emit create context operation.
builder.CreateBlockContext(factory->NewScopeInfo(1));
builder.CreateCatchContext(reg, name, factory->NewScopeInfo(1));
builder.CreateFunctionContext(1);
+ builder.CreateEvalContext(1);
builder.CreateWithContext(reg, factory->NewScopeInfo(1));
// Emit literal creation operations.
- builder.CreateRegExpLiteral(factory->NewStringFromStaticChars("a"), 0, 0)
- .CreateArrayLiteral(factory->NewFixedArray(1), 0, 0)
- .CreateObjectLiteral(factory->NewFixedArray(1), 0, 0, reg);
+ builder.CreateRegExpLiteral(factory->NewStringFromStaticChars("a"), 0, 0);
+ builder.CreateArrayLiteral(0, 0, 0);
+ builder.CreateObjectLiteral(0, 0, 0, reg);
// Call operations.
builder.Call(reg, reg_list, 1, Call::GLOBAL_CALL)
@@ -135,7 +137,8 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.Call(reg, reg_list, 1, Call::GLOBAL_CALL, TailCallMode::kAllow)
.CallRuntime(Runtime::kIsArray, reg)
.CallRuntimeForPair(Runtime::kLoadLookupSlotForCall, reg_list, pair)
- .CallJSRuntime(Context::SPREAD_ITERABLE_INDEX, reg_list);
+ .CallJSRuntime(Context::SPREAD_ITERABLE_INDEX, reg_list)
+ .NewWithSpread(reg_list);
// Emit binary operator invocations.
builder.BinaryOperation(Token::Value::ADD, reg, 1)
@@ -195,14 +198,28 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.CompareOperation(Token::Value::INSTANCEOF, reg, 8)
.CompareOperation(Token::Value::IN, reg, 9);
+ // Emit peephole optimizations of equality with Null or Undefined.
+ builder.LoadUndefined()
+ .CompareOperation(Token::Value::EQ, reg, 1)
+ .LoadNull()
+ .CompareOperation(Token::Value::EQ, reg, 1)
+ .LoadUndefined()
+ .CompareOperation(Token::Value::EQ_STRICT, reg, 1)
+ .LoadNull()
+ .CompareOperation(Token::Value::EQ_STRICT, reg, 1);
+
// Emit conversion operator invocations.
builder.ConvertAccumulatorToNumber(reg)
.ConvertAccumulatorToObject(reg)
.ConvertAccumulatorToName(reg);
+ // Emit GetSuperConstructor.
+ builder.GetSuperConstructor(reg);
+
// Short jumps with Imm8 operands
{
- BytecodeLabel start, after_jump1, after_jump2, after_jump3, after_jump4;
+ BytecodeLabel start, after_jump1, after_jump2, after_jump3, after_jump4,
+ after_jump5;
builder.Bind(&start)
.Jump(&after_jump1)
.Bind(&after_jump1)
@@ -212,11 +229,13 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.Bind(&after_jump3)
.JumpIfNotHole(&after_jump4)
.Bind(&after_jump4)
+ .JumpIfJSReceiver(&after_jump5)
+ .Bind(&after_jump5)
.JumpLoop(&start, 0);
}
// Longer jumps with constant operands
- BytecodeLabel end[8];
+ BytecodeLabel end[9];
{
BytecodeLabel after_jump;
builder.Jump(&end[0])
@@ -231,7 +250,9 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.JumpIfFalse(&end[4])
.JumpIfNull(&end[5])
.JumpIfUndefined(&end[6])
- .JumpIfNotHole(&end[7]);
+ .JumpIfNotHole(&end[7])
+ .LoadLiteral(factory->prototype_string())
+ .JumpIfJSReceiver(&end[8]);
}
// Perform an operation that returns boolean value to
@@ -258,6 +279,9 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.Bind(&after_jump2);
}
+ // Emit set pending message bytecode.
+ builder.SetPendingMessage();
+
// Emit stack check bytecode.
builder.StackCheck(0);
@@ -282,14 +306,14 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
Handle<String> wide_name = factory->NewStringFromStaticChars("var_wide_name");
// Emit wide global load / store operations.
- builder.LoadGlobal(1024, TypeofMode::NOT_INSIDE_TYPEOF)
- .LoadGlobal(1024, TypeofMode::INSIDE_TYPEOF)
- .LoadGlobal(1024, TypeofMode::INSIDE_TYPEOF)
+ builder.LoadGlobal(name, 1024, TypeofMode::NOT_INSIDE_TYPEOF)
+ .LoadGlobal(name, 1024, TypeofMode::INSIDE_TYPEOF)
+ .LoadGlobal(name, 1024, TypeofMode::INSIDE_TYPEOF)
.StoreGlobal(name, 1024, LanguageMode::SLOPPY)
.StoreGlobal(wide_name, 1, LanguageMode::STRICT);
// Emit extra wide global load.
- builder.LoadGlobal(1024 * 1024, TypeofMode::NOT_INSIDE_TYPEOF);
+ builder.LoadGlobal(name, 1024 * 1024, TypeofMode::NOT_INSIDE_TYPEOF);
// Emit wide load / store property operations.
builder.LoadNamedProperty(reg, wide_name, 0)
@@ -299,6 +323,9 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.StoreNamedProperty(reg, wide_name, 0, LanguageMode::STRICT)
.StoreKeyedProperty(reg, reg, 2056, LanguageMode::STRICT);
+ builder.StoreDataPropertyInLiteral(reg, reg,
+ DataPropertyInLiteralFlag::kNoFlags, 0);
+
// Emit wide context operations.
builder.LoadContextSlot(reg, 1024, 0).StoreContextSlot(reg, 1024, 0);
@@ -309,13 +336,14 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.StoreLookupSlot(wide_name, LanguageMode::STRICT);
// CreateClosureWide
- builder.CreateClosure(1000, NOT_TENURED);
+ builder.CreateClosure(1000, 321, NOT_TENURED);
// Emit wide variant of literal creation operations.
- builder.CreateRegExpLiteral(factory->NewStringFromStaticChars("wide_literal"),
- 0, 0)
- .CreateArrayLiteral(factory->NewFixedArray(2), 0, 0)
- .CreateObjectLiteral(factory->NewFixedArray(2), 0, 0, reg);
+ builder
+ .CreateRegExpLiteral(factory->NewStringFromStaticChars("wide_literal"), 0,
+ 0)
+ .CreateArrayLiteral(0, 0, 0)
+ .CreateObjectLiteral(0, 0, 0, reg);
// Emit load and store operations for module variables.
builder.LoadModuleVariable(-1, 42)
@@ -393,6 +421,9 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
scorecard[Bytecodes::ToByte(Bytecode::kBitwiseOrSmi)] = 1;
scorecard[Bytecodes::ToByte(Bytecode::kShiftLeftSmi)] = 1;
scorecard[Bytecodes::ToByte(Bytecode::kShiftRightSmi)] = 1;
+ scorecard[Bytecodes::ToByte(Bytecode::kTestUndetectable)] = 1;
+ scorecard[Bytecodes::ToByte(Bytecode::kTestUndefined)] = 1;
+ scorecard[Bytecodes::ToByte(Bytecode::kTestNull)] = 1;
}
// Check return occurs at the end and only once in the BytecodeArray.