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

Side by Side Diff: src/scopeinfo.cc

Issue 6993008: Allow closures to be optimized if outer contexts that call eval are all in strict mode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 7 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
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2011 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
11 // with the distribution. 11 // with the distribution.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 int y = (t != NULL ? t->index() : 0); 45 int y = (t != NULL ? t->index() : 0);
46 // Consider sorting them according to type as well? 46 // Consider sorting them according to type as well?
47 return x - y; 47 return x - y;
48 } 48 }
49 49
50 50
51 template<class Allocator> 51 template<class Allocator>
52 ScopeInfo<Allocator>::ScopeInfo(Scope* scope) 52 ScopeInfo<Allocator>::ScopeInfo(Scope* scope)
53 : function_name_(FACTORY->empty_symbol()), 53 : function_name_(FACTORY->empty_symbol()),
54 calls_eval_(scope->calls_eval()), 54 calls_eval_(scope->calls_eval()),
55 is_strict_mode_(scope->is_strict_mode()),
55 parameters_(scope->num_parameters()), 56 parameters_(scope->num_parameters()),
56 stack_slots_(scope->num_stack_slots()), 57 stack_slots_(scope->num_stack_slots()),
57 context_slots_(scope->num_heap_slots()), 58 context_slots_(scope->num_heap_slots()),
58 context_modes_(scope->num_heap_slots()) { 59 context_modes_(scope->num_heap_slots()) {
59 // Add parameters. 60 // Add parameters.
60 for (int i = 0; i < scope->num_parameters(); i++) { 61 for (int i = 0; i < scope->num_parameters(); i++) {
61 ASSERT(parameters_.length() == i); 62 ASSERT(parameters_.length() == i);
62 parameters_.Add(scope->parameter(i)->name()); 63 parameters_.Add(scope->parameter(i)->name());
63 } 64 }
64 65
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 : function_name_(FACTORY->empty_symbol()), 242 : function_name_(FACTORY->empty_symbol()),
242 parameters_(4), 243 parameters_(4),
243 stack_slots_(8), 244 stack_slots_(8),
244 context_slots_(8), 245 context_slots_(8),
245 context_modes_(8) { 246 context_modes_(8) {
246 if (data->length() > 0) { 247 if (data->length() > 0) {
247 Object** p0 = data->data_start(); 248 Object** p0 = data->data_start();
248 Object** p = p0; 249 Object** p = p0;
249 p = ReadSymbol(p, &function_name_); 250 p = ReadSymbol(p, &function_name_);
250 p = ReadBool(p, &calls_eval_); 251 p = ReadBool(p, &calls_eval_);
252 p = ReadBool(p, &is_strict_mode_);
251 p = ReadList<Allocator>(p, &context_slots_, &context_modes_); 253 p = ReadList<Allocator>(p, &context_slots_, &context_modes_);
252 p = ReadList<Allocator>(p, &parameters_); 254 p = ReadList<Allocator>(p, &parameters_);
253 p = ReadList<Allocator>(p, &stack_slots_); 255 p = ReadList<Allocator>(p, &stack_slots_);
254 ASSERT((p - p0) == FixedArray::cast(data)->length()); 256 ASSERT((p - p0) == FixedArray::cast(data)->length());
255 } 257 }
256 } 258 }
257 259
258 260
259 static inline Object** WriteInt(Object** p, int x) { 261 static inline Object** WriteInt(Object** p, int x) {
260 *p++ = Smi::FromInt(x); 262 *p++ = Smi::FromInt(x);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 for (int i = 0; i < n; i++) { 296 for (int i = 0; i < n; i++) {
295 p = WriteSymbol(p, list->at(i)); 297 p = WriteSymbol(p, list->at(i));
296 p = WriteInt(p, modes->at(i)); 298 p = WriteInt(p, modes->at(i));
297 } 299 }
298 return p; 300 return p;
299 } 301 }
300 302
301 303
302 template<class Allocator> 304 template<class Allocator>
303 Handle<SerializedScopeInfo> ScopeInfo<Allocator>::Serialize() { 305 Handle<SerializedScopeInfo> ScopeInfo<Allocator>::Serialize() {
304 // function name, calls eval, length for 3 tables: 306 // function name, calls eval, is_strict_mode, length for 3 tables:
305 const int extra_slots = 1 + 1 + 3; 307 const int extra_slots = 1 + 1 + 1 + 3;
306 int length = extra_slots + 308 int length = extra_slots +
307 context_slots_.length() * 2 + 309 context_slots_.length() * 2 +
308 parameters_.length() + 310 parameters_.length() +
309 stack_slots_.length(); 311 stack_slots_.length();
310 312
311 Handle<SerializedScopeInfo> data( 313 Handle<SerializedScopeInfo> data(
312 SerializedScopeInfo::cast(*FACTORY->NewFixedArray(length, TENURED))); 314 SerializedScopeInfo::cast(*FACTORY->NewFixedArray(length, TENURED)));
313 AssertNoAllocation nogc; 315 AssertNoAllocation nogc;
314 316
315 Object** p0 = data->data_start(); 317 Object** p0 = data->data_start();
316 Object** p = p0; 318 Object** p = p0;
317 p = WriteSymbol(p, function_name_); 319 p = WriteSymbol(p, function_name_);
318 p = WriteBool(p, calls_eval_); 320 p = WriteBool(p, calls_eval_);
321 p = WriteBool(p, is_strict_mode_);
319 p = WriteList(p, &context_slots_, &context_modes_); 322 p = WriteList(p, &context_slots_, &context_modes_);
320 p = WriteList(p, &parameters_); 323 p = WriteList(p, &parameters_);
321 p = WriteList(p, &stack_slots_); 324 p = WriteList(p, &stack_slots_);
322 ASSERT((p - p0) == length); 325 ASSERT((p - p0) == length);
323 326
324 return data; 327 return data;
325 } 328 }
326 329
327 330
328 template<class Allocator> 331 template<class Allocator>
(...skipping 27 matching lines...) Expand all
356 } 359 }
357 360
358 361
359 SerializedScopeInfo* SerializedScopeInfo::Empty() { 362 SerializedScopeInfo* SerializedScopeInfo::Empty() {
360 return reinterpret_cast<SerializedScopeInfo*>(HEAP->empty_fixed_array()); 363 return reinterpret_cast<SerializedScopeInfo*>(HEAP->empty_fixed_array());
361 } 364 }
362 365
363 366
364 Object** SerializedScopeInfo::ContextEntriesAddr() { 367 Object** SerializedScopeInfo::ContextEntriesAddr() {
365 ASSERT(length() > 0); 368 ASSERT(length() > 0);
366 return data_start() + 2; // +2 for function name and calls eval. 369 // +3 for function name, calls eval, strict mode.
370 return data_start() + 3;
367 } 371 }
368 372
369 373
370 Object** SerializedScopeInfo::ParameterEntriesAddr() { 374 Object** SerializedScopeInfo::ParameterEntriesAddr() {
371 ASSERT(length() > 0); 375 ASSERT(length() > 0);
372 Object** p = ContextEntriesAddr(); 376 Object** p = ContextEntriesAddr();
373 int number_of_context_slots; 377 int number_of_context_slots;
374 p = ReadInt(p, &number_of_context_slots); 378 p = ReadInt(p, &number_of_context_slots);
375 return p + number_of_context_slots*2; // *2 for pairs 379 return p + number_of_context_slots*2; // *2 for pairs
376 } 380 }
377 381
378 382
379 Object** SerializedScopeInfo::StackSlotEntriesAddr() { 383 Object** SerializedScopeInfo::StackSlotEntriesAddr() {
380 ASSERT(length() > 0); 384 ASSERT(length() > 0);
381 Object** p = ParameterEntriesAddr(); 385 Object** p = ParameterEntriesAddr();
382 int number_of_parameter_slots; 386 int number_of_parameter_slots;
383 p = ReadInt(p, &number_of_parameter_slots); 387 p = ReadInt(p, &number_of_parameter_slots);
384 return p + number_of_parameter_slots; 388 return p + number_of_parameter_slots;
385 } 389 }
386 390
387 391
388 bool SerializedScopeInfo::CallsEval() { 392 bool SerializedScopeInfo::CallsEval() {
389 if (length() > 0) { 393 if (length() > 0) {
390 Object** p = data_start() + 1; // +1 for function name. 394 Object** p = data_start() + 1; // +1 for function name.
391 bool calls_eval; 395 bool calls_eval;
392 p = ReadBool(p, &calls_eval); 396 p = ReadBool(p, &calls_eval);
393 return calls_eval; 397 return calls_eval;
394 } 398 }
395 return true; 399 return false;
396 } 400 }
397 401
398 402
403 bool SerializedScopeInfo::IsStrictMode() {
404 if (length() > 0) {
405 Object** p = data_start() + 2; // +2 for function name, calls eval.
406 bool strict_mode;
407 p = ReadBool(p, &strict_mode);
408 return strict_mode;
409 }
410 return false;
411 }
412
413
399 int SerializedScopeInfo::NumberOfStackSlots() { 414 int SerializedScopeInfo::NumberOfStackSlots() {
400 if (length() > 0) { 415 if (length() > 0) {
401 Object** p = StackSlotEntriesAddr(); 416 Object** p = StackSlotEntriesAddr();
402 int number_of_stack_slots; 417 int number_of_stack_slots;
403 ReadInt(p, &number_of_stack_slots); 418 ReadInt(p, &number_of_stack_slots);
404 return number_of_stack_slots; 419 return number_of_stack_slots;
405 } 420 }
406 return 0; 421 return 0;
407 } 422 }
408 423
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 } 637 }
623 #endif // DEBUG 638 #endif // DEBUG
624 639
625 640
626 // Make sure the classes get instantiated by the template system. 641 // Make sure the classes get instantiated by the template system.
627 template class ScopeInfo<FreeStoreAllocationPolicy>; 642 template class ScopeInfo<FreeStoreAllocationPolicy>;
628 template class ScopeInfo<PreallocatedStorage>; 643 template class ScopeInfo<PreallocatedStorage>;
629 template class ScopeInfo<ZoneListAllocationPolicy>; 644 template class ScopeInfo<ZoneListAllocationPolicy>;
630 645
631 } } // namespace v8::internal 646 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698