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

Side by Side Diff: src/ast.cc

Issue 1370303004: Distinction between FeedbackVectorICSlot and FeedbackVectorSlot eliminated. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed release builds 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 unified diff | Download patch
« no previous file with comments | « src/ast.h ('k') | src/ast-numbering.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 #include "src/ast.h" 5 #include "src/ast.h"
6 6
7 #include <cmath> // For isfinite. 7 #include <cmath> // For isfinite.
8 #include "src/builtins.h" 8 #include "src/builtins.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/contexts.h" 10 #include "src/contexts.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 (IsVariableProxy() && AsVariableProxy()->is_this()); 64 (IsVariableProxy() && AsVariableProxy()->is_this());
65 } 65 }
66 66
67 67
68 VariableProxy::VariableProxy(Zone* zone, Variable* var, int start_position, 68 VariableProxy::VariableProxy(Zone* zone, Variable* var, int start_position,
69 int end_position) 69 int end_position)
70 : Expression(zone, start_position), 70 : Expression(zone, start_position),
71 bit_field_(IsThisField::encode(var->is_this()) | 71 bit_field_(IsThisField::encode(var->is_this()) |
72 IsAssignedField::encode(false) | 72 IsAssignedField::encode(false) |
73 IsResolvedField::encode(false)), 73 IsResolvedField::encode(false)),
74 variable_feedback_slot_(FeedbackVectorICSlot::Invalid()),
75 raw_name_(var->raw_name()), 74 raw_name_(var->raw_name()),
76 end_position_(end_position) { 75 end_position_(end_position) {
77 BindTo(var); 76 BindTo(var);
78 } 77 }
79 78
80 79
81 VariableProxy::VariableProxy(Zone* zone, const AstRawString* name, 80 VariableProxy::VariableProxy(Zone* zone, const AstRawString* name,
82 Variable::Kind variable_kind, int start_position, 81 Variable::Kind variable_kind, int start_position,
83 int end_position) 82 int end_position)
84 : Expression(zone, start_position), 83 : Expression(zone, start_position),
85 bit_field_(IsThisField::encode(variable_kind == Variable::THIS) | 84 bit_field_(IsThisField::encode(variable_kind == Variable::THIS) |
86 IsAssignedField::encode(false) | 85 IsAssignedField::encode(false) |
87 IsResolvedField::encode(false)), 86 IsResolvedField::encode(false)),
88 variable_feedback_slot_(FeedbackVectorICSlot::Invalid()),
89 raw_name_(name), 87 raw_name_(name),
90 end_position_(end_position) {} 88 end_position_(end_position) {}
91 89
92 90
93 void VariableProxy::BindTo(Variable* var) { 91 void VariableProxy::BindTo(Variable* var) {
94 DCHECK((is_this() && var->is_this()) || raw_name() == var->raw_name()); 92 DCHECK((is_this() && var->is_this()) || raw_name() == var->raw_name());
95 set_var(var); 93 set_var(var);
96 set_is_resolved(); 94 set_is_resolved();
97 var->set_is_used(); 95 var->set_is_used();
98 } 96 }
99 97
100 98
101 void VariableProxy::AssignFeedbackVectorSlots(Isolate* isolate, 99 void VariableProxy::AssignFeedbackVectorSlots(Isolate* isolate,
102 FeedbackVectorSpec* spec, 100 FeedbackVectorSpec* spec,
103 ICSlotCache* cache) { 101 FeedbackVectorSlotCache* cache) {
104 if (UsesVariableFeedbackSlot()) { 102 if (UsesVariableFeedbackSlot()) {
105 // VariableProxies that point to the same Variable within a function can 103 // VariableProxies that point to the same Variable within a function can
106 // make their loads from the same IC slot. 104 // make their loads from the same IC slot.
107 if (var()->IsUnallocated()) { 105 if (var()->IsUnallocated()) {
108 ZoneHashMap::Entry* entry = cache->Get(var()); 106 ZoneHashMap::Entry* entry = cache->Get(var());
109 if (entry != NULL) { 107 if (entry != NULL) {
110 variable_feedback_slot_ = FeedbackVectorICSlot( 108 variable_feedback_slot_ = FeedbackVectorSlot(
111 static_cast<int>(reinterpret_cast<intptr_t>(entry->value))); 109 static_cast<int>(reinterpret_cast<intptr_t>(entry->value)));
112 return; 110 return;
113 } 111 }
114 } 112 }
115 variable_feedback_slot_ = spec->AddLoadICSlot(); 113 variable_feedback_slot_ = spec->AddLoadICSlot();
116 if (var()->IsUnallocated()) { 114 if (var()->IsUnallocated()) {
117 cache->Put(var(), variable_feedback_slot_); 115 cache->Put(var(), variable_feedback_slot_);
118 } 116 }
119 } 117 }
120 } 118 }
121 119
122 120
123 static void AssignVectorSlots(Expression* expr, FeedbackVectorSpec* spec, 121 static void AssignVectorSlots(Expression* expr, FeedbackVectorSpec* spec,
124 FeedbackVectorICSlot* out_slot) { 122 FeedbackVectorSlot* out_slot) {
125 if (FLAG_vector_stores) { 123 if (FLAG_vector_stores) {
126 Property* property = expr->AsProperty(); 124 Property* property = expr->AsProperty();
127 LhsKind assign_type = Property::GetAssignType(property); 125 LhsKind assign_type = Property::GetAssignType(property);
128 if ((assign_type == VARIABLE && 126 if ((assign_type == VARIABLE &&
129 expr->AsVariableProxy()->var()->IsUnallocated()) || 127 expr->AsVariableProxy()->var()->IsUnallocated()) ||
130 assign_type == NAMED_PROPERTY || assign_type == KEYED_PROPERTY) { 128 assign_type == NAMED_PROPERTY || assign_type == KEYED_PROPERTY) {
131 // TODO(ishell): consider using ICSlotCache for variables here. 129 // TODO(ishell): consider using ICSlotCache for variables here.
132 FeedbackVectorSlotKind kind = assign_type == KEYED_PROPERTY 130 FeedbackVectorSlotKind kind = assign_type == KEYED_PROPERTY
133 ? FeedbackVectorSlotKind::KEYED_STORE_IC 131 ? FeedbackVectorSlotKind::KEYED_STORE_IC
134 : FeedbackVectorSlotKind::STORE_IC; 132 : FeedbackVectorSlotKind::STORE_IC;
135 *out_slot = spec->AddSlot(kind); 133 *out_slot = spec->AddSlot(kind);
136 } 134 }
137 } 135 }
138 } 136 }
139 137
140 138
141 void ForEachStatement::AssignFeedbackVectorSlots(Isolate* isolate, 139 void ForEachStatement::AssignFeedbackVectorSlots(
142 FeedbackVectorSpec* spec, 140 Isolate* isolate, FeedbackVectorSpec* spec,
143 ICSlotCache* cache) { 141 FeedbackVectorSlotCache* cache) {
144 AssignVectorSlots(each(), spec, &each_slot_); 142 AssignVectorSlots(each(), spec, &each_slot_);
145 } 143 }
146 144
147 145
148 Assignment::Assignment(Zone* zone, Token::Value op, Expression* target, 146 Assignment::Assignment(Zone* zone, Token::Value op, Expression* target,
149 Expression* value, int pos) 147 Expression* value, int pos)
150 : Expression(zone, pos), 148 : Expression(zone, pos),
151 bit_field_( 149 bit_field_(
152 IsUninitializedField::encode(false) | KeyTypeField::encode(ELEMENT) | 150 IsUninitializedField::encode(false) | KeyTypeField::encode(ELEMENT) |
153 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)), 151 StoreModeField::encode(STANDARD_STORE) | TokenField::encode(op)),
154 target_(target), 152 target_(target),
155 value_(value), 153 value_(value),
156 binary_operation_(NULL), 154 binary_operation_(NULL) {}
157 slot_(FeedbackVectorICSlot::Invalid()) {}
158 155
159 156
160 void Assignment::AssignFeedbackVectorSlots(Isolate* isolate, 157 void Assignment::AssignFeedbackVectorSlots(Isolate* isolate,
161 FeedbackVectorSpec* spec, 158 FeedbackVectorSpec* spec,
162 ICSlotCache* cache) { 159 FeedbackVectorSlotCache* cache) {
163 AssignVectorSlots(target(), spec, &slot_); 160 AssignVectorSlots(target(), spec, &slot_);
164 } 161 }
165 162
166 163
167 void CountOperation::AssignFeedbackVectorSlots(Isolate* isolate, 164 void CountOperation::AssignFeedbackVectorSlots(Isolate* isolate,
168 FeedbackVectorSpec* spec, 165 FeedbackVectorSpec* spec,
169 ICSlotCache* cache) { 166 FeedbackVectorSlotCache* cache) {
170 AssignVectorSlots(expression(), spec, &slot_); 167 AssignVectorSlots(expression(), spec, &slot_);
171 } 168 }
172 169
173 170
174 Token::Value Assignment::binary_op() const { 171 Token::Value Assignment::binary_op() const {
175 switch (op()) { 172 switch (op()) {
176 case Token::ASSIGN_BIT_OR: return Token::BIT_OR; 173 case Token::ASSIGN_BIT_OR: return Token::BIT_OR;
177 case Token::ASSIGN_BIT_XOR: return Token::BIT_XOR; 174 case Token::ASSIGN_BIT_XOR: return Token::BIT_XOR;
178 case Token::ASSIGN_BIT_AND: return Token::BIT_AND; 175 case Token::ASSIGN_BIT_AND: return Token::BIT_AND;
179 case Token::ASSIGN_SHL: return Token::SHL; 176 case Token::ASSIGN_SHL: return Token::SHL;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 DCHECK_NOT_NULL(expr->AsFunctionLiteral()->scope()); 217 DCHECK_NOT_NULL(expr->AsFunctionLiteral()->scope());
221 return expr->AsFunctionLiteral()->scope()->NeedsHomeObject(); 218 return expr->AsFunctionLiteral()->scope()->NeedsHomeObject();
222 } 219 }
223 220
224 221
225 ObjectLiteralProperty::ObjectLiteralProperty(Expression* key, Expression* value, 222 ObjectLiteralProperty::ObjectLiteralProperty(Expression* key, Expression* value,
226 Kind kind, bool is_static, 223 Kind kind, bool is_static,
227 bool is_computed_name) 224 bool is_computed_name)
228 : key_(key), 225 : key_(key),
229 value_(value), 226 value_(value),
230 slot_(FeedbackVectorICSlot::Invalid()),
231 kind_(kind), 227 kind_(kind),
232 emit_store_(true), 228 emit_store_(true),
233 is_static_(is_static), 229 is_static_(is_static),
234 is_computed_name_(is_computed_name) {} 230 is_computed_name_(is_computed_name) {}
235 231
236 232
237 ObjectLiteralProperty::ObjectLiteralProperty(AstValueFactory* ast_value_factory, 233 ObjectLiteralProperty::ObjectLiteralProperty(AstValueFactory* ast_value_factory,
238 Expression* key, Expression* value, 234 Expression* key, Expression* value,
239 bool is_static, 235 bool is_static,
240 bool is_computed_name) 236 bool is_computed_name)
241 : key_(key), 237 : key_(key),
242 value_(value), 238 value_(value),
243 slot_(FeedbackVectorICSlot::Invalid()),
244 emit_store_(true), 239 emit_store_(true),
245 is_static_(is_static), 240 is_static_(is_static),
246 is_computed_name_(is_computed_name) { 241 is_computed_name_(is_computed_name) {
247 if (!is_computed_name && 242 if (!is_computed_name &&
248 key->AsLiteral()->raw_value()->EqualsString( 243 key->AsLiteral()->raw_value()->EqualsString(
249 ast_value_factory->proto_string())) { 244 ast_value_factory->proto_string())) {
250 kind_ = PROTOTYPE; 245 kind_ = PROTOTYPE;
251 } else if (value_->AsMaterializedLiteral() != NULL) { 246 } else if (value_->AsMaterializedLiteral() != NULL) {
252 kind_ = MATERIALIZED_LITERAL; 247 kind_ = MATERIALIZED_LITERAL;
253 } else if (value_->IsLiteral()) { 248 } else if (value_->IsLiteral()) {
254 kind_ = CONSTANT; 249 kind_ = CONSTANT;
255 } else { 250 } else {
256 kind_ = COMPUTED; 251 kind_ = COMPUTED;
257 } 252 }
258 } 253 }
259 254
260 255
261 void ClassLiteral::AssignFeedbackVectorSlots(Isolate* isolate, 256 void ClassLiteral::AssignFeedbackVectorSlots(Isolate* isolate,
262 FeedbackVectorSpec* spec, 257 FeedbackVectorSpec* spec,
263 ICSlotCache* cache) { 258 FeedbackVectorSlotCache* cache) {
264 if (!FLAG_vector_stores) return; 259 if (!FLAG_vector_stores) return;
265 260
266 // This logic that computes the number of slots needed for vector store 261 // This logic that computes the number of slots needed for vector store
267 // ICs must mirror FullCodeGenerator::VisitClassLiteral. 262 // ICs must mirror FullCodeGenerator::VisitClassLiteral.
268 if (NeedsProxySlot()) { 263 if (NeedsProxySlot()) {
269 slot_ = spec->AddStoreICSlot(); 264 slot_ = spec->AddStoreICSlot();
270 } 265 }
271 266
272 for (int i = 0; i < properties()->length(); i++) { 267 for (int i = 0; i < properties()->length(); i++) {
273 ObjectLiteral::Property* property = properties()->at(i); 268 ObjectLiteral::Property* property = properties()->at(i);
274 Expression* value = property->value(); 269 Expression* value = property->value();
275 if (FunctionLiteral::NeedsHomeObject(value)) { 270 if (FunctionLiteral::NeedsHomeObject(value)) {
276 property->set_slot(spec->AddStoreICSlot()); 271 property->SetSlot(spec->AddStoreICSlot());
277 } 272 }
278 } 273 }
279 } 274 }
280 275
281 276
282 bool ObjectLiteral::Property::IsCompileTimeValue() { 277 bool ObjectLiteral::Property::IsCompileTimeValue() {
283 return kind_ == CONSTANT || 278 return kind_ == CONSTANT ||
284 (kind_ == MATERIALIZED_LITERAL && 279 (kind_ == MATERIALIZED_LITERAL &&
285 CompileTimeValue::IsCompileTimeValue(value_)); 280 CompileTimeValue::IsCompileTimeValue(value_));
286 } 281 }
287 282
288 283
289 void ObjectLiteral::Property::set_emit_store(bool emit_store) { 284 void ObjectLiteral::Property::set_emit_store(bool emit_store) {
290 emit_store_ = emit_store; 285 emit_store_ = emit_store;
291 } 286 }
292 287
293 288
294 bool ObjectLiteral::Property::emit_store() { 289 bool ObjectLiteral::Property::emit_store() {
295 return emit_store_; 290 return emit_store_;
296 } 291 }
297 292
298 293
299 void ObjectLiteral::AssignFeedbackVectorSlots(Isolate* isolate, 294 void ObjectLiteral::AssignFeedbackVectorSlots(Isolate* isolate,
300 FeedbackVectorSpec* spec, 295 FeedbackVectorSpec* spec,
301 ICSlotCache* cache) { 296 FeedbackVectorSlotCache* cache) {
302 if (!FLAG_vector_stores) return; 297 if (!FLAG_vector_stores) return;
303 298
304 // This logic that computes the number of slots needed for vector store 299 // This logic that computes the number of slots needed for vector store
305 // ics must mirror FullCodeGenerator::VisitObjectLiteral. 300 // ics must mirror FullCodeGenerator::VisitObjectLiteral.
306 int property_index = 0; 301 int property_index = 0;
307 for (; property_index < properties()->length(); property_index++) { 302 for (; property_index < properties()->length(); property_index++) {
308 ObjectLiteral::Property* property = properties()->at(property_index); 303 ObjectLiteral::Property* property = properties()->at(property_index);
309 if (property->is_computed_name()) break; 304 if (property->is_computed_name()) break;
310 if (property->IsCompileTimeValue()) continue; 305 if (property->IsCompileTimeValue()) continue;
311 306
312 Literal* key = property->key()->AsLiteral(); 307 Literal* key = property->key()->AsLiteral();
313 Expression* value = property->value(); 308 Expression* value = property->value();
314 switch (property->kind()) { 309 switch (property->kind()) {
315 case ObjectLiteral::Property::CONSTANT: 310 case ObjectLiteral::Property::CONSTANT:
316 UNREACHABLE(); 311 UNREACHABLE();
317 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 312 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
318 // Fall through. 313 // Fall through.
319 case ObjectLiteral::Property::COMPUTED: 314 case ObjectLiteral::Property::COMPUTED:
320 // It is safe to use [[Put]] here because the boilerplate already 315 // It is safe to use [[Put]] here because the boilerplate already
321 // contains computed properties with an uninitialized value. 316 // contains computed properties with an uninitialized value.
322 if (key->value()->IsInternalizedString()) { 317 if (key->value()->IsInternalizedString()) {
323 if (property->emit_store()) { 318 if (property->emit_store()) {
324 property->set_slot(spec->AddStoreICSlot()); 319 property->SetSlot(spec->AddStoreICSlot());
325 if (FunctionLiteral::NeedsHomeObject(value)) { 320 if (FunctionLiteral::NeedsHomeObject(value)) {
326 spec->AddStoreICSlot(); 321 property->SetSlot(spec->AddStoreICSlot(), 1);
327 } 322 }
328 } 323 }
329 break; 324 break;
330 } 325 }
331 if (property->emit_store() && FunctionLiteral::NeedsHomeObject(value)) { 326 if (property->emit_store() && FunctionLiteral::NeedsHomeObject(value)) {
332 property->set_slot(spec->AddStoreICSlot()); 327 property->SetSlot(spec->AddStoreICSlot());
333 } 328 }
334 break; 329 break;
335 case ObjectLiteral::Property::PROTOTYPE: 330 case ObjectLiteral::Property::PROTOTYPE:
336 break; 331 break;
337 case ObjectLiteral::Property::GETTER: 332 case ObjectLiteral::Property::GETTER:
338 if (property->emit_store() && FunctionLiteral::NeedsHomeObject(value)) { 333 if (property->emit_store() && FunctionLiteral::NeedsHomeObject(value)) {
339 property->set_slot(spec->AddStoreICSlot()); 334 property->SetSlot(spec->AddStoreICSlot());
340 } 335 }
341 break; 336 break;
342 case ObjectLiteral::Property::SETTER: 337 case ObjectLiteral::Property::SETTER:
343 if (property->emit_store() && FunctionLiteral::NeedsHomeObject(value)) { 338 if (property->emit_store() && FunctionLiteral::NeedsHomeObject(value)) {
344 property->set_slot(spec->AddStoreICSlot()); 339 property->SetSlot(spec->AddStoreICSlot());
345 } 340 }
346 break; 341 break;
347 } 342 }
348 } 343 }
349 344
350 for (; property_index < properties()->length(); property_index++) { 345 for (; property_index < properties()->length(); property_index++) {
351 ObjectLiteral::Property* property = properties()->at(property_index); 346 ObjectLiteral::Property* property = properties()->at(property_index);
352 347
353 Expression* value = property->value(); 348 Expression* value = property->value();
354 if (property->kind() != ObjectLiteral::Property::PROTOTYPE) { 349 if (property->kind() != ObjectLiteral::Property::PROTOTYPE) {
355 if (FunctionLiteral::NeedsHomeObject(value)) { 350 if (FunctionLiteral::NeedsHomeObject(value)) {
356 property->set_slot(spec->AddStoreICSlot()); 351 property->SetSlot(spec->AddStoreICSlot());
357 } 352 }
358 } 353 }
359 } 354 }
360 } 355 }
361 356
362 357
363 void ObjectLiteral::CalculateEmitStore(Zone* zone) { 358 void ObjectLiteral::CalculateEmitStore(Zone* zone) {
364 const auto GETTER = ObjectLiteral::Property::GETTER; 359 const auto GETTER = ObjectLiteral::Property::GETTER;
365 const auto SETTER = ObjectLiteral::Property::SETTER; 360 const auto SETTER = ObjectLiteral::Property::SETTER;
366 361
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
713 708
714 709
715 bool Call::IsUsingCallFeedbackSlot(Isolate* isolate) const { 710 bool Call::IsUsingCallFeedbackSlot(Isolate* isolate) const {
716 // SuperConstructorCall uses a CallConstructStub, which wants 711 // SuperConstructorCall uses a CallConstructStub, which wants
717 // a Slot, in addition to any IC slots requested elsewhere. 712 // a Slot, in addition to any IC slots requested elsewhere.
718 return GetCallType(isolate) == SUPER_CALL; 713 return GetCallType(isolate) == SUPER_CALL;
719 } 714 }
720 715
721 716
722 void Call::AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec, 717 void Call::AssignFeedbackVectorSlots(Isolate* isolate, FeedbackVectorSpec* spec,
723 ICSlotCache* cache) { 718 FeedbackVectorSlotCache* cache) {
724 if (IsUsingCallFeedbackICSlot(isolate)) { 719 if (IsUsingCallFeedbackICSlot(isolate)) {
725 ic_slot_ = spec->AddCallICSlot(); 720 ic_slot_ = spec->AddCallICSlot();
726 } 721 }
727 if (IsUsingCallFeedbackSlot(isolate)) { 722 if (IsUsingCallFeedbackSlot(isolate)) {
728 slot_ = spec->AddStubSlot(); 723 stub_slot_ = spec->AddGeneralSlot();
729 } 724 }
730 } 725 }
731 726
732 727
733 Call::CallType Call::GetCallType(Isolate* isolate) const { 728 Call::CallType Call::GetCallType(Isolate* isolate) const {
734 VariableProxy* proxy = expression()->AsVariableProxy(); 729 VariableProxy* proxy = expression()->AsVariableProxy();
735 if (proxy != NULL) { 730 if (proxy != NULL) {
736 if (proxy->var()->is_possibly_eval(isolate)) { 731 if (proxy->var()->is_possibly_eval(isolate)) {
737 return POSSIBLY_EVAL_CALL; 732 return POSSIBLY_EVAL_CALL;
738 } else if (proxy->var()->IsUnallocatedOrGlobalSlot()) { 733 } else if (proxy->var()->IsUnallocatedOrGlobalSlot()) {
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 bool Literal::Match(void* literal1, void* literal2) { 1123 bool Literal::Match(void* literal1, void* literal2) {
1129 const AstValue* x = static_cast<Literal*>(literal1)->raw_value(); 1124 const AstValue* x = static_cast<Literal*>(literal1)->raw_value();
1130 const AstValue* y = static_cast<Literal*>(literal2)->raw_value(); 1125 const AstValue* y = static_cast<Literal*>(literal2)->raw_value();
1131 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) || 1126 return (x->IsString() && y->IsString() && x->AsString() == y->AsString()) ||
1132 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber()); 1127 (x->IsNumber() && y->IsNumber() && x->AsNumber() == y->AsNumber());
1133 } 1128 }
1134 1129
1135 1130
1136 } // namespace internal 1131 } // namespace internal
1137 } // namespace v8 1132 } // namespace v8
OLDNEW
« no previous file with comments | « src/ast.h ('k') | src/ast-numbering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698