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

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: 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
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 1713 matching lines...) Expand 10 before | Expand all | Expand 10 after
1724 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked(); 1724 Handle<Smi>(Smi::FromInt(3), handles.main_isolate())).ToHandleChecked();
1725 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5)); 1725 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(5));
1726 } 1726 }
1727 1727
1728 1728
1729 TEST(InterpreterRegExpLiterals) { 1729 TEST(InterpreterRegExpLiterals) {
1730 HandleAndZoneScope handles; 1730 HandleAndZoneScope handles;
1731 i::Isolate* isolate = handles.main_isolate(); 1731 i::Isolate* isolate = handles.main_isolate();
1732 i::Factory* factory = isolate->factory(); 1732 i::Factory* factory = isolate->factory();
1733 1733
1734 std::pair<const char*, Handle<Object>> literals[5] = { 1734 std::pair<const char*, Handle<Object>> literals[] = {
1735 std::make_pair("return /abd/.exec('cccabbdd');\n", 1735 std::make_pair("return /abd/.exec('cccabbdd');\n",
1736 factory->null_value()), 1736 factory->null_value()),
1737 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n", 1737 std::make_pair("return /ab+d/.exec('cccabbdd')[0];\n",
1738 factory->NewStringFromStaticChars("abbd")), 1738 factory->NewStringFromStaticChars("abbd")),
1739 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n", 1739 std::make_pair("return /AbC/i.exec('ssaBC')[0];\n",
1740 factory->NewStringFromStaticChars("aBC")), 1740 factory->NewStringFromStaticChars("aBC")),
1741 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n", 1741 std::make_pair("return 'ssaBC'.match(/AbC/i)[0];\n",
1742 factory->NewStringFromStaticChars("aBC")), 1742 factory->NewStringFromStaticChars("aBC")),
1743 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n", 1743 std::make_pair("return 'ssaBCtAbC'.match(/(AbC)/gi)[1];\n",
1744 factory->NewStringFromStaticChars("AbC")), 1744 factory->NewStringFromStaticChars("AbC")),
1745 }; 1745 };
1746 1746
1747 for (size_t i = 0; i < arraysize(literals); i++) { 1747 for (size_t i = 0; i < arraysize(literals); i++) {
1748 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 1748 std::string source(InterpreterTester::SourceForBody(literals[i].first));
1749 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1749 InterpreterTester tester(handles.main_isolate(), source.c_str());
1750 auto callable = tester.GetCallable<>(); 1750 auto callable = tester.GetCallable<>();
1751 1751
1752 Handle<i::Object> return_value = callable().ToHandleChecked(); 1752 Handle<i::Object> return_value = callable().ToHandleChecked();
1753 CHECK(return_value->SameValue(*literals[i].second)); 1753 CHECK(return_value->SameValue(*literals[i].second));
1754 } 1754 }
1755 } 1755 }
1756 1756
1757 1757
1758 TEST(InterpreterArrayLiterals) { 1758 TEST(InterpreterArrayLiterals) {
1759 HandleAndZoneScope handles; 1759 HandleAndZoneScope handles;
1760 i::Isolate* isolate = handles.main_isolate(); 1760 i::Isolate* isolate = handles.main_isolate();
1761 i::Factory* factory = isolate->factory(); 1761 i::Factory* factory = isolate->factory();
1762 1762
1763 std::pair<const char*, Handle<Object>> literals[6] = { 1763 std::pair<const char*, Handle<Object>> literals[] = {
1764 std::make_pair("return [][0];\n", 1764 std::make_pair("return [][0];\n",
1765 factory->undefined_value()), 1765 factory->undefined_value()),
1766 std::make_pair("return [1, 3, 2][1];\n", 1766 std::make_pair("return [1, 3, 2][1];\n",
1767 handle(Smi::FromInt(3), isolate)), 1767 handle(Smi::FromInt(3), isolate)),
1768 std::make_pair("return ['a', 'b', 'c'][2];\n", 1768 std::make_pair("return ['a', 'b', 'c'][2];\n",
1769 factory->NewStringFromStaticChars("c")), 1769 factory->NewStringFromStaticChars("c")),
1770 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n", 1770 std::make_pair("var a = 100; return [a, a + 1, a + 2, a + 3][2];\n",
1771 handle(Smi::FromInt(102), isolate)), 1771 handle(Smi::FromInt(102), isolate)),
1772 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n", 1772 std::make_pair("return [[1, 2, 3], ['a', 'b', 'c']][1][0];\n",
1773 factory->NewStringFromStaticChars("a")), 1773 factory->NewStringFromStaticChars("a")),
(...skipping 10 matching lines...) Expand all
1784 CHECK(return_value->SameValue(*literals[i].second)); 1784 CHECK(return_value->SameValue(*literals[i].second));
1785 } 1785 }
1786 } 1786 }
1787 1787
1788 1788
1789 TEST(InterpreterObjectLiterals) { 1789 TEST(InterpreterObjectLiterals) {
1790 HandleAndZoneScope handles; 1790 HandleAndZoneScope handles;
1791 i::Isolate* isolate = handles.main_isolate(); 1791 i::Isolate* isolate = handles.main_isolate();
1792 i::Factory* factory = isolate->factory(); 1792 i::Factory* factory = isolate->factory();
1793 1793
1794 std::pair<const char*, Handle<Object>> literals[14] = { 1794 std::pair<const char*, Handle<Object>> literals[] = {
1795 std::make_pair("return { }.name;", 1795 std::make_pair("return { }.name;",
1796 factory->undefined_value()), 1796 factory->undefined_value()),
1797 std::make_pair("return { name: 'string', val: 9.2 }.name;", 1797 std::make_pair("return { name: 'string', val: 9.2 }.name;",
1798 factory->NewStringFromStaticChars("string")), 1798 factory->NewStringFromStaticChars("string")),
1799 std::make_pair("var a = 15; return { name: 'string', val: a }.val;", 1799 std::make_pair("var a = 15; return { name: 'string', val: a }.val;",
1800 handle(Smi::FromInt(15), isolate)), 1800 handle(Smi::FromInt(15), isolate)),
1801 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;", 1801 std::make_pair("var a = 5; return { val: a, val: a + 1 }.val;",
1802 handle(Smi::FromInt(6), isolate)), 1802 handle(Smi::FromInt(6), isolate)),
1803 std::make_pair("return { func: function() { return 'test' } }.func();", 1803 std::make_pair("return { func: function() { return 'test' } }.func();",
1804 factory->NewStringFromStaticChars("test")), 1804 factory->NewStringFromStaticChars("test")),
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 1895
1896 Handle<Object> return_val = callable().ToHandleChecked(); 1896 Handle<Object> return_val = callable().ToHandleChecked();
1897 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15)); 1897 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(15));
1898 } 1898 }
1899 1899
1900 1900
1901 TEST(InterpreterContextVariables) { 1901 TEST(InterpreterContextVariables) {
1902 HandleAndZoneScope handles; 1902 HandleAndZoneScope handles;
1903 i::Isolate* isolate = handles.main_isolate(); 1903 i::Isolate* isolate = handles.main_isolate();
1904 1904
1905 std::pair<const char*, Handle<Object>> context_vars[5] = { 1905 std::pair<const char*, Handle<Object>> context_vars[] = {
1906 std::make_pair("var a; (function() { a = 1; })(); return a;", 1906 std::make_pair("var a; (function() { a = 1; })(); return a;",
1907 handle(Smi::FromInt(1), isolate)), 1907 handle(Smi::FromInt(1), isolate)),
1908 std::make_pair("var a = 10; (function() { a; })(); return a;", 1908 std::make_pair("var a = 10; (function() { a; })(); return a;",
1909 handle(Smi::FromInt(10), isolate)), 1909 handle(Smi::FromInt(10), isolate)),
1910 std::make_pair("var a = 20; var b = 30;\n" 1910 std::make_pair("var a = 20; var b = 30;\n"
1911 "return (function() { return a + b; })();", 1911 "return (function() { return a + b; })();",
1912 handle(Smi::FromInt(50), isolate)), 1912 handle(Smi::FromInt(50), isolate)),
1913 std::make_pair("'use strict'; let a = 1;\n" 1913 std::make_pair("'use strict'; let a = 1;\n"
1914 "{ let b = 2; return (function() { return a + b; })(); }", 1914 "{ let b = 2; return (function() { return a + b; })(); }",
1915 handle(Smi::FromInt(3), isolate)), 1915 handle(Smi::FromInt(3), isolate)),
(...skipping 11 matching lines...) Expand all
1927 Handle<i::Object> return_value = callable().ToHandleChecked(); 1927 Handle<i::Object> return_value = callable().ToHandleChecked();
1928 CHECK(return_value->SameValue(*context_vars[i].second)); 1928 CHECK(return_value->SameValue(*context_vars[i].second));
1929 } 1929 }
1930 } 1930 }
1931 1931
1932 1932
1933 TEST(InterpreterContextParameters) { 1933 TEST(InterpreterContextParameters) {
1934 HandleAndZoneScope handles; 1934 HandleAndZoneScope handles;
1935 i::Isolate* isolate = handles.main_isolate(); 1935 i::Isolate* isolate = handles.main_isolate();
1936 1936
1937 std::pair<const char*, Handle<Object>> context_params[3] = { 1937 std::pair<const char*, Handle<Object>> context_params[] = {
1938 std::make_pair("return (function() { return arg1; })();", 1938 std::make_pair("return (function() { return arg1; })();",
1939 handle(Smi::FromInt(1), isolate)), 1939 handle(Smi::FromInt(1), isolate)),
1940 std::make_pair("(function() { arg1 = 4; })(); return arg1;", 1940 std::make_pair("(function() { arg1 = 4; })(); return arg1;",
1941 handle(Smi::FromInt(4), isolate)), 1941 handle(Smi::FromInt(4), isolate)),
1942 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;", 1942 std::make_pair("(function() { arg3 = arg2 - arg1; })(); return arg3;",
1943 handle(Smi::FromInt(1), isolate)), 1943 handle(Smi::FromInt(1), isolate)),
1944 }; 1944 };
1945 1945
1946 for (size_t i = 0; i < arraysize(context_params); i++) { 1946 for (size_t i = 0; i < arraysize(context_params); i++) {
1947 std::string source = "function " + InterpreterTester::function_name() + 1947 std::string source = "function " + InterpreterTester::function_name() +
1948 "(arg1, arg2, arg3) {" + context_params[i].first + "}"; 1948 "(arg1, arg2, arg3) {" + context_params[i].first + "}";
1949 InterpreterTester tester(handles.main_isolate(), source.c_str()); 1949 InterpreterTester tester(handles.main_isolate(), source.c_str());
1950 auto callable = 1950 auto callable =
1951 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>(); 1951 tester.GetCallable<Handle<Object>, Handle<Object>, Handle<Object>>();
1952 1952
1953 Handle<Object> a1 = handle(Smi::FromInt(1), isolate); 1953 Handle<Object> a1 = handle(Smi::FromInt(1), isolate);
1954 Handle<Object> a2 = handle(Smi::FromInt(2), isolate); 1954 Handle<Object> a2 = handle(Smi::FromInt(2), isolate);
1955 Handle<Object> a3 = handle(Smi::FromInt(3), isolate); 1955 Handle<Object> a3 = handle(Smi::FromInt(3), isolate);
1956 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked(); 1956 Handle<i::Object> return_value = callable(a1, a2, a3).ToHandleChecked();
1957 CHECK(return_value->SameValue(*context_params[i].second)); 1957 CHECK(return_value->SameValue(*context_params[i].second));
1958 } 1958 }
1959 } 1959 }
1960 1960
1961 1961
1962 TEST(InterpreterOuterContextVariables) { 1962 TEST(InterpreterOuterContextVariables) {
1963 HandleAndZoneScope handles; 1963 HandleAndZoneScope handles;
1964 i::Isolate* isolate = handles.main_isolate(); 1964 i::Isolate* isolate = handles.main_isolate();
1965 1965
1966 std::pair<const char*, Handle<Object>> context_vars[2] = { 1966 std::pair<const char*, Handle<Object>> context_vars[] = {
1967 std::make_pair("return outerVar * innerArg;", 1967 std::make_pair("return outerVar * innerArg;",
1968 handle(Smi::FromInt(200), isolate)), 1968 handle(Smi::FromInt(200), isolate)),
1969 std::make_pair("outerVar = innerArg; return outerVar", 1969 std::make_pair("outerVar = innerArg; return outerVar",
1970 handle(Smi::FromInt(20), isolate)), 1970 handle(Smi::FromInt(20), isolate)),
1971 }; 1971 };
1972 1972
1973 std::string header( 1973 std::string header(
1974 "function Outer() {" 1974 "function Outer() {"
1975 " var outerVar = 10;" 1975 " var outerVar = 10;"
1976 " function Inner(innerArg) {" 1976 " function Inner(innerArg) {"
(...skipping 13 matching lines...) Expand all
1990 CHECK(return_value->SameValue(*context_vars[i].second)); 1990 CHECK(return_value->SameValue(*context_vars[i].second));
1991 } 1991 }
1992 } 1992 }
1993 1993
1994 1994
1995 TEST(InterpreterComma) { 1995 TEST(InterpreterComma) {
1996 HandleAndZoneScope handles; 1996 HandleAndZoneScope handles;
1997 i::Isolate* isolate = handles.main_isolate(); 1997 i::Isolate* isolate = handles.main_isolate();
1998 i::Factory* factory = isolate->factory(); 1998 i::Factory* factory = isolate->factory();
1999 1999
2000 std::pair<const char*, Handle<Object>> literals[6] = { 2000 std::pair<const char*, Handle<Object>> literals[] = {
2001 std::make_pair("var a; return 0, a;\n", factory->undefined_value()), 2001 std::make_pair("var a; return 0, a;\n", factory->undefined_value()),
2002 std::make_pair("return 'a', 2.2, 3;\n", 2002 std::make_pair("return 'a', 2.2, 3;\n",
2003 handle(Smi::FromInt(3), isolate)), 2003 handle(Smi::FromInt(3), isolate)),
2004 std::make_pair("return 'a', 'b', 'c';\n", 2004 std::make_pair("return 'a', 'b', 'c';\n",
2005 factory->NewStringFromStaticChars("c")), 2005 factory->NewStringFromStaticChars("c")),
2006 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)), 2006 std::make_pair("return 3.2, 2.3, 4.5;\n", factory->NewNumber(4.5)),
2007 std::make_pair("var a = 10; return b = a, b = b+1;\n", 2007 std::make_pair("var a = 10; return b = a, b = b+1;\n",
2008 handle(Smi::FromInt(11), isolate)), 2008 handle(Smi::FromInt(11), isolate)),
2009 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n", 2009 std::make_pair("var a = 10; return b = a, b = b+1, b + 10;\n",
2010 handle(Smi::FromInt(21), isolate))}; 2010 handle(Smi::FromInt(21), isolate))};
2011 2011
2012 for (size_t i = 0; i < arraysize(literals); i++) { 2012 for (size_t i = 0; i < arraysize(literals); i++) {
2013 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2013 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2014 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2014 InterpreterTester tester(handles.main_isolate(), source.c_str());
2015 auto callable = tester.GetCallable<>(); 2015 auto callable = tester.GetCallable<>();
2016 2016
2017 Handle<i::Object> return_value = callable().ToHandleChecked(); 2017 Handle<i::Object> return_value = callable().ToHandleChecked();
2018 CHECK(return_value->SameValue(*literals[i].second)); 2018 CHECK(return_value->SameValue(*literals[i].second));
2019 } 2019 }
2020 } 2020 }
2021 2021
2022 2022
2023 TEST(InterpreterLogicalOr) { 2023 TEST(InterpreterLogicalOr) {
2024 HandleAndZoneScope handles; 2024 HandleAndZoneScope handles;
2025 i::Isolate* isolate = handles.main_isolate(); 2025 i::Isolate* isolate = handles.main_isolate();
2026 i::Factory* factory = isolate->factory(); 2026 i::Factory* factory = isolate->factory();
2027 2027
2028 std::pair<const char*, Handle<Object>> literals[5] = { 2028 std::pair<const char*, Handle<Object>> literals[] = {
2029 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()), 2029 std::make_pair("var a, b; return a || b;\n", factory->undefined_value()),
2030 std::make_pair("var a, b = 10; return a || b;\n", 2030 std::make_pair("var a, b = 10; return a || b;\n",
2031 handle(Smi::FromInt(10), isolate)), 2031 handle(Smi::FromInt(10), isolate)),
2032 std::make_pair("var a = '0', b = 10; return a || b;\n", 2032 std::make_pair("var a = '0', b = 10; return a || b;\n",
2033 factory->NewStringFromStaticChars("0")), 2033 factory->NewStringFromStaticChars("0")),
2034 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)), 2034 std::make_pair("return 0 || 3.2;\n", factory->NewNumber(3.2)),
2035 std::make_pair("return 'a' || 0;\n", 2035 std::make_pair("return 'a' || 0;\n",
2036 factory->NewStringFromStaticChars("a"))}; 2036 factory->NewStringFromStaticChars("a"))};
2037 2037
2038 for (size_t i = 0; i < arraysize(literals); i++) { 2038 for (size_t i = 0; i < arraysize(literals); i++) {
2039 std::string source(InterpreterTester::SourceForBody(literals[i].first)); 2039 std::string source(InterpreterTester::SourceForBody(literals[i].first));
2040 InterpreterTester tester(handles.main_isolate(), source.c_str()); 2040 InterpreterTester tester(handles.main_isolate(), source.c_str());
2041 auto callable = tester.GetCallable<>(); 2041 auto callable = tester.GetCallable<>();
2042 2042
2043 Handle<i::Object> return_value = callable().ToHandleChecked(); 2043 Handle<i::Object> return_value = callable().ToHandleChecked();
2044 CHECK(return_value->SameValue(*literals[i].second)); 2044 CHECK(return_value->SameValue(*literals[i].second));
2045 } 2045 }
2046 } 2046 }
2047 2047
2048 2048
2049 TEST(InterpreterLogicalAnd) { 2049 TEST(InterpreterLogicalAnd) {
2050 HandleAndZoneScope handles; 2050 HandleAndZoneScope handles;
2051 i::Isolate* isolate = handles.main_isolate(); 2051 i::Isolate* isolate = handles.main_isolate();
2052 i::Factory* factory = isolate->factory(); 2052 i::Factory* factory = isolate->factory();
2053 2053
2054 std::pair<const char*, Handle<Object>> literals[7] = { 2054 std::pair<const char*, Handle<Object>> literals[] = {
2055 std::make_pair("var a, b = 10; return a && b;\n", 2055 std::make_pair("var a, b = 10; return a && b;\n",
2056 factory->undefined_value()), 2056 factory->undefined_value()),
2057 std::make_pair("var a = 0, b = 10; return a && b / a;\n", 2057 std::make_pair("var a = 0, b = 10; return a && b / a;\n",
2058 handle(Smi::FromInt(0), isolate)), 2058 handle(Smi::FromInt(0), isolate)),
2059 std::make_pair("var a = '0', b = 10; return a && b;\n", 2059 std::make_pair("var a = '0', b = 10; return a && b;\n",
2060 handle(Smi::FromInt(10), isolate)), 2060 handle(Smi::FromInt(10), isolate)),
2061 std::make_pair("return 0.0 && 3.2;\n", 2061 std::make_pair("return 0.0 && 3.2;\n",
2062 handle(Smi::FromInt(0), isolate)), 2062 handle(Smi::FromInt(0), isolate)),
2063 std::make_pair("return 'a' && 'b';\n", 2063 std::make_pair("return 'a' && 'b';\n",
2064 factory->NewStringFromStaticChars("b")), 2064 factory->NewStringFromStaticChars("b")),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2105 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4)); 2105 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(4));
2106 } 2106 }
2107 2107
2108 2108
2109 TEST(InterpreterThrow) { 2109 TEST(InterpreterThrow) {
2110 HandleAndZoneScope handles; 2110 HandleAndZoneScope handles;
2111 i::Isolate* isolate = handles.main_isolate(); 2111 i::Isolate* isolate = handles.main_isolate();
2112 i::Factory* factory = isolate->factory(); 2112 i::Factory* factory = isolate->factory();
2113 2113
2114 // TODO(rmcilroy): modify tests when we have real try catch support. 2114 // TODO(rmcilroy): modify tests when we have real try catch support.
2115 std::pair<const char*, Handle<Object>> throws[6] = { 2115 std::pair<const char*, Handle<Object>> throws[] = {
2116 std::make_pair("throw undefined;\n", 2116 std::make_pair("throw undefined;\n",
2117 factory->undefined_value()), 2117 factory->undefined_value()),
2118 std::make_pair("throw 1;\n", 2118 std::make_pair("throw 1;\n",
2119 handle(Smi::FromInt(1), isolate)), 2119 handle(Smi::FromInt(1), isolate)),
2120 std::make_pair("throw 'Error';\n", 2120 std::make_pair("throw 'Error';\n",
2121 factory->NewStringFromStaticChars("Error")), 2121 factory->NewStringFromStaticChars("Error")),
2122 std::make_pair("var a = true; if (a) { throw 'Error'; }\n", 2122 std::make_pair("var a = true; if (a) { throw 'Error'; }\n",
2123 factory->NewStringFromStaticChars("Error")), 2123 factory->NewStringFromStaticChars("Error")),
2124 std::make_pair("var a = false; if (a) { throw 'Error'; }\n", 2124 std::make_pair("var a = false; if (a) { throw 'Error'; }\n",
2125 factory->undefined_value()), 2125 factory->undefined_value()),
(...skipping 12 matching lines...) Expand all
2138 CHECK(thrown_obj->SameValue(*throws[i].second)); 2138 CHECK(thrown_obj->SameValue(*throws[i].second));
2139 } 2139 }
2140 } 2140 }
2141 2141
2142 2142
2143 TEST(InterpreterCountOperators) { 2143 TEST(InterpreterCountOperators) {
2144 HandleAndZoneScope handles; 2144 HandleAndZoneScope handles;
2145 i::Isolate* isolate = handles.main_isolate(); 2145 i::Isolate* isolate = handles.main_isolate();
2146 i::Factory* factory = isolate->factory(); 2146 i::Factory* factory = isolate->factory();
2147 2147
2148 std::pair<const char*, Handle<Object>> count_ops[16] = { 2148 std::pair<const char*, Handle<Object>> count_ops[] = {
2149 std::make_pair("var a = 1; return ++a;", 2149 std::make_pair("var a = 1; return ++a;",
2150 handle(Smi::FromInt(2), isolate)), 2150 handle(Smi::FromInt(2), isolate)),
2151 std::make_pair("var a = 1; return a++;", 2151 std::make_pair("var a = 1; return a++;",
2152 handle(Smi::FromInt(1), isolate)), 2152 handle(Smi::FromInt(1), isolate)),
2153 std::make_pair("var a = 5; return --a;", 2153 std::make_pair("var a = 5; return --a;",
2154 handle(Smi::FromInt(4), isolate)), 2154 handle(Smi::FromInt(4), isolate)),
2155 std::make_pair("var a = 5; return a--;", 2155 std::make_pair("var a = 5; return a--;",
2156 handle(Smi::FromInt(5), isolate)), 2156 handle(Smi::FromInt(5), isolate)),
2157 std::make_pair("var a = 5.2; return --a;", 2157 std::make_pair("var a = 5.2; return --a;",
2158 factory->NewHeapNumber(4.2)), 2158 factory->NewHeapNumber(4.2)),
(...skipping 29 matching lines...) Expand all
2188 Handle<i::Object> return_value = callable().ToHandleChecked(); 2188 Handle<i::Object> return_value = callable().ToHandleChecked();
2189 CHECK(return_value->SameValue(*count_ops[i].second)); 2189 CHECK(return_value->SameValue(*count_ops[i].second));
2190 } 2190 }
2191 } 2191 }
2192 2192
2193 2193
2194 TEST(InterpreterGlobalCountOperators) { 2194 TEST(InterpreterGlobalCountOperators) {
2195 HandleAndZoneScope handles; 2195 HandleAndZoneScope handles;
2196 i::Isolate* isolate = handles.main_isolate(); 2196 i::Isolate* isolate = handles.main_isolate();
2197 2197
2198 std::pair<const char*, Handle<Object>> count_ops[6] = { 2198 std::pair<const char*, Handle<Object>> count_ops[] = {
2199 std::make_pair("var global = 100;function f(){ return ++global; }", 2199 std::make_pair("var global = 100;function f(){ return ++global; }",
2200 handle(Smi::FromInt(101), isolate)), 2200 handle(Smi::FromInt(101), isolate)),
2201 std::make_pair("var global = 100; function f(){ return --global; }", 2201 std::make_pair("var global = 100; function f(){ return --global; }",
2202 handle(Smi::FromInt(99), isolate)), 2202 handle(Smi::FromInt(99), isolate)),
2203 std::make_pair("var global = 100; function f(){ return global++; }", 2203 std::make_pair("var global = 100; function f(){ return global++; }",
2204 handle(Smi::FromInt(100), isolate)), 2204 handle(Smi::FromInt(100), isolate)),
2205 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }", 2205 std::make_pair("unallocated = 200; function f(){ return ++unallocated; }",
2206 handle(Smi::FromInt(201), isolate)), 2206 handle(Smi::FromInt(201), isolate)),
2207 std::make_pair("unallocated = 200; function f(){ return --unallocated; }", 2207 std::make_pair("unallocated = 200; function f(){ return --unallocated; }",
2208 handle(Smi::FromInt(199), isolate)), 2208 handle(Smi::FromInt(199), isolate)),
2209 std::make_pair("unallocated = 200; function f(){ return unallocated++; }", 2209 std::make_pair("unallocated = 200; function f(){ return unallocated++; }",
2210 handle(Smi::FromInt(200), isolate)), 2210 handle(Smi::FromInt(200), isolate)),
2211 }; 2211 };
2212 2212
2213 for (size_t i = 0; i < arraysize(count_ops); i++) { 2213 for (size_t i = 0; i < arraysize(count_ops); i++) {
2214 InterpreterTester tester(handles.main_isolate(), count_ops[i].first); 2214 InterpreterTester tester(handles.main_isolate(), count_ops[i].first);
2215 auto callable = tester.GetCallable<>(); 2215 auto callable = tester.GetCallable<>();
2216 2216
2217 Handle<i::Object> return_value = callable().ToHandleChecked(); 2217 Handle<i::Object> return_value = callable().ToHandleChecked();
2218 CHECK(return_value->SameValue(*count_ops[i].second)); 2218 CHECK(return_value->SameValue(*count_ops[i].second));
2219 } 2219 }
2220 } 2220 }
2221 2221
2222 2222
2223 TEST(InterpreterCompoundExpressions) { 2223 TEST(InterpreterCompoundExpressions) {
2224 HandleAndZoneScope handles; 2224 HandleAndZoneScope handles;
2225 i::Isolate* isolate = handles.main_isolate(); 2225 i::Isolate* isolate = handles.main_isolate();
2226 i::Factory* factory = isolate->factory(); 2226 i::Factory* factory = isolate->factory();
2227 2227
2228 std::pair<const char*, Handle<Object>> compound_expr[5] = { 2228 std::pair<const char*, Handle<Object>> compound_expr[] = {
2229 std::make_pair("var a = 1; a += 2; return a;", 2229 std::make_pair("var a = 1; a += 2; return a;",
2230 Handle<Object>(Smi::FromInt(3), isolate)), 2230 Handle<Object>(Smi::FromInt(3), isolate)),
2231 std::make_pair("var a = 10; a /= 2; return a;", 2231 std::make_pair("var a = 10; a /= 2; return a;",
2232 Handle<Object>(Smi::FromInt(5), isolate)), 2232 Handle<Object>(Smi::FromInt(5), isolate)),
2233 std::make_pair("var a = 'test'; a += 'ing'; return a;", 2233 std::make_pair("var a = 'test'; a += 'ing'; return a;",
2234 factory->NewStringFromStaticChars("testing")), 2234 factory->NewStringFromStaticChars("testing")),
2235 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;", 2235 std::make_pair("var a = { val: 2 }; a.val *= 2; return a.val;",
2236 Handle<Object>(Smi::FromInt(4), isolate)), 2236 Handle<Object>(Smi::FromInt(4), isolate)),
2237 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;" 2237 std::make_pair("var a = 1; (function f() { a = 2; })(); a += 24;"
2238 "return a;", 2238 "return a;",
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2272 CHECK(return_value->SameValue(*compound_expr[i].second)); 2272 CHECK(return_value->SameValue(*compound_expr[i].second));
2273 } 2273 }
2274 } 2274 }
2275 2275
2276 2276
2277 TEST(InterpreterCreateArguments) { 2277 TEST(InterpreterCreateArguments) {
2278 HandleAndZoneScope handles; 2278 HandleAndZoneScope handles;
2279 i::Isolate* isolate = handles.main_isolate(); 2279 i::Isolate* isolate = handles.main_isolate();
2280 i::Factory* factory = isolate->factory(); 2280 i::Factory* factory = isolate->factory();
2281 2281
2282 std::pair<const char*, int> create_args[9] = { 2282 std::pair<const char*, int> create_args[] = {
2283 std::make_pair("function f() { return arguments[0]; }", 0), 2283 std::make_pair("function f() { return arguments[0]; }", 0),
2284 std::make_pair("function f(a) { return arguments[0]; }", 0), 2284 std::make_pair("function f(a) { return arguments[0]; }", 0),
2285 std::make_pair("function f() { return arguments[2]; }", 2), 2285 std::make_pair("function f() { return arguments[2]; }", 2),
2286 std::make_pair("function f(a) { return arguments[2]; }", 2), 2286 std::make_pair("function f(a) { return arguments[2]; }", 2),
2287 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2), 2287 std::make_pair("function f(a, b, c, d) { return arguments[2]; }", 2),
2288 std::make_pair("function f(a) {" 2288 std::make_pair("function f(a) {"
2289 "'use strict'; return arguments[0]; }", 2289 "'use strict'; return arguments[0]; }",
2290 0), 2290 0),
2291 std::make_pair("function f(a, b, c, d) {" 2291 std::make_pair("function f(a, b, c, d) {"
2292 "'use strict'; return arguments[2]; }", 2292 "'use strict'; return arguments[2]; }",
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2336 callable(args[0], args[1], args[2]).ToHandleChecked(); 2336 callable(args[0], args[1], args[2]).ToHandleChecked();
2337 CHECK(return_val->SameValue(*args[create_args[i].second])); 2337 CHECK(return_val->SameValue(*args[create_args[i].second]));
2338 } 2338 }
2339 } 2339 }
2340 2340
2341 2341
2342 TEST(InterpreterConditional) { 2342 TEST(InterpreterConditional) {
2343 HandleAndZoneScope handles; 2343 HandleAndZoneScope handles;
2344 i::Isolate* isolate = handles.main_isolate(); 2344 i::Isolate* isolate = handles.main_isolate();
2345 2345
2346 std::pair<const char*, Handle<Object>> conditional[8] = { 2346 std::pair<const char*, Handle<Object>> conditional[] = {
2347 std::make_pair("return true ? 2 : 3;", 2347 std::make_pair("return true ? 2 : 3;",
2348 handle(Smi::FromInt(2), isolate)), 2348 handle(Smi::FromInt(2), isolate)),
2349 std::make_pair("return false ? 2 : 3;", 2349 std::make_pair("return false ? 2 : 3;",
2350 handle(Smi::FromInt(3), isolate)), 2350 handle(Smi::FromInt(3), isolate)),
2351 std::make_pair("var a = 1; return a ? 20 : 30;", 2351 std::make_pair("var a = 1; return a ? 20 : 30;",
2352 handle(Smi::FromInt(20), isolate)), 2352 handle(Smi::FromInt(20), isolate)),
2353 std::make_pair("var a = 1; return a ? 20 : 30;", 2353 std::make_pair("var a = 1; return a ? 20 : 30;",
2354 handle(Smi::FromInt(20), isolate)), 2354 handle(Smi::FromInt(20), isolate)),
2355 std::make_pair("var a = 'string'; return a ? 20 : 30;", 2355 std::make_pair("var a = 'string'; return a ? 20 : 30;",
2356 handle(Smi::FromInt(20), isolate)), 2356 handle(Smi::FromInt(20), isolate)),
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
2717 " }", 2717 " }",
2718 0}}; 2718 0}};
2719 2719
2720 for (size_t i = 0; i < arraysize(for_in_samples); i++) { 2720 for (size_t i = 0; i < arraysize(for_in_samples); i++) {
2721 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first); 2721 InterpreterTester tester(handles.main_isolate(), for_in_samples[i].first);
2722 auto callable = tester.GetCallable<>(); 2722 auto callable = tester.GetCallable<>();
2723 Handle<Object> return_val = callable().ToHandleChecked(); 2723 Handle<Object> return_val = callable().ToHandleChecked();
2724 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second); 2724 CHECK_EQ(Handle<Smi>::cast(return_val)->value(), for_in_samples[i].second);
2725 } 2725 }
2726 } 2726 }
2727
2728
2729 TEST(InterpreterSwitch) {
2730 HandleAndZoneScope handles;
2731 i::Isolate* isolate = handles.main_isolate();
2732 i::Factory* factory = isolate->factory();
2733
2734 std::pair<const char*, Handle<Object>> switch_ops[] = {
2735 std::make_pair("var a = 1;\n"
2736 "switch(a) {\n"
2737 " case 1: return 2;\n"
2738 " case 2: return 3;\n"
2739 "}\n",
2740 handle(Smi::FromInt(2), isolate)),
2741 std::make_pair("var a = 1;\n"
2742 "switch(a) {\n"
2743 " case 2: a = 2; break;\n"
2744 " case 1: a = 3; break;\n"
2745 "}\n"
2746 "return a;",
2747 handle(Smi::FromInt(3), isolate)),
2748 std::make_pair("var a = 1;\n"
2749 "switch(a) {\n"
2750 " case 1: a = 2; // fall-through\n"
2751 " case 2: a = 3; break;\n"
2752 "}\n"
2753 "return a;",
2754 handle(Smi::FromInt(3), isolate)),
2755 std::make_pair("var a = 100;\n"
2756 "switch(a) {\n"
2757 " case 1: return 100;\n"
2758 " case 2: return 200;\n"
2759 "}\n"
2760 "return undefined;",
2761 factory->undefined_value()),
2762 std::make_pair("var a = 100;\n"
2763 "switch(a) {\n"
2764 " case 1: return 100;\n"
2765 " case 2: return 200;\n"
2766 " default: return 300;\n"
2767 "}\n"
2768 "return undefined;",
2769 handle(Smi::FromInt(300), isolate)),
2770 std::make_pair("var a = 100;\n"
2771 "switch(typeof(a)) {\n"
2772 " case 'string': return 1;\n"
2773 " case 'number': return 2;\n"
2774 " default: return 3;\n"
2775 "}\n",
2776 handle(Smi::FromInt(2), isolate)),
2777 std::make_pair("var a = 100;\n"
2778 "switch(a) {\n"
2779 " case a += 20: return 1;\n"
2780 " case a -= 10: return 2;\n"
2781 " case a -= 10: return 3;\n"
2782 " default: return 3;\n"
2783 "}\n",
2784 handle(Smi::FromInt(3), isolate)),
2785 };
2786
2787 for (size_t i = 0; i < arraysize(switch_ops); i++) {
2788 std::string source(InterpreterTester::SourceForBody(switch_ops[i].first));
2789 InterpreterTester tester(handles.main_isolate(), source.c_str());
2790 auto callable = tester.GetCallable<>();
2791
2792 Handle<i::Object> return_value = callable().ToHandleChecked();
2793 CHECK(return_value->SameValue(*switch_ops[i].second));
2794 }
2795 }
OLDNEW
« src/interpreter/bytecode-generator.cc ('K') | « 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