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

Side by Side Diff: src/ast-value-factory.cc

Issue 693803004: Parser & internalizing: efficiency fixes. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: . Created 6 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 | « no previous file | src/parser.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 if (content.IsOneByte()) { 234 if (content.IsOneByte()) {
235 return GetOneByteString(content.ToOneByteVector()); 235 return GetOneByteString(content.ToOneByteVector());
236 } 236 }
237 DCHECK(content.IsTwoByte()); 237 DCHECK(content.IsTwoByte());
238 return GetTwoByteString(content.ToUC16Vector()); 238 return GetTwoByteString(content.ToUC16Vector());
239 } 239 }
240 240
241 241
242 const AstConsString* AstValueFactory::NewConsString( 242 const AstConsString* AstValueFactory::NewConsString(
243 const AstString* left, const AstString* right) { 243 const AstString* left, const AstString* right) {
244 // This Vector will be valid as long as the Collector is alive (meaning that
245 // the AstRawString will not be moved).
246 AstConsString* new_string = new (zone_) AstConsString(left, right); 244 AstConsString* new_string = new (zone_) AstConsString(left, right);
247 strings_.Add(new_string);
248 if (isolate_) { 245 if (isolate_) {
249 new_string->Internalize(isolate_); 246 new_string->Internalize(isolate_);
247 } else {
248 strings_.Add(new_string);
250 } 249 }
251 return new_string; 250 return new_string;
252 } 251 }
253 252
254 253
255 void AstValueFactory::Internalize(Isolate* isolate) { 254 void AstValueFactory::Internalize(Isolate* isolate) {
256 if (isolate_) { 255 if (isolate_) {
257 // Everything is already internalized. 256 // Everything is already internalized.
258 return; 257 return;
259 } 258 }
260 // Strings need to be internalized before values, because values refer to 259 // Strings need to be internalized before values, because values refer to
261 // strings. 260 // strings.
262 for (int i = 0; i < strings_.length(); ++i) { 261 for (int i = 0; i < strings_.length(); ++i) {
263 strings_[i]->Internalize(isolate); 262 strings_[i]->Internalize(isolate);
264 } 263 }
265 for (int i = 0; i < values_.length(); ++i) { 264 for (int i = 0; i < values_.length(); ++i) {
266 values_[i]->Internalize(isolate); 265 values_[i]->Internalize(isolate);
267 } 266 }
268 isolate_ = isolate; 267 isolate_ = isolate;
269 } 268 }
270 269
271 270
272 const AstValue* AstValueFactory::NewString(const AstRawString* string) { 271 const AstValue* AstValueFactory::NewString(const AstRawString* string) {
273 AstValue* value = new (zone_) AstValue(string); 272 AstValue* value = new (zone_) AstValue(string);
274 DCHECK(string != NULL); 273 DCHECK(string != NULL);
275 if (isolate_) { 274 if (isolate_) {
276 value->Internalize(isolate_); 275 // If we're creating immediately-internalized AstValues, the underlying
276 // strings must already be internalized at this point.
277 DCHECK(!string->string_.is_null());
277 } 278 }
278 values_.Add(value); 279 // These AstValues don't need to be added to values_, since the AstRawStrings
280 // will be insternalized separately.
279 return value; 281 return value;
280 } 282 }
281 283
282 284
283 const AstValue* AstValueFactory::NewSymbol(const char* name) { 285 const AstValue* AstValueFactory::NewSymbol(const char* name) {
284 AstValue* value = new (zone_) AstValue(name); 286 AstValue* value = new (zone_) AstValue(name);
285 if (isolate_) { 287 if (isolate_) {
286 value->Internalize(isolate_); 288 value->Internalize(isolate_);
289 } else {
290 values_.Add(value);
287 } 291 }
288 values_.Add(value);
289 return value; 292 return value;
290 } 293 }
291 294
292 295
293 const AstValue* AstValueFactory::NewNumber(double number) { 296 const AstValue* AstValueFactory::NewNumber(double number) {
294 AstValue* value = new (zone_) AstValue(number); 297 AstValue* value = new (zone_) AstValue(number);
295 if (isolate_) { 298 if (isolate_) {
296 value->Internalize(isolate_); 299 value->Internalize(isolate_);
300 } else {
301 values_.Add(value);
297 } 302 }
298 values_.Add(value);
299 return value; 303 return value;
300 } 304 }
301 305
302 306
303 const AstValue* AstValueFactory::NewSmi(int number) { 307 const AstValue* AstValueFactory::NewSmi(int number) {
304 AstValue* value = 308 AstValue* value =
305 new (zone_) AstValue(AstValue::SMI, number); 309 new (zone_) AstValue(AstValue::SMI, number);
306 if (isolate_) { 310 if (isolate_) {
307 value->Internalize(isolate_); 311 value->Internalize(isolate_);
312 } else {
313 values_.Add(value);
308 } 314 }
309 values_.Add(value);
310 return value; 315 return value;
311 } 316 }
312 317
313 318
314 #define GENERATE_VALUE_GETTER(value, initializer) \ 319 #define GENERATE_VALUE_GETTER(value, initializer) \
315 if (!value) { \ 320 if (!value) { \
316 value = new (zone_) AstValue(initializer); \ 321 value = new (zone_) AstValue(initializer); \
317 if (isolate_) { \ 322 if (isolate_) { \
318 value->Internalize(isolate_); \ 323 value->Internalize(isolate_); \
324 } else { \
325 values_.Add(value); \
319 } \ 326 } \
320 values_.Add(value); \
321 } \ 327 } \
322 return value; 328 return value;
323 329
324 330
325 const AstValue* AstValueFactory::NewBoolean(bool b) { 331 const AstValue* AstValueFactory::NewBoolean(bool b) {
326 if (b) { 332 if (b) {
327 GENERATE_VALUE_GETTER(true_value_, true); 333 GENERATE_VALUE_GETTER(true_value_, true);
328 } else { 334 } else {
329 GENERATE_VALUE_GETTER(false_value_, false); 335 GENERATE_VALUE_GETTER(false_value_, false);
330 } 336 }
(...skipping 26 matching lines...) Expand all
357 AstRawString key(is_one_byte, literal_bytes, hash); 363 AstRawString key(is_one_byte, literal_bytes, hash);
358 HashMap::Entry* entry = string_table_.Lookup(&key, hash, true); 364 HashMap::Entry* entry = string_table_.Lookup(&key, hash, true);
359 if (entry->value == NULL) { 365 if (entry->value == NULL) {
360 // Copy literal contents for later comparison. 366 // Copy literal contents for later comparison.
361 int length = literal_bytes.length(); 367 int length = literal_bytes.length();
362 byte* new_literal_bytes = zone_->NewArray<byte>(length); 368 byte* new_literal_bytes = zone_->NewArray<byte>(length);
363 memcpy(new_literal_bytes, literal_bytes.start(), length); 369 memcpy(new_literal_bytes, literal_bytes.start(), length);
364 AstRawString* new_string = new (zone_) AstRawString( 370 AstRawString* new_string = new (zone_) AstRawString(
365 is_one_byte, Vector<const byte>(new_literal_bytes, length), hash); 371 is_one_byte, Vector<const byte>(new_literal_bytes, length), hash);
366 entry->key = new_string; 372 entry->key = new_string;
367 strings_.Add(new_string);
368 if (isolate_) { 373 if (isolate_) {
369 new_string->Internalize(isolate_); 374 new_string->Internalize(isolate_);
375 } else {
376 strings_.Add(new_string);
370 } 377 }
371 entry->value = reinterpret_cast<void*>(1); 378 entry->value = reinterpret_cast<void*>(1);
372 } 379 }
373 return reinterpret_cast<AstRawString*>(entry->key); 380 return reinterpret_cast<AstRawString*>(entry->key);
374 } 381 }
375 382
376 383
377 } } // namespace v8::internal 384 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698