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

Side by Side Diff: src/ast/ast.h

Issue 2302643002: Split the AST representation of class properties from object properties (Closed)
Patch Set: remove spurious classliteralproperty typedef Created 4 years, 3 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
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | src/parsing/parser.h » ('J')
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_AST_H_ 5 #ifndef V8_AST_AST_H_
6 #define V8_AST_AST_H_ 6 #define V8_AST_AST_H_
7 7
8 #include "src/ast/ast-value-factory.h" 8 #include "src/ast/ast-value-factory.h"
9 #include "src/ast/modules.h" 9 #include "src/ast/modules.h"
10 #include "src/ast/variables.h" 10 #include "src/ast/variables.h"
(...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1284 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); 1284 Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate);
1285 1285
1286 private: 1286 private:
1287 bool is_simple_ : 1; 1287 bool is_simple_ : 1;
1288 int depth_ : 31; 1288 int depth_ : 31;
1289 int literal_index_; 1289 int literal_index_;
1290 1290
1291 friend class AstLiteralReindexer; 1291 friend class AstLiteralReindexer;
1292 }; 1292 };
1293 1293
1294 // Common supertype for ObjectLiteralProperty and ClassLiteralProperty
1295 class LiteralProperty : public ZoneObject {
1296 public:
1297 Expression* key() { return key_; }
1298 Expression* value() { return value_; }
adamk 2016/09/01 21:18:22 Might as well make these const methods while you'r
bakkot 2016/09/01 23:24:31 Done.
1299 void set_key(Expression* e) { key_ = e; }
1300 void set_value(Expression* e) { value_ = e; }
1301
1302 bool is_computed_name() const { return is_computed_name_; }
1303
1304 FeedbackVectorSlot GetSlot(int offset = 0) const {
1305 DCHECK_LT(offset, static_cast<int>(arraysize(slots_)));
1306 return slots_[offset];
1307 }
1308
1309 void SetSlot(FeedbackVectorSlot slot, int offset = 0) {
1310 DCHECK_LT(offset, static_cast<int>(arraysize(slots_)));
1311 slots_[offset] = slot;
1312 }
1313
1314 bool NeedsSetFunctionName() const;
1315
1316 protected:
1317 LiteralProperty(Expression* key, Expression* value, bool is_computed_name)
1318 : key_(key), value_(value), is_computed_name_(is_computed_name) {}
1319 Expression* key_;
adamk 2016/09/01 21:18:23 Please leave a blank line above to separate the co
bakkot 2016/09/01 23:24:31 Done.
1320 Expression* value_;
1321 FeedbackVectorSlot slots_[2];
1322 bool is_computed_name_;
1323 };
1294 1324
1295 // Property is used for passing information 1325 // Property is used for passing information
1296 // about an object literal's properties from the parser 1326 // about an object literal's properties from the parser
1297 // to the code generator. 1327 // to the code generator.
1298 class ObjectLiteralProperty final : public ZoneObject { 1328 class ObjectLiteralProperty final : public LiteralProperty {
1299 public: 1329 public:
1300 enum Kind : uint8_t { 1330 enum Kind : uint8_t {
1301 CONSTANT, // Property with constant value (compile time). 1331 CONSTANT, // Property with constant value (compile time).
1302 COMPUTED, // Property with computed value (execution time). 1332 COMPUTED, // Property with computed value (execution time).
1303 MATERIALIZED_LITERAL, // Property value is a materialized literal. 1333 MATERIALIZED_LITERAL, // Property value is a materialized literal.
1304 GETTER, 1334 GETTER,
1305 SETTER, // Property is an accessor function. 1335 SETTER, // Property is an accessor function.
1306 PROTOTYPE // Property is __proto__. 1336 PROTOTYPE // Property is __proto__.
1307 }; 1337 };
1308 1338
1309 Expression* key() { return key_; }
1310 Expression* value() { return value_; }
1311 Kind kind() { return kind_; } 1339 Kind kind() { return kind_; }
adamk 2016/09/01 21:18:22 Consider adding const modifiers to the getters in
bakkot 2016/09/01 23:24:31 Done.
1312 1340
1313 void set_key(Expression* e) { key_ = e; }
1314 void set_value(Expression* e) { value_ = e; }
1315
1316 // Type feedback information. 1341 // Type feedback information.
1317 bool IsMonomorphic() { return !receiver_type_.is_null(); } 1342 bool IsMonomorphic() { return !receiver_type_.is_null(); }
1318 Handle<Map> GetReceiverType() { return receiver_type_; } 1343 Handle<Map> GetReceiverType() { return receiver_type_; }
1319 1344
1320 bool IsCompileTimeValue(); 1345 bool IsCompileTimeValue();
1321 1346
1322 void set_emit_store(bool emit_store); 1347 void set_emit_store(bool emit_store);
1323 bool emit_store(); 1348 bool emit_store();
1324 1349
1325 bool is_static() const { return is_static_; }
1326 bool is_computed_name() const { return is_computed_name_; }
1327
1328 FeedbackVectorSlot GetSlot(int offset = 0) const {
1329 DCHECK_LT(offset, static_cast<int>(arraysize(slots_)));
1330 return slots_[offset];
1331 }
1332 void SetSlot(FeedbackVectorSlot slot, int offset = 0) {
1333 DCHECK_LT(offset, static_cast<int>(arraysize(slots_)));
1334 slots_[offset] = slot;
1335 }
1336
1337 void set_receiver_type(Handle<Map> map) { receiver_type_ = map; } 1350 void set_receiver_type(Handle<Map> map) { receiver_type_ = map; }
1338 1351
1339 bool NeedsSetFunctionName() const;
1340
1341 private: 1352 private:
1342 friend class AstNodeFactory; 1353 friend class AstNodeFactory;
1343 1354
1344 ObjectLiteralProperty(Expression* key, Expression* value, Kind kind, 1355 ObjectLiteralProperty(Expression* key, Expression* value, Kind kind,
1345 bool is_static, bool is_computed_name); 1356 bool is_computed_name);
1346 ObjectLiteralProperty(AstValueFactory* ast_value_factory, Expression* key, 1357 ObjectLiteralProperty(AstValueFactory* ast_value_factory, Expression* key,
1347 Expression* value, bool is_static, 1358 Expression* value, bool is_computed_name);
1348 bool is_computed_name);
1349 1359
1350 Expression* key_;
1351 Expression* value_;
1352 FeedbackVectorSlot slots_[2];
1353 Kind kind_; 1360 Kind kind_;
1354 bool emit_store_; 1361 bool emit_store_;
adamk 2016/09/01 21:18:23 Make this a single-bit bitfield to pack with kind_
bakkot 2016/09/01 23:24:31 Sounded like this wasn't worth doing, so I'm leavi
1355 bool is_static_;
1356 bool is_computed_name_;
1357 Handle<Map> receiver_type_; 1362 Handle<Map> receiver_type_;
1358 }; 1363 };
1359 1364
1360 1365
1361 // An object literal has a boilerplate object that is used 1366 // An object literal has a boilerplate object that is used
1362 // for minimizing the work when constructing it at runtime. 1367 // for minimizing the work when constructing it at runtime.
1363 class ObjectLiteral final : public MaterializedLiteral { 1368 class ObjectLiteral final : public MaterializedLiteral {
1364 public: 1369 public:
1365 typedef ObjectLiteralProperty Property; 1370 typedef ObjectLiteralProperty Property;
1366 1371
(...skipping 1304 matching lines...) Expand 10 before | Expand all | Expand 10 after
2671 int yield_count_; 2676 int yield_count_;
2672 2677
2673 const AstString* raw_name_; 2678 const AstString* raw_name_;
2674 DeclarationScope* scope_; 2679 DeclarationScope* scope_;
2675 ZoneList<Statement*>* body_; 2680 ZoneList<Statement*>* body_;
2676 const AstString* raw_inferred_name_; 2681 const AstString* raw_inferred_name_;
2677 Handle<String> inferred_name_; 2682 Handle<String> inferred_name_;
2678 AstProperties ast_properties_; 2683 AstProperties ast_properties_;
2679 }; 2684 };
2680 2685
2686 // Property is used for passing information
2687 // about a class literal's properties from the parser to the code generator.
2688 class ClassLiteralProperty final : public LiteralProperty {
2689 public:
2690 enum Kind : uint8_t { METHOD, GETTER, SETTER };
2691
2692 Kind kind() { return kind_; }
adamk 2016/09/01 21:18:22 Make this a const method too.
bakkot 2016/09/01 23:24:31 Done.
2693
2694 bool is_static() const { return is_static_; }
2695
2696 private:
2697 friend class AstNodeFactory;
2698
2699 ClassLiteralProperty(Expression* key, Expression* value, Kind kind,
2700 bool is_static, bool is_computed_name);
2701
2702 Kind kind_;
2703 bool is_static_;
2704 };
2681 2705
2682 class ClassLiteral final : public Expression { 2706 class ClassLiteral final : public Expression {
2683 public: 2707 public:
2684 typedef ObjectLiteralProperty Property; 2708 typedef ClassLiteralProperty Property;
2685 2709
2686 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; } 2710 VariableProxy* class_variable_proxy() const { return class_variable_proxy_; }
2687 Expression* extends() const { return extends_; } 2711 Expression* extends() const { return extends_; }
2688 void set_extends(Expression* e) { extends_ = e; } 2712 void set_extends(Expression* e) { extends_ = e; }
2689 FunctionLiteral* constructor() const { return constructor_; } 2713 FunctionLiteral* constructor() const { return constructor_; }
2690 void set_constructor(FunctionLiteral* f) { constructor_ = f; } 2714 void set_constructor(FunctionLiteral* f) { constructor_ = f; }
2691 ZoneList<Property*>* properties() const { return properties_; } 2715 ZoneList<Property*>* properties() const { return properties_; }
2692 int start_position() const { return position(); } 2716 int start_position() const { return position(); }
2693 int end_position() const { return end_position_; } 2717 int end_position() const { return end_position_; }
2694 2718
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after
3170 3194
3171 ObjectLiteral* NewObjectLiteral( 3195 ObjectLiteral* NewObjectLiteral(
3172 ZoneList<ObjectLiteral::Property*>* properties, int literal_index, 3196 ZoneList<ObjectLiteral::Property*>* properties, int literal_index,
3173 uint32_t boilerplate_properties, int pos) { 3197 uint32_t boilerplate_properties, int pos) {
3174 return new (zone_) 3198 return new (zone_)
3175 ObjectLiteral(properties, literal_index, boilerplate_properties, pos); 3199 ObjectLiteral(properties, literal_index, boilerplate_properties, pos);
3176 } 3200 }
3177 3201
3178 ObjectLiteral::Property* NewObjectLiteralProperty( 3202 ObjectLiteral::Property* NewObjectLiteralProperty(
3179 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind, 3203 Expression* key, Expression* value, ObjectLiteralProperty::Kind kind,
3180 bool is_static, bool is_computed_name) { 3204 bool is_computed_name) {
3181 return new (zone_) 3205 return new (zone_)
3182 ObjectLiteral::Property(key, value, kind, is_static, is_computed_name); 3206 ObjectLiteral::Property(key, value, kind, is_computed_name);
3183 } 3207 }
3184 3208
3185 ObjectLiteral::Property* NewObjectLiteralProperty(Expression* key, 3209 ObjectLiteral::Property* NewObjectLiteralProperty(Expression* key,
3186 Expression* value, 3210 Expression* value,
3187 bool is_static,
3188 bool is_computed_name) { 3211 bool is_computed_name) {
3189 return new (zone_) ObjectLiteral::Property(ast_value_factory_, key, value, 3212 return new (zone_) ObjectLiteral::Property(ast_value_factory_, key, value,
3190 is_static, is_computed_name); 3213 is_computed_name);
3191 } 3214 }
3192 3215
3193 RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, int flags, 3216 RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, int flags,
3194 int literal_index, int pos) { 3217 int literal_index, int pos) {
3195 return new (zone_) RegExpLiteral(pattern, flags, literal_index, pos); 3218 return new (zone_) RegExpLiteral(pattern, flags, literal_index, pos);
3196 } 3219 }
3197 3220
3198 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, 3221 ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values,
3199 int literal_index, 3222 int literal_index,
3200 int pos) { 3223 int pos) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3349 int materialized_literal_count, int expected_property_count) { 3372 int materialized_literal_count, int expected_property_count) {
3350 return new (zone_) FunctionLiteral( 3373 return new (zone_) FunctionLiteral(
3351 zone_, ast_value_factory_->empty_string(), ast_value_factory_, scope, 3374 zone_, ast_value_factory_->empty_string(), ast_value_factory_, scope,
3352 body, materialized_literal_count, expected_property_count, 0, 3375 body, materialized_literal_count, expected_property_count, 0,
3353 FunctionLiteral::kAnonymousExpression, 3376 FunctionLiteral::kAnonymousExpression,
3354 FunctionLiteral::kNoDuplicateParameters, 3377 FunctionLiteral::kNoDuplicateParameters,
3355 FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, 0, 3378 FunctionLiteral::kShouldLazyCompile, FunctionKind::kNormalFunction, 0,
3356 false); 3379 false);
3357 } 3380 }
3358 3381
3382 ClassLiteral::Property* NewClassLiteralProperty(
3383 Expression* key, Expression* value, ClassLiteralProperty::Kind kind,
3384 bool is_static, bool is_computed_name) {
3385 return new (zone_)
3386 ClassLiteral::Property(key, value, kind, is_static, is_computed_name);
3387 }
3388
3359 ClassLiteral* NewClassLiteral(VariableProxy* proxy, Expression* extends, 3389 ClassLiteral* NewClassLiteral(VariableProxy* proxy, Expression* extends,
3360 FunctionLiteral* constructor, 3390 FunctionLiteral* constructor,
3361 ZoneList<ObjectLiteral::Property*>* properties, 3391 ZoneList<ClassLiteral::Property*>* properties,
3362 int start_position, int end_position) { 3392 int start_position, int end_position) {
3363 return new (zone_) ClassLiteral(proxy, extends, constructor, properties, 3393 return new (zone_) ClassLiteral(proxy, extends, constructor, properties,
3364 start_position, end_position); 3394 start_position, end_position);
3365 } 3395 }
3366 3396
3367 NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, 3397 NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name,
3368 v8::Extension* extension, 3398 v8::Extension* extension,
3369 int pos) { 3399 int pos) {
3370 return new (zone_) NativeFunctionLiteral(name, extension, pos); 3400 return new (zone_) NativeFunctionLiteral(name, extension, pos);
3371 } 3401 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
3464 : NULL; \ 3494 : NULL; \
3465 } 3495 }
3466 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 3496 AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
3467 #undef DECLARE_NODE_FUNCTIONS 3497 #undef DECLARE_NODE_FUNCTIONS
3468 3498
3469 3499
3470 } // namespace internal 3500 } // namespace internal
3471 } // namespace v8 3501 } // namespace v8
3472 3502
3473 #endif // V8_AST_AST_H_ 3503 #endif // V8_AST_AST_H_
OLDNEW
« no previous file with comments | « no previous file | src/ast/ast.cc » ('j') | src/parsing/parser.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698