Chromium Code Reviews| Index: test/cctest/interpreter/test-interpreter.cc |
| diff --git a/test/cctest/interpreter/test-interpreter.cc b/test/cctest/interpreter/test-interpreter.cc |
| index d87f244318af3704fe3421e617976e7e4db33219..d72c10ecef536f68cd6f5aa6a5ddb609ca7224dd 100644 |
| --- a/test/cctest/interpreter/test-interpreter.cc |
| +++ b/test/cctest/interpreter/test-interpreter.cc |
| @@ -1291,6 +1291,90 @@ TEST(InterpreterTestIn) { |
| } |
| +TEST(InterpreterUnaryNot) { |
| + HandleAndZoneScope handles; |
| + for (size_t i = 1; i < 10; i++) { |
| + bool expected_value = ((i & 1) == 1); |
| + BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| + Register r0(0); |
| + builder.set_locals_count(0); |
| + builder.set_parameter_count(0); |
| + builder.EnterBlock(); |
| + builder.LoadFalse(); |
|
rmcilroy
2015/10/06 10:39:15
Could you add a tests with a non-boolean parameter
oth
2015/10/06 12:35:06
Done.
|
| + for (size_t j = 0; j < i; j++) { |
| + builder.LogicalNot(); |
| + } |
| + builder.LeaveBlock().Return(); |
| + Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| + InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| + auto callable = tester.GetCallable<>(); |
| + Handle<Object> return_value = callable().ToHandleChecked(); |
| + CHECK(return_value->IsBoolean()); |
| + CHECK_EQ(return_value->BooleanValue(), expected_value); |
| + } |
| +} |
| + |
| + |
| +static void LoadAny(BytecodeArrayBuilder* builder, |
| + v8::internal::Factory* factory, Handle<Object> obj) { |
| + if (obj->IsOddball()) { |
| + if (obj->SameValue(*factory->true_value())) { |
| + builder->LoadTrue(); |
| + } else if (obj->SameValue(*factory->false_value())) { |
| + builder->LoadFalse(); |
| + } else if (obj->SameValue(*factory->the_hole_value())) { |
| + builder->LoadTheHole(); |
| + } else if (obj->SameValue(*factory->null_value())) { |
| + builder->LoadNull(); |
| + } else if (obj->SameValue(*factory->undefined_value())) { |
| + builder->LoadUndefined(); |
| + } else { |
| + UNREACHABLE(); |
| + } |
| + } else if (obj->IsSmi()) { |
| + builder->LoadLiteral(*Handle<Smi>::cast(obj)); |
| + } else { |
| + builder->LoadLiteral(obj); |
| + } |
| +} |
| + |
| + |
| +TEST(InterpreterTypeOf) { |
| + HandleAndZoneScope handles; |
| + i::Factory* factory = handles.main_isolate()->factory(); |
| + |
| + std::pair<Handle<Object>, const char*> object_type_tuples[] = { |
| + std::make_pair(factory->undefined_value(), "undefined"), |
| + std::make_pair(factory->null_value(), "object"), |
| + std::make_pair(factory->true_value(), "boolean"), |
| + std::make_pair(factory->false_value(), "boolean"), |
| + std::make_pair(factory->NewNumber(9.1), "number"), |
| + std::make_pair(factory->NewNumberFromInt(7771), "number"), |
| + std::make_pair( |
| + Handle<Object>::cast(factory->NewStringFromStaticChars("hello")), |
| + "string"), |
| + }; |
| + |
| + for (size_t i = 0; i < arraysize(object_type_tuples); i++) { |
| + BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); |
| + Register r0(0); |
| + builder.set_locals_count(0); |
| + builder.set_parameter_count(0); |
| + builder.EnterBlock(); |
| + LoadAny(&builder, factory, object_type_tuples[i].first); |
| + builder.TypeOf(); |
| + builder.LeaveBlock().Return(); |
| + Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| + InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| + auto callable = tester.GetCallable<>(); |
| + Handle<v8::internal::String> return_value = |
| + Handle<v8::internal::String>::cast(callable().ToHandleChecked()); |
| + auto actual = return_value->ToCString(); |
| + CHECK_EQ(strcmp(&actual[0], object_type_tuples[i].second), 0); |
| + } |
| +} |
| + |
| + |
| TEST(InterpreterCallRuntime) { |
| HandleAndZoneScope handles; |