OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 <cstring> | 5 #include <cstring> |
6 #include <functional> | 6 #include <functional> |
7 #include <iostream> | 7 #include <iostream> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
10 #include "src/asmjs/asm-typer.h" | 10 #include "src/asmjs/asm-typer.h" |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 | 170 |
171 AsmTyperHarnessBuilder* WithReturnType(AsmType* type) { | 171 AsmTyperHarnessBuilder* WithReturnType(AsmType* type) { |
172 CHECK(type->IsReturnType()); | 172 CHECK(type->IsReturnType()); |
173 CHECK(typer_->return_type_ == AsmType::None()); | 173 CHECK(typer_->return_type_ == AsmType::None()); |
174 typer_->return_type_ = type; | 174 typer_->return_type_ = type; |
175 return this; | 175 return this; |
176 } | 176 } |
177 | 177 |
178 AsmTyperHarnessBuilder* WithStdlib(VariableName var_name) { | 178 AsmTyperHarnessBuilder* WithStdlib(VariableName var_name) { |
179 auto* var = DeclareVariable(var_name); | 179 auto* var = DeclareVariable(var_name); |
180 auto* var_info = new (zone_) AsmTyper::VariableInfo(); | 180 auto* var_info = |
181 var_info->set_mutability(AsmTyper::VariableInfo::kImmutableGlobal); | 181 AsmTyper::VariableInfo::ForSpecialSymbol(zone_, AsmTyper::kStdlib); |
182 var_info->set_standard_member(AsmTyper::kStdlib); | |
183 CHECK(typer_->AddGlobal(var, var_info)); | 182 CHECK(typer_->AddGlobal(var, var_info)); |
184 return this; | 183 return this; |
185 } | 184 } |
186 | 185 |
187 AsmTyperHarnessBuilder* WithHeap(VariableName var_name) { | 186 AsmTyperHarnessBuilder* WithHeap(VariableName var_name) { |
188 auto* var = DeclareVariable(var_name); | 187 auto* var = DeclareVariable(var_name); |
189 auto* var_info = new (zone_) AsmTyper::VariableInfo(); | 188 auto* var_info = |
190 var_info->set_mutability(AsmTyper::VariableInfo::kImmutableGlobal); | 189 AsmTyper::VariableInfo::ForSpecialSymbol(zone_, AsmTyper::kHeap); |
191 var_info->set_standard_member(AsmTyper::kHeap); | |
192 CHECK(typer_->AddGlobal(var, var_info)); | 190 CHECK(typer_->AddGlobal(var, var_info)); |
193 return this; | 191 return this; |
194 } | 192 } |
195 | 193 |
196 AsmTyperHarnessBuilder* WithFFI(VariableName var_name) { | 194 AsmTyperHarnessBuilder* WithFFI(VariableName var_name) { |
197 auto* var = DeclareVariable(var_name); | 195 auto* var = DeclareVariable(var_name); |
198 auto* var_info = | 196 auto* var_info = |
199 new (zone_) AsmTyper::VariableInfo(AsmType::FFIType(zone_)); | 197 AsmTyper::VariableInfo::ForSpecialSymbol(zone_, AsmTyper::kFFI); |
200 var_info->set_mutability(AsmTyper::VariableInfo::kImmutableGlobal); | |
201 var_info->set_standard_member(AsmTyper::kFFI); | |
202 CHECK(typer_->AddGlobal(var, var_info)); | 198 CHECK(typer_->AddGlobal(var, var_info)); |
203 return this; | 199 return this; |
204 } | 200 } |
205 | 201 |
206 bool Succeeds() { | 202 bool Succeeds() { |
207 CHECK(validation_type_ == ValidateModule || | 203 CHECK(validation_type_ == ValidateModule || |
208 validation_type_ == ValidateGlobals || | 204 validation_type_ == ValidateGlobals || |
209 validation_type_ == ValidateFunctionTables || | 205 validation_type_ == ValidateFunctionTables || |
210 validation_type_ == ValidateExport || | 206 validation_type_ == ValidateExport || |
211 validation_type_ == ValidateFunction || | 207 validation_type_ == ValidateFunction || |
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 auto* ret = iw::AsmType::FunctionTableType(zone, 2, d2s); | 899 auto* ret = iw::AsmType::FunctionTableType(zone, 2, d2s); |
904 return ret; | 900 return ret; |
905 }; | 901 }; |
906 | 902 |
907 const struct { | 903 const struct { |
908 const char* expression; | 904 const char* expression; |
909 const char* error_message; | 905 const char* error_message; |
910 } kTests[] = { | 906 } kTests[] = { |
911 {"noy_a_function();", "Unanotated call to a function must be a call to"}, | 907 {"noy_a_function();", "Unanotated call to a function must be a call to"}, |
912 {"a = 0;", "Undeclared identifier"}, | 908 {"a = 0;", "Undeclared identifier"}, |
| 909 // we can't verify the module's name being referenced here because |
| 910 // expression validation does not invoke ValidateModule, which sets up the |
| 911 // module information in the AsmTyper. |
| 912 {"stdlib", "accessed by ordinary expressions"}, |
| 913 {"ffi", "accessed by ordinary expressions"}, |
| 914 {"heap", "accessed by ordinary expressions"}, |
| 915 {"d2d", "accessed by ordinary expression"}, |
| 916 {"fround", "accessed by ordinary expression"}, |
| 917 {"d2s_tbl", "accessed by ordinary expression"}, |
913 {"ilocal = +1.0", "Type mismatch in assignment"}, | 918 {"ilocal = +1.0", "Type mismatch in assignment"}, |
914 {"!dlocal", "Invalid type for !"}, | 919 {"!dlocal", "Invalid type for !"}, |
915 {"2 * dlocal", "Invalid types for intish *"}, | 920 {"2 * dlocal", "Invalid types for intish *"}, |
916 {"dlocal * 2", "Invalid types for intish *"}, | 921 {"dlocal * 2", "Invalid types for intish *"}, |
917 {"1048577 * ilocal", "Invalid operands for *"}, | 922 {"1048577 * ilocal", "Invalid operands for *"}, |
918 {"1048577 / ilocal", "Invalid operands for /"}, | 923 {"1048577 / ilocal", "Invalid operands for /"}, |
919 {"1048577 % dlocal", "Invalid operands for %"}, | 924 {"1048577 % dlocal", "Invalid operands for %"}, |
920 {"1048577 * dlocal", "Invalid operands for *"}, | 925 {"1048577 * dlocal", "Invalid operands for *"}, |
921 {"1048577 / dlocal", "Invalid operands for /"}, | 926 {"1048577 / dlocal", "Invalid operands for /"}, |
922 {"1048577 % ilocal", "Invalid operands for %"}, | 927 {"1048577 % ilocal", "Invalid operands for %"}, |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 // *VIOLATION* the following is invalid, but because of desugaring it is | 987 // *VIOLATION* the following is invalid, but because of desugaring it is |
983 // accepted. | 988 // accepted. |
984 // {"HEAP32[0 >> 1] = 0", "Invalid heap access index"}, | 989 // {"HEAP32[0 >> 1] = 0", "Invalid heap access index"}, |
985 {"HEAP8[fround(0.0)] = 0", "Invalid heap access index for byte array"}, | 990 {"HEAP8[fround(0.0)] = 0", "Invalid heap access index for byte array"}, |
986 {"HEAP8[iish] = 0", "Invalid heap access index for byte array"}, | 991 {"HEAP8[iish] = 0", "Invalid heap access index for byte array"}, |
987 }; | 992 }; |
988 | 993 |
989 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { | 994 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { |
990 const auto* test = kTests + ii; | 995 const auto* test = kTests + ii; |
991 if (!ValidationOf(Expression(test->expression)) | 996 if (!ValidationOf(Expression(test->expression)) |
| 997 ->WithStdlib(DynamicGlobal("stdlib")) |
| 998 ->WithFFI(DynamicGlobal("ffi")) |
| 999 ->WithHeap(DynamicGlobal("heap")) |
992 ->WithLocal(DynamicGlobal("iish"), iw::AsmType::Intish()) | 1000 ->WithLocal(DynamicGlobal("iish"), iw::AsmType::Intish()) |
993 ->WithLocal(DynamicGlobal("ilocal"), iw::AsmType::Int()) | 1001 ->WithLocal(DynamicGlobal("ilocal"), iw::AsmType::Int()) |
994 ->WithLocal(DynamicGlobal("dlocal"), iw::AsmType::Double()) | 1002 ->WithLocal(DynamicGlobal("dlocal"), iw::AsmType::Double()) |
995 ->WithLocal(DynamicGlobal("dlocal2"), iw::AsmType::Double()) | 1003 ->WithLocal(DynamicGlobal("dlocal2"), iw::AsmType::Double()) |
996 ->WithLocal(DynamicGlobal("not_a_function"), iw::AsmType::Int()) | 1004 ->WithLocal(DynamicGlobal("not_a_function"), iw::AsmType::Int()) |
997 ->WithImport(DynamicGlobal("fround"), iw::AsmTyper::kMathFround) | 1005 ->WithImport(DynamicGlobal("fround"), iw::AsmTyper::kMathFround) |
998 ->WithImport(DynamicGlobal("FFI"), iw::AsmTyper::kFFI) | 1006 ->WithImport(DynamicGlobal("FFI"), iw::AsmTyper::kFFI) |
999 ->WithGlobal(DynamicGlobal("d2d"), d2d) | 1007 ->WithGlobal(DynamicGlobal("d2d"), d2d) |
1000 ->WithGlobal(DynamicGlobal("d2s_tbl"), d2s_tbl) | 1008 ->WithGlobal(DynamicGlobal("d2s_tbl"), d2s_tbl) |
1001 ->WithGlobal(DynamicGlobal("HEAP32"), iw::AsmType::Int32Array()) | 1009 ->WithGlobal(DynamicGlobal("HEAP32"), iw::AsmType::Int32Array()) |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1756 ->WithGlobal(DynamicGlobal("ifd2f_tbl"), ifd2f_tbl) | 1764 ->WithGlobal(DynamicGlobal("ifd2f_tbl"), ifd2f_tbl) |
1757 ->WithGlobal(DynamicGlobal("ifd2d_tbl"), ifd2d_tbl) | 1765 ->WithGlobal(DynamicGlobal("ifd2d_tbl"), ifd2d_tbl) |
1758 ->WithGlobal(DynamicGlobal("ifd2i_tbl"), ifd2i_tbl) | 1766 ->WithGlobal(DynamicGlobal("ifd2i_tbl"), ifd2i_tbl) |
1759 ->SucceedsWithExactType(test->load_type)) { | 1767 ->SucceedsWithExactType(test->load_type)) { |
1760 std::cerr << "Test:\n" << test->expression; | 1768 std::cerr << "Test:\n" << test->expression; |
1761 CHECK(false); | 1769 CHECK(false); |
1762 } | 1770 } |
1763 } | 1771 } |
1764 } | 1772 } |
1765 | 1773 |
| 1774 TEST(CannotReferenceModuleName) { |
| 1775 v8::V8::Initialize(); |
| 1776 |
| 1777 const struct { |
| 1778 const char* module; |
| 1779 const char* error_message; |
| 1780 } kTests[] = { |
| 1781 {"function asm() {\n" |
| 1782 " 'use asm';\n" |
| 1783 " function f() { asm; }\n" |
| 1784 "}", |
| 1785 "accessed by ordinary expressions"}, |
| 1786 {"function asm() { 'use asm'; return asm; }", "Module cannot export"}, |
| 1787 }; |
| 1788 |
| 1789 for (size_t ii = 0; ii < arraysize(kTests); ++ii) { |
| 1790 const auto* test = kTests + ii; |
| 1791 if (!ValidationOf(Module(test->module)) |
| 1792 ->FailsWithMessage(test->error_message)) { |
| 1793 std::cerr << "Test:\n" << test->module; |
| 1794 CHECK(false); |
| 1795 } |
| 1796 } |
| 1797 } |
| 1798 |
1766 } // namespace | 1799 } // namespace |
OLD | NEW |