| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
| 8 #include "src/ast/ast-expression-visitor.h" | 8 #include "src/ast/ast-expression-visitor.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/parsing/parser.h" | 10 #include "src/parsing/parser.h" |
| (...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1719 } | 1719 } |
| 1720 | 1720 |
| 1721 | 1721 |
| 1722 TEST(ForeignFunction) { | 1722 TEST(ForeignFunction) { |
| 1723 CHECK_FUNC_TYPES_BEGIN( | 1723 CHECK_FUNC_TYPES_BEGIN( |
| 1724 "var baz = foreign.baz;\n" | 1724 "var baz = foreign.baz;\n" |
| 1725 "function bar() { return baz(1, 2)|0; }\n" | 1725 "function bar() { return baz(1, 2)|0; }\n" |
| 1726 "function foo() { bar(); }") { | 1726 "function foo() { bar(); }") { |
| 1727 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { | 1727 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { |
| 1728 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 1728 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
| 1729 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { | 1729 CHECK_EXPR(Call, Bounds(Type::Number(zone))) { |
| 1730 CHECK_VAR(baz, Bounds(Type::Any(zone))); | 1730 CHECK_VAR(baz, Bounds(Type::Any(zone))); |
| 1731 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1731 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1732 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1732 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1733 } | 1733 } |
| 1734 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1734 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1735 } | 1735 } |
| 1736 } | 1736 } |
| 1737 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { | 1737 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { |
| 1738 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { | 1738 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { |
| 1739 CHECK_VAR(bar, FUNC_I_TYPE); | 1739 CHECK_VAR(bar, FUNC_I_TYPE); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 "function foo() { bar(); }", | 1781 "function foo() { bar(); }", |
| 1782 "asm: line 39: illegal type in assignment\n"); | 1782 "asm: line 39: illegal type in assignment\n"); |
| 1783 } | 1783 } |
| 1784 | 1784 |
| 1785 | 1785 |
| 1786 TEST(BadStandardFunctionCallOutside) { | 1786 TEST(BadStandardFunctionCallOutside) { |
| 1787 CHECK_FUNC_ERROR( | 1787 CHECK_FUNC_ERROR( |
| 1788 "var s0 = sin(0);\n" | 1788 "var s0 = sin(0);\n" |
| 1789 "function bar() { }\n" | 1789 "function bar() { }\n" |
| 1790 "function foo() { bar(); }", | 1790 "function foo() { bar(); }", |
| 1791 "asm: line 39: illegal variable reference in module body\n"); | 1791 "asm: line 39: calls forbidden outside function bodies\n"); |
| 1792 } | 1792 } |
| 1793 | 1793 |
| 1794 | 1794 |
| 1795 TEST(BadFunctionCallOutside) { | 1795 TEST(BadFunctionCallOutside) { |
| 1796 CHECK_FUNC_ERROR( | 1796 CHECK_FUNC_ERROR( |
| 1797 "function bar() { return 0.0; }\n" | 1797 "function bar() { return 0.0; }\n" |
| 1798 "var s0 = bar(0);\n" | 1798 "var s0 = bar(0);\n" |
| 1799 "function foo() { bar(); }", | 1799 "function foo() { bar(); }", |
| 1800 "asm: line 40: illegal variable reference in module body\n"); | 1800 "asm: line 40: calls forbidden outside function bodies\n"); |
| 1801 } | 1801 } |
| 1802 | 1802 |
| 1803 | 1803 |
| 1804 TEST(NestedVariableAssignment) { | 1804 TEST(NestedVariableAssignment) { |
| 1805 CHECK_FUNC_TYPES_BEGIN( | 1805 CHECK_FUNC_TYPES_BEGIN( |
| 1806 "function bar() { var x = 0; x = x = 4; }\n" | 1806 "function bar() { var x = 0; x = x = 4; }\n" |
| 1807 "function foo() { bar(); }") { | 1807 "function foo() { bar(); }") { |
| 1808 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { | 1808 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { |
| 1809 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { | 1809 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { |
| 1810 CHECK_VAR(x, Bounds(cache.kAsmInt)); | 1810 CHECK_VAR(x, Bounds(cache.kAsmInt)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1830 "function foo() { bar(); }") { | 1830 "function foo() { bar(); }") { |
| 1831 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { | 1831 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { |
| 1832 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { | 1832 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { |
| 1833 CHECK_VAR(x, Bounds(cache.kAsmInt)); | 1833 CHECK_VAR(x, Bounds(cache.kAsmInt)); |
| 1834 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1834 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1835 } | 1835 } |
| 1836 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { | 1836 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { |
| 1837 CHECK_EXPR(Property, Bounds::Unbounded()) { | 1837 CHECK_EXPR(Property, Bounds::Unbounded()) { |
| 1838 CHECK_VAR(i8, Bounds(cache.kInt8Array)); | 1838 CHECK_VAR(i8, Bounds(cache.kInt8Array)); |
| 1839 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 1839 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
| 1840 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { | 1840 CHECK_EXPR(Assignment, Bounds(cache.kAsmSigned)) { |
| 1841 CHECK_VAR(x, Bounds(cache.kAsmInt)); | 1841 CHECK_VAR(x, Bounds(cache.kAsmInt)); |
| 1842 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1842 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1843 } | 1843 } |
| 1844 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1844 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1845 } | 1845 } |
| 1846 } | 1846 } |
| 1847 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1847 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
| 1848 } | 1848 } |
| 1849 } | 1849 } |
| 1850 CHECK_SKIP(); | 1850 CHECK_SKIP(); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2043 "asm: line 39: duplicate case value\n"); | 2043 "asm: line 39: duplicate case value\n"); |
| 2044 } | 2044 } |
| 2045 | 2045 |
| 2046 | 2046 |
| 2047 TEST(BadSwitchOrder) { | 2047 TEST(BadSwitchOrder) { |
| 2048 CHECK_FUNC_ERROR( | 2048 CHECK_FUNC_ERROR( |
| 2049 "function bar() { switch (1) { default: case 0: } }\n" | 2049 "function bar() { switch (1) { default: case 0: } }\n" |
| 2050 "function foo() { bar(); }", | 2050 "function foo() { bar(); }", |
| 2051 "asm: line 39: default case out of order\n"); | 2051 "asm: line 39: default case out of order\n"); |
| 2052 } | 2052 } |
| 2053 | |
| 2054 TEST(BadForeignCall) { | |
| 2055 const char test_function[] = | |
| 2056 "function TestModule(stdlib, foreign, buffer) {\n" | |
| 2057 " \"use asm\";\n" | |
| 2058 " var ffunc = foreign.foo;\n" | |
| 2059 " function test1() { var x = 0; ffunc(x); }\n" | |
| 2060 " return { testFunc1: test1 };\n" | |
| 2061 "}\n"; | |
| 2062 v8::V8::Initialize(); | |
| 2063 HandleAndZoneScope handles; | |
| 2064 Zone* zone = handles.main_zone(); | |
| 2065 ZoneVector<ExpressionTypeEntry> types(zone); | |
| 2066 CHECK_EQ( | |
| 2067 "asm: line 4: foreign call argument expected to be int, double, or " | |
| 2068 "fixnum\n", | |
| 2069 Validate(zone, test_function, &types)); | |
| 2070 } | |
| 2071 | |
| 2072 TEST(BadImports) { | |
| 2073 const char test_function[] = | |
| 2074 "function TestModule(stdlib, foreign, buffer) {\n" | |
| 2075 " \"use asm\";\n" | |
| 2076 " var fint = (foreign.bar | 0) | 0;\n" | |
| 2077 " function test1() {}\n" | |
| 2078 " return { testFunc1: test1 };\n" | |
| 2079 "}\n"; | |
| 2080 v8::V8::Initialize(); | |
| 2081 HandleAndZoneScope handles; | |
| 2082 Zone* zone = handles.main_zone(); | |
| 2083 ZoneVector<ExpressionTypeEntry> types(zone); | |
| 2084 CHECK_EQ("asm: line 3: illegal computation inside module body\n", | |
| 2085 Validate(zone, test_function, &types)); | |
| 2086 } | |
| 2087 | |
| 2088 TEST(BadVariableReference) { | |
| 2089 const char test_function[] = | |
| 2090 "function TestModule(stdlib, foreign, buffer) {\n" | |
| 2091 " \"use asm\";\n" | |
| 2092 " var x = 0;\n" | |
| 2093 " var y = x;\n" | |
| 2094 " function test1() {}\n" | |
| 2095 " return { testFunc1: test1 };\n" | |
| 2096 "}\n"; | |
| 2097 v8::V8::Initialize(); | |
| 2098 HandleAndZoneScope handles; | |
| 2099 Zone* zone = handles.main_zone(); | |
| 2100 ZoneVector<ExpressionTypeEntry> types(zone); | |
| 2101 CHECK_EQ("asm: line 4: illegal variable reference in module body\n", | |
| 2102 Validate(zone, test_function, &types)); | |
| 2103 } | |
| 2104 | |
| 2105 TEST(Imports) { | |
| 2106 const char test_function[] = | |
| 2107 "function TestModule(stdlib, foreign, buffer) {\n" | |
| 2108 " \"use asm\";\n" | |
| 2109 " var ffunc = foreign.foo;\n" | |
| 2110 " var fint = foreign.bar | 0;\n" | |
| 2111 " var fdouble = +foreign.baz;\n" | |
| 2112 " function test1() { return ffunc(fint|0, fdouble) | 0; }\n" | |
| 2113 " function test2() { return +ffunc(fdouble, fint|0); }\n" | |
| 2114 " return { testFunc1: test1, testFunc2: test2 };\n" | |
| 2115 "}\n"; | |
| 2116 | |
| 2117 v8::V8::Initialize(); | |
| 2118 HandleAndZoneScope handles; | |
| 2119 Zone* zone = handles.main_zone(); | |
| 2120 ZoneVector<ExpressionTypeEntry> types(zone); | |
| 2121 CHECK_EQ("", Validate(zone, test_function, &types)); | |
| 2122 TypeCache cache; | |
| 2123 | |
| 2124 CHECK_TYPES_BEGIN { | |
| 2125 // Module. | |
| 2126 CHECK_EXPR(FunctionLiteral, Bounds::Unbounded()) { | |
| 2127 // function test1 | |
| 2128 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { | |
| 2129 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | |
| 2130 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { | |
| 2131 CHECK_VAR(ffunc, Bounds(Type::Any(zone))); | |
| 2132 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | |
| 2133 CHECK_VAR(fint, Bounds(cache.kAsmInt)); | |
| 2134 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | |
| 2135 } | |
| 2136 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); | |
| 2137 } | |
| 2138 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | |
| 2139 } | |
| 2140 } | |
| 2141 // function test2 | |
| 2142 CHECK_EXPR(FunctionLiteral, FUNC_D_TYPE) { | |
| 2143 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmDouble)) { | |
| 2144 CHECK_EXPR(Call, Bounds(cache.kAsmDouble)) { | |
| 2145 CHECK_VAR(ffunc, Bounds(Type::Any(zone))); | |
| 2146 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); | |
| 2147 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | |
| 2148 CHECK_VAR(fint, Bounds(cache.kAsmInt)); | |
| 2149 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | |
| 2150 } | |
| 2151 } | |
| 2152 CHECK_EXPR(Literal, Bounds(cache.kAsmDouble)); | |
| 2153 } | |
| 2154 } | |
| 2155 // "use asm"; | |
| 2156 CHECK_EXPR(Literal, Bounds(Type::String(zone))); | |
| 2157 // var func = foreign.foo; | |
| 2158 CHECK_EXPR(Assignment, Bounds(Type::Any(zone))) { | |
| 2159 CHECK_VAR(ffunc, Bounds(Type::Any(zone))); | |
| 2160 CHECK_EXPR(Property, Bounds(Type::Any(zone))) { | |
| 2161 CHECK_VAR(foreign, Bounds::Unbounded()); | |
| 2162 CHECK_EXPR(Literal, Bounds::Unbounded()); | |
| 2163 } | |
| 2164 } | |
| 2165 // var fint = foreign.bar | 0; | |
| 2166 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { | |
| 2167 CHECK_VAR(fint, Bounds(cache.kAsmInt)); | |
| 2168 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | |
| 2169 CHECK_EXPR(Property, Bounds(Type::Number())) { | |
| 2170 CHECK_VAR(foreign, Bounds::Unbounded()); | |
| 2171 CHECK_EXPR(Literal, Bounds::Unbounded()); | |
| 2172 } | |
| 2173 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | |
| 2174 } | |
| 2175 } | |
| 2176 // var fdouble = +foreign.baz; | |
| 2177 CHECK_EXPR(Assignment, Bounds(cache.kAsmDouble)) { | |
| 2178 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); | |
| 2179 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmDouble)) { | |
| 2180 CHECK_EXPR(Property, Bounds(Type::Number())) { | |
| 2181 CHECK_VAR(foreign, Bounds::Unbounded()); | |
| 2182 CHECK_EXPR(Literal, Bounds::Unbounded()); | |
| 2183 } | |
| 2184 CHECK_EXPR(Literal, Bounds(cache.kAsmDouble)); | |
| 2185 } | |
| 2186 } | |
| 2187 // return { testFunc1: test1, testFunc2: test2 }; | |
| 2188 CHECK_EXPR(ObjectLiteral, Bounds::Unbounded()) { | |
| 2189 CHECK_VAR(test1, FUNC_I_TYPE); | |
| 2190 CHECK_VAR(test2, FUNC_D_TYPE); | |
| 2191 } | |
| 2192 } | |
| 2193 } | |
| 2194 CHECK_TYPES_END | |
| 2195 } | |
| OLD | NEW |