OLD | NEW |
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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/ast.h" | 7 #include "src/ast.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 Cell* cell = Cell::cast(value); | 42 Cell* cell = Cell::cast(value); |
43 return Handle<Object>(cell->value(), isolate()); | 43 return Handle<Object>(cell->value(), isolate()); |
44 } else { | 44 } else { |
45 return Handle<Object>(value, isolate()); | 45 return Handle<Object>(value, isolate()); |
46 } | 46 } |
47 } | 47 } |
48 return Handle<Object>::cast(isolate()->factory()->undefined_value()); | 48 return Handle<Object>::cast(isolate()->factory()->undefined_value()); |
49 } | 49 } |
50 | 50 |
51 | 51 |
52 Handle<Object> TypeFeedbackOracle::GetInfo(int slot) { | 52 Handle<Object> TypeFeedbackOracle::GetInfo(FeedbackVectorSlot slot) { |
53 DCHECK(slot >= 0 && slot < feedback_vector_->length()); | 53 DCHECK(slot.ToInt() >= 0 && slot.ToInt() < feedback_vector_->length()); |
54 Object* obj = feedback_vector_->get(slot); | 54 Object* obj = feedback_vector_->get(slot.ToInt()); |
55 if (!obj->IsJSFunction() || | 55 if (!obj->IsJSFunction() || |
56 !CanRetainOtherContext(JSFunction::cast(obj), *native_context_)) { | 56 !CanRetainOtherContext(JSFunction::cast(obj), *native_context_)) { |
57 return Handle<Object>(obj, isolate()); | 57 return Handle<Object>(obj, isolate()); |
58 } | 58 } |
59 return Handle<Object>::cast(isolate()->factory()->undefined_value()); | 59 return Handle<Object>::cast(isolate()->factory()->undefined_value()); |
60 } | 60 } |
61 | 61 |
62 | 62 |
63 bool TypeFeedbackOracle::LoadIsUninitialized(TypeFeedbackId id) { | 63 bool TypeFeedbackOracle::LoadIsUninitialized(TypeFeedbackId id) { |
64 Handle<Object> maybe_code = GetInfo(id); | 64 Handle<Object> maybe_code = GetInfo(id); |
65 if (maybe_code->IsCode()) { | 65 if (maybe_code->IsCode()) { |
66 Handle<Code> code = Handle<Code>::cast(maybe_code); | 66 Handle<Code> code = Handle<Code>::cast(maybe_code); |
67 return code->is_inline_cache_stub() && code->ic_state() == UNINITIALIZED; | 67 return code->is_inline_cache_stub() && code->ic_state() == UNINITIALIZED; |
68 } | 68 } |
69 return false; | 69 return false; |
70 } | 70 } |
71 | 71 |
72 | 72 |
73 bool TypeFeedbackOracle::StoreIsUninitialized(TypeFeedbackId ast_id) { | 73 bool TypeFeedbackOracle::StoreIsUninitialized(TypeFeedbackId ast_id) { |
74 Handle<Object> maybe_code = GetInfo(ast_id); | 74 Handle<Object> maybe_code = GetInfo(ast_id); |
75 if (!maybe_code->IsCode()) return false; | 75 if (!maybe_code->IsCode()) return false; |
76 Handle<Code> code = Handle<Code>::cast(maybe_code); | 76 Handle<Code> code = Handle<Code>::cast(maybe_code); |
77 return code->ic_state() == UNINITIALIZED; | 77 return code->ic_state() == UNINITIALIZED; |
78 } | 78 } |
79 | 79 |
80 | 80 |
81 bool TypeFeedbackOracle::CallIsMonomorphic(int slot) { | 81 bool TypeFeedbackOracle::CallIsMonomorphic(FeedbackVectorSlot slot) { |
82 Handle<Object> value = GetInfo(slot); | 82 Handle<Object> value = GetInfo(slot); |
83 return value->IsAllocationSite() || value->IsJSFunction(); | 83 return value->IsAllocationSite() || value->IsJSFunction(); |
84 } | 84 } |
85 | 85 |
86 | 86 |
87 bool TypeFeedbackOracle::CallNewIsMonomorphic(int slot) { | 87 bool TypeFeedbackOracle::CallNewIsMonomorphic(FeedbackVectorSlot slot) { |
88 Handle<Object> info = GetInfo(slot); | 88 Handle<Object> info = GetInfo(slot); |
89 return FLAG_pretenuring_call_new | 89 return FLAG_pretenuring_call_new |
90 ? info->IsJSFunction() | 90 ? info->IsJSFunction() |
91 : info->IsAllocationSite() || info->IsJSFunction(); | 91 : info->IsAllocationSite() || info->IsJSFunction(); |
92 } | 92 } |
93 | 93 |
94 | 94 |
95 byte TypeFeedbackOracle::ForInType(int feedback_vector_slot) { | 95 byte TypeFeedbackOracle::ForInType(FeedbackVectorSlot feedback_vector_slot) { |
96 Handle<Object> value = GetInfo(feedback_vector_slot); | 96 Handle<Object> value = GetInfo(feedback_vector_slot); |
97 return value.is_identical_to( | 97 return value.is_identical_to( |
98 TypeFeedbackVector::UninitializedSentinel(isolate())) | 98 TypeFeedbackVector::UninitializedSentinel(isolate())) |
99 ? ForInStatement::FAST_FOR_IN | 99 ? ForInStatement::FAST_FOR_IN |
100 : ForInStatement::SLOW_FOR_IN; | 100 : ForInStatement::SLOW_FOR_IN; |
101 } | 101 } |
102 | 102 |
103 | 103 |
104 KeyedAccessStoreMode TypeFeedbackOracle::GetStoreMode( | 104 KeyedAccessStoreMode TypeFeedbackOracle::GetStoreMode( |
105 TypeFeedbackId ast_id) { | 105 TypeFeedbackId ast_id) { |
106 Handle<Object> maybe_code = GetInfo(ast_id); | 106 Handle<Object> maybe_code = GetInfo(ast_id); |
107 if (maybe_code->IsCode()) { | 107 if (maybe_code->IsCode()) { |
108 Handle<Code> code = Handle<Code>::cast(maybe_code); | 108 Handle<Code> code = Handle<Code>::cast(maybe_code); |
109 if (code->kind() == Code::KEYED_STORE_IC) { | 109 if (code->kind() == Code::KEYED_STORE_IC) { |
110 return KeyedStoreIC::GetKeyedAccessStoreMode(code->extra_ic_state()); | 110 return KeyedStoreIC::GetKeyedAccessStoreMode(code->extra_ic_state()); |
111 } | 111 } |
112 } | 112 } |
113 return STANDARD_STORE; | 113 return STANDARD_STORE; |
114 } | 114 } |
115 | 115 |
116 | 116 |
117 Handle<JSFunction> TypeFeedbackOracle::GetCallTarget(int slot) { | 117 Handle<JSFunction> TypeFeedbackOracle::GetCallTarget(FeedbackVectorSlot slot) { |
118 Handle<Object> info = GetInfo(slot); | 118 Handle<Object> info = GetInfo(slot); |
119 if (info->IsAllocationSite()) { | 119 if (info->IsAllocationSite()) { |
120 return Handle<JSFunction>(isolate()->native_context()->array_function()); | 120 return Handle<JSFunction>(isolate()->native_context()->array_function()); |
121 } | 121 } |
122 | 122 |
123 return Handle<JSFunction>::cast(info); | 123 return Handle<JSFunction>::cast(info); |
124 } | 124 } |
125 | 125 |
126 | 126 |
127 Handle<JSFunction> TypeFeedbackOracle::GetCallNewTarget(int slot) { | 127 Handle<JSFunction> TypeFeedbackOracle::GetCallNewTarget( |
| 128 FeedbackVectorSlot slot) { |
128 Handle<Object> info = GetInfo(slot); | 129 Handle<Object> info = GetInfo(slot); |
129 if (FLAG_pretenuring_call_new || info->IsJSFunction()) { | 130 if (FLAG_pretenuring_call_new || info->IsJSFunction()) { |
130 return Handle<JSFunction>::cast(info); | 131 return Handle<JSFunction>::cast(info); |
131 } | 132 } |
132 | 133 |
133 DCHECK(info->IsAllocationSite()); | 134 DCHECK(info->IsAllocationSite()); |
134 return Handle<JSFunction>(isolate()->native_context()->array_function()); | 135 return Handle<JSFunction>(isolate()->native_context()->array_function()); |
135 } | 136 } |
136 | 137 |
137 | 138 |
138 Handle<AllocationSite> TypeFeedbackOracle::GetCallAllocationSite(int slot) { | 139 Handle<AllocationSite> TypeFeedbackOracle::GetCallAllocationSite( |
| 140 FeedbackVectorSlot slot) { |
139 Handle<Object> info = GetInfo(slot); | 141 Handle<Object> info = GetInfo(slot); |
140 if (info->IsAllocationSite()) { | 142 if (info->IsAllocationSite()) { |
141 return Handle<AllocationSite>::cast(info); | 143 return Handle<AllocationSite>::cast(info); |
142 } | 144 } |
143 return Handle<AllocationSite>::null(); | 145 return Handle<AllocationSite>::null(); |
144 } | 146 } |
145 | 147 |
146 | 148 |
147 Handle<AllocationSite> TypeFeedbackOracle::GetCallNewAllocationSite(int slot) { | 149 Handle<AllocationSite> TypeFeedbackOracle::GetCallNewAllocationSite( |
| 150 FeedbackVectorSlot slot) { |
148 Handle<Object> info = GetInfo(slot); | 151 Handle<Object> info = GetInfo(slot); |
149 if (FLAG_pretenuring_call_new || info->IsAllocationSite()) { | 152 if (FLAG_pretenuring_call_new || info->IsAllocationSite()) { |
150 return Handle<AllocationSite>::cast(info); | 153 return Handle<AllocationSite>::cast(info); |
151 } | 154 } |
152 return Handle<AllocationSite>::null(); | 155 return Handle<AllocationSite>::null(); |
153 } | 156 } |
154 | 157 |
155 | 158 |
156 bool TypeFeedbackOracle::LoadIsBuiltin( | 159 bool TypeFeedbackOracle::LoadIsBuiltin( |
157 TypeFeedbackId id, Builtins::Name builtin) { | 160 TypeFeedbackId id, Builtins::Name builtin) { |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 UnseededNumberDictionary::kNotFound); | 450 UnseededNumberDictionary::kNotFound); |
448 // Dictionary has been allocated with sufficient size for all elements. | 451 // Dictionary has been allocated with sufficient size for all elements. |
449 DisallowHeapAllocation no_need_to_resize_dictionary; | 452 DisallowHeapAllocation no_need_to_resize_dictionary; |
450 HandleScope scope(isolate()); | 453 HandleScope scope(isolate()); |
451 USE(UnseededNumberDictionary::AtNumberPut( | 454 USE(UnseededNumberDictionary::AtNumberPut( |
452 dictionary_, IdToKey(ast_id), handle(target, isolate()))); | 455 dictionary_, IdToKey(ast_id), handle(target, isolate()))); |
453 } | 456 } |
454 | 457 |
455 | 458 |
456 } } // namespace v8::internal | 459 } } // namespace v8::internal |
OLD | NEW |