Un-revert "Implement simple effect typing for variables" and "Handle switch effects"

This re-lands r15776 and r15777, reverting the revert in r15786.

R=rossberg@chromium.org

Review URL: https://codereview.chromium.org/22144006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16071 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 548062ea
...@@ -259,6 +259,7 @@ class Statement: public AstNode { ...@@ -259,6 +259,7 @@ class Statement: public AstNode {
Statement() : statement_pos_(RelocInfo::kNoPosition) {} Statement() : statement_pos_(RelocInfo::kNoPosition) {}
bool IsEmpty() { return AsEmptyStatement() != NULL; } bool IsEmpty() { return AsEmptyStatement() != NULL; }
virtual bool IsJump() const { return false; }
void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; } void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; }
int statement_pos() const { return statement_pos_; } int statement_pos() const { return statement_pos_; }
...@@ -388,7 +389,7 @@ class Expression: public AstNode { ...@@ -388,7 +389,7 @@ class Expression: public AstNode {
protected: protected:
explicit Expression(Isolate* isolate) explicit Expression(Isolate* isolate)
: bounds_(Type::None(), Type::Any(), isolate), : bounds_(Bounds::Unbounded(isolate)),
id_(GetNextId(isolate)), id_(GetNextId(isolate)),
test_id_(GetNextId(isolate)) {} test_id_(GetNextId(isolate)) {}
void set_to_boolean_types(byte types) { to_boolean_types_ = types; } void set_to_boolean_types(byte types) { to_boolean_types_ = types; }
...@@ -458,6 +459,11 @@ class Block: public BreakableStatement { ...@@ -458,6 +459,11 @@ class Block: public BreakableStatement {
ZoneList<Statement*>* statements() { return &statements_; } ZoneList<Statement*>* statements() { return &statements_; }
bool is_initializer_block() const { return is_initializer_block_; } bool is_initializer_block() const { return is_initializer_block_; }
virtual bool IsJump() const {
return !statements_.is_empty() && statements_.last()->IsJump()
&& labels() == NULL; // Good enough as an approximation...
}
Scope* scope() const { return scope_; } Scope* scope() const { return scope_; }
void set_scope(Scope* scope) { scope_ = scope; } void set_scope(Scope* scope) { scope_ = scope; }
...@@ -1008,6 +1014,7 @@ class ExpressionStatement: public Statement { ...@@ -1008,6 +1014,7 @@ class ExpressionStatement: public Statement {
void set_expression(Expression* e) { expression_ = e; } void set_expression(Expression* e) { expression_ = e; }
Expression* expression() const { return expression_; } Expression* expression() const { return expression_; }
virtual bool IsJump() const { return expression_->IsThrow(); }
protected: protected:
explicit ExpressionStatement(Expression* expression) explicit ExpressionStatement(Expression* expression)
...@@ -1018,7 +1025,16 @@ class ExpressionStatement: public Statement { ...@@ -1018,7 +1025,16 @@ class ExpressionStatement: public Statement {
}; };
class ContinueStatement: public Statement { class JumpStatement: public Statement {
public:
virtual bool IsJump() const { return true; }
protected:
JumpStatement() {}
};
class ContinueStatement: public JumpStatement {
public: public:
DECLARE_NODE_TYPE(ContinueStatement) DECLARE_NODE_TYPE(ContinueStatement)
...@@ -1033,7 +1049,7 @@ class ContinueStatement: public Statement { ...@@ -1033,7 +1049,7 @@ class ContinueStatement: public Statement {
}; };
class BreakStatement: public Statement { class BreakStatement: public JumpStatement {
public: public:
DECLARE_NODE_TYPE(BreakStatement) DECLARE_NODE_TYPE(BreakStatement)
...@@ -1048,7 +1064,7 @@ class BreakStatement: public Statement { ...@@ -1048,7 +1064,7 @@ class BreakStatement: public Statement {
}; };
class ReturnStatement: public Statement { class ReturnStatement: public JumpStatement {
public: public:
DECLARE_NODE_TYPE(ReturnStatement) DECLARE_NODE_TYPE(ReturnStatement)
...@@ -1167,6 +1183,11 @@ class IfStatement: public Statement { ...@@ -1167,6 +1183,11 @@ class IfStatement: public Statement {
Statement* then_statement() const { return then_statement_; } Statement* then_statement() const { return then_statement_; }
Statement* else_statement() const { return else_statement_; } Statement* else_statement() const { return else_statement_; }
virtual bool IsJump() const {
return HasThenStatement() && then_statement()->IsJump()
&& HasElseStatement() && else_statement()->IsJump();
}
BailoutId IfId() const { return if_id_; } BailoutId IfId() const { return if_id_; }
BailoutId ThenId() const { return then_id_; } BailoutId ThenId() const { return then_id_; }
BailoutId ElseId() const { return else_id_; } BailoutId ElseId() const { return else_id_; }
......
This diff is collapsed.
...@@ -90,6 +90,12 @@ bool SplayTree<Config, Allocator>::FindInternal(const Key& key) { ...@@ -90,6 +90,12 @@ bool SplayTree<Config, Allocator>::FindInternal(const Key& key) {
} }
template<typename Config, class Allocator>
bool SplayTree<Config, Allocator>::Contains(const Key& key) {
return FindInternal(key);
}
template<typename Config, class Allocator> template<typename Config, class Allocator>
bool SplayTree<Config, Allocator>::Find(const Key& key, Locator* locator) { bool SplayTree<Config, Allocator>::Find(const Key& key, Locator* locator) {
if (FindInternal(key)) { if (FindInternal(key)) {
...@@ -293,9 +299,10 @@ void SplayTree<Config, Allocator>::ForEach(Callback* callback) { ...@@ -293,9 +299,10 @@ void SplayTree<Config, Allocator>::ForEach(Callback* callback) {
template <typename Config, class Allocator> template <class Callback> template <typename Config, class Allocator> template <class Callback>
void SplayTree<Config, Allocator>::ForEachNode(Callback* callback) { void SplayTree<Config, Allocator>::ForEachNode(Callback* callback) {
if (root_ == NULL) return;
// Pre-allocate some space for tiny trees. // Pre-allocate some space for tiny trees.
List<Node*, Allocator> nodes_to_visit(10, allocator_); List<Node*, Allocator> nodes_to_visit(10, allocator_);
if (root_ != NULL) nodes_to_visit.Add(root_, allocator_); nodes_to_visit.Add(root_, allocator_);
int pos = 0; int pos = 0;
while (pos < nodes_to_visit.length()) { while (pos < nodes_to_visit.length()) {
Node* node = nodes_to_visit[pos++]; Node* node = nodes_to_visit[pos++];
......
...@@ -39,9 +39,9 @@ namespace internal { ...@@ -39,9 +39,9 @@ namespace internal {
// //
// typedef Key: the key type // typedef Key: the key type
// typedef Value: the value type // typedef Value: the value type
// static const kNoKey: the dummy key used when no key is set // static const Key kNoKey: the dummy key used when no key is set
// static const kNoValue: the dummy value used to initialize nodes // static Value kNoValue(): the dummy value used to initialize nodes
// int (Compare)(Key& a, Key& b) -> {-1, 0, 1}: comparison function // static int (Compare)(Key& a, Key& b) -> {-1, 0, 1}: comparison function
// //
// The tree is also parameterized by an allocation policy // The tree is also parameterized by an allocation policy
// (Allocator). The policy is used for allocating lists in the C free // (Allocator). The policy is used for allocating lists in the C free
...@@ -74,6 +74,11 @@ class SplayTree { ...@@ -74,6 +74,11 @@ class SplayTree {
UNREACHABLE(); UNREACHABLE();
} }
AllocationPolicy allocator() { return allocator_; }
// Checks if there is a mapping for the key.
bool Contains(const Key& key);
// Inserts the given key in this tree with the given value. Returns // Inserts the given key in this tree with the given value. Returns
// true if a node was inserted, otherwise false. If found the locator // true if a node was inserted, otherwise false. If found the locator
// is enabled and provides access to the mapping for the key. // is enabled and provides access to the mapping for the key.
...@@ -104,6 +109,9 @@ class SplayTree { ...@@ -104,6 +109,9 @@ class SplayTree {
// Remove the node with the given key from the tree. // Remove the node with the given key from the tree.
bool Remove(const Key& key); bool Remove(const Key& key);
// Remove all keys from the tree.
void Clear() { ResetRoot(); }
bool is_empty() { return root_ == NULL; } bool is_empty() { return root_ == NULL; }
// Perform the splay operation for the given key. Moves the node with // Perform the splay operation for the given key. Moves the node with
......
...@@ -303,6 +303,11 @@ struct Bounds { ...@@ -303,6 +303,11 @@ struct Bounds {
explicit Bounds(Handle<Type> t) : lower(t), upper(t) {} explicit Bounds(Handle<Type> t) : lower(t), upper(t) {}
Bounds(Type* t, Isolate* isl) : lower(t, isl), upper(t, isl) {} Bounds(Type* t, Isolate* isl) : lower(t, isl), upper(t, isl) {}
// Unrestricted bounds.
static Bounds Unbounded(Isolate* isl) {
return Bounds(Type::None(), Type::Any(), isl);
}
// Meet: both b1 and b2 are known to hold. // Meet: both b1 and b2 are known to hold.
static Bounds Both(Bounds b1, Bounds b2, Isolate* isl) { static Bounds Both(Bounds b1, Bounds b2, Isolate* isl) {
return Bounds( return Bounds(
......
This diff is collapsed.
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "compiler.h" #include "compiler.h"
#include "type-info.h" #include "type-info.h"
#include "types.h" #include "types.h"
#include "effects.h"
#include "zone.h" #include "zone.h"
#include "scopes.h" #include "scopes.h"
...@@ -57,8 +58,13 @@ class AstTyper: public AstVisitor { ...@@ -57,8 +58,13 @@ class AstTyper: public AstVisitor {
private: private:
explicit AstTyper(CompilationInfo* info); explicit AstTyper(CompilationInfo* info);
static const int kNoVar = INT_MIN;
typedef v8::internal::Effects<int, kNoVar> Effects;
typedef v8::internal::NestedEffects<int, kNoVar> Store;
CompilationInfo* info_; CompilationInfo* info_;
TypeFeedbackOracle oracle_; TypeFeedbackOracle oracle_;
Store store_;
TypeFeedbackOracle* oracle() { return &oracle_; } TypeFeedbackOracle* oracle() { return &oracle_; }
Zone* zone() const { return info_->zone(); } Zone* zone() const { return info_->zone(); }
...@@ -70,6 +76,17 @@ class AstTyper: public AstVisitor { ...@@ -70,6 +76,17 @@ class AstTyper: public AstVisitor {
e->set_bounds(Bounds::NarrowLower(e->bounds(), t, isolate_)); e->set_bounds(Bounds::NarrowLower(e->bounds(), t, isolate_));
} }
Effects EnterEffects() {
store_ = store_.Push();
return store_.Top();
}
void ExitEffects() { store_ = store_.Pop(); }
int variable_index(Variable* var) {
return var->IsStackLocal() ? var->index() :
var->IsParameter() ? -var->index() : kNoVar;
}
void VisitDeclarations(ZoneList<Declaration*>* declarations); void VisitDeclarations(ZoneList<Declaration*>* declarations);
void VisitStatements(ZoneList<Statement*>* statements); void VisitStatements(ZoneList<Statement*>* statements);
......
...@@ -109,6 +109,12 @@ void* ZoneList<T>::operator new(size_t size, Zone* zone) { ...@@ -109,6 +109,12 @@ void* ZoneList<T>::operator new(size_t size, Zone* zone) {
} }
template <typename T>
void* ZoneSplayTree<T>::operator new(size_t size, Zone* zone) {
return zone->New(static_cast<int>(size));
}
} } // namespace v8::internal } } // namespace v8::internal
#endif // V8_ZONE_INL_H_ #endif // V8_ZONE_INL_H_
...@@ -177,6 +177,7 @@ struct ZoneAllocationPolicy { ...@@ -177,6 +177,7 @@ struct ZoneAllocationPolicy {
explicit ZoneAllocationPolicy(Zone* zone) : zone_(zone) { } explicit ZoneAllocationPolicy(Zone* zone) : zone_(zone) { }
INLINE(void* New(size_t size)); INLINE(void* New(size_t size));
INLINE(static void Delete(void *pointer)) { } INLINE(static void Delete(void *pointer)) { }
Zone* zone() { return zone_; }
private: private:
Zone* zone_; Zone* zone_;
...@@ -246,6 +247,8 @@ class ZoneSplayTree: public SplayTree<Config, ZoneAllocationPolicy> { ...@@ -246,6 +247,8 @@ class ZoneSplayTree: public SplayTree<Config, ZoneAllocationPolicy> {
explicit ZoneSplayTree(Zone* zone) explicit ZoneSplayTree(Zone* zone)
: SplayTree<Config, ZoneAllocationPolicy>(ZoneAllocationPolicy(zone)) {} : SplayTree<Config, ZoneAllocationPolicy>(ZoneAllocationPolicy(zone)) {}
~ZoneSplayTree(); ~ZoneSplayTree();
INLINE(void* operator new(size_t size, Zone* zone));
}; };
......
...@@ -418,7 +418,7 @@ class RandomMutationData { ...@@ -418,7 +418,7 @@ class RandomMutationData {
int32_t offset = ++weak_offset_; int32_t offset = ++weak_offset_;
object->Set(7, v8::Integer::New(offset, isolate)); object->Set(7, v8::Integer::New(offset, isolate));
v8::Persistent<v8::Object> persistent(isolate, object); v8::Persistent<v8::Object> persistent(isolate, object);
persistent.MakeWeak(isolate, this, WeakCallback); persistent.MakeWeak(this, WeakCallback);
persistent.MarkIndependent(); persistent.MarkIndependent();
Object** location = v8::Utils::OpenPersistent(persistent).location(); Object** location = v8::Utils::OpenPersistent(persistent).location();
bool inserted = bool inserted =
......
...@@ -290,6 +290,7 @@ ...@@ -290,6 +290,7 @@
'../../src/double.h', '../../src/double.h',
'../../src/dtoa.cc', '../../src/dtoa.cc',
'../../src/dtoa.h', '../../src/dtoa.h',
'../../src/effects.h',
'../../src/elements-kind.cc', '../../src/elements-kind.cc',
'../../src/elements-kind.h', '../../src/elements-kind.h',
'../../src/elements.cc', '../../src/elements.cc',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment