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" |
11 #include "src/parsing/rewriter.h" | 11 #include "src/parsing/rewriter.h" |
12 #include "src/type-cache.h" | 12 #include "src/type-cache.h" |
13 #include "src/typing-asm.h" | 13 #include "src/typing-asm.h" |
14 #include "test/cctest/cctest.h" | 14 #include "test/cctest/cctest.h" |
15 #include "test/cctest/expression-type-collector.h" | 15 #include "test/cctest/expression-type-collector.h" |
16 #include "test/cctest/expression-type-collector-macros.h" | 16 #include "test/cctest/expression-type-collector-macros.h" |
17 | 17 |
18 // Macros for function types. | 18 // Macros for function types. |
19 #define FUNC_BARE_TYPE Bounds(Type::Function()) | 19 #define FUNC_FOREIGN_TYPE Bounds(Type::Function(Type::Any(), zone)) |
20 #define FUNC_V_TYPE Bounds(Type::Function(Type::Undefined(), zone)) | 20 #define FUNC_V_TYPE Bounds(Type::Function(Type::Undefined(), zone)) |
21 #define FUNC_I_TYPE Bounds(Type::Function(cache.kAsmSigned, zone)) | 21 #define FUNC_I_TYPE Bounds(Type::Function(cache.kAsmSigned, zone)) |
22 #define FUNC_F_TYPE Bounds(Type::Function(cache.kAsmFloat, zone)) | 22 #define FUNC_F_TYPE Bounds(Type::Function(cache.kAsmFloat, zone)) |
23 #define FUNC_D_TYPE Bounds(Type::Function(cache.kAsmDouble, zone)) | 23 #define FUNC_D_TYPE Bounds(Type::Function(cache.kAsmDouble, zone)) |
24 #define FUNC_D2D_TYPE \ | 24 #define FUNC_D2D_TYPE \ |
25 Bounds(Type::Function(cache.kAsmDouble, cache.kAsmDouble, zone)) | 25 Bounds(Type::Function(cache.kAsmDouble, cache.kAsmDouble, zone)) |
26 #define FUNC_N2F_TYPE \ | 26 #define FUNC_N2F_TYPE \ |
27 Bounds(Type::Function(cache.kAsmFloat, Type::Number(), zone)) | 27 Bounds(Type::Function(cache.kAsmFloat, Type::Number(), zone)) |
28 #define FUNC_I2I_TYPE \ | 28 #define FUNC_I2I_TYPE \ |
29 Bounds(Type::Function(cache.kAsmSigned, cache.kAsmInt, zone)) | 29 Bounds(Type::Function(cache.kAsmSigned, cache.kAsmInt, zone)) |
(...skipping 1689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1719 | 1719 |
1720 | 1720 |
1721 TEST(ForeignFunction) { | 1721 TEST(ForeignFunction) { |
1722 CHECK_FUNC_TYPES_BEGIN( | 1722 CHECK_FUNC_TYPES_BEGIN( |
1723 "var baz = foreign.baz;\n" | 1723 "var baz = foreign.baz;\n" |
1724 "function bar() { return baz(1, 2)|0; }\n" | 1724 "function bar() { return baz(1, 2)|0; }\n" |
1725 "function foo() { bar(); }") { | 1725 "function foo() { bar(); }") { |
1726 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { | 1726 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { |
1727 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 1727 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
1728 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { | 1728 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { |
1729 CHECK_VAR(baz, FUNC_BARE_TYPE); | 1729 CHECK_VAR(baz, FUNC_FOREIGN_TYPE); |
1730 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1730 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
1731 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1731 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
1732 } | 1732 } |
1733 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 1733 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
1734 } | 1734 } |
1735 } | 1735 } |
1736 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { | 1736 CHECK_EXPR(FunctionLiteral, FUNC_V_TYPE) { |
1737 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { | 1737 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { |
1738 CHECK_VAR(bar, FUNC_I_TYPE); | 1738 CHECK_VAR(bar, FUNC_I_TYPE); |
1739 } | 1739 } |
1740 } | 1740 } |
1741 } | 1741 } |
1742 CHECK_FUNC_TYPES_END_1() | 1742 CHECK_FUNC_TYPES_END_1() |
1743 CHECK_EXPR(Assignment, Bounds(Type::Any())) { | 1743 CHECK_EXPR(Assignment, Bounds(FUNC_FOREIGN_TYPE)) { |
1744 CHECK_VAR(baz, Bounds(Type::Any())); | 1744 CHECK_VAR(baz, Bounds(FUNC_FOREIGN_TYPE)); |
1745 CHECK_EXPR(Property, Bounds(Type::Any())) { | 1745 CHECK_EXPR(Property, Bounds(FUNC_FOREIGN_TYPE)) { |
1746 CHECK_VAR(foreign, Bounds::Unbounded()); | 1746 CHECK_VAR(foreign, Bounds::Unbounded()); |
1747 CHECK_EXPR(Literal, Bounds::Unbounded()); | 1747 CHECK_EXPR(Literal, Bounds::Unbounded()); |
1748 } | 1748 } |
1749 } | 1749 } |
1750 CHECK_FUNC_TYPES_END_2() | 1750 CHECK_FUNC_TYPES_END_2() |
1751 } | 1751 } |
1752 | 1752 |
1753 | 1753 |
1754 TEST(BadExports) { | 1754 TEST(BadExports) { |
1755 HARNESS_PREAMBLE() | 1755 HARNESS_PREAMBLE() |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2120 CHECK_EQ("", Validate(zone, test_function, &types)); | 2120 CHECK_EQ("", Validate(zone, test_function, &types)); |
2121 TypeCache cache; | 2121 TypeCache cache; |
2122 | 2122 |
2123 CHECK_TYPES_BEGIN { | 2123 CHECK_TYPES_BEGIN { |
2124 // Module. | 2124 // Module. |
2125 CHECK_EXPR(FunctionLiteral, Bounds::Unbounded()) { | 2125 CHECK_EXPR(FunctionLiteral, Bounds::Unbounded()) { |
2126 // function test1 | 2126 // function test1 |
2127 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { | 2127 CHECK_EXPR(FunctionLiteral, FUNC_I_TYPE) { |
2128 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 2128 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
2129 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { | 2129 CHECK_EXPR(Call, Bounds(cache.kAsmSigned)) { |
2130 CHECK_VAR(ffunc, FUNC_BARE_TYPE); | 2130 CHECK_VAR(ffunc, FUNC_FOREIGN_TYPE); |
2131 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 2131 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
2132 CHECK_VAR(fint, Bounds(cache.kAsmInt)); | 2132 CHECK_VAR(fint, Bounds(cache.kAsmInt)); |
2133 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 2133 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
2134 } | 2134 } |
2135 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); | 2135 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); |
2136 } | 2136 } |
2137 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 2137 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
2138 } | 2138 } |
2139 } | 2139 } |
2140 // function test2 | 2140 // function test2 |
2141 CHECK_EXPR(FunctionLiteral, FUNC_D_TYPE) { | 2141 CHECK_EXPR(FunctionLiteral, FUNC_D_TYPE) { |
2142 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmDouble)) { | 2142 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmDouble)) { |
2143 CHECK_EXPR(Call, Bounds(cache.kAsmDouble)) { | 2143 CHECK_EXPR(Call, Bounds(cache.kAsmDouble)) { |
2144 CHECK_VAR(ffunc, FUNC_BARE_TYPE); | 2144 CHECK_VAR(ffunc, FUNC_FOREIGN_TYPE); |
2145 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); | 2145 CHECK_VAR(fdouble, Bounds(cache.kAsmDouble)); |
2146 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 2146 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
2147 CHECK_VAR(fint, Bounds(cache.kAsmInt)); | 2147 CHECK_VAR(fint, Bounds(cache.kAsmInt)); |
2148 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); | 2148 CHECK_EXPR(Literal, Bounds(cache.kAsmFixnum)); |
2149 } | 2149 } |
2150 } | 2150 } |
2151 CHECK_EXPR(Literal, Bounds(cache.kAsmDouble)); | 2151 CHECK_EXPR(Literal, Bounds(cache.kAsmDouble)); |
2152 } | 2152 } |
2153 } | 2153 } |
2154 // "use asm"; | 2154 // "use asm"; |
2155 CHECK_EXPR(Literal, Bounds(Type::String())); | 2155 CHECK_EXPR(Literal, Bounds(Type::String())); |
2156 // var func = foreign.foo; | 2156 // var func = foreign.foo; |
2157 CHECK_EXPR(Assignment, Bounds(Type::Any())) { | 2157 CHECK_EXPR(Assignment, Bounds(FUNC_FOREIGN_TYPE)) { |
2158 CHECK_VAR(ffunc, Bounds(Type::Any())); | 2158 CHECK_VAR(ffunc, Bounds(FUNC_FOREIGN_TYPE)); |
2159 CHECK_EXPR(Property, Bounds(Type::Any())) { | 2159 CHECK_EXPR(Property, Bounds(FUNC_FOREIGN_TYPE)) { |
2160 CHECK_VAR(foreign, Bounds::Unbounded()); | 2160 CHECK_VAR(foreign, Bounds::Unbounded()); |
2161 CHECK_EXPR(Literal, Bounds::Unbounded()); | 2161 CHECK_EXPR(Literal, Bounds::Unbounded()); |
2162 } | 2162 } |
2163 } | 2163 } |
2164 // var fint = foreign.bar | 0; | 2164 // var fint = foreign.bar | 0; |
2165 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { | 2165 CHECK_EXPR(Assignment, Bounds(cache.kAsmInt)) { |
2166 CHECK_VAR(fint, Bounds(cache.kAsmInt)); | 2166 CHECK_VAR(fint, Bounds(cache.kAsmInt)); |
2167 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { | 2167 CHECK_EXPR(BinaryOperation, Bounds(cache.kAsmSigned)) { |
2168 CHECK_EXPR(Property, Bounds(Type::Number())) { | 2168 CHECK_EXPR(Property, Bounds(Type::Number())) { |
2169 CHECK_VAR(foreign, Bounds::Unbounded()); | 2169 CHECK_VAR(foreign, Bounds::Unbounded()); |
(...skipping 15 matching lines...) Expand all Loading... |
2185 } | 2185 } |
2186 // return { testFunc1: test1, testFunc2: test2 }; | 2186 // return { testFunc1: test1, testFunc2: test2 }; |
2187 CHECK_EXPR(ObjectLiteral, Bounds::Unbounded()) { | 2187 CHECK_EXPR(ObjectLiteral, Bounds::Unbounded()) { |
2188 CHECK_VAR(test1, FUNC_I_TYPE); | 2188 CHECK_VAR(test1, FUNC_I_TYPE); |
2189 CHECK_VAR(test2, FUNC_D_TYPE); | 2189 CHECK_VAR(test2, FUNC_D_TYPE); |
2190 } | 2190 } |
2191 } | 2191 } |
2192 } | 2192 } |
2193 CHECK_TYPES_END | 2193 CHECK_TYPES_END |
2194 } | 2194 } |
OLD | NEW |