OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ic/ic-state.h" | |
7 #include "src/objects.h" | 8 #include "src/objects.h" |
8 #include "src/type-feedback-vector-inl.h" | 9 #include "src/type-feedback-vector-inl.h" |
9 | 10 |
10 namespace v8 { | 11 namespace v8 { |
11 namespace internal { | 12 namespace internal { |
12 | 13 |
13 // static | 14 // static |
15 Handle<TypeFeedbackVector> TypeFeedbackVector::Allocate(Isolate* isolate, | |
16 int slot_count, | |
17 int ic_slot_count) { | |
18 int length = slot_count + ic_slot_count + kReservedIndexCount; | |
19 if (length == kReservedIndexCount) { | |
20 return Handle<TypeFeedbackVector>::cast( | |
21 isolate->factory()->empty_fixed_array()); | |
22 } | |
23 | |
24 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length, TENURED); | |
25 if (ic_slot_count > 0) { | |
26 array->set(kFirstICSlotIndex, | |
27 Smi::FromInt(slot_count + kReservedIndexCount)); | |
28 } else { | |
29 array->set(kFirstICSlotIndex, Smi::FromInt(length)); | |
30 } | |
31 array->set(kWithTypesIndex, Smi::FromInt(0)); | |
32 array->set(kGenericCountIndex, Smi::FromInt(0)); | |
33 | |
34 // Ensure we can skip the write barrier | |
35 Handle<Object> uninitialized_sentinel = UninitializedSentinel(isolate); | |
36 DCHECK_EQ(isolate->heap()->uninitialized_symbol(), *uninitialized_sentinel); | |
37 for (int i = kReservedIndexCount; i < length; i++) { | |
38 array->set(i, *uninitialized_sentinel, SKIP_WRITE_BARRIER); | |
39 } | |
40 return Handle<TypeFeedbackVector>::cast(array); | |
41 } | |
42 | |
43 | |
44 // static | |
14 Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( | 45 Handle<TypeFeedbackVector> TypeFeedbackVector::Copy( |
15 Isolate* isolate, Handle<TypeFeedbackVector> vector) { | 46 Isolate* isolate, Handle<TypeFeedbackVector> vector) { |
16 Handle<TypeFeedbackVector> result; | 47 Handle<TypeFeedbackVector> result; |
17 result = Handle<TypeFeedbackVector>::cast( | 48 result = Handle<TypeFeedbackVector>::cast( |
18 isolate->factory()->CopyFixedArray(Handle<FixedArray>::cast(vector))); | 49 isolate->factory()->CopyFixedArray(Handle<FixedArray>::cast(vector))); |
19 return result; | 50 return result; |
20 } | 51 } |
52 | |
53 | |
54 void TypeFeedbackVector::ClearSlots(SharedFunctionInfo* shared) { | |
55 int slots = Slots(); | |
56 Isolate* isolate = GetIsolate(); | |
57 Object* uninitialized_sentinel = | |
58 TypeFeedbackVector::RawUninitializedSentinel(isolate->heap()); | |
59 | |
60 for (int i = 0; i < slots; i++) { | |
61 FeedbackVectorSlot slot(i); | |
62 Object* obj = Get(slot); | |
63 if (obj->IsHeapObject()) { | |
64 InstanceType instance_type = | |
65 HeapObject::cast(obj)->map()->instance_type(); | |
66 switch (instance_type) { | |
67 case ALLOCATION_SITE_TYPE: | |
68 // AllocationSites are not cleared because they do not store | |
69 // information that leaks. | |
70 break; | |
71 // Fall through... | |
Jakob Kummerow
2014/10/20 10:29:43
Uhm, what? Either "break;" or "// Fall through.",
mvstanton
2014/10/20 11:09:22
You are right, it's unwieldy...changing to if()...
| |
72 default: | |
73 Set(slot, uninitialized_sentinel, SKIP_WRITE_BARRIER); | |
74 } | |
75 } | |
76 } | |
77 | |
78 // Now clear vector-based ICs. They are all CallICs. | |
Jakob Kummerow
2014/10/20 10:29:43
Whoa. The comment in the header said "leaves vecto
mvstanton
2014/10/20 11:09:22
Nice catch, I'll fix that outdated comment in the
| |
79 // Try and pass the containing code (the "host") | |
80 slots = ICSlots(); | |
81 Code* host = shared->code(); | |
82 for (int i = 0; i < slots; i++) { | |
83 FeedbackVectorICSlot slot(i); | |
84 Object* obj = Get(slot); | |
85 if (obj != uninitialized_sentinel) { | |
86 ICUtility::Clear(isolate, Code::CALL_IC, host, this, slot); | |
87 } | |
88 } | |
89 } | |
21 } | 90 } |
22 } // namespace v8::internal | 91 } // namespace v8::internal |
OLD | NEW |