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

Side by Side Diff: src/typing-asm.cc

Issue 1508003002: Retain information on which standard objects are used in asm typer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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
« src/typing-asm.h ('K') | « src/typing-asm.h ('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/typing-asm.h" 7 #include "src/typing-asm.h"
8 8
9 #include "src/ast/ast.h" 9 #include "src/ast/ast.h"
10 #include "src/ast/scopes.h" 10 #include "src/ast/scopes.h"
(...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 769
770 770
771 bool AsmTyper::IsStdlibObject(Expression* expr) { 771 bool AsmTyper::IsStdlibObject(Expression* expr) {
772 VariableProxy* proxy = expr->AsVariableProxy(); 772 VariableProxy* proxy = expr->AsVariableProxy();
773 if (proxy == NULL) { 773 if (proxy == NULL) {
774 return false; 774 return false;
775 } 775 }
776 Variable* var = proxy->var(); 776 Variable* var = proxy->var();
777 VariableInfo* info = GetVariableInfo(var, false); 777 VariableInfo* info = GetVariableInfo(var, false);
778 if (info) { 778 if (info) {
779 if (info->is_stdlib_object) return info->is_stdlib_object; 779 if (info->standard_object == kStdlib) return true;
780 } 780 }
781 if (var->location() != VariableLocation::PARAMETER || var->index() != 0) { 781 if (var->location() != VariableLocation::PARAMETER || var->index() != 0) {
782 return false; 782 return false;
783 } 783 }
784 info = GetVariableInfo(var, true); 784 info = GetVariableInfo(var, true);
785 info->type = Type::Object(); 785 info->type = Type::Object();
786 info->is_stdlib_object = true; 786 info->standard_object = kStdlib;
787 return true; 787 return true;
788 } 788 }
789 789
790 790
791 Expression* AsmTyper::GetReceiverOfPropertyAccess(Expression* expr, 791 Expression* AsmTyper::GetReceiverOfPropertyAccess(Expression* expr,
792 const char* name) { 792 const char* name) {
793 Property* property = expr->AsProperty(); 793 Property* property = expr->AsProperty();
794 if (property == NULL) { 794 if (property == NULL) {
795 return NULL; 795 return NULL;
796 } 796 }
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 1227
1228 Type* fround_type = Type::Function(cache_.kAsmFloat, number_type, zone()); 1228 Type* fround_type = Type::Function(cache_.kAsmFloat, number_type, zone());
1229 Type* imul_type = 1229 Type* imul_type =
1230 Type::Function(cache_.kAsmSigned, cache_.kAsmInt, cache_.kAsmInt, zone()); 1230 Type::Function(cache_.kAsmSigned, cache_.kAsmInt, cache_.kAsmInt, zone());
1231 // TODO(bradnelson): currently only approximating the proper intersection type 1231 // TODO(bradnelson): currently only approximating the proper intersection type
1232 // (which we cannot currently represent). 1232 // (which we cannot currently represent).
1233 Type* abs_type = Type::Function(number_type, number_type, zone()); 1233 Type* abs_type = Type::Function(number_type, number_type, zone());
1234 1234
1235 struct Assignment { 1235 struct Assignment {
1236 const char* name; 1236 const char* name;
1237 StandardObject standard_object;
1237 Type* type; 1238 Type* type;
1238 }; 1239 };
1239 1240
1240 const Assignment math[] = { 1241 const Assignment math[] = {{"PI", kMathPI, double_type},
1241 {"PI", double_type}, {"E", double_type}, 1242 {"E", kMathE, double_type},
1242 {"LN2", double_type}, {"LN10", double_type}, 1243 {"LN2", kMathLN2, double_type},
1243 {"LOG2E", double_type}, {"LOG10E", double_type}, 1244 {"LN10", kMathLN10, double_type},
1244 {"SQRT2", double_type}, {"SQRT1_2", double_type}, 1245 {"LOG2E", kMathLOG2E, double_type},
1245 {"imul", imul_type}, {"abs", abs_type}, 1246 {"LOG10E", kMathLOG10E, double_type},
1246 {"ceil", double_fn1_type}, {"floor", double_fn1_type}, 1247 {"SQRT2", kMathSQRT2, double_type},
1247 {"fround", fround_type}, {"pow", double_fn2_type}, 1248 {"SQRT1_2", kMathSQRT1_2, double_type},
1248 {"exp", double_fn1_type}, {"log", double_fn1_type}, 1249 {"imul", kMathImul, imul_type},
1249 {"min", double_fn2_type}, {"max", double_fn2_type}, 1250 {"abs", kMathAbs, abs_type},
1250 {"sqrt", double_fn1_type}, {"cos", double_fn1_type}, 1251 {"ceil", kMathCeil, double_fn1_type},
1251 {"sin", double_fn1_type}, {"tan", double_fn1_type}, 1252 {"floor", kMathFloor, double_fn1_type},
1252 {"acos", double_fn1_type}, {"asin", double_fn1_type}, 1253 {"fround", kMathFround, fround_type},
1253 {"atan", double_fn1_type}, {"atan2", double_fn2_type}}; 1254 {"pow", kMathPow, double_fn2_type},
1255 {"exp", kMathExp, double_fn1_type},
1256 {"log", kMathLog, double_fn1_type},
1257 {"min", kMathMin, double_fn2_type},
1258 {"max", kMathMax, double_fn2_type},
1259 {"sqrt", kMathSqrt, double_fn1_type},
1260 {"cos", kMathCos, double_fn1_type},
1261 {"sin", kMathSin, double_fn1_type},
1262 {"tan", kMathTan, double_fn1_type},
1263 {"acos", kMathAcos, double_fn1_type},
1264 {"asin", kMathAsin, double_fn1_type},
1265 {"atan", kMathAtan, double_fn1_type},
1266 {"atan2", kMathAtan2, double_fn2_type}};
1254 for (unsigned i = 0; i < arraysize(math); ++i) { 1267 for (unsigned i = 0; i < arraysize(math); ++i) {
1255 stdlib_math_types_[math[i].name] = new (zone()) VariableInfo(math[i].type); 1268 stdlib_math_types_[math[i].name] = new (zone()) VariableInfo(math[i].type);
1269 stdlib_math_types_[math[i].name]->standard_object = math[i].standard_object;
1256 } 1270 }
1257 stdlib_math_types_["fround"]->is_check_function = true; 1271 stdlib_math_types_["fround"]->is_check_function = true;
1258 1272
1259 stdlib_types_["Infinity"] = new (zone()) VariableInfo(double_type); 1273 stdlib_types_["Infinity"] = new (zone()) VariableInfo(double_type);
1274 stdlib_types_["Infinity"]->standard_object = kInfinity;
1260 stdlib_types_["NaN"] = new (zone()) VariableInfo(double_type); 1275 stdlib_types_["NaN"] = new (zone()) VariableInfo(double_type);
1276 stdlib_types_["NaN"]->standard_object = kNaN;
1261 Type* buffer_type = Type::Any(zone()); 1277 Type* buffer_type = Type::Any(zone());
1262 #define TYPED_ARRAY(TypeName, type_name, TYPE_NAME, ctype, size) \ 1278 #define TYPED_ARRAY(TypeName, type_name, TYPE_NAME, ctype, size) \
1263 stdlib_types_[#TypeName "Array"] = new (zone()) VariableInfo( \ 1279 stdlib_types_[#TypeName "Array"] = new (zone()) VariableInfo( \
1264 Type::Function(cache_.k##TypeName##Array, buffer_type, zone())); 1280 Type::Function(cache_.k##TypeName##Array, buffer_type, zone()));
1265 TYPED_ARRAYS(TYPED_ARRAY) 1281 TYPED_ARRAYS(TYPED_ARRAY)
1266 #undef TYPED_ARRAY 1282 #undef TYPED_ARRAY
1267 1283
1268 #define TYPED_ARRAY(TypeName, type_name, TYPE_NAME, ctype, size) \ 1284 #define TYPED_ARRAY(TypeName, type_name, TYPE_NAME, ctype, size) \
1269 stdlib_heap_types_[#TypeName "Array"] = new (zone()) VariableInfo( \ 1285 stdlib_heap_types_[#TypeName "Array"] = new (zone()) VariableInfo( \
1270 Type::Function(cache_.k##TypeName##Array, buffer_type, zone())); 1286 Type::Function(cache_.k##TypeName##Array, buffer_type, zone()));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 if (!setting) return NULL; 1349 if (!setting) return NULL;
1334 entry->value = new (zone()) VariableInfo; 1350 entry->value = new (zone()) VariableInfo;
1335 } 1351 }
1336 return reinterpret_cast<VariableInfo*>(entry->value); 1352 return reinterpret_cast<VariableInfo*>(entry->value);
1337 } 1353 }
1338 1354
1339 1355
1340 void AsmTyper::SetVariableInfo(Variable* variable, const VariableInfo* info) { 1356 void AsmTyper::SetVariableInfo(Variable* variable, const VariableInfo* info) {
1341 VariableInfo* dest = GetVariableInfo(variable, true); 1357 VariableInfo* dest = GetVariableInfo(variable, true);
1342 dest->type = info->type; 1358 dest->type = info->type;
1343 dest->is_stdlib_object = info->is_stdlib_object;
1344 dest->is_check_function = info->is_check_function; 1359 dest->is_check_function = info->is_check_function;
1345 dest->is_constructor_function = info->is_constructor_function; 1360 dest->is_constructor_function = info->is_constructor_function;
1361 dest->standard_object = info->standard_object;
1346 } 1362 }
1347 1363
1348 1364
1365 AsmTyper::StandardObject AsmTyper::VariableAsStandardObject(
1366 Variable* variable) {
1367 VariableInfo* info = GetVariableInfo(variable, false);
1368 if (!info) return kNone;
1369 return info->standard_object;
1370 }
1371
1372
1349 void AsmTyper::SetResult(Expression* expr, Type* type) { 1373 void AsmTyper::SetResult(Expression* expr, Type* type) {
1350 computed_type_ = type; 1374 computed_type_ = type;
1351 expr->set_bounds(Bounds(computed_type_)); 1375 expr->set_bounds(Bounds(computed_type_));
1352 } 1376 }
1353 1377
1354 1378
1355 void AsmTyper::IntersectResult(Expression* expr, Type* type) { 1379 void AsmTyper::IntersectResult(Expression* expr, Type* type) {
1356 computed_type_ = type; 1380 computed_type_ = type;
1357 Type* bounded_type = Type::Intersect(computed_type_, expected_type_, zone()); 1381 Type* bounded_type = Type::Intersect(computed_type_, expected_type_, zone());
1358 expr->set_bounds(Bounds(bounded_type)); 1382 expr->set_bounds(Bounds(bounded_type));
(...skipping 20 matching lines...) Expand all
1379 1403
1380 1404
1381 void AsmTyper::VisitRewritableAssignmentExpression( 1405 void AsmTyper::VisitRewritableAssignmentExpression(
1382 RewritableAssignmentExpression* expr) { 1406 RewritableAssignmentExpression* expr) {
1383 RECURSE(Visit(expr->expression())); 1407 RECURSE(Visit(expr->expression()));
1384 } 1408 }
1385 1409
1386 1410
1387 } // namespace internal 1411 } // namespace internal
1388 } // namespace v8 1412 } // namespace v8
OLDNEW
« src/typing-asm.h ('K') | « src/typing-asm.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698