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

Side by Side Diff: src/ast.h

Issue 3120027: Add position information for compares, binary ops, and count (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 10 years, 4 months 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 | Annotate | Revision Log
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/ast.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 Expression* expression() const { return expression_; } 1195 Expression* expression() const { return expression_; }
1196 1196
1197 private: 1197 private:
1198 Token::Value op_; 1198 Token::Value op_;
1199 Expression* expression_; 1199 Expression* expression_;
1200 }; 1200 };
1201 1201
1202 1202
1203 class BinaryOperation: public Expression { 1203 class BinaryOperation: public Expression {
1204 public: 1204 public:
1205 BinaryOperation(Token::Value op, Expression* left, Expression* right) 1205 BinaryOperation(Token::Value op,
1206 : op_(op), left_(left), right_(right) { 1206 Expression* left,
1207 Expression* right,
1208 int pos)
1209 : op_(op), left_(left), right_(right), pos_(pos) {
1207 ASSERT(Token::IsBinaryOp(op)); 1210 ASSERT(Token::IsBinaryOp(op));
1208 } 1211 }
1209 1212
1213 // Create the binary operation corresponding to a compound assignment.
1214 explicit BinaryOperation(Assignment* assignment);
1215
1210 virtual void Accept(AstVisitor* v); 1216 virtual void Accept(AstVisitor* v);
1211 1217
1212 // Type testing & conversion 1218 // Type testing & conversion
1213 virtual BinaryOperation* AsBinaryOperation() { return this; } 1219 virtual BinaryOperation* AsBinaryOperation() { return this; }
1214 1220
1215 // True iff the result can be safely overwritten (to avoid allocation). 1221 // True iff the result can be safely overwritten (to avoid allocation).
1216 // False for operations that can return one of their operands. 1222 // False for operations that can return one of their operands.
1217 bool ResultOverwriteAllowed() { 1223 bool ResultOverwriteAllowed() {
1218 switch (op_) { 1224 switch (op_) {
1219 case Token::COMMA: 1225 case Token::COMMA:
(...skipping 14 matching lines...) Expand all
1234 return true; 1240 return true;
1235 default: 1241 default:
1236 UNREACHABLE(); 1242 UNREACHABLE();
1237 } 1243 }
1238 return false; 1244 return false;
1239 } 1245 }
1240 1246
1241 Token::Value op() const { return op_; } 1247 Token::Value op() const { return op_; }
1242 Expression* left() const { return left_; } 1248 Expression* left() const { return left_; }
1243 Expression* right() const { return right_; } 1249 Expression* right() const { return right_; }
1250 int position() const { return pos_; }
1244 1251
1245 private: 1252 private:
1246 Token::Value op_; 1253 Token::Value op_;
1247 Expression* left_; 1254 Expression* left_;
1248 Expression* right_; 1255 Expression* right_;
1256 int pos_;
1249 }; 1257 };
1250 1258
1251 1259
1252 class IncrementOperation: public Expression { 1260 class IncrementOperation: public Expression {
1253 public: 1261 public:
1254 IncrementOperation(Token::Value op, Expression* expr) 1262 IncrementOperation(Token::Value op, Expression* expr)
1255 : op_(op), expression_(expr) { 1263 : op_(op), expression_(expr) {
1256 ASSERT(Token::IsCountOp(op)); 1264 ASSERT(Token::IsCountOp(op));
1257 } 1265 }
1258 1266
1259 Token::Value op() const { return op_; } 1267 Token::Value op() const { return op_; }
1260 bool is_increment() { return op_ == Token::INC; } 1268 bool is_increment() { return op_ == Token::INC; }
1261 Expression* expression() const { return expression_; } 1269 Expression* expression() const { return expression_; }
1262 1270
1263 virtual void Accept(AstVisitor* v); 1271 virtual void Accept(AstVisitor* v);
1264 1272
1265 private: 1273 private:
1266 Token::Value op_; 1274 Token::Value op_;
1267 Expression* expression_; 1275 Expression* expression_;
1276 int pos_;
1268 }; 1277 };
1269 1278
1270 1279
1271 class CountOperation: public Expression { 1280 class CountOperation: public Expression {
1272 public: 1281 public:
1273 CountOperation(bool is_prefix, IncrementOperation* increment) 1282 CountOperation(bool is_prefix, IncrementOperation* increment, int pos)
1274 : is_prefix_(is_prefix), increment_(increment) { } 1283 : is_prefix_(is_prefix), increment_(increment), pos_(pos) { }
1275 1284
1276 virtual void Accept(AstVisitor* v); 1285 virtual void Accept(AstVisitor* v);
1277 1286
1278 virtual CountOperation* AsCountOperation() { return this; } 1287 virtual CountOperation* AsCountOperation() { return this; }
1279 1288
1280 bool is_prefix() const { return is_prefix_; } 1289 bool is_prefix() const { return is_prefix_; }
1281 bool is_postfix() const { return !is_prefix_; } 1290 bool is_postfix() const { return !is_prefix_; }
1282 1291
1283 Token::Value op() const { return increment_->op(); } 1292 Token::Value op() const { return increment_->op(); }
1284 Token::Value binary_op() { 1293 Token::Value binary_op() {
1285 return (op() == Token::INC) ? Token::ADD : Token::SUB; 1294 return (op() == Token::INC) ? Token::ADD : Token::SUB;
1286 } 1295 }
1287 1296
1288 Expression* expression() const { return increment_->expression(); } 1297 Expression* expression() const { return increment_->expression(); }
1289 IncrementOperation* increment() const { return increment_; } 1298 IncrementOperation* increment() const { return increment_; }
1299 int position() const { return pos_; }
1290 1300
1291 virtual void MarkAsStatement() { is_prefix_ = true; } 1301 virtual void MarkAsStatement() { is_prefix_ = true; }
1292 1302
1293 private: 1303 private:
1294 bool is_prefix_; 1304 bool is_prefix_;
1295 IncrementOperation* increment_; 1305 IncrementOperation* increment_;
1306 int pos_;
1296 }; 1307 };
1297 1308
1298 1309
1299 class CompareOperation: public Expression { 1310 class CompareOperation: public Expression {
1300 public: 1311 public:
1301 CompareOperation(Token::Value op, Expression* left, Expression* right) 1312 CompareOperation(Token::Value op,
1302 : op_(op), left_(left), right_(right) { 1313 Expression* left,
1314 Expression* right,
1315 int pos)
1316 : op_(op), left_(left), right_(right), pos_(pos) {
1303 ASSERT(Token::IsCompareOp(op)); 1317 ASSERT(Token::IsCompareOp(op));
1304 } 1318 }
1305 1319
1306 virtual void Accept(AstVisitor* v); 1320 virtual void Accept(AstVisitor* v);
1307 1321
1308 Token::Value op() const { return op_; } 1322 Token::Value op() const { return op_; }
1309 Expression* left() const { return left_; } 1323 Expression* left() const { return left_; }
1310 Expression* right() const { return right_; } 1324 Expression* right() const { return right_; }
1325 int position() const { return pos_; }
1311 1326
1312 // Type testing & conversion 1327 // Type testing & conversion
1313 virtual CompareOperation* AsCompareOperation() { return this; } 1328 virtual CompareOperation* AsCompareOperation() { return this; }
1314 1329
1315 private: 1330 private:
1316 Token::Value op_; 1331 Token::Value op_;
1317 Expression* left_; 1332 Expression* left_;
1318 Expression* right_; 1333 Expression* right_;
1334 int pos_;
1319 }; 1335 };
1320 1336
1321 1337
1322 class CompareToNull: public Expression { 1338 class CompareToNull: public Expression {
1323 public: 1339 public:
1324 CompareToNull(bool is_strict, Expression* expression) 1340 CompareToNull(bool is_strict, Expression* expression)
1325 : is_strict_(is_strict), expression_(expression) { } 1341 : is_strict_(is_strict), expression_(expression) { }
1326 1342
1327 virtual void Accept(AstVisitor* v); 1343 virtual void Accept(AstVisitor* v);
1328 1344
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 AST_NODE_LIST(DEF_VISIT) 1942 AST_NODE_LIST(DEF_VISIT)
1927 #undef DEF_VISIT 1943 #undef DEF_VISIT
1928 1944
1929 private: 1945 private:
1930 bool stack_overflow_; 1946 bool stack_overflow_;
1931 }; 1947 };
1932 1948
1933 } } // namespace v8::internal 1949 } } // namespace v8::internal
1934 1950
1935 #endif // V8_AST_H_ 1951 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « src/arm/full-codegen-arm.cc ('k') | src/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698