summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/interpreter/test-interpreter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/cctest/interpreter/test-interpreter.cc')
-rw-r--r--deps/v8/test/cctest/interpreter/test-interpreter.cc221
1 files changed, 102 insertions, 119 deletions
diff --git a/deps/v8/test/cctest/interpreter/test-interpreter.cc b/deps/v8/test/cctest/interpreter/test-interpreter.cc
index 65eee6f778..9ec0c99ce1 100644
--- a/deps/v8/test/cctest/interpreter/test-interpreter.cc
+++ b/deps/v8/test/cctest/interpreter/test-interpreter.cc
@@ -15,7 +15,8 @@
#include "src/interpreter/bytecode-label.h"
#include "src/interpreter/interpreter.h"
#include "src/objects-inl.h"
-#include "src/unicode-cache.h"
+#include "src/objects/heap-number-inl.h"
+#include "src/objects/smi.h"
#include "test/cctest/cctest.h"
#include "test/cctest/interpreter/interpreter-tester.h"
#include "test/cctest/test-feedback-vector.h"
@@ -240,7 +241,7 @@ static double BinaryOpC(Token::Value op, double lhs, double rhs) {
case Token::Value::DIV:
return lhs / rhs;
case Token::Value::MOD:
- return std::fmod(lhs, rhs);
+ return Modulo(lhs, rhs);
case Token::Value::BIT_OR:
return (v8::internal::DoubleToInt32(lhs) |
v8::internal::DoubleToInt32(rhs));
@@ -421,10 +422,11 @@ TEST(InterpreterBinaryOpsBigInt) {
auto callable = tester.GetCallable<>();
Handle<Object> return_value = callable().ToHandleChecked();
CHECK(return_value->IsBigInt());
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kBigInt,
- feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ CHECK_EQ(BinaryOperationFeedback::kBigInt, feedback->ToSmi().value());
+ }
}
}
}
@@ -542,9 +544,11 @@ TEST(InterpreterStringAdd) {
Handle<Object> return_value = callable().ToHandleChecked();
CHECK(return_value->SameValue(*test_cases[i].expected_value));
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- CHECK_EQ(test_cases[i].expected_feedback, feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ CHECK_EQ(test_cases[i].expected_feedback, feedback->ToSmi().value());
+ }
}
}
@@ -623,6 +627,8 @@ TEST(InterpreterParameter8) {
}
TEST(InterpreterBinaryOpTypeFeedback) {
+ if (FLAG_lite_mode) return;
+
HandleAndZoneScope handles;
i::Isolate* isolate = handles.main_isolate();
Zone* zone = handles.main_zone();
@@ -747,14 +753,16 @@ TEST(InterpreterBinaryOpTypeFeedback) {
auto callable = tester.GetCallable<>();
Handle<Object> return_val = callable().ToHandleChecked();
- MaybeObject* feedback0 = callable.vector()->Get(slot0);
+ MaybeObject feedback0 = callable.vector()->Get(slot0);
CHECK(feedback0->IsSmi());
- CHECK_EQ(test_case.feedback, feedback0->cast<Smi>()->value());
+ CHECK_EQ(test_case.feedback, feedback0->ToSmi().value());
CHECK(Object::Equals(isolate, test_case.result, return_val).ToChecked());
}
}
TEST(InterpreterBinaryOpSmiTypeFeedback) {
+ if (FLAG_lite_mode) return;
+
HandleAndZoneScope handles;
i::Isolate* isolate = handles.main_isolate();
Zone* zone = handles.main_zone();
@@ -794,7 +802,7 @@ TEST(InterpreterBinaryOpSmiTypeFeedback) {
isolate->factory()->NewHeapNumber(3.1415 - 2.0),
BinaryOperationFeedback::kNumber},
{Token::Value::SUB, LiteralForTest(ast_factory.GetOneByteString("2")), 2,
- Handle<Smi>(Smi::kZero, isolate), BinaryOperationFeedback::kAny},
+ Handle<Smi>(Smi::zero(), isolate), BinaryOperationFeedback::kAny},
// BIT_OR
{Token::Value::BIT_OR, LiteralForTest(4), 1,
Handle<Smi>(Smi::FromInt(5), isolate),
@@ -811,7 +819,7 @@ TEST(InterpreterBinaryOpSmiTypeFeedback) {
{Token::Value::BIT_AND, LiteralForTest(3.1415), 2,
Handle<Smi>(Smi::FromInt(2), isolate), BinaryOperationFeedback::kNumber},
{Token::Value::BIT_AND, LiteralForTest(ast_factory.GetOneByteString("2")),
- 1, Handle<Smi>(Smi::kZero, isolate), BinaryOperationFeedback::kAny},
+ 1, Handle<Smi>(Smi::zero(), isolate), BinaryOperationFeedback::kAny},
// SHL
{Token::Value::SHL, LiteralForTest(3), 1,
Handle<Smi>(Smi::FromInt(6), isolate),
@@ -826,7 +834,7 @@ TEST(InterpreterBinaryOpSmiTypeFeedback) {
Handle<Smi>(Smi::FromInt(1), isolate),
BinaryOperationFeedback::kSignedSmall},
{Token::Value::SAR, LiteralForTest(3.1415), 2,
- Handle<Smi>(Smi::kZero, isolate), BinaryOperationFeedback::kNumber},
+ Handle<Smi>(Smi::zero(), isolate), BinaryOperationFeedback::kNumber},
{Token::Value::SAR, LiteralForTest(ast_factory.GetOneByteString("2")), 1,
Handle<Smi>(Smi::FromInt(1), isolate), BinaryOperationFeedback::kAny}};
@@ -853,14 +861,16 @@ TEST(InterpreterBinaryOpSmiTypeFeedback) {
auto callable = tester.GetCallable<>();
Handle<Object> return_val = callable().ToHandleChecked();
- MaybeObject* feedback0 = callable.vector()->Get(slot0);
+ MaybeObject feedback0 = callable.vector()->Get(slot0);
CHECK(feedback0->IsSmi());
- CHECK_EQ(test_case.feedback, feedback0->cast<Smi>()->value());
+ CHECK_EQ(test_case.feedback, feedback0->ToSmi().value());
CHECK(Object::Equals(isolate, test_case.result, return_val).ToChecked());
}
}
TEST(InterpreterUnaryOpFeedback) {
+ if (FLAG_lite_mode) return;
+
HandleAndZoneScope handles;
i::Isolate* isolate = handles.main_isolate();
Zone* zone = handles.main_zone();
@@ -924,30 +934,31 @@ TEST(InterpreterUnaryOpFeedback) {
test_case.bigint_feedback_value, test_case.any_feedback_value)
.ToHandleChecked();
USE(return_val);
- MaybeObject* feedback0 = callable.vector()->Get(slot0);
+ MaybeObject feedback0 = callable.vector()->Get(slot0);
CHECK(feedback0->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kSignedSmall,
- feedback0->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kSignedSmall, feedback0->ToSmi().value());
- MaybeObject* feedback1 = callable.vector()->Get(slot1);
+ MaybeObject feedback1 = callable.vector()->Get(slot1);
CHECK(feedback1->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kNumber, feedback1->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kNumber, feedback1->ToSmi().value());
- MaybeObject* feedback2 = callable.vector()->Get(slot2);
+ MaybeObject feedback2 = callable.vector()->Get(slot2);
CHECK(feedback2->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kNumber, feedback2->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kNumber, feedback2->ToSmi().value());
- MaybeObject* feedback3 = callable.vector()->Get(slot3);
+ MaybeObject feedback3 = callable.vector()->Get(slot3);
CHECK(feedback3->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kBigInt, feedback3->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kBigInt, feedback3->ToSmi().value());
- MaybeObject* feedback4 = callable.vector()->Get(slot4);
+ MaybeObject feedback4 = callable.vector()->Get(slot4);
CHECK(feedback4->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kAny, feedback4->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kAny, feedback4->ToSmi().value());
}
}
TEST(InterpreterBitwiseTypeFeedback) {
+ if (FLAG_lite_mode) return;
+
HandleAndZoneScope handles;
i::Isolate* isolate = handles.main_isolate();
Zone* zone = handles.main_zone();
@@ -986,18 +997,17 @@ TEST(InterpreterBitwiseTypeFeedback) {
Handle<Object> return_val =
callable(arg1, arg2, arg3, arg4).ToHandleChecked();
USE(return_val);
- MaybeObject* feedback0 = callable.vector()->Get(slot0);
+ MaybeObject feedback0 = callable.vector()->Get(slot0);
CHECK(feedback0->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kSignedSmall,
- feedback0->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kSignedSmall, feedback0->ToSmi().value());
- MaybeObject* feedback1 = callable.vector()->Get(slot1);
+ MaybeObject feedback1 = callable.vector()->Get(slot1);
CHECK(feedback1->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kNumber, feedback1->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kNumber, feedback1->ToSmi().value());
- MaybeObject* feedback2 = callable.vector()->Get(slot2);
+ MaybeObject feedback2 = callable.vector()->Get(slot2);
CHECK(feedback2->IsSmi());
- CHECK_EQ(BinaryOperationFeedback::kAny, feedback2->cast<Smi>()->value());
+ CHECK_EQ(BinaryOperationFeedback::kAny, feedback2->ToSmi().value());
}
}
@@ -1519,7 +1529,7 @@ TEST(InterpreterJumps) {
Register reg(0), scratch(1);
BytecodeLabel label[3];
- builder.LoadLiteral(Smi::kZero)
+ builder.LoadLiteral(Smi::zero())
.StoreAccumulatorInRegister(reg)
.Jump(&label[1]);
SetRegister(builder, reg, 1024, scratch).Bind(&label[0]);
@@ -1559,7 +1569,7 @@ TEST(InterpreterConditionalJumps) {
BytecodeLabel label[2];
BytecodeLabel done, done1;
- builder.LoadLiteral(Smi::kZero)
+ builder.LoadLiteral(Smi::zero())
.StoreAccumulatorInRegister(reg)
.LoadFalse()
.JumpIfFalse(ToBooleanMode::kAlreadyBoolean, &label[0]);
@@ -1609,7 +1619,7 @@ TEST(InterpreterConditionalJumps2) {
BytecodeLabel label[2];
BytecodeLabel done, done1;
- builder.LoadLiteral(Smi::kZero)
+ builder.LoadLiteral(Smi::zero())
.StoreAccumulatorInRegister(reg)
.LoadFalse()
.JumpIfFalse(ToBooleanMode::kAlreadyBoolean, &label[0]);
@@ -1654,7 +1664,7 @@ TEST(InterpreterJumpConstantWith16BitOperand) {
Register reg(0), scratch(256);
BytecodeLabel done, fake;
- builder.LoadLiteral(Smi::kZero);
+ builder.LoadLiteral(Smi::zero());
builder.StoreAccumulatorInRegister(reg);
// Consume all 8-bit operands
for (int i = 1; i <= 256; i++) {
@@ -1667,7 +1677,7 @@ TEST(InterpreterJumpConstantWith16BitOperand) {
// Emit more than 16-bit immediate operands worth of code to jump over.
builder.Bind(&fake);
for (int i = 0; i < 6600; i++) {
- builder.LoadLiteral(Smi::kZero); // 1-byte
+ builder.LoadLiteral(Smi::zero()); // 1-byte
builder.BinaryOperation(Token::Value::ADD, scratch,
GetIndex(slot)); // 6-bytes
builder.StoreAccumulatorInRegister(scratch); // 4-bytes
@@ -1709,7 +1719,7 @@ TEST(InterpreterJumpWith32BitOperand) {
Register reg(0);
BytecodeLabel done;
- builder.LoadLiteral(Smi::kZero);
+ builder.LoadLiteral(Smi::zero());
builder.StoreAccumulatorInRegister(reg);
// Consume all 16-bit constant pool entries. Make sure to use doubles so that
// the jump can't re-use an integer.
@@ -1717,7 +1727,7 @@ TEST(InterpreterJumpWith32BitOperand) {
builder.LoadLiteral(i + 0.5);
}
builder.Jump(&done);
- builder.LoadLiteral(Smi::kZero);
+ builder.LoadLiteral(Smi::zero());
builder.Bind(&done);
builder.Return();
@@ -1816,10 +1826,12 @@ TEST(InterpreterSmiComparisons) {
CHECK(return_value->IsBoolean());
CHECK_EQ(return_value->BooleanValue(isolate),
CompareC(comparison, inputs[i], inputs[j]));
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- CHECK_EQ(CompareOperationFeedback::kSignedSmall,
- feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ CHECK_EQ(CompareOperationFeedback::kSignedSmall,
+ feedback->ToSmi().value());
+ }
}
}
}
@@ -1865,10 +1877,12 @@ TEST(InterpreterHeapNumberComparisons) {
CHECK(return_value->IsBoolean());
CHECK_EQ(return_value->BooleanValue(isolate),
CompareC(comparison, inputs[i], inputs[j]));
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- CHECK_EQ(CompareOperationFeedback::kNumber,
- feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ CHECK_EQ(CompareOperationFeedback::kNumber,
+ feedback->ToSmi().value());
+ }
}
}
}
@@ -1908,10 +1922,12 @@ TEST(InterpreterBigIntComparisons) {
auto callable = tester.GetCallable<>();
Handle<Object> return_value = callable().ToHandleChecked();
CHECK(return_value->IsBoolean());
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- CHECK_EQ(CompareOperationFeedback::kBigInt,
- feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ CHECK_EQ(CompareOperationFeedback::kBigInt,
+ feedback->ToSmi().value());
+ }
}
}
}
@@ -1956,13 +1972,15 @@ TEST(InterpreterStringComparisons) {
CHECK(return_value->IsBoolean());
CHECK_EQ(return_value->BooleanValue(isolate),
CompareC(comparison, inputs[i], inputs[j]));
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- int const expected_feedback =
- Token::IsOrderedRelationalCompareOp(comparison)
- ? CompareOperationFeedback::kString
- : CompareOperationFeedback::kInternalizedString;
- CHECK_EQ(expected_feedback, feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ int const expected_feedback =
+ Token::IsOrderedRelationalCompareOp(comparison)
+ ? CompareOperationFeedback::kString
+ : CompareOperationFeedback::kInternalizedString;
+ CHECK_EQ(expected_feedback, feedback->ToSmi().value());
+ }
}
}
}
@@ -1989,8 +2007,6 @@ TEST(InterpreterMixedComparisons) {
// performed.
const char* inputs[] = {"-1.77", "-40.333", "0.01", "55.77e50", "2.01"};
- UnicodeCache unicode_cache;
-
enum WhichSideString { kLhsIsString, kRhsIsString };
enum StringType { kInternalizedStringConstant, kComputedString };
@@ -2006,10 +2022,8 @@ TEST(InterpreterMixedComparisons) {
{kInternalizedStringConstant, kComputedString}) {
const char* lhs_cstr = inputs[i];
const char* rhs_cstr = inputs[j];
- double lhs = StringToDouble(&unicode_cache, lhs_cstr,
- ConversionFlags::NO_FLAGS);
- double rhs = StringToDouble(&unicode_cache, rhs_cstr,
- ConversionFlags::NO_FLAGS);
+ double lhs = StringToDouble(lhs_cstr, ConversionFlags::NO_FLAGS);
+ double rhs = StringToDouble(rhs_cstr, ConversionFlags::NO_FLAGS);
HandleAndZoneScope handles;
Isolate* isolate = handles.main_isolate();
Zone* zone = handles.main_zone();
@@ -2071,11 +2085,13 @@ TEST(InterpreterMixedComparisons) {
CHECK(return_value->IsBoolean());
CHECK_EQ(return_value->BooleanValue(isolate),
CompareC(comparison, lhs, rhs, true));
- MaybeObject* feedback = callable.vector()->Get(slot);
- CHECK(feedback->IsSmi());
- // Comparison with a number and string collects kAny feedback.
- CHECK_EQ(CompareOperationFeedback::kAny,
- feedback->cast<Smi>()->value());
+ if (tester.HasFeedbackMetadata()) {
+ MaybeObject feedback = callable.vector()->Get(slot);
+ CHECK(feedback->IsSmi());
+ // Comparison with a number and string collects kAny feedback.
+ CHECK_EQ(CompareOperationFeedback::kAny,
+ feedback->ToSmi().value());
+ }
}
}
}
@@ -2097,13 +2113,10 @@ TEST(InterpreterStrictNotEqual) {
// Test passing different types.
const char* inputs[] = {"-1.77", "-40.333", "0.01", "55.77e5", "2.01"};
- UnicodeCache unicode_cache;
for (size_t i = 0; i < arraysize(inputs); i++) {
for (size_t j = 0; j < arraysize(inputs); j++) {
- double lhs =
- StringToDouble(&unicode_cache, inputs[i], ConversionFlags::NO_FLAGS);
- double rhs =
- StringToDouble(&unicode_cache, inputs[j], ConversionFlags::NO_FLAGS);
+ double lhs = StringToDouble(inputs[i], ConversionFlags::NO_FLAGS);
+ double rhs = StringToDouble(inputs[j], ConversionFlags::NO_FLAGS);
Handle<Object> lhs_obj = factory->NewNumber(lhs);
Handle<Object> rhs_obj = factory->NewStringFromAsciiChecked(inputs[j]);
@@ -4635,37 +4648,6 @@ TEST(InterpreterWideParametersSummation) {
}
}
-TEST(InterpreterDoExpression) {
- bool old_flag = FLAG_harmony_do_expressions;
- FLAG_harmony_do_expressions = true;
-
- HandleAndZoneScope handles;
- Isolate* isolate = handles.main_isolate();
- Factory* factory = isolate->factory();
-
- std::pair<const char*, Handle<Object>> do_expr[] = {
- {"var a = do {}; return a;", factory->undefined_value()},
- {"var a = do { var x = 100; }; return a;", factory->undefined_value()},
- {"var a = do { var x = 100; }; return a;", factory->undefined_value()},
- {"var a = do { var x = 100; x++; }; return a;",
- handle(Smi::FromInt(100), isolate)},
- {"var i = 0; for (; i < 5;) { i = do { if (i == 3) { break; }; i + 1; }};"
- "return i;",
- handle(Smi::FromInt(3), isolate)},
- };
-
- for (size_t i = 0; i < arraysize(do_expr); i++) {
- std::string source(InterpreterTester::SourceForBody(do_expr[i].first));
- InterpreterTester tester(isolate, source.c_str());
- auto callable = tester.GetCallable<>();
-
- Handle<i::Object> return_value = callable().ToHandleChecked();
- CHECK(return_value->SameValue(*do_expr[i].second));
- }
-
- FLAG_harmony_do_expressions = old_flag;
-}
-
TEST(InterpreterWithStatement) {
HandleAndZoneScope handles;
Isolate* isolate = handles.main_isolate();
@@ -5026,6 +5008,7 @@ TEST(InterpreterGenerators) {
}
}
+#ifndef V8_TARGET_ARCH_ARM
TEST(InterpreterWithNativeStack) {
i::FLAG_interpreted_frames_native_stack = true;
@@ -5039,41 +5022,41 @@ TEST(InterpreterWithNativeStack) {
i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
CHECK(f->shared()->HasBytecodeArray());
- i::Code* code = f->shared()->GetCode();
+ i::Code code = f->shared()->GetCode();
i::Handle<i::Code> interpreter_entry_trampoline =
BUILTIN_CODE(isolate, InterpreterEntryTrampoline);
CHECK(code->IsCode());
CHECK(code->is_interpreter_trampoline_builtin());
- CHECK_NE(code->InstructionStart(),
- interpreter_entry_trampoline->InstructionStart());
+ CHECK_NE(code->address(), interpreter_entry_trampoline->address());
}
+#endif // V8_TARGET_ARCH_ARM
-TEST(InterpreterGetAndMaybeDeserializeBytecodeHandler) {
+TEST(InterpreterGetBytecodeHandler) {
HandleAndZoneScope handles;
Isolate* isolate = handles.main_isolate();
Interpreter* interpreter = isolate->interpreter();
// Test that single-width bytecode handlers deserializer correctly.
- Code* wide_handler = interpreter->GetAndMaybeDeserializeBytecodeHandler(
- Bytecode::kWide, OperandScale::kSingle);
+ Code wide_handler =
+ interpreter->GetBytecodeHandler(Bytecode::kWide, OperandScale::kSingle);
CHECK_EQ(wide_handler->builtin_index(), Builtins::kWideHandler);
- Code* add_handler = interpreter->GetAndMaybeDeserializeBytecodeHandler(
- Bytecode::kAdd, OperandScale::kSingle);
+ Code add_handler =
+ interpreter->GetBytecodeHandler(Bytecode::kAdd, OperandScale::kSingle);
CHECK_EQ(add_handler->builtin_index(), Builtins::kAddHandler);
// Test that double-width bytecode handlers deserializer correctly, including
// an illegal bytecode handler since there is no Wide.Wide handler.
- Code* wide_wide_handler = interpreter->GetAndMaybeDeserializeBytecodeHandler(
- Bytecode::kWide, OperandScale::kDouble);
+ Code wide_wide_handler =
+ interpreter->GetBytecodeHandler(Bytecode::kWide, OperandScale::kDouble);
CHECK_EQ(wide_wide_handler->builtin_index(), Builtins::kIllegalHandler);
- Code* add_wide_handler = interpreter->GetAndMaybeDeserializeBytecodeHandler(
- Bytecode::kAdd, OperandScale::kDouble);
+ Code add_wide_handler =
+ interpreter->GetBytecodeHandler(Bytecode::kAdd, OperandScale::kDouble);
CHECK_EQ(add_wide_handler->builtin_index(), Builtins::kAddWideHandler);
}