| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/base/utils/random-number-generator.h" | 5 #include "src/base/utils/random-number-generator.h" |
| 6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
| 7 #include "src/code-stub-assembler.h" | 7 #include "src/code-stub-assembler.h" |
| 8 #include "src/compiler/node.h" | 8 #include "src/compiler/node.h" |
| 9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
| 10 #include "src/isolate.h" | 10 #include "src/isolate.h" |
| (...skipping 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 // Ensure we performed both kind of queries. | 1503 // Ensure we performed both kind of queries. |
| 1504 CHECK(queried_existing && queried_non_existing); | 1504 CHECK(queried_existing && queried_non_existing); |
| 1505 } | 1505 } |
| 1506 | 1506 |
| 1507 TEST(GotoIfException) { | 1507 TEST(GotoIfException) { |
| 1508 typedef CodeStubAssembler::Label Label; | 1508 typedef CodeStubAssembler::Label Label; |
| 1509 typedef CodeStubAssembler::Variable Variable; | 1509 typedef CodeStubAssembler::Variable Variable; |
| 1510 Isolate* isolate(CcTest::InitIsolateOnce()); | 1510 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1511 | 1511 |
| 1512 const int kNumParams = 1; | 1512 const int kNumParams = 1; |
| 1513 CodeStubAssemblerTester m(isolate, kNumParams); | 1513 // Emulate TFJ builtin |
| 1514 CodeStubAssemblerTester m(isolate, kNumParams, Code::BUILTIN); |
| 1514 | 1515 |
| 1515 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 1516 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 1516 Node* to_string_tag = | 1517 Node* to_string_tag = |
| 1517 m.HeapConstant(isolate->factory()->to_string_tag_symbol()); | 1518 m.HeapConstant(isolate->factory()->to_string_tag_symbol()); |
| 1518 Variable exception(&m, MachineRepresentation::kTagged); | 1519 Variable exception(&m, MachineRepresentation::kTagged); |
| 1519 | 1520 |
| 1520 Label exception_handler(&m); | 1521 Label exception_handler(&m); |
| 1521 Callable to_string = CodeFactory::ToString(isolate); | 1522 Callable to_string = CodeFactory::ToString(isolate); |
| 1522 Node* string = m.CallStub(to_string, context, to_string_tag); | 1523 Node* string = m.CallStub(to_string, context, to_string_tag); |
| 1523 m.GotoIfException(string, &exception_handler, &exception); | 1524 m.GotoIfException(string, &exception_handler, &exception); |
| 1524 m.Return(string); | 1525 m.Return(string); |
| 1525 | 1526 |
| 1526 m.Bind(&exception_handler); | 1527 m.Bind(&exception_handler); |
| 1527 m.Return(exception.value()); | 1528 m.Return(exception.value()); |
| 1528 | 1529 |
| 1529 Handle<Code> code = m.GenerateCode(); | 1530 Handle<Code> code = m.GenerateCode(); |
| 1530 CHECK(!code.is_null()); | 1531 CHECK(!code.is_null()); |
| 1531 | 1532 |
| 1532 // Emulate TFJ builtin | |
| 1533 code->set_flags(Code::ComputeFlags(Code::BUILTIN)); | |
| 1534 | |
| 1535 FunctionTester ft(code, kNumParams); | 1533 FunctionTester ft(code, kNumParams); |
| 1536 Handle<Object> result = ft.Call().ToHandleChecked(); | 1534 Handle<Object> result = ft.Call().ToHandleChecked(); |
| 1537 | 1535 |
| 1538 // Should be a TypeError | 1536 // Should be a TypeError |
| 1539 CHECK(result->IsJSObject()); | 1537 CHECK(result->IsJSObject()); |
| 1540 | 1538 |
| 1541 Handle<Object> constructor = | 1539 Handle<Object> constructor = |
| 1542 Object::GetPropertyOrElement(result, | 1540 Object::GetPropertyOrElement(result, |
| 1543 isolate->factory()->constructor_string()) | 1541 isolate->factory()->constructor_string()) |
| 1544 .ToHandleChecked(); | 1542 .ToHandleChecked(); |
| 1545 CHECK(constructor->SameValue(*isolate->type_error_function())); | 1543 CHECK(constructor->SameValue(*isolate->type_error_function())); |
| 1546 } | 1544 } |
| 1547 | 1545 |
| 1548 TEST(GotoIfExceptionMultiple) { | 1546 TEST(GotoIfExceptionMultiple) { |
| 1549 typedef CodeStubAssembler::Label Label; | 1547 typedef CodeStubAssembler::Label Label; |
| 1550 typedef CodeStubAssembler::Variable Variable; | 1548 typedef CodeStubAssembler::Variable Variable; |
| 1551 Isolate* isolate(CcTest::InitIsolateOnce()); | 1549 Isolate* isolate(CcTest::InitIsolateOnce()); |
| 1552 | 1550 |
| 1553 const int kNumParams = 4; // receiver, first, second, third | 1551 const int kNumParams = 4; // receiver, first, second, third |
| 1554 CodeStubAssemblerTester m(isolate, kNumParams); | 1552 // Emulate TFJ builtin |
| 1553 CodeStubAssemblerTester m(isolate, kNumParams, Code::BUILTIN); |
| 1555 | 1554 |
| 1556 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); | 1555 Node* context = m.HeapConstant(Handle<Context>(isolate->native_context())); |
| 1557 Node* first_value = m.Parameter(0); | 1556 Node* first_value = m.Parameter(0); |
| 1558 Node* second_value = m.Parameter(1); | 1557 Node* second_value = m.Parameter(1); |
| 1559 Node* third_value = m.Parameter(2); | 1558 Node* third_value = m.Parameter(2); |
| 1560 | 1559 |
| 1561 Label exception_handler1(&m); | 1560 Label exception_handler1(&m); |
| 1562 Label exception_handler2(&m); | 1561 Label exception_handler2(&m); |
| 1563 Label exception_handler3(&m); | 1562 Label exception_handler3(&m); |
| 1564 Variable return_value(&m, MachineRepresentation::kWord32); | 1563 Variable return_value(&m, MachineRepresentation::kWord32); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1589 m.Return(m.SmiFromWord32( | 1588 m.Return(m.SmiFromWord32( |
| 1590 m.Word32And(return_value.value(), | 1589 m.Word32And(return_value.value(), |
| 1591 m.Word32Xor(m.Int32Constant(2), m.Int32Constant(-1))))); | 1590 m.Word32Xor(m.Int32Constant(2), m.Int32Constant(-1))))); |
| 1592 | 1591 |
| 1593 m.Bind(&exception_handler3); | 1592 m.Bind(&exception_handler3); |
| 1594 m.Return(error.value()); | 1593 m.Return(error.value()); |
| 1595 | 1594 |
| 1596 Handle<Code> code = m.GenerateCode(); | 1595 Handle<Code> code = m.GenerateCode(); |
| 1597 CHECK(!code.is_null()); | 1596 CHECK(!code.is_null()); |
| 1598 | 1597 |
| 1599 // Emulate TFJ builtin | |
| 1600 code->set_flags(Code::ComputeFlags(Code::BUILTIN)); | |
| 1601 | |
| 1602 FunctionTester ft(code, kNumParams); | 1598 FunctionTester ft(code, kNumParams); |
| 1603 | 1599 |
| 1604 Handle<Object> result; | 1600 Handle<Object> result; |
| 1605 // First handler does not throw, returns result of first value | 1601 // First handler does not throw, returns result of first value |
| 1606 result = ft.Call(isolate->factory()->undefined_value(), | 1602 result = ft.Call(isolate->factory()->undefined_value(), |
| 1607 isolate->factory()->to_string_tag_symbol()) | 1603 isolate->factory()->to_string_tag_symbol()) |
| 1608 .ToHandleChecked(); | 1604 .ToHandleChecked(); |
| 1609 CHECK(String::cast(*result)->IsOneByteEqualTo(OneByteVector("undefined"))); | 1605 CHECK(String::cast(*result)->IsOneByteEqualTo(OneByteVector("undefined"))); |
| 1610 | 1606 |
| 1611 // First handler returns a number | 1607 // First handler returns a number |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1769 // passed in as a parameter to the function so that it can't be recongized as | 1765 // passed in as a parameter to the function so that it can't be recongized as |
| 1770 // a constant. | 1766 // a constant. |
| 1771 m.PopAndReturn(m.SmiUntag(m.Parameter(1)), m.SmiConstant(Smi::FromInt(1234))); | 1767 m.PopAndReturn(m.SmiUntag(m.Parameter(1)), m.SmiConstant(Smi::FromInt(1234))); |
| 1772 | 1768 |
| 1773 Handle<Code> code = m.GenerateCode(); | 1769 Handle<Code> code = m.GenerateCode(); |
| 1774 CHECK(!code.is_null()); | 1770 CHECK(!code.is_null()); |
| 1775 | 1771 |
| 1776 FunctionTester ft(code, kNumParams); | 1772 FunctionTester ft(code, kNumParams); |
| 1777 Handle<Object> result; | 1773 Handle<Object> result; |
| 1778 for (int test_count = 0; test_count < 100; ++test_count) { | 1774 for (int test_count = 0; test_count < 100; ++test_count) { |
| 1779 result = | 1775 result = ft.Call(isolate->factory()->undefined_value(), |
| 1780 ft.Call(isolate->factory()->undefined_value(), | 1776 Handle<Smi>(Smi::FromInt(1234), isolate), |
| 1781 Handle<Smi>(Smi::FromInt(1234), isolate), | 1777 isolate->factory()->undefined_value(), |
| 1782 isolate->factory()->undefined_value(), | 1778 Handle<Smi>(Smi::FromInt(kNumProgramaticParams), isolate)) |
| 1783 Handle<Smi>(Smi::FromInt(kNumProgramaticParams * kPointerSize), | 1779 .ToHandleChecked(); |
| 1784 isolate)) | |
| 1785 .ToHandleChecked(); | |
| 1786 CHECK_EQ(1234, Handle<Smi>::cast(result)->value()); | 1780 CHECK_EQ(1234, Handle<Smi>::cast(result)->value()); |
| 1787 } | 1781 } |
| 1788 } | 1782 } |
| 1789 | 1783 |
| 1790 } // namespace internal | 1784 } // namespace internal |
| 1791 } // namespace v8 | 1785 } // namespace v8 |
| OLD | NEW |