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

Side by Side Diff: src/ast.h

Issue 398053002: Introduce FLAG_vector_ics. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE. Created 6 years, 5 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/arm64/lithium-codegen-arm64.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #ifndef V8_AST_H_ 5 #ifndef V8_AST_H_
6 #define V8_AST_H_ 6 #define V8_AST_H_
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/assembler.h" 10 #include "src/assembler.h"
(...skipping 1607 matching lines...) Expand 10 before | Expand all | Expand 10 after
1618 values_(values), 1618 values_(values),
1619 first_element_id_(ReserveIdRange(zone, values->length())) {} 1619 first_element_id_(ReserveIdRange(zone, values->length())) {}
1620 1620
1621 private: 1621 private:
1622 Handle<FixedArray> constant_elements_; 1622 Handle<FixedArray> constant_elements_;
1623 ZoneList<Expression*>* values_; 1623 ZoneList<Expression*>* values_;
1624 const BailoutId first_element_id_; 1624 const BailoutId first_element_id_;
1625 }; 1625 };
1626 1626
1627 1627
1628 class VariableProxy V8_FINAL : public Expression { 1628 class VariableProxy V8_FINAL : public Expression, public FeedbackSlotInterface {
1629 public: 1629 public:
1630 DECLARE_NODE_TYPE(VariableProxy) 1630 DECLARE_NODE_TYPE(VariableProxy)
1631 1631
1632 virtual bool IsValidReferenceExpression() const V8_OVERRIDE { 1632 virtual bool IsValidReferenceExpression() const V8_OVERRIDE {
1633 return var_ == NULL ? true : var_->IsValidReference(); 1633 return var_ == NULL ? true : var_->IsValidReference();
1634 } 1634 }
1635 1635
1636 bool IsArguments() const { return var_ != NULL && var_->is_arguments(); } 1636 bool IsArguments() const { return var_ != NULL && var_->is_arguments(); }
1637 1637
1638 Handle<String> name() const { return name_->string(); } 1638 Handle<String> name() const { return name_->string(); }
1639 const AstRawString* raw_name() const { return name_; } 1639 const AstRawString* raw_name() const { return name_; }
1640 Variable* var() const { return var_; } 1640 Variable* var() const { return var_; }
1641 bool is_this() const { return is_this_; } 1641 bool is_this() const { return is_this_; }
1642 Interface* interface() const { return interface_; } 1642 Interface* interface() const { return interface_; }
1643 1643
1644 bool is_assigned() const { return is_assigned_; } 1644 bool is_assigned() const { return is_assigned_; }
1645 void set_is_assigned() { is_assigned_ = true; } 1645 void set_is_assigned() { is_assigned_ = true; }
1646 1646
1647 // Bind this proxy to the variable var. Interfaces must match. 1647 // Bind this proxy to the variable var. Interfaces must match.
1648 void BindTo(Variable* var); 1648 void BindTo(Variable* var);
1649 1649
1650 virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
1651 virtual void SetFirstFeedbackSlot(int slot) {
1652 variable_feedback_slot_ = slot;
1653 }
1654
1655 int VariableFeedbackSlot() { return variable_feedback_slot_; }
1656
1650 protected: 1657 protected:
1651 VariableProxy(Zone* zone, Variable* var, int position); 1658 VariableProxy(Zone* zone, Variable* var, int position);
1652 1659
1653 VariableProxy(Zone* zone, 1660 VariableProxy(Zone* zone,
1654 const AstRawString* name, 1661 const AstRawString* name,
1655 bool is_this, 1662 bool is_this,
1656 Interface* interface, 1663 Interface* interface,
1657 int position); 1664 int position);
1658 1665
1659 const AstRawString* name_; 1666 const AstRawString* name_;
1660 Variable* var_; // resolved variable, or NULL 1667 Variable* var_; // resolved variable, or NULL
1661 bool is_this_; 1668 bool is_this_;
1662 bool is_assigned_; 1669 bool is_assigned_;
1663 Interface* interface_; 1670 Interface* interface_;
1671 int variable_feedback_slot_;
1664 }; 1672 };
1665 1673
1666 1674
1667 class Property V8_FINAL : public Expression { 1675 class Property V8_FINAL : public Expression, public FeedbackSlotInterface {
1668 public: 1676 public:
1669 DECLARE_NODE_TYPE(Property) 1677 DECLARE_NODE_TYPE(Property)
1670 1678
1671 virtual bool IsValidReferenceExpression() const V8_OVERRIDE { return true; } 1679 virtual bool IsValidReferenceExpression() const V8_OVERRIDE { return true; }
1672 1680
1673 Expression* obj() const { return obj_; } 1681 Expression* obj() const { return obj_; }
1674 Expression* key() const { return key_; } 1682 Expression* key() const { return key_; }
1675 1683
1676 BailoutId LoadId() const { return load_id_; } 1684 BailoutId LoadId() const { return load_id_; }
1677 1685
(...skipping 15 matching lines...) Expand all
1693 return is_uninitialized_; 1701 return is_uninitialized_;
1694 } 1702 }
1695 void set_is_uninitialized(bool b) { is_uninitialized_ = b; } 1703 void set_is_uninitialized(bool b) { is_uninitialized_ = b; }
1696 void set_is_string_access(bool b) { is_string_access_ = b; } 1704 void set_is_string_access(bool b) { is_string_access_ = b; }
1697 void set_is_function_prototype(bool b) { is_function_prototype_ = b; } 1705 void set_is_function_prototype(bool b) { is_function_prototype_ = b; }
1698 void mark_for_call() { is_for_call_ = true; } 1706 void mark_for_call() { is_for_call_ = true; }
1699 bool IsForCall() { return is_for_call_; } 1707 bool IsForCall() { return is_for_call_; }
1700 1708
1701 TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } 1709 TypeFeedbackId PropertyFeedbackId() { return reuse(id()); }
1702 1710
1711 virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; }
1712 virtual void SetFirstFeedbackSlot(int slot) {
1713 property_feedback_slot_ = slot;
1714 }
1715
1716 int PropertyFeedbackSlot() const { return property_feedback_slot_; }
1717
1703 protected: 1718 protected:
1704 Property(Zone* zone, 1719 Property(Zone* zone,
1705 Expression* obj, 1720 Expression* obj,
1706 Expression* key, 1721 Expression* key,
1707 int pos) 1722 int pos)
1708 : Expression(zone, pos), 1723 : Expression(zone, pos),
1709 obj_(obj), 1724 obj_(obj),
1710 key_(key), 1725 key_(key),
1711 load_id_(GetNextId(zone)), 1726 load_id_(GetNextId(zone)),
1727 property_feedback_slot_(kInvalidFeedbackSlot),
1712 is_for_call_(false), 1728 is_for_call_(false),
1713 is_uninitialized_(false), 1729 is_uninitialized_(false),
1714 is_string_access_(false), 1730 is_string_access_(false),
1715 is_function_prototype_(false) { } 1731 is_function_prototype_(false) { }
1716 1732
1717 private: 1733 private:
1718 Expression* obj_; 1734 Expression* obj_;
1719 Expression* key_; 1735 Expression* key_;
1720 const BailoutId load_id_; 1736 const BailoutId load_id_;
1737 int property_feedback_slot_;
1721 1738
1722 SmallMapList receiver_types_; 1739 SmallMapList receiver_types_;
1723 bool is_for_call_ : 1; 1740 bool is_for_call_ : 1;
1724 bool is_uninitialized_ : 1; 1741 bool is_uninitialized_ : 1;
1725 bool is_string_access_ : 1; 1742 bool is_string_access_ : 1;
1726 bool is_function_prototype_ : 1; 1743 bool is_function_prototype_ : 1;
1727 }; 1744 };
1728 1745
1729 1746
1730 class Call V8_FINAL : public Expression, public FeedbackSlotInterface { 1747 class Call V8_FINAL : public Expression, public FeedbackSlotInterface {
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1888 int callnew_feedback_slot_; 1905 int callnew_feedback_slot_;
1889 1906
1890 const BailoutId return_id_; 1907 const BailoutId return_id_;
1891 }; 1908 };
1892 1909
1893 1910
1894 // The CallRuntime class does not represent any official JavaScript 1911 // The CallRuntime class does not represent any official JavaScript
1895 // language construct. Instead it is used to call a C or JS function 1912 // language construct. Instead it is used to call a C or JS function
1896 // with a set of arguments. This is used from the builtins that are 1913 // with a set of arguments. This is used from the builtins that are
1897 // implemented in JavaScript (see "v8natives.js"). 1914 // implemented in JavaScript (see "v8natives.js").
1898 class CallRuntime V8_FINAL : public Expression { 1915 class CallRuntime V8_FINAL : public Expression, public FeedbackSlotInterface {
1899 public: 1916 public:
1900 DECLARE_NODE_TYPE(CallRuntime) 1917 DECLARE_NODE_TYPE(CallRuntime)
1901 1918
1902 Handle<String> name() const { return raw_name_->string(); } 1919 Handle<String> name() const { return raw_name_->string(); }
1903 const AstRawString* raw_name() const { return raw_name_; } 1920 const AstRawString* raw_name() const { return raw_name_; }
1904 const Runtime::Function* function() const { return function_; } 1921 const Runtime::Function* function() const { return function_; }
1905 ZoneList<Expression*>* arguments() const { return arguments_; } 1922 ZoneList<Expression*>* arguments() const { return arguments_; }
1906 bool is_jsruntime() const { return function_ == NULL; } 1923 bool is_jsruntime() const { return function_ == NULL; }
1907 1924
1925 // Type feedback information.
1926 virtual int ComputeFeedbackSlotCount() {
1927 return (FLAG_vector_ics && is_jsruntime()) ? 1 : 0;
1928 }
1929 virtual void SetFirstFeedbackSlot(int slot) {
1930 callruntime_feedback_slot_ = slot;
1931 }
1932
1933 int CallRuntimeFeedbackSlot() {
1934 ASSERT(!is_jsruntime() ||
1935 callruntime_feedback_slot_ != kInvalidFeedbackSlot);
1936 return callruntime_feedback_slot_;
1937 }
1938
1908 TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } 1939 TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); }
1909 1940
1910 protected: 1941 protected:
1911 CallRuntime(Zone* zone, 1942 CallRuntime(Zone* zone,
1912 const AstRawString* name, 1943 const AstRawString* name,
1913 const Runtime::Function* function, 1944 const Runtime::Function* function,
1914 ZoneList<Expression*>* arguments, 1945 ZoneList<Expression*>* arguments,
1915 int pos) 1946 int pos)
1916 : Expression(zone, pos), 1947 : Expression(zone, pos),
1917 raw_name_(name), 1948 raw_name_(name),
1918 function_(function), 1949 function_(function),
1919 arguments_(arguments) { } 1950 arguments_(arguments) { }
1920 1951
1921 private: 1952 private:
1922 const AstRawString* raw_name_; 1953 const AstRawString* raw_name_;
1923 const Runtime::Function* function_; 1954 const Runtime::Function* function_;
1924 ZoneList<Expression*>* arguments_; 1955 ZoneList<Expression*>* arguments_;
1956 int callruntime_feedback_slot_;
1925 }; 1957 };
1926 1958
1927 1959
1928 class UnaryOperation V8_FINAL : public Expression { 1960 class UnaryOperation V8_FINAL : public Expression {
1929 public: 1961 public:
1930 DECLARE_NODE_TYPE(UnaryOperation) 1962 DECLARE_NODE_TYPE(UnaryOperation)
1931 1963
1932 Token::Value op() const { return op_; } 1964 Token::Value op() const { return op_; }
1933 Expression* expression() const { return expression_; } 1965 Expression* expression() const { return expression_; }
1934 1966
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2208 BinaryOperation* binary_operation_; 2240 BinaryOperation* binary_operation_;
2209 const BailoutId assignment_id_; 2241 const BailoutId assignment_id_;
2210 2242
2211 bool is_uninitialized_ : 1; 2243 bool is_uninitialized_ : 1;
2212 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, 2244 KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed,
2213 // must have extra bit. 2245 // must have extra bit.
2214 SmallMapList receiver_types_; 2246 SmallMapList receiver_types_;
2215 }; 2247 };
2216 2248
2217 2249
2218 class Yield V8_FINAL : public Expression { 2250 class Yield V8_FINAL : public Expression, public FeedbackSlotInterface {
2219 public: 2251 public:
2220 DECLARE_NODE_TYPE(Yield) 2252 DECLARE_NODE_TYPE(Yield)
2221 2253
2222 enum Kind { 2254 enum Kind {
2223 INITIAL, // The initial yield that returns the unboxed generator object. 2255 INITIAL, // The initial yield that returns the unboxed generator object.
2224 SUSPEND, // A normal yield: { value: EXPRESSION, done: false } 2256 SUSPEND, // A normal yield: { value: EXPRESSION, done: false }
2225 DELEGATING, // A yield*. 2257 DELEGATING, // A yield*.
2226 FINAL // A return: { value: EXPRESSION, done: true } 2258 FINAL // A return: { value: EXPRESSION, done: true }
2227 }; 2259 };
2228 2260
2229 Expression* generator_object() const { return generator_object_; } 2261 Expression* generator_object() const { return generator_object_; }
2230 Expression* expression() const { return expression_; } 2262 Expression* expression() const { return expression_; }
2231 Kind yield_kind() const { return yield_kind_; } 2263 Kind yield_kind() const { return yield_kind_; }
2232 2264
2233 // Delegating yield surrounds the "yield" in a "try/catch". This index 2265 // Delegating yield surrounds the "yield" in a "try/catch". This index
2234 // locates the catch handler in the handler table, and is equivalent to 2266 // locates the catch handler in the handler table, and is equivalent to
2235 // TryCatchStatement::index(). 2267 // TryCatchStatement::index().
2236 int index() const { 2268 int index() const {
2237 ASSERT(yield_kind() == DELEGATING); 2269 ASSERT(yield_kind() == DELEGATING);
2238 return index_; 2270 return index_;
2239 } 2271 }
2240 void set_index(int index) { 2272 void set_index(int index) {
2241 ASSERT(yield_kind() == DELEGATING); 2273 ASSERT(yield_kind() == DELEGATING);
2242 index_ = index; 2274 index_ = index;
2243 } 2275 }
2244 2276
2277 // Type feedback information.
2278 virtual int ComputeFeedbackSlotCount() {
2279 return (FLAG_vector_ics && yield_kind() == DELEGATING) ? 3 : 0;
2280 }
2281 virtual void SetFirstFeedbackSlot(int slot) {
2282 yield_first_feedback_slot_ = slot;
2283 }
2284
2285 int KeyedLoadFeedbackSlot() {
2286 ASSERT(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
2287 return yield_first_feedback_slot_;
2288 }
2289
2290 int DoneFeedbackSlot() {
2291 ASSERT(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
2292 return yield_first_feedback_slot_ + 1;
2293 }
2294
2295 int ValueFeedbackSlot() {
2296 ASSERT(yield_first_feedback_slot_ != kInvalidFeedbackSlot);
2297 return yield_first_feedback_slot_ + 2;
2298 }
2299
2245 protected: 2300 protected:
2246 Yield(Zone* zone, 2301 Yield(Zone* zone,
2247 Expression* generator_object, 2302 Expression* generator_object,
2248 Expression* expression, 2303 Expression* expression,
2249 Kind yield_kind, 2304 Kind yield_kind,
2250 int pos) 2305 int pos)
2251 : Expression(zone, pos), 2306 : Expression(zone, pos),
2252 generator_object_(generator_object), 2307 generator_object_(generator_object),
2253 expression_(expression), 2308 expression_(expression),
2254 yield_kind_(yield_kind), 2309 yield_kind_(yield_kind),
2255 index_(-1) { } 2310 index_(-1),
2311 yield_first_feedback_slot_(kInvalidFeedbackSlot) { }
2256 2312
2257 private: 2313 private:
2258 Expression* generator_object_; 2314 Expression* generator_object_;
2259 Expression* expression_; 2315 Expression* expression_;
2260 Kind yield_kind_; 2316 Kind yield_kind_;
2261 int index_; 2317 int index_;
2318 int yield_first_feedback_slot_;
2262 }; 2319 };
2263 2320
2264 2321
2265 class Throw V8_FINAL : public Expression { 2322 class Throw V8_FINAL : public Expression {
2266 public: 2323 public:
2267 DECLARE_NODE_TYPE(Throw) 2324 DECLARE_NODE_TYPE(Throw)
2268 2325
2269 Expression* exception() const { return exception_; } 2326 Expression* exception() const { return exception_; }
2270 2327
2271 protected: 2328 protected:
(...skipping 1149 matching lines...) Expand 10 before | Expand all | Expand 10 after
3421 private: 3478 private:
3422 Zone* zone_; 3479 Zone* zone_;
3423 Visitor visitor_; 3480 Visitor visitor_;
3424 AstValueFactory* ast_value_factory_; 3481 AstValueFactory* ast_value_factory_;
3425 }; 3482 };
3426 3483
3427 3484
3428 } } // namespace v8::internal 3485 } } // namespace v8::internal
3429 3486
3430 #endif // V8_AST_H_ 3487 #endif // V8_AST_H_
OLDNEW
« no previous file with comments | « src/arm64/lithium-codegen-arm64.cc ('k') | src/ast.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698