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

Unified Diff: src/rewriter.cc

Issue 1399893002: [es7] implement |do| expressions proposal (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix AST numbering issue + add simple TF impl Created 5 years, 2 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
« src/preparser.h ('K') | « src/rewriter.h ('k') | src/typing.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/rewriter.cc
diff --git a/src/rewriter.cc b/src/rewriter.cc
index 9df46c9beef236551026f893d1c89da3cefb970d..4f6e74558a9abb1b2a1ea9e276c78d1430d5347b 100644
--- a/src/rewriter.cc
+++ b/src/rewriter.cc
@@ -24,6 +24,18 @@ class Processor: public AstVisitor {
InitializeAstVisitor(isolate, ast_value_factory->zone());
}
+ Processor(Parser* parser, Scope* scope, Variable* result,
+ AstValueFactory* ast_value_factory)
+ : result_(result),
+ result_assigned_(false),
+ replacement_(nullptr),
+ is_set_(false),
+ scope_(scope),
+ factory_(ast_value_factory) {
+ InitializeAstVisitor(nullptr, ast_value_factory->zone());
+ parser_ = parser;
+ }
+
virtual ~Processor() { }
void Process(ZoneList<Statement*>* statements);
@@ -72,7 +84,41 @@ class Processor: public AstVisitor {
void VisitIterationStatement(IterationStatement* stmt);
- DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
rossberg 2015/10/12 13:52:40 I think Adam is working on a refactoring for separ
caitp (gmail) 2015/10/12 18:23:00 If that lands first, that would be helpful.
adamk 2015/10/12 19:02:21 I was hoping to get some answers on my v8-dev thre
+ public:
+ void Visit(AstNode* node) final {
+ if (!CheckStackOverflow()) node->Accept(this);
+ }
+
+ void SetStackOverflow() { stack_overflow_ = true; }
+ void ClearStackOverflow() { stack_overflow_ = false; }
+ bool HasStackOverflow() const { return stack_overflow_; }
+
+ bool CheckStackOverflow() {
+ if (stack_overflow_) return true;
+ if (isolate_) {
+ StackLimitCheck check(isolate_);
+ if (!check.HasOverflowed()) return false;
+ stack_overflow_ = true;
+ } else {
+ if (!parser_->CheckStackOverflow()) return false;
+ stack_overflow_ = true;
+ }
+ return true;
+ }
+
+ private:
+ void InitializeAstVisitor(Isolate* isolate, Zone* zone) {
+ isolate_ = isolate;
+ zone_ = zone;
+ stack_overflow_ = false;
+ }
+ Zone* zone() { return zone_; }
+ Isolate* isolate() { return isolate_; }
+
+ Isolate* isolate_;
+ Parser* parser_;
+ Zone* zone_;
+ bool stack_overflow_;
};
@@ -359,5 +405,26 @@ bool Rewriter::Rewrite(ParseInfo* info) {
}
+bool Rewriter::Rewrite(Parser* parser, DoExpression* expr,
+ AstValueFactory* factory) {
+ Scope* scope = expr->scope();
+ ZoneList<Statement*>* body = expr->statements();
+ VariableProxy* result = expr->result();
+ Variable* result_var = result->var();
+
+ if (!body->is_empty()) {
+ Processor processor(parser, scope, result_var, factory);
+ processor.Process(body);
+ if (processor.HasStackOverflow()) return false;
+
+ if (processor.result_assigned()) {
+ DCHECK(!result->is_assigned());
+ result->set_is_assigned();
+ }
+ }
+ return true;
+}
+
+
} // namespace internal
} // namespace v8
« src/preparser.h ('K') | « src/rewriter.h ('k') | src/typing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698