OLD | NEW |
1 // Copyright 2011 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 |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 function_name_ = proxy->name(); | 131 function_name_ = proxy->name(); |
132 // Note that we must not find the function name in the context slot | 132 // Note that we must not find the function name in the context slot |
133 // list - instead it must be handled separately in the | 133 // list - instead it must be handled separately in the |
134 // Contexts::Lookup() function. Thus record an empty symbol here so we | 134 // Contexts::Lookup() function. Thus record an empty symbol here so we |
135 // get the correct number of context slots. | 135 // get the correct number of context slots. |
136 ASSERT(proxy->var()->index() - Context::MIN_CONTEXT_SLOTS == | 136 ASSERT(proxy->var()->index() - Context::MIN_CONTEXT_SLOTS == |
137 context_slots_.length()); | 137 context_slots_.length()); |
138 ASSERT(proxy->var()->index() - Context::MIN_CONTEXT_SLOTS == | 138 ASSERT(proxy->var()->index() - Context::MIN_CONTEXT_SLOTS == |
139 context_modes_.length()); | 139 context_modes_.length()); |
140 context_slots_.Add(FACTORY->empty_symbol()); | 140 context_slots_.Add(FACTORY->empty_symbol()); |
141 context_modes_.Add(Variable::INTERNAL); | 141 context_modes_.Add(INTERNAL); |
142 } | 142 } |
143 } | 143 } |
144 } | 144 } |
145 | 145 |
146 | 146 |
147 // Encoding format in a FixedArray object: | 147 // Encoding format in a FixedArray object: |
148 // | 148 // |
149 // - function name | 149 // - function name |
150 // | 150 // |
151 // - calls eval boolean flag | 151 // - calls eval boolean flag |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 p = ReadSymbol(p, &s); | 209 p = ReadSymbol(p, &s); |
210 list->Add(s); | 210 list->Add(s); |
211 } | 211 } |
212 return p; | 212 return p; |
213 } | 213 } |
214 | 214 |
215 | 215 |
216 template <class Allocator> | 216 template <class Allocator> |
217 static Object** ReadList(Object** p, | 217 static Object** ReadList(Object** p, |
218 List<Handle<String>, Allocator>* list, | 218 List<Handle<String>, Allocator>* list, |
219 List<Variable::Mode, Allocator>* modes) { | 219 List<VariableMode, Allocator>* modes) { |
220 ASSERT(list->is_empty()); | 220 ASSERT(list->is_empty()); |
221 int n; | 221 int n; |
222 p = ReadInt(p, &n); | 222 p = ReadInt(p, &n); |
223 while (n-- > 0) { | 223 while (n-- > 0) { |
224 Handle<String> s; | 224 Handle<String> s; |
225 int m; | 225 int m; |
226 p = ReadSymbol(p, &s); | 226 p = ReadSymbol(p, &s); |
227 p = ReadInt(p, &m); | 227 p = ReadInt(p, &m); |
228 list->Add(s); | 228 list->Add(s); |
229 modes->Add(static_cast<Variable::Mode>(m)); | 229 modes->Add(static_cast<VariableMode>(m)); |
230 } | 230 } |
231 return p; | 231 return p; |
232 } | 232 } |
233 | 233 |
234 | 234 |
235 template<class Allocator> | 235 template<class Allocator> |
236 ScopeInfo<Allocator>::ScopeInfo(SerializedScopeInfo* data) | 236 ScopeInfo<Allocator>::ScopeInfo(SerializedScopeInfo* data) |
237 : function_name_(FACTORY->empty_symbol()), | 237 : function_name_(FACTORY->empty_symbol()), |
238 parameters_(4), | 238 parameters_(4), |
239 stack_slots_(8), | 239 stack_slots_(8), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 for (int i = 0; i < n; i++) { | 278 for (int i = 0; i < n; i++) { |
279 p = WriteSymbol(p, list->at(i)); | 279 p = WriteSymbol(p, list->at(i)); |
280 } | 280 } |
281 return p; | 281 return p; |
282 } | 282 } |
283 | 283 |
284 | 284 |
285 template <class Allocator> | 285 template <class Allocator> |
286 static Object** WriteList(Object** p, | 286 static Object** WriteList(Object** p, |
287 List<Handle<String>, Allocator>* list, | 287 List<Handle<String>, Allocator>* list, |
288 List<Variable::Mode, Allocator>* modes) { | 288 List<VariableMode, Allocator>* modes) { |
289 const int n = list->length(); | 289 const int n = list->length(); |
290 p = WriteInt(p, n); | 290 p = WriteInt(p, n); |
291 for (int i = 0; i < n; i++) { | 291 for (int i = 0; i < n; i++) { |
292 p = WriteSymbol(p, list->at(i)); | 292 p = WriteSymbol(p, list->at(i)); |
293 p = WriteInt(p, modes->at(i)); | 293 p = WriteInt(p, modes->at(i)); |
294 } | 294 } |
295 return p; | 295 return p; |
296 } | 296 } |
297 | 297 |
298 | 298 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 Object** p = p0; | 449 Object** p = p0; |
450 Object** end = p0 + number_of_stack_slots; | 450 Object** end = p0 + number_of_stack_slots; |
451 while (p != end) { | 451 while (p != end) { |
452 if (*p == name) return static_cast<int>(p - p0); | 452 if (*p == name) return static_cast<int>(p - p0); |
453 p++; | 453 p++; |
454 } | 454 } |
455 } | 455 } |
456 return -1; | 456 return -1; |
457 } | 457 } |
458 | 458 |
459 int SerializedScopeInfo::ContextSlotIndex(String* name, Variable::Mode* mode) { | 459 int SerializedScopeInfo::ContextSlotIndex(String* name, VariableMode* mode) { |
460 ASSERT(name->IsSymbol()); | 460 ASSERT(name->IsSymbol()); |
461 Isolate* isolate = GetIsolate(); | 461 Isolate* isolate = GetIsolate(); |
462 int result = isolate->context_slot_cache()->Lookup(this, name, mode); | 462 int result = isolate->context_slot_cache()->Lookup(this, name, mode); |
463 if (result != ContextSlotCache::kNotFound) return result; | 463 if (result != ContextSlotCache::kNotFound) return result; |
464 if (length() > 0) { | 464 if (length() > 0) { |
465 // Slots start after length entry. | 465 // Slots start after length entry. |
466 Object** p0 = ContextEntriesAddr(); | 466 Object** p0 = ContextEntriesAddr(); |
467 int number_of_context_slots; | 467 int number_of_context_slots; |
468 p0 = ReadInt(p0, &number_of_context_slots); | 468 p0 = ReadInt(p0, &number_of_context_slots); |
469 Object** p = p0; | 469 Object** p = p0; |
470 Object** end = p0 + number_of_context_slots * 2; | 470 Object** end = p0 + number_of_context_slots * 2; |
471 while (p != end) { | 471 while (p != end) { |
472 if (*p == name) { | 472 if (*p == name) { |
473 ASSERT(((p - p0) & 1) == 0); | 473 ASSERT(((p - p0) & 1) == 0); |
474 int v; | 474 int v; |
475 ReadInt(p + 1, &v); | 475 ReadInt(p + 1, &v); |
476 Variable::Mode mode_value = static_cast<Variable::Mode>(v); | 476 VariableMode mode_value = static_cast<VariableMode>(v); |
477 if (mode != NULL) *mode = mode_value; | 477 if (mode != NULL) *mode = mode_value; |
478 result = static_cast<int>((p - p0) >> 1) + Context::MIN_CONTEXT_SLOTS; | 478 result = static_cast<int>((p - p0) >> 1) + Context::MIN_CONTEXT_SLOTS; |
479 isolate->context_slot_cache()->Update(this, name, mode_value, result); | 479 isolate->context_slot_cache()->Update(this, name, mode_value, result); |
480 return result; | 480 return result; |
481 } | 481 } |
482 p += 2; | 482 p += 2; |
483 } | 483 } |
484 } | 484 } |
485 isolate->context_slot_cache()->Update(this, name, Variable::INTERNAL, -1); | 485 isolate->context_slot_cache()->Update(this, name, INTERNAL, -1); |
486 return -1; | 486 return -1; |
487 } | 487 } |
488 | 488 |
489 | 489 |
490 int SerializedScopeInfo::ParameterIndex(String* name) { | 490 int SerializedScopeInfo::ParameterIndex(String* name) { |
491 ASSERT(name->IsSymbol()); | 491 ASSERT(name->IsSymbol()); |
492 if (length() > 0) { | 492 if (length() > 0) { |
493 // We must read parameters from the end since for | 493 // We must read parameters from the end since for |
494 // multiply declared parameters the value of the | 494 // multiply declared parameters the value of the |
495 // last declaration of that parameter is used | 495 // last declaration of that parameter is used |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
533 int ContextSlotCache::Hash(Object* data, String* name) { | 533 int ContextSlotCache::Hash(Object* data, String* name) { |
534 // Uses only lower 32 bits if pointers are larger. | 534 // Uses only lower 32 bits if pointers are larger. |
535 uintptr_t addr_hash = | 535 uintptr_t addr_hash = |
536 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(data)) >> 2; | 536 static_cast<uint32_t>(reinterpret_cast<uintptr_t>(data)) >> 2; |
537 return static_cast<int>((addr_hash ^ name->Hash()) % kLength); | 537 return static_cast<int>((addr_hash ^ name->Hash()) % kLength); |
538 } | 538 } |
539 | 539 |
540 | 540 |
541 int ContextSlotCache::Lookup(Object* data, | 541 int ContextSlotCache::Lookup(Object* data, |
542 String* name, | 542 String* name, |
543 Variable::Mode* mode) { | 543 VariableMode* mode) { |
544 int index = Hash(data, name); | 544 int index = Hash(data, name); |
545 Key& key = keys_[index]; | 545 Key& key = keys_[index]; |
546 if ((key.data == data) && key.name->Equals(name)) { | 546 if ((key.data == data) && key.name->Equals(name)) { |
547 Value result(values_[index]); | 547 Value result(values_[index]); |
548 if (mode != NULL) *mode = result.mode(); | 548 if (mode != NULL) *mode = result.mode(); |
549 return result.index() + kNotFound; | 549 return result.index() + kNotFound; |
550 } | 550 } |
551 return kNotFound; | 551 return kNotFound; |
552 } | 552 } |
553 | 553 |
554 | 554 |
555 void ContextSlotCache::Update(Object* data, | 555 void ContextSlotCache::Update(Object* data, |
556 String* name, | 556 String* name, |
557 Variable::Mode mode, | 557 VariableMode mode, |
558 int slot_index) { | 558 int slot_index) { |
559 String* symbol; | 559 String* symbol; |
560 ASSERT(slot_index > kNotFound); | 560 ASSERT(slot_index > kNotFound); |
561 if (HEAP->LookupSymbolIfExists(name, &symbol)) { | 561 if (HEAP->LookupSymbolIfExists(name, &symbol)) { |
562 int index = Hash(data, symbol); | 562 int index = Hash(data, symbol); |
563 Key& key = keys_[index]; | 563 Key& key = keys_[index]; |
564 key.data = data; | 564 key.data = data; |
565 key.name = symbol; | 565 key.name = symbol; |
566 // Please note value only takes a uint as index. | 566 // Please note value only takes a uint as index. |
567 values_[index] = Value(mode, slot_index - kNotFound).raw(); | 567 values_[index] = Value(mode, slot_index - kNotFound).raw(); |
568 #ifdef DEBUG | 568 #ifdef DEBUG |
569 ValidateEntry(data, name, mode, slot_index); | 569 ValidateEntry(data, name, mode, slot_index); |
570 #endif | 570 #endif |
571 } | 571 } |
572 } | 572 } |
573 | 573 |
574 | 574 |
575 void ContextSlotCache::Clear() { | 575 void ContextSlotCache::Clear() { |
576 for (int index = 0; index < kLength; index++) keys_[index].data = NULL; | 576 for (int index = 0; index < kLength; index++) keys_[index].data = NULL; |
577 } | 577 } |
578 | 578 |
579 | 579 |
580 #ifdef DEBUG | 580 #ifdef DEBUG |
581 | 581 |
582 void ContextSlotCache::ValidateEntry(Object* data, | 582 void ContextSlotCache::ValidateEntry(Object* data, |
583 String* name, | 583 String* name, |
584 Variable::Mode mode, | 584 VariableMode mode, |
585 int slot_index) { | 585 int slot_index) { |
586 String* symbol; | 586 String* symbol; |
587 if (HEAP->LookupSymbolIfExists(name, &symbol)) { | 587 if (HEAP->LookupSymbolIfExists(name, &symbol)) { |
588 int index = Hash(data, name); | 588 int index = Hash(data, name); |
589 Key& key = keys_[index]; | 589 Key& key = keys_[index]; |
590 ASSERT(key.data == data); | 590 ASSERT(key.data == data); |
591 ASSERT(key.name->Equals(name)); | 591 ASSERT(key.name->Equals(name)); |
592 Value result(values_[index]); | 592 Value result(values_[index]); |
593 ASSERT(result.mode() == mode); | 593 ASSERT(result.mode() == mode); |
594 ASSERT(result.index() + kNotFound == slot_index); | 594 ASSERT(result.index() + kNotFound == slot_index); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 } | 632 } |
633 #endif // DEBUG | 633 #endif // DEBUG |
634 | 634 |
635 | 635 |
636 // Make sure the classes get instantiated by the template system. | 636 // Make sure the classes get instantiated by the template system. |
637 template class ScopeInfo<FreeStoreAllocationPolicy>; | 637 template class ScopeInfo<FreeStoreAllocationPolicy>; |
638 template class ScopeInfo<PreallocatedStorage>; | 638 template class ScopeInfo<PreallocatedStorage>; |
639 template class ScopeInfo<ZoneListAllocationPolicy>; | 639 template class ScopeInfo<ZoneListAllocationPolicy>; |
640 | 640 |
641 } } // namespace v8::internal | 641 } } // namespace v8::internal |
OLD | NEW |