summaryrefslogtreecommitdiff
path: root/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2018-01-24 20:16:06 +0100
committerMyles Borins <mylesborins@google.com>2018-01-24 15:02:20 -0800
commit4c4af643e5042d615a60c6bbc05aee9d81b903e5 (patch)
tree3fb0a97988fe4439ae3ae06f26915d1dcf8cab92 /deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
parentfa9f31a4fda5a3782c652e56e394465805ebb50f (diff)
downloadnode-new-4c4af643e5042d615a60c6bbc05aee9d81b903e5.tar.gz
deps: update V8 to 6.4.388.40
PR-URL: https://github.com/nodejs/node/pull/17489 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Ali Ijaz Sheikh <ofrobots@google.com>
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.cc136
1 files changed, 76 insertions, 60 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 5cdce7fc00..bbc9e565c9 100644
--- a/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
+++ b/deps/v8/test/unittests/interpreter/bytecode-array-builder-unittest.cc
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include <limits>
+
#include "src/v8.h"
#include "src/ast/scopes.h"
@@ -26,7 +28,8 @@ class BytecodeArrayBuilderTest : public TestWithIsolateAndZone {
using ToBooleanMode = BytecodeArrayBuilder::ToBooleanMode;
TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 131);
+ FeedbackVectorSpec feedback_spec(zone());
+ BytecodeArrayBuilder builder(zone(), 1, 131, &feedback_spec);
Factory* factory = isolate()->factory();
AstValueFactory ast_factory(zone(), isolate()->ast_string_constants(),
isolate()->heap()->HashSeed());
@@ -56,8 +59,7 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.StoreAccumulatorInRegister(reg)
.LoadLiteral(Smi::FromInt(10000000))
.StoreAccumulatorInRegister(reg)
- .LoadLiteral(
- ast_factory.NewString(ast_factory.GetOneByteString("A constant")))
+ .LoadLiteral(ast_factory.GetOneByteString("A constant"))
.StoreAccumulatorInRegister(reg)
.LoadUndefined()
.StoreAccumulatorInRegister(reg)
@@ -81,12 +83,36 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
builder.MoveRegister(reg, other);
builder.MoveRegister(reg, wide);
+ FeedbackSlot load_global_slot =
+ feedback_spec.AddLoadGlobalICSlot(NOT_INSIDE_TYPEOF);
+ FeedbackSlot load_global_typeof_slot =
+ feedback_spec.AddLoadGlobalICSlot(INSIDE_TYPEOF);
+ FeedbackSlot sloppy_store_global_slot =
+ feedback_spec.AddStoreGlobalICSlot(LanguageMode::kSloppy);
+ FeedbackSlot strict_store_global_slot =
+ feedback_spec.AddStoreGlobalICSlot(LanguageMode::kStrict);
+ FeedbackSlot load_slot = feedback_spec.AddLoadICSlot();
+ FeedbackSlot keyed_load_slot = feedback_spec.AddKeyedLoadICSlot();
+ FeedbackSlot sloppy_store_slot =
+ feedback_spec.AddStoreICSlot(LanguageMode::kSloppy);
+ FeedbackSlot strict_store_slot =
+ feedback_spec.AddStoreICSlot(LanguageMode::kStrict);
+ FeedbackSlot sloppy_keyed_store_slot =
+ feedback_spec.AddKeyedStoreICSlot(LanguageMode::kSloppy);
+ FeedbackSlot strict_keyed_store_slot =
+ feedback_spec.AddKeyedStoreICSlot(LanguageMode::kStrict);
+ FeedbackSlot store_own_slot = feedback_spec.AddStoreOwnICSlot();
+
// Emit global load / store operations.
const AstRawString* name = ast_factory.GetOneByteString("var_name");
- builder.LoadGlobal(name, 1, TypeofMode::NOT_INSIDE_TYPEOF)
- .LoadGlobal(name, 1, TypeofMode::INSIDE_TYPEOF)
- .StoreGlobal(name, 1, LanguageMode::SLOPPY)
- .StoreGlobal(name, 1, LanguageMode::STRICT);
+ builder
+ .LoadGlobal(name, load_global_slot.ToInt(), TypeofMode::NOT_INSIDE_TYPEOF)
+ .LoadGlobal(name, load_global_typeof_slot.ToInt(),
+ TypeofMode::INSIDE_TYPEOF)
+ .StoreGlobal(name, sloppy_store_global_slot.ToInt(),
+ LanguageMode::kSloppy)
+ .StoreGlobal(name, strict_store_global_slot.ToInt(),
+ LanguageMode::kStrict);
// Emit context operations.
builder.PushContext(reg)
@@ -106,21 +132,26 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.StoreContextSlot(Register::current_context(), 3, 0);
// Emit load / store property operations.
- builder.LoadNamedProperty(reg, name, 0)
- .LoadKeyedProperty(reg, 0)
- .StoreNamedProperty(reg, name, 0, LanguageMode::SLOPPY)
- .StoreKeyedProperty(reg, reg, 0, LanguageMode::SLOPPY)
- .StoreNamedProperty(reg, name, 0, LanguageMode::STRICT)
- .StoreKeyedProperty(reg, reg, 0, LanguageMode::STRICT)
- .StoreNamedOwnProperty(reg, name, 0);
+ builder.LoadNamedProperty(reg, name, load_slot.ToInt())
+ .LoadKeyedProperty(reg, keyed_load_slot.ToInt())
+ .StoreNamedProperty(reg, name, sloppy_store_slot.ToInt(),
+ LanguageMode::kSloppy)
+ .StoreKeyedProperty(reg, reg, sloppy_keyed_store_slot.ToInt(),
+ LanguageMode::kSloppy)
+ .StoreNamedProperty(reg, name, strict_store_slot.ToInt(),
+ LanguageMode::kStrict)
+ .StoreKeyedProperty(reg, reg, strict_keyed_store_slot.ToInt(),
+ LanguageMode::kStrict)
+ .StoreNamedOwnProperty(reg, name, store_own_slot.ToInt());
// Emit load / store lookup slots.
builder.LoadLookupSlot(name, TypeofMode::NOT_INSIDE_TYPEOF)
.LoadLookupSlot(name, TypeofMode::INSIDE_TYPEOF)
- .StoreLookupSlot(name, LanguageMode::SLOPPY, LookupHoistingMode::kNormal)
- .StoreLookupSlot(name, LanguageMode::SLOPPY,
+ .StoreLookupSlot(name, LanguageMode::kSloppy, LookupHoistingMode::kNormal)
+ .StoreLookupSlot(name, LanguageMode::kSloppy,
LookupHoistingMode::kLegacySloppy)
- .StoreLookupSlot(name, LanguageMode::STRICT, LookupHoistingMode::kNormal);
+ .StoreLookupSlot(name, LanguageMode::kStrict,
+ LookupHoistingMode::kNormal);
// Emit load / store lookup slots with context fast paths.
builder.LoadLookupContextSlot(name, TypeofMode::NOT_INSIDE_TYPEOF, 1, 0)
@@ -168,7 +199,8 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.BinaryOperation(Token::Value::SUB, reg, 2)
.BinaryOperation(Token::Value::MUL, reg, 3)
.BinaryOperation(Token::Value::DIV, reg, 4)
- .BinaryOperation(Token::Value::MOD, reg, 5);
+ .BinaryOperation(Token::Value::MOD, reg, 5)
+ .BinaryOperation(Token::Value::EXP, reg, 6);
// Emit bitwise operator invocations
builder.BinaryOperation(Token::Value::BIT_OR, reg, 6)
@@ -186,6 +218,7 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.BinaryOperationSmiLiteral(Token::Value::MUL, Smi::FromInt(42), 2)
.BinaryOperationSmiLiteral(Token::Value::DIV, Smi::FromInt(42), 2)
.BinaryOperationSmiLiteral(Token::Value::MOD, Smi::FromInt(42), 2)
+ .BinaryOperationSmiLiteral(Token::Value::EXP, Smi::FromInt(42), 2)
.BinaryOperationSmiLiteral(Token::Value::BIT_OR, Smi::FromInt(42), 2)
.BinaryOperationSmiLiteral(Token::Value::BIT_XOR, Smi::FromInt(42), 2)
.BinaryOperationSmiLiteral(Token::Value::BIT_AND, Smi::FromInt(42), 2)
@@ -206,7 +239,7 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.TypeOf();
// Emit delete
- builder.Delete(reg, LanguageMode::SLOPPY).Delete(reg, LanguageMode::STRICT);
+ builder.Delete(reg, LanguageMode::kSloppy).Delete(reg, LanguageMode::kStrict);
// Emit construct.
builder.Construct(reg, reg_list, 1).ConstructWithSpread(reg, reg_list, 1);
@@ -220,14 +253,14 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
.CompareOperation(Token::Value::LTE, reg, 5)
.CompareOperation(Token::Value::GTE, reg, 6)
.CompareTypeOf(TestTypeOfFlags::LiteralFlag::kNumber)
- .CompareOperation(Token::Value::INSTANCEOF, reg)
+ .CompareOperation(Token::Value::INSTANCEOF, reg, 7)
.CompareOperation(Token::Value::IN, reg)
.CompareUndetectable()
.CompareUndefined()
.CompareNull();
// Emit conversion operator invocations.
- builder.ToNumber(1).ToObject(reg).ToName(reg);
+ builder.ToNumber(1).ToNumeric(1).ToObject(reg).ToName(reg);
// Emit GetSuperConstructor.
builder.GetSuperConstructor(reg);
@@ -310,30 +343,11 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
// Wide constant pool loads
for (int i = 0; i < 256; i++) {
// Emit junk in constant pool to force wide constant pool index.
- builder.LoadLiteral(ast_factory.NewNumber(2.5321 + i));
+ builder.LoadLiteral(2.5321 + i);
}
builder.LoadLiteral(Smi::FromInt(20000000));
const AstRawString* wide_name = ast_factory.GetOneByteString("var_wide_name");
- // Emit wide global load / store operations.
- 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(name, 1024 * 1024, TypeofMode::NOT_INSIDE_TYPEOF);
-
- // Emit wide load / store property operations.
- builder.LoadNamedProperty(reg, wide_name, 0)
- .LoadKeyedProperty(reg, 2056)
- .StoreNamedProperty(reg, wide_name, 0, LanguageMode::SLOPPY)
- .StoreKeyedProperty(reg, reg, 2056, LanguageMode::SLOPPY)
- .StoreNamedProperty(reg, wide_name, 0, LanguageMode::STRICT)
- .StoreKeyedProperty(reg, reg, 2056, LanguageMode::STRICT)
- .StoreNamedOwnProperty(reg, wide_name, 0);
-
builder.StoreDataPropertyInLiteral(reg, reg,
DataPropertyInLiteralFlag::kNoFlags, 0);
@@ -344,11 +358,11 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
// Emit wide load / store lookup slots.
builder.LoadLookupSlot(wide_name, TypeofMode::NOT_INSIDE_TYPEOF)
.LoadLookupSlot(wide_name, TypeofMode::INSIDE_TYPEOF)
- .StoreLookupSlot(wide_name, LanguageMode::SLOPPY,
+ .StoreLookupSlot(wide_name, LanguageMode::kSloppy,
LookupHoistingMode::kNormal)
- .StoreLookupSlot(wide_name, LanguageMode::SLOPPY,
+ .StoreLookupSlot(wide_name, LanguageMode::kSloppy,
LookupHoistingMode::kLegacySloppy)
- .StoreLookupSlot(wide_name, LanguageMode::STRICT,
+ .StoreLookupSlot(wide_name, LanguageMode::kStrict,
LookupHoistingMode::kNormal);
// CreateClosureWide
@@ -454,7 +468,7 @@ TEST_F(BytecodeArrayBuilderTest, AllBytecodesGenerated) {
TEST_F(BytecodeArrayBuilderTest, FrameSizesLookGood) {
for (int locals = 0; locals < 5; locals++) {
for (int temps = 0; temps < 3; temps++) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, locals);
+ BytecodeArrayBuilder builder(zone(), 1, locals);
BytecodeRegisterAllocator* allocator(builder.register_allocator());
for (int i = 0; i < locals; i++) {
builder.LoadLiteral(Smi::kZero);
@@ -491,7 +505,7 @@ TEST_F(BytecodeArrayBuilderTest, RegisterValues) {
TEST_F(BytecodeArrayBuilderTest, Parameters) {
- BytecodeArrayBuilder builder(isolate(), zone(), 10, 0);
+ BytecodeArrayBuilder builder(zone(), 10, 0);
Register receiver(builder.Receiver());
Register param8(builder.Parameter(8));
@@ -500,35 +514,37 @@ TEST_F(BytecodeArrayBuilderTest, Parameters) {
TEST_F(BytecodeArrayBuilderTest, Constants) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 0);
+ BytecodeArrayBuilder builder(zone(), 1, 0);
AstValueFactory ast_factory(zone(), isolate()->ast_string_constants(),
isolate()->heap()->HashSeed());
- const AstValue* heap_num_1 = ast_factory.NewNumber(3.14);
- const AstValue* heap_num_2 = ast_factory.NewNumber(5.2);
- const AstValue* string =
- ast_factory.NewString(ast_factory.GetOneByteString("foo"));
- const AstValue* string_copy =
- ast_factory.NewString(ast_factory.GetOneByteString("foo"));
+ double heap_num_1 = 3.14;
+ double heap_num_2 = 5.2;
+ double nan = std::numeric_limits<double>::quiet_NaN();
+ const AstRawString* string = ast_factory.GetOneByteString("foo");
+ const AstRawString* string_copy = ast_factory.GetOneByteString("foo");
builder.LoadLiteral(heap_num_1)
.LoadLiteral(heap_num_2)
.LoadLiteral(string)
.LoadLiteral(heap_num_1)
.LoadLiteral(heap_num_1)
+ .LoadLiteral(nan)
.LoadLiteral(string_copy)
+ .LoadLiteral(heap_num_2)
+ .LoadLiteral(nan)
.Return();
ast_factory.Internalize(isolate());
Handle<BytecodeArray> array = builder.ToBytecodeArray(isolate());
// Should only have one entry for each identical constant.
- CHECK_EQ(array->constant_pool()->length(), 3);
+ EXPECT_EQ(4, array->constant_pool()->length());
}
TEST_F(BytecodeArrayBuilderTest, ForwardJumps) {
static const int kFarJumpDistance = 256 + 20;
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 1);
+ BytecodeArrayBuilder builder(zone(), 1, 1);
Register reg(0);
BytecodeLabel far0, far1, far2, far3, far4;
@@ -643,7 +659,7 @@ TEST_F(BytecodeArrayBuilderTest, ForwardJumps) {
TEST_F(BytecodeArrayBuilderTest, BackwardJumps) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 1);
+ BytecodeArrayBuilder builder(zone(), 1, 1);
Register reg(0);
@@ -691,7 +707,7 @@ TEST_F(BytecodeArrayBuilderTest, BackwardJumps) {
}
TEST_F(BytecodeArrayBuilderTest, SmallSwitch) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 1);
+ BytecodeArrayBuilder builder(zone(), 1, 1);
// Small jump table that fits into the single-size constant pool
int small_jump_table_size = 5;
@@ -739,7 +755,7 @@ TEST_F(BytecodeArrayBuilderTest, SmallSwitch) {
}
TEST_F(BytecodeArrayBuilderTest, WideSwitch) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 1);
+ BytecodeArrayBuilder builder(zone(), 1, 1);
// Large jump table that requires a wide Switch bytecode.
int large_jump_table_size = 256;
@@ -787,7 +803,7 @@ TEST_F(BytecodeArrayBuilderTest, WideSwitch) {
}
TEST_F(BytecodeArrayBuilderTest, LabelReuse) {
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 0);
+ BytecodeArrayBuilder builder(zone(), 1, 0);
// Labels can only have 1 forward reference, but
// can be referred to mulitple times once bound.
@@ -821,7 +837,7 @@ TEST_F(BytecodeArrayBuilderTest, LabelReuse) {
TEST_F(BytecodeArrayBuilderTest, LabelAddressReuse) {
static const int kRepeats = 3;
- BytecodeArrayBuilder builder(isolate(), zone(), 1, 0);
+ BytecodeArrayBuilder builder(zone(), 1, 0);
for (int i = 0; i < kRepeats; i++) {
BytecodeLabel label, after_jump0, after_jump1;
builder.Jump(&label)