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

Side by Side Diff: src/ast.h

Issue 61873003: Defer allocation of constant literal properties. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 1 month 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 1391 matching lines...) Expand 10 before | Expand all | Expand 10 after
1402 }; 1402 };
1403 1403
1404 1404
1405 // Base class for literals that needs space in the corresponding JSFunction. 1405 // Base class for literals that needs space in the corresponding JSFunction.
1406 class MaterializedLiteral : public Expression { 1406 class MaterializedLiteral : public Expression {
1407 public: 1407 public:
1408 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } 1408 virtual MaterializedLiteral* AsMaterializedLiteral() { return this; }
1409 1409
1410 int literal_index() { return literal_index_; } 1410 int literal_index() { return literal_index_; }
1411 1411
1412 protected:
1413 MaterializedLiteral(Isolate* isolate,
1414 int literal_index,
1415 int pos)
1416 : Expression(isolate, pos),
1417 literal_index_(literal_index),
1418 is_simple_(false) {}
1419
1412 // A materialized literal is simple if the values consist of only 1420 // A materialized literal is simple if the values consist of only
1413 // constants and simple object and array literals. 1421 // constants and simple object and array literals.
1414 bool is_simple() const { return is_simple_; } 1422 bool is_simple() const { return is_simple_; }
1423 void set_is_simple(bool is_simple) { is_simple_ = is_simple; }
1424 friend class CompileTimeValue;
1415 1425
1416 int depth() const { return depth_; } 1426 // Populate the constant properties/elements fixed array.
1427 void BuildConstants(Isolate* isolate, int* depth);
1428 friend class ArrayLiteral;
1429 friend class ObjectLiteral;
1417 1430
1418 protected: 1431 // If the expression is a literal, return the literal value;
1419 MaterializedLiteral(Isolate* isolate, 1432 // if the expression is a materialized literal and is simple return a
1420 int literal_index, 1433 // compile time value as encoded by CompileTimeValue::GetValue().
1421 bool is_simple, 1434 // Otherwise, return undefined literal as the placeholder
1422 int depth, 1435 // in the object literal boilerplate.
1423 int pos) 1436 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate);
1424 : Expression(isolate, pos),
1425 literal_index_(literal_index),
1426 is_simple_(is_simple),
1427 depth_(depth) {}
1428 1437
1429 private: 1438 private:
1430 int literal_index_; 1439 int literal_index_;
1431 bool is_simple_; 1440 bool is_simple_;
1432 int depth_;
1433 }; 1441 };
1434 1442
1435 1443
1436 // Property is used for passing information 1444 // Property is used for passing information
1437 // about an object literal's properties from the parser 1445 // about an object literal's properties from the parser
1438 // to the code generator. 1446 // to the code generator.
1439 class ObjectLiteralProperty V8_FINAL : public ZoneObject { 1447 class ObjectLiteralProperty V8_FINAL : public ZoneObject {
1440 public: 1448 public:
1441 enum Kind { 1449 enum Kind {
1442 CONSTANT, // Property with constant value (compile time). 1450 CONSTANT, // Property with constant value (compile time).
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1486 DECLARE_NODE_TYPE(ObjectLiteral) 1494 DECLARE_NODE_TYPE(ObjectLiteral)
1487 1495
1488 Handle<FixedArray> constant_properties() const { 1496 Handle<FixedArray> constant_properties() const {
1489 return constant_properties_; 1497 return constant_properties_;
1490 } 1498 }
1491 ZoneList<Property*>* properties() const { return properties_; } 1499 ZoneList<Property*>* properties() const { return properties_; }
1492 bool fast_elements() const { return fast_elements_; } 1500 bool fast_elements() const { return fast_elements_; }
1493 bool may_store_doubles() const { return may_store_doubles_; } 1501 bool may_store_doubles() const { return may_store_doubles_; }
1494 bool has_function() const { return has_function_; } 1502 bool has_function() const { return has_function_; }
1495 1503
1504 // Decide if a property should be in the object boilerplate.
1505 static bool IsBoilerplateProperty(Property* property);
1506
1507 // Populate the constant properties fixed array.
1508 void BuildConstantProperties(Isolate* isolate, int* depth = NULL);
1509
1496 // Mark all computed expressions that are bound to a key that 1510 // Mark all computed expressions that are bound to a key that
1497 // is shadowed by a later occurrence of the same key. For the 1511 // is shadowed by a later occurrence of the same key. For the
1498 // marked expressions, no store code is emitted. 1512 // marked expressions, no store code is emitted.
1499 void CalculateEmitStore(Zone* zone); 1513 void CalculateEmitStore(Zone* zone);
1500 1514
1501 enum Flags { 1515 enum Flags {
1502 kNoFlags = 0, 1516 kNoFlags = 0,
1503 kFastElements = 1, 1517 kFastElements = 1,
1504 kHasFunction = 1 << 1 1518 kHasFunction = 1 << 1
1505 }; 1519 };
1506 1520
1507 struct Accessors: public ZoneObject { 1521 struct Accessors: public ZoneObject {
1508 Accessors() : getter(NULL), setter(NULL) { } 1522 Accessors() : getter(NULL), setter(NULL) { }
1509 Expression* getter; 1523 Expression* getter;
1510 Expression* setter; 1524 Expression* setter;
1511 }; 1525 };
1512 1526
1513 protected: 1527 protected:
1514 ObjectLiteral(Isolate* isolate, 1528 ObjectLiteral(Isolate* isolate,
1515 Handle<FixedArray> constant_properties,
1516 ZoneList<Property*>* properties, 1529 ZoneList<Property*>* properties,
1517 int literal_index, 1530 int literal_index,
1518 bool is_simple, 1531 int boilerplate_properties,
1519 bool fast_elements,
1520 int depth,
1521 bool may_store_doubles,
1522 bool has_function, 1532 bool has_function,
1523 int pos) 1533 int pos)
1524 : MaterializedLiteral(isolate, literal_index, is_simple, depth, pos), 1534 : MaterializedLiteral(isolate, literal_index, pos),
1525 constant_properties_(constant_properties),
1526 properties_(properties), 1535 properties_(properties),
1527 fast_elements_(fast_elements), 1536 boilerplate_properties_(boilerplate_properties),
1528 may_store_doubles_(may_store_doubles), 1537 fast_elements_(false),
1538 may_store_doubles_(false),
1529 has_function_(has_function) {} 1539 has_function_(has_function) {}
1530 1540
1531 private: 1541 private:
1532 Handle<FixedArray> constant_properties_; 1542 Handle<FixedArray> constant_properties_;
1533 ZoneList<Property*>* properties_; 1543 ZoneList<Property*>* properties_;
1544 int boilerplate_properties_;
1534 bool fast_elements_; 1545 bool fast_elements_;
1535 bool may_store_doubles_; 1546 bool may_store_doubles_;
1536 bool has_function_; 1547 bool has_function_;
1537 }; 1548 };
1538 1549
1539 1550
1540 // Node for capturing a regexp literal. 1551 // Node for capturing a regexp literal.
1541 class RegExpLiteral V8_FINAL : public MaterializedLiteral { 1552 class RegExpLiteral V8_FINAL : public MaterializedLiteral {
1542 public: 1553 public:
1543 DECLARE_NODE_TYPE(RegExpLiteral) 1554 DECLARE_NODE_TYPE(RegExpLiteral)
1544 1555
1545 Handle<String> pattern() const { return pattern_; } 1556 Handle<String> pattern() const { return pattern_; }
1546 Handle<String> flags() const { return flags_; } 1557 Handle<String> flags() const { return flags_; }
1547 1558
1548 protected: 1559 protected:
1549 RegExpLiteral(Isolate* isolate, 1560 RegExpLiteral(Isolate* isolate,
1550 Handle<String> pattern, 1561 Handle<String> pattern,
1551 Handle<String> flags, 1562 Handle<String> flags,
1552 int literal_index, 1563 int literal_index,
1553 int pos) 1564 int pos)
1554 : MaterializedLiteral(isolate, literal_index, false, 1, pos), 1565 : MaterializedLiteral(isolate, literal_index, pos),
1555 pattern_(pattern), 1566 pattern_(pattern),
1556 flags_(flags) {} 1567 flags_(flags) {}
1557 1568
1558 private: 1569 private:
1559 Handle<String> pattern_; 1570 Handle<String> pattern_;
1560 Handle<String> flags_; 1571 Handle<String> flags_;
1561 }; 1572 };
1562 1573
1563 1574
1564 // An array literal has a literals object that is used 1575 // An array literal has a literals object that is used
1565 // for minimizing the work when constructing it at runtime. 1576 // for minimizing the work when constructing it at runtime.
1566 class ArrayLiteral V8_FINAL : public MaterializedLiteral { 1577 class ArrayLiteral V8_FINAL : public MaterializedLiteral {
1567 public: 1578 public:
1568 DECLARE_NODE_TYPE(ArrayLiteral) 1579 DECLARE_NODE_TYPE(ArrayLiteral)
1569 1580
1570 Handle<FixedArray> constant_elements() const { return constant_elements_; } 1581 Handle<FixedArray> constant_elements() const { return constant_elements_; }
1571 ZoneList<Expression*>* values() const { return values_; } 1582 ZoneList<Expression*>* values() const { return values_; }
1572 1583
1573 // Return an AST id for an element that is used in simulate instructions. 1584 // Return an AST id for an element that is used in simulate instructions.
1574 BailoutId GetIdForElement(int i) { 1585 BailoutId GetIdForElement(int i) {
1575 return BailoutId(first_element_id_.ToInt() + i); 1586 return BailoutId(first_element_id_.ToInt() + i);
1576 } 1587 }
1577 1588
1589 // Populate the constant elements fixed array.
1590 void BuildConstantElements(Isolate* isolate, int* depth = NULL);
1591
1578 protected: 1592 protected:
1579 ArrayLiteral(Isolate* isolate, 1593 ArrayLiteral(Isolate* isolate,
1580 Handle<FixedArray> constant_elements,
1581 ZoneList<Expression*>* values, 1594 ZoneList<Expression*>* values,
1582 int literal_index, 1595 int literal_index,
1583 bool is_simple,
1584 int depth,
1585 int pos) 1596 int pos)
1586 : MaterializedLiteral(isolate, literal_index, is_simple, depth, pos), 1597 : MaterializedLiteral(isolate, literal_index, pos),
1587 constant_elements_(constant_elements),
1588 values_(values), 1598 values_(values),
1589 first_element_id_(ReserveIdRange(isolate, values->length())) {} 1599 first_element_id_(ReserveIdRange(isolate, values->length())) {}
1590 1600
1591 private: 1601 private:
1592 Handle<FixedArray> constant_elements_; 1602 Handle<FixedArray> constant_elements_;
1593 ZoneList<Expression*>* values_; 1603 ZoneList<Expression*>* values_;
1594 const BailoutId first_element_id_; 1604 const BailoutId first_element_id_;
1595 }; 1605 };
1596 1606
1597 1607
(...skipping 1461 matching lines...) Expand 10 before | Expand all | Expand 10 after
3059 Literal* NewLiteral(Handle<Object> handle, int pos) { 3069 Literal* NewLiteral(Handle<Object> handle, int pos) {
3060 Literal* lit = new(zone_) Literal(isolate_, handle, pos); 3070 Literal* lit = new(zone_) Literal(isolate_, handle, pos);
3061 VISIT_AND_RETURN(Literal, lit) 3071 VISIT_AND_RETURN(Literal, lit)
3062 } 3072 }
3063 3073
3064 Literal* NewNumberLiteral(double number, int pos) { 3074 Literal* NewNumberLiteral(double number, int pos) {
3065 return NewLiteral(isolate_->factory()->NewNumber(number, TENURED), pos); 3075 return NewLiteral(isolate_->factory()->NewNumber(number, TENURED), pos);
3066 } 3076 }
3067 3077
3068 ObjectLiteral* NewObjectLiteral( 3078 ObjectLiteral* NewObjectLiteral(
3069 Handle<FixedArray> constant_properties,
3070 ZoneList<ObjectLiteral::Property*>* properties, 3079 ZoneList<ObjectLiteral::Property*>* properties,
3071 int literal_index, 3080 int literal_index,
3072 bool is_simple, 3081 int boilerplate_properties,
3073 bool fast_elements,
3074 int depth,
3075 bool may_store_doubles,
3076 bool has_function, 3082 bool has_function,
3077 int pos) { 3083 int pos) {
3078 ObjectLiteral* lit = new(zone_) ObjectLiteral( 3084 ObjectLiteral* lit = new(zone_) ObjectLiteral(
3079 isolate_, constant_properties, properties, literal_index, 3085 isolate_, properties, literal_index, boilerplate_properties,
3080 is_simple, fast_elements, depth, may_store_doubles, has_function, pos); 3086 has_function, pos);
3081 VISIT_AND_RETURN(ObjectLiteral, lit) 3087 VISIT_AND_RETURN(ObjectLiteral, lit)
3082 } 3088 }
3083 3089
3084 ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, 3090 ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter,
3085 FunctionLiteral* value, 3091 FunctionLiteral* value,
3086 int pos) { 3092 int pos) {
3087 ObjectLiteral::Property* prop = 3093 ObjectLiteral::Property* prop =
3088 new(zone_) ObjectLiteral::Property(is_getter, value); 3094 new(zone_) ObjectLiteral::Property(is_getter, value);
3089 prop->set_key(NewLiteral(value->name(), pos)); 3095 prop->set_key(NewLiteral(value->name(), pos));
3090 return prop; // Not an AST node, will not be visited. 3096 return prop; // Not an AST node, will not be visited.
3091 } 3097 }
3092 3098
3093 RegExpLiteral* NewRegExpLiteral(Handle<String> pattern, 3099 RegExpLiteral* NewRegExpLiteral(Handle<String> pattern,
3094 Handle<String> flags, 3100 Handle<String> flags,
3095 int literal_index, 3101 int literal_index,
3096 int pos) { 3102 int pos) {
3097 RegExpLiteral* lit = 3103 RegExpLiteral* lit =
3098 new(zone_) RegExpLiteral(isolate_, pattern, flags, literal_index, pos); 3104 new(zone_) RegExpLiteral(isolate_, pattern, flags, literal_index, pos);
3099 VISIT_AND_RETURN(RegExpLiteral, lit); 3105 VISIT_AND_RETURN(RegExpLiteral, lit);
3100 } 3106 }
3101 3107
3102 ArrayLiteral* NewArrayLiteral(Handle<FixedArray> constant_elements, 3108 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values,
3103 ZoneList<Expression*>* values,
3104 int literal_index, 3109 int literal_index,
3105 bool is_simple,
3106 int depth,
3107 int pos) { 3110 int pos) {
3108 ArrayLiteral* lit = new(zone_) ArrayLiteral( 3111 ArrayLiteral* lit = new(zone_) ArrayLiteral(
3109 isolate_, constant_elements, values, literal_index, is_simple, 3112 isolate_, values, literal_index, pos);
3110 depth, pos);
3111 VISIT_AND_RETURN(ArrayLiteral, lit) 3113 VISIT_AND_RETURN(ArrayLiteral, lit)
3112 } 3114 }
3113 3115
3114 VariableProxy* NewVariableProxy(Variable* var, 3116 VariableProxy* NewVariableProxy(Variable* var,
3115 int pos = RelocInfo::kNoPosition) { 3117 int pos = RelocInfo::kNoPosition) {
3116 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var, pos); 3118 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var, pos);
3117 VISIT_AND_RETURN(VariableProxy, proxy) 3119 VISIT_AND_RETURN(VariableProxy, proxy)
3118 } 3120 }
3119 3121
3120 VariableProxy* NewVariableProxy(Handle<String> name, 3122 VariableProxy* NewVariableProxy(Handle<String> name,
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
3265 private: 3267 private:
3266 Isolate* isolate_; 3268 Isolate* isolate_;
3267 Zone* zone_; 3269 Zone* zone_;
3268 Visitor visitor_; 3270 Visitor visitor_;
3269 }; 3271 };
3270 3272
3271 3273
3272 } } // namespace v8::internal 3274 } } // namespace v8::internal
3273 3275
3274 #endif // V8_AST_H_ 3276 #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