Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: test/cctest/interpreter/test-interpreter.cc

Issue 1415093006: [Interpreter] Add switch support. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@int_wideidx
Patch Set: Rebased Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/interpreter/test-bytecode-generator.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/execution.h" 7 #include "src/execution.h"
8 #include "src/handles.h" 8 #include "src/handles.h"
9 #include "src/interpreter/bytecode-array-builder.h" 9 #include "src/interpreter/bytecode-array-builder.h"
10 #include "src/interpreter/interpreter.h" 10 #include "src/interpreter/interpreter.h"
(...skipping 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after
1711 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); 1711 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked();
1712 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); 1712 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5));
1713 } 1713 }
1714 1714
1715 1715
1716 TEST(InterpreterRegExpLiterals) { 1716 TEST(InterpreterRegExpLiterals) {
1717 HandleAndZoneScope handles; 1717 HandleAndZoneScope handles;
1718 i::Isolate* isolate = handles.main_isolate(); 1718 i::Isolate* isolate = handles.main_isolate();
1719 i::Factory* factory = isolate->factory(); 1719 i::Factory* factory = isolate->factory();
1720 1720
1721 std::pair<const char*, Handle<Object>> literals[5] = { 1721 std::pair<const char*, Handle<Object>> literals[] = {
1722 std::make_pair("return /abd/.exec('cccabbdd');\n", 1722 std::make_pair("return /abd/.exec('cccabbdd');\n",
1723 factory->null_value()), 1723 factory->null_value()),
1724 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", 1724 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n",
1725 factory->NewStringFromStaticChars("abbd")), 1725 factory->NewStringFromStaticChars("abbd")),
1726 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", 1726 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n",
1727 factory->NewStringFromStaticChars("aBC")), 1727 factory->NewStringFromStaticChars("aBC")),
1728 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", 1728 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n",
1729 factory->NewStringFromStaticChars("aBC")), 1729 factory->NewStringFromStaticChars("aBC")),
1730 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", 1730 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n",
1731 factory->NewStringFromStaticChars("AbC")), 1731 factory->NewStringFromStaticChars("AbC")),
1732 }; 1732 };
1733 1733
1734 for (size_t i = 0; i < arraysize(literals); i++) { 1734 for (size_t i = 0; i < arraysize(literals); i++) {
1735 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 1735 std::string source(InterpreterTester::SourceForBody(literals[i].first));
1736 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1736 InterpreterTester tester(handles.main_isolate(), source.c_str());
1737 auto callable = tester.GetCallable<>(); 1737 auto callable = tester.GetCallable<>();
1738 1738
1739 Handle<i::Object> return_value = callable().ToHandleChecked(); 1739 Handle<i::Object> return_value = callable().ToHandleChecked();
1740 CHECK(return_value->SameValue(*literals[i].second)); 1740 CHECK(return_value->SameValue(*literals[i].second));
1741 } 1741 }
1742 } 1742 }
1743 1743
1744 1744
1745 TEST(InterpreterArrayLiterals) { 1745 TEST(InterpreterArrayLiterals) {
1746 HandleAndZoneScope handles; 1746 HandleAndZoneScope handles;
1747 i::Isolate* isolate = handles.main_isolate(); 1747 i::Isolate* isolate = handles.main_isolate();
1748 i::Factory* factory = isolate->factory(); 1748 i::Factory* factory = isolate->factory();
1749 1749
1750 std::pair<const char*, Handle<Object>> literals[6] = { 1750 std::pair<const char*, Handle<Object>> literals[] = {
1751 std::make_pair("return [][0];\n", 1751 std::make_pair("return [][0];\n",
1752 factory->undefined_value()), 1752 factory->undefined_value()),
1753 std::make_pair("return [1, 3, 2][1];\n", 1753 std::make_pair("return [1, 3, 2][1];\n",
1754 handle(Smi::FromInt(3), isolate)), 1754 handle(Smi::FromInt(3), isolate)),
1755 std::make_pair("return ['a', 'b', 'c'][2];\n", 1755 std::make_pair("return ['a', 'b', 'c'][2];\n",
1756 factory->NewStringFromStaticChars("c")), 1756 factory->NewStringFromStaticChars("c")),
1757 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", 1757 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n",
1758 handle(Smi::FromInt(102), isolate)), 1758 handle(Smi::FromInt(102), isolate)),
1759 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", 1759 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n",
1760 factory->NewStringFromStaticChars("a")), 1760 factory->NewStringFromStaticChars("a")),
(...skipping 10 matching lines...) Expand all
1771 CHECK(return_value->SameValue(*literals[i].second)); 1771 CHECK(return_value->SameValue(*literals[i].second));
1772 } 1772 }
1773 } 1773 }
1774 1774
1775 1775
1776 TEST(InterpreterObjectLiterals) { 1776 TEST(InterpreterObjectLiterals) {
1777 HandleAndZoneScope handles; 1777 HandleAndZoneScope handles;
1778 i::Isolate* isolate = handles.main_isolate(); 1778 i::Isolate* isolate = handles.main_isolate();
1779 i::Factory* factory = isolate->factory(); 1779 i::Factory* factory = isolate->factory();
1780 1780
1781 std::pair<const char*, Handle<Object>> literals[14] = { 1781 std::pair<const char*, Handle<Object>> literals[] = {
1782 std::make_pair("return { }.name;", 1782 std::make_pair("return { }.name;",
1783 factory->undefined_value()), 1783 factory->undefined_value()),
1784 std::make_pair("return { name: 'string', val: 9.2 }.name;", 1784 std::make_pair("return { name: 'string', val: 9.2 }.name;",
1785 factory->NewStringFromStaticChars("string")), 1785 factory->NewStringFromStaticChars("string")),
1786 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", 1786 std::make_pair("var a = 15; return { name: 'string', val: a }.val;",
1787 handle(Smi::FromInt(15), isolate)), 1787 handle(Smi::FromInt(15), isolate)),
1788 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", 1788 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;",
1789 handle(Smi::FromInt(6), isolate)), 1789 handle(Smi::FromInt(6), isolate)),
1790 std::make_pair("return { func: function() { return 'test' } }.func();", 1790 std::make_pair("return { func: function() { return 'test' } }.func();",
1791 factory->NewStringFromStaticChars("test")), 1791 factory->NewStringFromStaticChars("test")),
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1882 1882
1883 Handle<Object> return_val = callable().ToHandleChecked(); 1883 Handle<Object> return_val = callable().ToHandleChecked();
1884 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); 1884 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15));
1885 } 1885 }
1886 1886
1887 1887
1888 TEST(InterpreterContextVariables) { 1888 TEST(InterpreterContextVariables) {
1889 HandleAndZoneScope handles; 1889 HandleAndZoneScope handles;
1890 i::Isolate* isolate = handles.main_isolate(); 1890 i::Isolate* isolate = handles.main_isolate();
1891 1891
1892 std::pair<const char*, Handle<Object>> context_vars[5] = { 1892 std::pair<const char*, Handle<Object>> context_vars[] = {
1893 std::make_pair("var a; (function() { a = 1; })(); return a;", 1893 std::make_pair("var a; (function() { a = 1; })(); return a;",
1894 handle(Smi::FromInt(1), isolate)), 1894 handle(Smi::FromInt(1), isolate)),
1895 std::make_pair("var a = 10; (function() { a; })(); return a;", 1895 std::make_pair("var a = 10; (function() { a; })(); return a;",
1896 handle(Smi::FromInt(10), isolate)), 1896 handle(Smi::FromInt(10), isolate)),
1897 std::make_pair("var a = 20; var b = 30;\n" 1897 std::make_pair("var a = 20; var b = 30;\n"
1898 "return (function() { return a + b; })();", 1898 "return (function() { return a + b; })();",
1899 handle(Smi::FromInt(50), isolate)), 1899 handle(Smi::FromInt(50), isolate)),
1900 std::make_pair("'use strict'; let a = 1;\n" 1900 std::make_pair("'use strict'; let a = 1;\n"
1901 "{ let b = 2; return (function() { return a + b; })(); }", 1901 "{ let b = 2; return (function() { return a + b; })(); }",
1902 handle(Smi::FromInt(3), isolate)), 1902 handle(Smi::FromInt(3), isolate)),
(...skipping 11 matching lines...) Expand all
1914 Handle<i::Object> return_value = callable().ToHandleChecked(); 1914 Handle<i::Object> return_value = callable().ToHandleChecked();
1915 CHECK(return_value->SameValue(*context_vars[i].second)); 1915 CHECK(return_value->SameValue(*context_vars[i].second));
1916 } 1916 }
1917 } 1917 }
1918 1918
1919 1919
1920 TEST(InterpreterContextParameters) { 1920 TEST(InterpreterContextParameters) {
1921 HandleAndZoneScope handles; 1921 HandleAndZoneScope handles;
1922 i::Isolate* isolate = handles.main_isolate(); 1922 i::Isolate* isolate = handles.main_isolate();
1923 1923
1924 std::pair<const char*, Handle<Object>> context_params[3] = { 1924 std::pair<const char*, Handle<Object>> context_params[] = {
1925 std::make_pair("return (function() { return arg1; })();", 1925 std::make_pair("return (function() { return arg1; })();",
1926 handle(Smi::FromInt(1), isolate)), 1926 handle(Smi::FromInt(1), isolate)),
1927 std::make_pair("(function() { arg1 = 4; })(); return arg1;", 1927 std::make_pair("(function() { arg1 = 4; })(); return arg1;",
1928 handle(Smi::FromInt(4), isolate)), 1928 handle(Smi::FromInt(4), isolate)),
1929 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", 1929 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;",
1930 handle(Smi::FromInt(1), isolate)), 1930 handle(Smi::FromInt(1), isolate)),
1931 }; 1931 };
1932 1932
1933 for (size_t i = 0; i < arraysize(context_params); i++) { 1933 for (size_t i = 0; i < arraysize(context_params); i++) {
1934 std::string source = "function " + InterpreterTester::function_name() + 1934 std::string source = "function " + InterpreterTester::function_name() +
1935 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; 1935 "(arg1, arg2, arg3) {" + context_params[i].first + "}";
1936 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1936 InterpreterTester tester(handles.main_isolate(), source.c_str());
1937 auto callable = 1937 auto callable =
1938 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); 1938 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>();
1939 1939
1940 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); 1940 Handle<Object> a1 = handle(Smi::FromInt(1), isolate);
1941 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); 1941 Handle<Object> a2 = handle(Smi::FromInt(2), isolate);
1942 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); 1942 Handle<Object> a3 = handle(Smi::FromInt(3), isolate);
1943 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); 1943 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked();
1944 CHECK(return_value->SameValue(*context_params[i].second)); 1944 CHECK(return_value->SameValue(*context_params[i].second));
1945 } 1945 }
1946 } 1946 }
1947 1947
1948 1948
1949 TEST(InterpreterOuterContextVariables) { 1949 TEST(InterpreterOuterContextVariables) {
1950 HandleAndZoneScope handles; 1950 HandleAndZoneScope handles;
1951 i::Isolate* isolate = handles.main_isolate(); 1951 i::Isolate* isolate = handles.main_isolate();
1952 1952
1953 std::pair<const char*, Handle<Object>> context_vars[2] = { 1953 std::pair<const char*, Handle<Object>> context_vars[] = {
1954 std::make_pair("return outerVar * innerArg;", 1954 std::make_pair("return outerVar * innerArg;",
1955 handle(Smi::FromInt(200), isolate)), 1955 handle(Smi::FromInt(200), isolate)),
1956 std::make_pair("outerVar = innerArg; return outerVar", 1956 std::make_pair("outerVar = innerArg; return outerVar",
1957 handle(Smi::FromInt(20), isolate)), 1957 handle(Smi::FromInt(20), isolate)),
1958 }; 1958 };
1959 1959
1960 std::string header( 1960 std::string header(
1961 "function Outer() {" 1961 "function Outer() {"
1962 " var outerVar = 10;" 1962 " var outerVar = 10;"
1963 " function Inner(innerArg) {" 1963 " function Inner(innerArg) {"
(...skipping 13 matching lines...) Expand all
1977 CHECK(return_value->SameValue(*context_vars[i].second)); 1977 CHECK(return_value->SameValue(*context_vars[i].second));
1978 } 1978 }
1979 } 1979 }
1980 1980
1981 1981
1982 TEST(InterpreterComma) { 1982 TEST(InterpreterComma) {
1983 HandleAndZoneScope handles; 1983 HandleAndZoneScope handles;
1984 i::Isolate* isolate = handles.main_isolate(); 1984 i::Isolate* isolate = handles.main_isolate();
1985 i::Factory* factory = isolate->factory(); 1985 i::Factory* factory = isolate->factory();
1986 1986
1987 std::pair<const char*, Handle<Object>> literals[6] = { 1987 std::pair<const char*, Handle<Object>> literals[] = {
1988 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), 1988 std::make_pair("var a; return 0, a;\n", factory->undefined_value()),
1989 std::make_pair("return 'a', 2.2, 3;\n", 1989 std::make_pair("return 'a', 2.2, 3;\n",
1990 handle(Smi::FromInt(3), isolate)), 1990 handle(Smi::FromInt(3), isolate)),
1991 std::make_pair("return 'a', 'b', 'c';\n", 1991 std::make_pair("return 'a', 'b', 'c';\n",
1992 factory->NewStringFromStaticChars("c")), 1992 factory->NewStringFromStaticChars("c")),
1993 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), 1993 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)),
1994 std::make_pair("var a = 10; return b = a, b = b+1;\n", 1994 std::make_pair("var a = 10; return b = a, b = b+1;\n",
1995 handle(Smi::FromInt(11), isolate)), 1995 handle(Smi::FromInt(11), isolate)),
1996 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", 1996 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n",
1997 handle(Smi::FromInt(21), isolate))}; 1997 handle(Smi::FromInt(21), isolate))};
1998 1998
1999 for (size_t i = 0; i < arraysize(literals); i++) { 1999 for (size_t i = 0; i < arraysize(literals); i++) {
2000 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2000 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2001 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2001 InterpreterTester tester(handles.main_isolate(), source.c_str());
2002 auto callable = tester.GetCallable<>(); 2002 auto callable = tester.GetCallable<>();
2003 2003
2004 Handle<i::Object> return_value = callable().ToHandleChecked(); 2004 Handle<i::Object> return_value = callable().ToHandleChecked();
2005 CHECK(return_value->SameValue(*literals[i].second)); 2005 CHECK(return_value->SameValue(*literals[i].second));
2006 } 2006 }
2007 } 2007 }
2008 2008
2009 2009
2010 TEST(InterpreterLogicalOr) { 2010 TEST(InterpreterLogicalOr) {
2011 HandleAndZoneScope handles; 2011 HandleAndZoneScope handles;
2012 i::Isolate* isolate = handles.main_isolate(); 2012 i::Isolate* isolate = handles.main_isolate();
2013 i::Factory* factory = isolate->factory(); 2013 i::Factory* factory = isolate->factory();
2014 2014
2015 std::pair<const char*, Handle<Object>> literals[5] = { 2015 std::pair<const char*, Handle<Object>> literals[] = {
2016 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), 2016 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()),
2017 std::make_pair("var a, b = 10; return a || b;\n", 2017 std::make_pair("var a, b = 10; return a || b;\n",
2018 handle(Smi::FromInt(10), isolate)), 2018 handle(Smi::FromInt(10), isolate)),
2019 std::make_pair("var a = '0', b = 10; return a || b;\n", 2019 std::make_pair("var a = '0', b = 10; return a || b;\n",
2020 factory->NewStringFromStaticChars("0")), 2020 factory->NewStringFromStaticChars("0")),
2021 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), 2021 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)),
2022 std::make_pair("return 'a' || 0;\n", 2022 std::make_pair("return 'a' || 0;\n",
2023 factory->NewStringFromStaticChars("a"))}; 2023 factory->NewStringFromStaticChars("a"))};
2024 2024
2025 for (size_t i = 0; i < arraysize(literals); i++) { 2025 for (size_t i = 0; i < arraysize(literals); i++) {
2026 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2026 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2027 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2027 InterpreterTester tester(handles.main_isolate(), source.c_str());
2028 auto callable = tester.GetCallable<>(); 2028 auto callable = tester.GetCallable<>();
2029 2029
2030 Handle<i::Object> return_value = callable().ToHandleChecked(); 2030 Handle<i::Object> return_value = callable().ToHandleChecked();
2031 CHECK(return_value->SameValue(*literals[i].second)); 2031 CHECK(return_value->SameValue(*literals[i].second));
2032 } 2032 }
2033 } 2033 }
2034 2034
2035 2035
2036 TEST(InterpreterLogicalAnd) { 2036 TEST(InterpreterLogicalAnd) {
2037 HandleAndZoneScope handles; 2037 HandleAndZoneScope handles;
2038 i::Isolate* isolate = handles.main_isolate(); 2038 i::Isolate* isolate = handles.main_isolate();
2039 i::Factory* factory = isolate->factory(); 2039 i::Factory* factory = isolate->factory();
2040 2040
2041 std::pair<const char*, Handle<Object>> literals[7] = { 2041 std::pair<const char*, Handle<Object>> literals[] = {
2042 std::make_pair("var a, b = 10; return a && b;\n", 2042 std::make_pair("var a, b = 10; return a && b;\n",
2043 factory->undefined_value()), 2043 factory->undefined_value()),
2044 std::make_pair("var a = 0, b = 10; return a && b / a;\n", 2044 std::make_pair("var a = 0, b = 10; return a && b / a;\n",
2045 handle(Smi::FromInt(0), isolate)), 2045 handle(Smi::FromInt(0), isolate)),
2046 std::make_pair("var a = '0', b = 10; return a && b;\n", 2046 std::make_pair("var a = '0', b = 10; return a && b;\n",
2047 handle(Smi::FromInt(10), isolate)), 2047 handle(Smi::FromInt(10), isolate)),
2048 std::make_pair("return 0.0 && 3.2;\n", 2048 std::make_pair("return 0.0 && 3.2;\n",
2049 handle(Smi::FromInt(0), isolate)), 2049 handle(Smi::FromInt(0), isolate)),
2050 std::make_pair("return 'a' && 'b';\n", 2050 std::make_pair("return 'a' && 'b';\n",
2051 factory->NewStringFromStaticChars("b")), 2051 factory->NewStringFromStaticChars("b")),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2092 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); 2092 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4));
2093 } 2093 }
2094 2094
2095 2095
2096 TEST(InterpreterThrow) { 2096 TEST(InterpreterThrow) {
2097 HandleAndZoneScope handles; 2097 HandleAndZoneScope handles;
2098 i::Isolate* isolate = handles.main_isolate(); 2098 i::Isolate* isolate = handles.main_isolate();
2099 i::Factory* factory = isolate->factory(); 2099 i::Factory* factory = isolate->factory();
2100 2100
2101 // TODO(rmcilroy): modify tests when we have real try catch support. 2101 // TODO(rmcilroy): modify tests when we have real try catch support.
2102 std::pair<const char*, Handle<Object>> throws[6] = { 2102 std::pair<const char*, Handle<Object>> throws[] = {
2103 std::make_pair("throw undefined;\n", 2103 std::make_pair("throw undefined;\n",
2104 factory->undefined_value()), 2104 factory->undefined_value()),
2105 std::make_pair("throw 1;\n", 2105 std::make_pair("throw 1;\n",
2106 handle(Smi::FromInt(1), isolate)), 2106 handle(Smi::FromInt(1), isolate)),
2107 std::make_pair("throw 'Error';\n", 2107 std::make_pair("throw 'Error';\n",
2108 factory->NewStringFromStaticChars("Error")), 2108 factory->NewStringFromStaticChars("Error")),
2109 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", 2109 std::make_pair("var a = true; if (a) { throw 'Error'; }\n",
2110 factory->NewStringFromStaticChars("Error")), 2110 factory->NewStringFromStaticChars("Error")),
2111 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", 2111 std::make_pair("var a = false; if (a) { throw 'Error'; }\n",
2112 factory->undefined_value()), 2112 factory->undefined_value()),
(...skipping 12 matching lines...) Expand all
2125 CHECK(thrown_obj->SameValue(*throws[i].second)); 2125 CHECK(thrown_obj->SameValue(*throws[i].second));
2126 } 2126 }
2127 } 2127 }
2128 2128
2129 2129
2130 TEST(InterpreterCountOperators) { 2130 TEST(InterpreterCountOperators) {
2131 HandleAndZoneScope handles; 2131 HandleAndZoneScope handles;
2132 i::Isolate* isolate = handles.main_isolate(); 2132 i::Isolate* isolate = handles.main_isolate();
2133 i::Factory* factory = isolate->factory(); 2133 i::Factory* factory = isolate->factory();
2134 2134
2135 std::pair<const char*, Handle<Object>> count_ops[16] = { 2135 std::pair<const char*, Handle<Object>> count_ops[] = {
2136 std::make_pair("var a = 1; return ++a;", 2136 std::make_pair("var a = 1; return ++a;",
2137 handle(Smi::FromInt(2), isolate)), 2137 handle(Smi::FromInt(2), isolate)),
2138 std::make_pair("var a = 1; return a++;", 2138 std::make_pair("var a = 1; return a++;",
2139 handle(Smi::FromInt(1), isolate)), 2139 handle(Smi::FromInt(1), isolate)),
2140 std::make_pair("var a = 5; return --a;", 2140 std::make_pair("var a = 5; return --a;",
2141 handle(Smi::FromInt(4), isolate)), 2141 handle(Smi::FromInt(4), isolate)),
2142 std::make_pair("var a = 5; return a--;", 2142 std::make_pair("var a = 5; return a--;",
2143 handle(Smi::FromInt(5), isolate)), 2143 handle(Smi::FromInt(5), isolate)),
2144 std::make_pair("var a = 5.2; return --a;", 2144 std::make_pair("var a = 5.2; return --a;",
2145 factory->NewHeapNumber(4.2)), 2145 factory->NewHeapNumber(4.2)),
(...skipping 29 matching lines...) Expand all
2175 Handle<i::Object> return_value = callable().ToHandleChecked(); 2175 Handle<i::Object> return_value = callable().ToHandleChecked();
2176 CHECK(return_value->SameValue(*count_ops[i].second)); 2176 CHECK(return_value->SameValue(*count_ops[i].second));
2177 } 2177 }
2178 } 2178 }
2179 2179
2180 2180
2181 TEST(InterpreterGlobalCountOperators) { 2181 TEST(InterpreterGlobalCountOperators) {
2182 HandleAndZoneScope handles; 2182 HandleAndZoneScope handles;
2183 i::Isolate* isolate = handles.main_isolate(); 2183 i::Isolate* isolate = handles.main_isolate();
2184 2184
2185 std::pair<const char*, Handle<Object>> count_ops[6] = { 2185 std::pair<const char*, Handle<Object>> count_ops[] = {
2186 std::make_pair("var global = 100;function f(){ return ++global; }", 2186 std::make_pair("var global = 100;function f(){ return ++global; }",
2187 handle(Smi::FromInt(101), isolate)), 2187 handle(Smi::FromInt(101), isolate)),
2188 std::make_pair("var global = 100; function f(){ return --global; }", 2188 std::make_pair("var global = 100; function f(){ return --global; }",
2189 handle(Smi::FromInt(99), isolate)), 2189 handle(Smi::FromInt(99), isolate)),
2190 std::make_pair("var global = 100; function f(){ return global++; }", 2190 std::make_pair("var global = 100; function f(){ return global++; }",
2191 handle(Smi::FromInt(100), isolate)), 2191 handle(Smi::FromInt(100), isolate)),
2192 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", 2192 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }",
2193 handle(Smi::FromInt(201), isolate)), 2193 handle(Smi::FromInt(201), isolate)),
2194 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", 2194 std::make_pair("unallocated = 200; function f(){ return --unallocated; }",
2195 handle(Smi::FromInt(199), isolate)), 2195 handle(Smi::FromInt(199), isolate)),
2196 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", 2196 std::make_pair("unallocated = 200; function f(){ return unallocated++; }",
2197 handle(Smi::FromInt(200), isolate)), 2197 handle(Smi::FromInt(200), isolate)),
2198 }; 2198 };
2199 2199
2200 for (size_t i = 0; i < arraysize(count_ops); i++) { 2200 for (size_t i = 0; i < arraysize(count_ops); i++) {
2201 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); 2201 InterpreterTester tester(handles.main_isolate(), count_ops[i].first);
2202 auto callable = tester.GetCallable<>(); 2202 auto callable = tester.GetCallable<>();
2203 2203
2204 Handle<i::Object> return_value = callable().ToHandleChecked(); 2204 Handle<i::Object> return_value = callable().ToHandleChecked();
2205 CHECK(return_value->SameValue(*count_ops[i].second)); 2205 CHECK(return_value->SameValue(*count_ops[i].second));
2206 } 2206 }
2207 } 2207 }
2208 2208
2209 2209
2210 TEST(InterpreterCompoundExpressions) { 2210 TEST(InterpreterCompoundExpressions) {
2211 HandleAndZoneScope handles; 2211 HandleAndZoneScope handles;
2212 i::Isolate* isolate = handles.main_isolate(); 2212 i::Isolate* isolate = handles.main_isolate();
2213 i::Factory* factory = isolate->factory(); 2213 i::Factory* factory = isolate->factory();
2214 2214
2215 std::pair<const char*, Handle<Object>> compound_expr[5] = { 2215 std::pair<const char*, Handle<Object>> compound_expr[] = {
2216 std::make_pair("var a = 1; a += 2; return a;", 2216 std::make_pair("var a = 1; a += 2; return a;",
2217 Handle<Object>(Smi::FromInt(3), isolate)), 2217 Handle<Object>(Smi::FromInt(3), isolate)),
2218 std::make_pair("var a = 10; a /= 2; return a;", 2218 std::make_pair("var a = 10; a /= 2; return a;",
2219 Handle<Object>(Smi::FromInt(5), isolate)), 2219 Handle<Object>(Smi::FromInt(5), isolate)),
2220 std::make_pair("var a = 'test'; a += 'ing'; return a;", 2220 std::make_pair("var a = 'test'; a += 'ing'; return a;",
2221 factory->NewStringFromStaticChars("testing")), 2221 factory->NewStringFromStaticChars("testing")),
2222 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", 2222 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;",
2223 Handle<Object>(Smi::FromInt(4), isolate)), 2223 Handle<Object>(Smi::FromInt(4), isolate)),
2224 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" 2224 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;"
2225 "return a;", 2225 "return a;",
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2259 CHECK(return_value->SameValue(*compound_expr[i].second)); 2259 CHECK(return_value->SameValue(*compound_expr[i].second));
2260 } 2260 }
2261 } 2261 }
2262 2262
2263 2263
2264 TEST(InterpreterCreateArguments) { 2264 TEST(InterpreterCreateArguments) {
2265 HandleAndZoneScope handles; 2265 HandleAndZoneScope handles;
2266 i::Isolate* isolate = handles.main_isolate(); 2266 i::Isolate* isolate = handles.main_isolate();
2267 i::Factory* factory = isolate->factory(); 2267 i::Factory* factory = isolate->factory();
2268 2268
2269 std::pair<const char*, int> create_args[9] = { 2269 std::pair<const char*, int> create_args[] = {
2270 std::make_pair("function f() { return arguments[0]; }", 0), 2270 std::make_pair("function f() { return arguments[0]; }", 0),
2271 std::make_pair("function f(a) { return arguments[0]; }", 0), 2271 std::make_pair("function f(a) { return arguments[0]; }", 0),
2272 std::make_pair("function f() { return arguments[2]; }", 2), 2272 std::make_pair("function f() { return arguments[2]; }", 2),
2273 std::make_pair("function f(a) { return arguments[2]; }", 2), 2273 std::make_pair("function f(a) { return arguments[2]; }", 2),
2274 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), 2274 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2),
2275 std::make_pair("function f(a) {" 2275 std::make_pair("function f(a) {"
2276 "'use strict'; return arguments[0]; }", 2276 "'use strict'; return arguments[0]; }",
2277 0), 2277 0),
2278 std::make_pair("function f(a, b, c, d) {" 2278 std::make_pair("function f(a, b, c, d) {"
2279 "'use strict'; return arguments[2]; }", 2279 "'use strict'; return arguments[2]; }",
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2323 callable(args[0], args[1], args[2]).ToHandleChecked(); 2323 callable(args[0], args[1], args[2]).ToHandleChecked();
2324 CHECK(return_val->SameValue(*args[create_args[i].second])); 2324 CHECK(return_val->SameValue(*args[create_args[i].second]));
2325 } 2325 }
2326 } 2326 }
2327 2327
2328 2328
2329 TEST(InterpreterConditional) { 2329 TEST(InterpreterConditional) {
2330 HandleAndZoneScope handles; 2330 HandleAndZoneScope handles;
2331 i::Isolate* isolate = handles.main_isolate(); 2331 i::Isolate* isolate = handles.main_isolate();
2332 2332
2333 std::pair<const char*, Handle<Object>> conditional[8] = { 2333 std::pair<const char*, Handle<Object>> conditional[] = {
2334 std::make_pair("return true ? 2 : 3;", 2334 std::make_pair("return true ? 2 : 3;",
2335 handle(Smi::FromInt(2), isolate)), 2335 handle(Smi::FromInt(2), isolate)),
2336 std::make_pair("return false ? 2 : 3;", 2336 std::make_pair("return false ? 2 : 3;",
2337 handle(Smi::FromInt(3), isolate)), 2337 handle(Smi::FromInt(3), isolate)),
2338 std::make_pair("var a = 1; return a ? 20 : 30;", 2338 std::make_pair("var a = 1; return a ? 20 : 30;",
2339 handle(Smi::FromInt(20), isolate)), 2339 handle(Smi::FromInt(20), isolate)),
2340 std::make_pair("var a = 1; return a ? 20 : 30;", 2340 std::make_pair("var a = 1; return a ? 20 : 30;",
2341 handle(Smi::FromInt(20), isolate)), 2341 handle(Smi::FromInt(20), isolate)),
2342 std::make_pair("var a = 'string'; return a ? 20 : 30;", 2342 std::make_pair("var a = 'string'; return a ? 20 : 30;",
2343 handle(Smi::FromInt(20), isolate)), 2343 handle(Smi::FromInt(20), isolate)),
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
2705 0}}; 2705 0}};
2706 2706
2707 for (size_t i = 0; i < arraysize(for_in_samples); i++) { 2707 for (size_t i = 0; i < arraysize(for_in_samples); i++) {
2708 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); 2708 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first);
2709 auto callable = tester.GetCallable<>(); 2709 auto callable = tester.GetCallable<>();
2710 Handle<Object> return_val = callable().ToHandleChecked(); 2710 Handle<Object> return_val = callable().ToHandleChecked();
2711 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); 2711 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second);
2712 } 2712 }
2713 } 2713 }
2714 2714
2715
2716 TEST(InterpreterSwitch) {
2717 HandleAndZoneScope handles;
2718 i::Isolate* isolate = handles.main_isolate();
2719 i::Factory* factory = isolate->factory();
2720
2721 std::pair<const char*, Handle<Object>> switch_ops[] = {
2722 std::make_pair("var a = 1;\n"
2723 "switch(a) {\n"
2724 " case 1: return 2;\n"
2725 " case 2: return 3;\n"
2726 "}\n",
2727 handle(Smi::FromInt(2), isolate)),
2728 std::make_pair("var a = 1;\n"
2729 "switch(a) {\n"
2730 " case 2: a = 2; break;\n"
2731 " case 1: a = 3; break;\n"
2732 "}\n"
2733 "return a;",
2734 handle(Smi::FromInt(3), isolate)),
2735 std::make_pair("var a = 1;\n"
2736 "switch(a) {\n"
2737 " case 1: a = 2; // fall-through\n"
2738 " case 2: a = 3; break;\n"
2739 "}\n"
2740 "return a;",
2741 handle(Smi::FromInt(3), isolate)),
2742 std::make_pair("var a = 100;\n"
2743 "switch(a) {\n"
2744 " case 1: return 100;\n"
2745 " case 2: return 200;\n"
2746 "}\n"
2747 "return undefined;",
2748 factory->undefined_value()),
2749 std::make_pair("var a = 100;\n"
2750 "switch(a) {\n"
2751 " case 1: return 100;\n"
2752 " case 2: return 200;\n"
2753 " default: return 300;\n"
2754 "}\n"
2755 "return undefined;",
2756 handle(Smi::FromInt(300), isolate)),
2757 std::make_pair("var a = 100;\n"
2758 "switch(typeof(a)) {\n"
2759 " case 'string': return 1;\n"
2760 " case 'number': return 2;\n"
2761 " default: return 3;\n"
2762 "}\n",
2763 handle(Smi::FromInt(2), isolate)),
2764 std::make_pair("var a = 100;\n"
2765 "switch(a) {\n"
2766 " case a += 20: return 1;\n"
2767 " case a -= 10: return 2;\n"
2768 " case a -= 10: return 3;\n"
2769 " default: return 3;\n"
2770 "}\n",
2771 handle(Smi::FromInt(3), isolate)),
2772 std::make_pair("var a = 1;\n"
2773 "switch(a) {\n"
2774 " case 1: \n"
2775 " switch(a + 1) {\n"
2776 " case 2 : a += 1; break;\n"
2777 " default : a += 2; break;\n"
2778 " } // fall-through\n"
2779 " case 2: a += 3;\n"
2780 "}\n"
2781 "return a;",
2782 handle(Smi::FromInt(5), isolate)),
2783 };
2784
2785 for (size_t i = 0; i < arraysize(switch_ops); i++) {
2786 std::string source(InterpreterTester::SourceForBody(switch_ops[i].first));
2787 InterpreterTester tester(handles.main_isolate(), source.c_str());
2788 auto callable = tester.GetCallable<>();
2789
2790 Handle<i::Object> return_value = callable().ToHandleChecked();
2791 CHECK(return_value->SameValue(*switch_ops[i].second));
2792 }
2793 }
2794
2715 } // namespace interpreter 2795 } // namespace interpreter
2716 } // namespace internal 2796 } // namespace internal
2717 } // namespace v8 2797 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/interpreter/test-bytecode-generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698