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

Unified Diff: src/ast.h

Issue 660372: Add syntax checker for side-effect-free expressions to AstOptimizer in rewrit... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/rewriter.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ast.h
===================================================================
--- src/ast.h (revision 3997)
+++ src/ast.h (working copy)
@@ -183,7 +183,11 @@
static const int kNoLabel = -1;
- Expression() : num_(kNoLabel), def_(NULL), defined_vars_(NULL) {}
+ Expression()
+ : bitfields_(0),
+ num_(kNoLabel),
+ def_(NULL),
+ defined_vars_(NULL) {}
virtual Expression* AsExpression() { return this; }
@@ -225,11 +229,66 @@
defined_vars_ = defined_vars;
}
+ // AST analysis results
+
+ // True if the expression rooted at this node can be compiled by the
+ // side-effect free compiler.
+ bool side_effect_free() { return SideEffectFreeField::decode(bitfields_); }
+ void set_side_effect_free(bool is_side_effect_free) {
+ bitfields_ = (bitfields_ & ~SideEffectFreeField::mask()) |
Kevin Millikin (Chromium) 2010/03/02 14:33:06 It's a little weird that there are three different
+ SideEffectFreeField::encode(is_side_effect_free);
+ }
+
+ // The number of unary and binary operations contained in the expression
+ // rooted at this node. Valid only if side_effect_free() is true.
+ int expression_size() { return ExpressionSizeField::decode(bitfields_); }
+ void set_expression_size(int expression_size) {
+ bitfields_ = (bitfields_ & ~ExpressionSizeField::mask()) |
+ ExpressionSizeField::encode(Min(expression_size, ExpressionSizeMax));
+ }
+
+ // The number of expression stack slots needed to compute the expression
+ // rooted at this node. Does not count the slot needed by the value
+ // computed by this expression. Valid only if side_effect_free() is true.
+ int stack_height() { return StackHeightField::decode(bitfields_); }
+ void set_stack_height(int stack_height) {
+ bitfields_ &= ~StackHeightField::mask();
+ bitfields_ |=
+ StackHeightField::encode(Min(stack_height, StackHeightMax));
+ }
+
private:
+ uint32_t bitfields_;
StaticType type_;
+
int num_;
DefinitionInfo* def_;
ZoneList<DefinitionInfo*>* defined_vars_;
+
+ static const int SideEffectFreeFieldStart = 0;
Kevin Millikin (Chromium) 2010/03/02 14:33:06 These constants don't help anything. They're used
+ static const int SideEffectFreeFieldLength = 1;
+ class SideEffectFreeField: public BitField<bool,
+ SideEffectFreeFieldStart,
+ SideEffectFreeFieldLength> {
+ };
+
+ static const int ExpressionSizeFieldStart =
+ SideEffectFreeFieldStart + SideEffectFreeFieldLength;
+ static const int ExpressionSizeFieldLength = 5;
+ static const int ExpressionSizeMax = (1 << ExpressionSizeFieldLength) - 1;
+ class ExpressionSizeField: public BitField<int,
+ ExpressionSizeFieldStart,
+ ExpressionSizeFieldLength> {
+ };
+
+ static const int StackHeightFieldStart =
+ ExpressionSizeFieldStart + ExpressionSizeFieldLength;
+ static const int StackHeightFieldLength = 5;
+ static const int StackHeightMax = (1 << StackHeightFieldLength) - 1;
+ class StackHeightField: public BitField<int,
+ StackHeightFieldStart,
+ StackHeightFieldLength> {
+ };
};
« no previous file with comments | « no previous file | src/rewriter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698