OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 23 matching lines...) Expand all Loading... |
34 #include "stub-cache.h" | 34 #include "stub-cache.h" |
35 #include "vm-state-inl.h" | 35 #include "vm-state-inl.h" |
36 | 36 |
37 namespace v8 { | 37 namespace v8 { |
38 namespace internal { | 38 namespace internal { |
39 | 39 |
40 // ----------------------------------------------------------------------- | 40 // ----------------------------------------------------------------------- |
41 // StubCache implementation. | 41 // StubCache implementation. |
42 | 42 |
43 | 43 |
44 StubCache::Entry StubCache::primary_[StubCache::kPrimaryTableSize]; | 44 StubCache::StubCache(Isolate* isolate) : isolate_(isolate) { |
45 StubCache::Entry StubCache::secondary_[StubCache::kSecondaryTableSize]; | 45 ASSERT(isolate == Isolate::Current()); |
| 46 memset(primary_, 0, sizeof(primary_[0]) * StubCache::kPrimaryTableSize); |
| 47 memset(secondary_, 0, sizeof(secondary_[0]) * StubCache::kSecondaryTableSize); |
| 48 } |
| 49 |
46 | 50 |
47 void StubCache::Initialize(bool create_heap_objects) { | 51 void StubCache::Initialize(bool create_heap_objects) { |
48 ASSERT(IsPowerOf2(kPrimaryTableSize)); | 52 ASSERT(IsPowerOf2(kPrimaryTableSize)); |
49 ASSERT(IsPowerOf2(kSecondaryTableSize)); | 53 ASSERT(IsPowerOf2(kSecondaryTableSize)); |
50 if (create_heap_objects) { | 54 if (create_heap_objects) { |
51 HandleScope scope; | 55 HandleScope scope; |
52 Clear(); | 56 Clear(); |
53 } | 57 } |
54 } | 58 } |
55 | 59 |
56 | 60 |
57 Code* StubCache::Set(String* name, Map* map, Code* code) { | 61 Code* StubCache::Set(String* name, Map* map, Code* code) { |
58 // Get the flags from the code. | 62 // Get the flags from the code. |
59 Code::Flags flags = Code::RemoveTypeFromFlags(code->flags()); | 63 Code::Flags flags = Code::RemoveTypeFromFlags(code->flags()); |
60 | 64 |
61 // Validate that the name does not move on scavenge, and that we | 65 // Validate that the name does not move on scavenge, and that we |
62 // can use identity checks instead of string equality checks. | 66 // can use identity checks instead of string equality checks. |
63 ASSERT(!Heap::InNewSpace(name)); | 67 ASSERT(!isolate_->heap()->InNewSpace(name)); |
64 ASSERT(name->IsSymbol()); | 68 ASSERT(name->IsSymbol()); |
65 | 69 |
66 // The state bits are not important to the hash function because | 70 // The state bits are not important to the hash function because |
67 // the stub cache only contains monomorphic stubs. Make sure that | 71 // the stub cache only contains monomorphic stubs. Make sure that |
68 // the bits are the least significant so they will be the ones | 72 // the bits are the least significant so they will be the ones |
69 // masked out. | 73 // masked out. |
70 ASSERT(Code::ExtractICStateFromFlags(flags) == MONOMORPHIC); | 74 ASSERT(Code::ExtractICStateFromFlags(flags) == MONOMORPHIC); |
71 ASSERT(Code::kFlagsICStateShift == 0); | 75 ASSERT(Code::kFlagsICStateShift == 0); |
72 | 76 |
73 // Make sure that the code type is not included in the hash. | 77 // Make sure that the code type is not included in the hash. |
74 ASSERT(Code::ExtractTypeFromFlags(flags) == 0); | 78 ASSERT(Code::ExtractTypeFromFlags(flags) == 0); |
75 | 79 |
76 // Compute the primary entry. | 80 // Compute the primary entry. |
77 int primary_offset = PrimaryOffset(name, flags, map); | 81 int primary_offset = PrimaryOffset(name, flags, map); |
78 Entry* primary = entry(primary_, primary_offset); | 82 Entry* primary = entry(primary_, primary_offset); |
79 Code* hit = primary->value; | 83 Code* hit = primary->value; |
80 | 84 |
81 // If the primary entry has useful data in it, we retire it to the | 85 // If the primary entry has useful data in it, we retire it to the |
82 // secondary cache before overwriting it. | 86 // secondary cache before overwriting it. |
83 if (hit != Builtins::builtin(Builtins::Illegal)) { | 87 if (hit != isolate_->builtins()->builtin(Builtins::Illegal)) { |
84 Code::Flags primary_flags = Code::RemoveTypeFromFlags(hit->flags()); | 88 Code::Flags primary_flags = Code::RemoveTypeFromFlags(hit->flags()); |
85 int secondary_offset = | 89 int secondary_offset = |
86 SecondaryOffset(primary->key, primary_flags, primary_offset); | 90 SecondaryOffset(primary->key, primary_flags, primary_offset); |
87 Entry* secondary = entry(secondary_, secondary_offset); | 91 Entry* secondary = entry(secondary_, secondary_offset); |
88 *secondary = *primary; | 92 *secondary = *primary; |
89 } | 93 } |
90 | 94 |
91 // Update primary cache. | 95 // Update primary cache. |
92 primary->key = name; | 96 primary->key = name; |
93 primary->value = code; | 97 primary->value = code; |
94 return code; | 98 return code; |
95 } | 99 } |
96 | 100 |
97 | 101 |
98 MaybeObject* StubCache::ComputeLoadNonexistent(String* name, | 102 MaybeObject* StubCache::ComputeLoadNonexistent(String* name, |
99 JSObject* receiver) { | 103 JSObject* receiver) { |
100 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 104 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
101 // If no global objects are present in the prototype chain, the load | 105 // If no global objects are present in the prototype chain, the load |
102 // nonexistent IC stub can be shared for all names for a given map | 106 // nonexistent IC stub can be shared for all names for a given map |
103 // and we use the empty string for the map cache in that case. If | 107 // and we use the empty string for the map cache in that case. If |
104 // there are global objects involved, we need to check global | 108 // there are global objects involved, we need to check global |
105 // property cells in the stub and therefore the stub will be | 109 // property cells in the stub and therefore the stub will be |
106 // specific to the name. | 110 // specific to the name. |
107 String* cache_name = Heap::empty_string(); | 111 String* cache_name = isolate_->heap()->empty_string(); |
108 if (receiver->IsGlobalObject()) cache_name = name; | 112 if (receiver->IsGlobalObject()) cache_name = name; |
109 JSObject* last = receiver; | 113 JSObject* last = receiver; |
110 while (last->GetPrototype() != Heap::null_value()) { | 114 while (last->GetPrototype() != isolate_->heap()->null_value()) { |
111 last = JSObject::cast(last->GetPrototype()); | 115 last = JSObject::cast(last->GetPrototype()); |
112 if (last->IsGlobalObject()) cache_name = name; | 116 if (last->IsGlobalObject()) cache_name = name; |
113 } | 117 } |
114 // Compile the stub that is either shared for all names or | 118 // Compile the stub that is either shared for all names or |
115 // name specific if there are global objects involved. | 119 // name specific if there are global objects involved. |
116 Code::Flags flags = | 120 Code::Flags flags = |
117 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); | 121 Code::ComputeMonomorphicFlags(Code::LOAD_IC, NONEXISTENT); |
118 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); | 122 Object* code = receiver->map()->FindInCodeCache(cache_name, flags); |
119 if (code->IsUndefined()) { | 123 if (code->IsUndefined()) { |
120 LoadStubCompiler compiler; | 124 LoadStubCompiler compiler; |
121 { MaybeObject* maybe_code = | 125 { MaybeObject* maybe_code = |
122 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 126 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
123 if (!maybe_code->ToObject(&code)) return maybe_code; | 127 if (!maybe_code->ToObject(&code)) return maybe_code; |
124 } | 128 } |
125 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); | 129 PROFILE(isolate_, |
| 130 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), cache_name)); |
126 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); | 131 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, cache_name, Code::cast(code))); |
127 Object* result; | 132 Object* result; |
128 { MaybeObject* maybe_result = | 133 { MaybeObject* maybe_result = |
129 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); | 134 receiver->UpdateMapCodeCache(cache_name, Code::cast(code)); |
130 if (!maybe_result->ToObject(&result)) return maybe_result; | 135 if (!maybe_result->ToObject(&result)) return maybe_result; |
131 } | 136 } |
132 } | 137 } |
133 return code; | 138 return code; |
134 } | 139 } |
135 | 140 |
136 | 141 |
137 MaybeObject* StubCache::ComputeLoadField(String* name, | 142 MaybeObject* StubCache::ComputeLoadField(String* name, |
138 JSObject* receiver, | 143 JSObject* receiver, |
139 JSObject* holder, | 144 JSObject* holder, |
140 int field_index) { | 145 int field_index) { |
141 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 146 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
142 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); | 147 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, FIELD); |
143 Object* code = receiver->map()->FindInCodeCache(name, flags); | 148 Object* code = receiver->map()->FindInCodeCache(name, flags); |
144 if (code->IsUndefined()) { | 149 if (code->IsUndefined()) { |
145 LoadStubCompiler compiler; | 150 LoadStubCompiler compiler; |
146 { MaybeObject* maybe_code = | 151 { MaybeObject* maybe_code = |
147 compiler.CompileLoadField(receiver, holder, field_index, name); | 152 compiler.CompileLoadField(receiver, holder, field_index, name); |
148 if (!maybe_code->ToObject(&code)) return maybe_code; | 153 if (!maybe_code->ToObject(&code)) return maybe_code; |
149 } | 154 } |
150 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 155 PROFILE(isolate_, |
| 156 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
151 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 157 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
152 Object* result; | 158 Object* result; |
153 { MaybeObject* maybe_result = | 159 { MaybeObject* maybe_result = |
154 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 160 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
155 if (!maybe_result->ToObject(&result)) return maybe_result; | 161 if (!maybe_result->ToObject(&result)) return maybe_result; |
156 } | 162 } |
157 } | 163 } |
158 return code; | 164 return code; |
159 } | 165 } |
160 | 166 |
161 | 167 |
162 MaybeObject* StubCache::ComputeLoadCallback(String* name, | 168 MaybeObject* StubCache::ComputeLoadCallback(String* name, |
163 JSObject* receiver, | 169 JSObject* receiver, |
164 JSObject* holder, | 170 JSObject* holder, |
165 AccessorInfo* callback) { | 171 AccessorInfo* callback) { |
166 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 172 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
167 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 173 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
168 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); | 174 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, CALLBACKS); |
169 Object* code = receiver->map()->FindInCodeCache(name, flags); | 175 Object* code = receiver->map()->FindInCodeCache(name, flags); |
170 if (code->IsUndefined()) { | 176 if (code->IsUndefined()) { |
171 LoadStubCompiler compiler; | 177 LoadStubCompiler compiler; |
172 { MaybeObject* maybe_code = | 178 { MaybeObject* maybe_code = |
173 compiler.CompileLoadCallback(name, receiver, holder, callback); | 179 compiler.CompileLoadCallback(name, receiver, holder, callback); |
174 if (!maybe_code->ToObject(&code)) return maybe_code; | 180 if (!maybe_code->ToObject(&code)) return maybe_code; |
175 } | 181 } |
176 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 182 PROFILE(isolate_, |
| 183 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
177 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 184 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
178 Object* result; | 185 Object* result; |
179 { MaybeObject* maybe_result = | 186 { MaybeObject* maybe_result = |
180 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 187 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
181 if (!maybe_result->ToObject(&result)) return maybe_result; | 188 if (!maybe_result->ToObject(&result)) return maybe_result; |
182 } | 189 } |
183 } | 190 } |
184 return code; | 191 return code; |
185 } | 192 } |
186 | 193 |
187 | 194 |
188 MaybeObject* StubCache::ComputeLoadConstant(String* name, | 195 MaybeObject* StubCache::ComputeLoadConstant(String* name, |
189 JSObject* receiver, | 196 JSObject* receiver, |
190 JSObject* holder, | 197 JSObject* holder, |
191 Object* value) { | 198 Object* value) { |
192 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 199 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
193 Code::Flags flags = | 200 Code::Flags flags = |
194 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); | 201 Code::ComputeMonomorphicFlags(Code::LOAD_IC, CONSTANT_FUNCTION); |
195 Object* code = receiver->map()->FindInCodeCache(name, flags); | 202 Object* code = receiver->map()->FindInCodeCache(name, flags); |
196 if (code->IsUndefined()) { | 203 if (code->IsUndefined()) { |
197 LoadStubCompiler compiler; | 204 LoadStubCompiler compiler; |
198 { MaybeObject* maybe_code = | 205 { MaybeObject* maybe_code = |
199 compiler.CompileLoadConstant(receiver, holder, value, name); | 206 compiler.CompileLoadConstant(receiver, holder, value, name); |
200 if (!maybe_code->ToObject(&code)) return maybe_code; | 207 if (!maybe_code->ToObject(&code)) return maybe_code; |
201 } | 208 } |
202 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 209 PROFILE(isolate_, |
| 210 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
203 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 211 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
204 Object* result; | 212 Object* result; |
205 { MaybeObject* maybe_result = | 213 { MaybeObject* maybe_result = |
206 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 214 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
207 if (!maybe_result->ToObject(&result)) return maybe_result; | 215 if (!maybe_result->ToObject(&result)) return maybe_result; |
208 } | 216 } |
209 } | 217 } |
210 return code; | 218 return code; |
211 } | 219 } |
212 | 220 |
213 | 221 |
214 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, | 222 MaybeObject* StubCache::ComputeLoadInterceptor(String* name, |
215 JSObject* receiver, | 223 JSObject* receiver, |
216 JSObject* holder) { | 224 JSObject* holder) { |
217 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 225 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
218 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); | 226 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, INTERCEPTOR); |
219 Object* code = receiver->map()->FindInCodeCache(name, flags); | 227 Object* code = receiver->map()->FindInCodeCache(name, flags); |
220 if (code->IsUndefined()) { | 228 if (code->IsUndefined()) { |
221 LoadStubCompiler compiler; | 229 LoadStubCompiler compiler; |
222 { MaybeObject* maybe_code = | 230 { MaybeObject* maybe_code = |
223 compiler.CompileLoadInterceptor(receiver, holder, name); | 231 compiler.CompileLoadInterceptor(receiver, holder, name); |
224 if (!maybe_code->ToObject(&code)) return maybe_code; | 232 if (!maybe_code->ToObject(&code)) return maybe_code; |
225 } | 233 } |
226 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 234 PROFILE(isolate_, |
| 235 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
227 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 236 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
228 Object* result; | 237 Object* result; |
229 { MaybeObject* maybe_result = | 238 { MaybeObject* maybe_result = |
230 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 239 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
231 if (!maybe_result->ToObject(&result)) return maybe_result; | 240 if (!maybe_result->ToObject(&result)) return maybe_result; |
232 } | 241 } |
233 } | 242 } |
234 return code; | 243 return code; |
235 } | 244 } |
236 | 245 |
237 | 246 |
238 MaybeObject* StubCache::ComputeLoadNormal() { | 247 MaybeObject* StubCache::ComputeLoadNormal() { |
239 return Builtins::builtin(Builtins::LoadIC_Normal); | 248 return isolate_->builtins()->builtin(Builtins::LoadIC_Normal); |
240 } | 249 } |
241 | 250 |
242 | 251 |
243 MaybeObject* StubCache::ComputeLoadGlobal(String* name, | 252 MaybeObject* StubCache::ComputeLoadGlobal(String* name, |
244 JSObject* receiver, | 253 JSObject* receiver, |
245 GlobalObject* holder, | 254 GlobalObject* holder, |
246 JSGlobalPropertyCell* cell, | 255 JSGlobalPropertyCell* cell, |
247 bool is_dont_delete) { | 256 bool is_dont_delete) { |
248 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 257 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
249 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); | 258 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, NORMAL); |
250 Object* code = receiver->map()->FindInCodeCache(name, flags); | 259 Object* code = receiver->map()->FindInCodeCache(name, flags); |
251 if (code->IsUndefined()) { | 260 if (code->IsUndefined()) { |
252 LoadStubCompiler compiler; | 261 LoadStubCompiler compiler; |
253 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, | 262 { MaybeObject* maybe_code = compiler.CompileLoadGlobal(receiver, |
254 holder, | 263 holder, |
255 cell, | 264 cell, |
256 name, | 265 name, |
257 is_dont_delete); | 266 is_dont_delete); |
258 if (!maybe_code->ToObject(&code)) return maybe_code; | 267 if (!maybe_code->ToObject(&code)) return maybe_code; |
259 } | 268 } |
260 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); | 269 PROFILE(isolate_, |
| 270 CodeCreateEvent(Logger::LOAD_IC_TAG, Code::cast(code), name)); |
261 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); | 271 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, name, Code::cast(code))); |
262 Object* result; | 272 Object* result; |
263 { MaybeObject* maybe_result = | 273 { MaybeObject* maybe_result = |
264 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 274 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
265 if (!maybe_result->ToObject(&result)) return maybe_result; | 275 if (!maybe_result->ToObject(&result)) return maybe_result; |
266 } | 276 } |
267 } | 277 } |
268 return code; | 278 return code; |
269 } | 279 } |
270 | 280 |
271 | 281 |
272 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 282 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, |
273 JSObject* receiver, | 283 JSObject* receiver, |
274 JSObject* holder, | 284 JSObject* holder, |
275 int field_index) { | 285 int field_index) { |
276 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 286 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
277 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 287 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
278 Object* code = receiver->map()->FindInCodeCache(name, flags); | 288 Object* code = receiver->map()->FindInCodeCache(name, flags); |
279 if (code->IsUndefined()) { | 289 if (code->IsUndefined()) { |
280 KeyedLoadStubCompiler compiler; | 290 KeyedLoadStubCompiler compiler; |
281 { MaybeObject* maybe_code = | 291 { MaybeObject* maybe_code = |
282 compiler.CompileLoadField(name, receiver, holder, field_index); | 292 compiler.CompileLoadField(name, receiver, holder, field_index); |
283 if (!maybe_code->ToObject(&code)) return maybe_code; | 293 if (!maybe_code->ToObject(&code)) return maybe_code; |
284 } | 294 } |
285 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 295 PROFILE(isolate_, |
| 296 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
286 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 297 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
287 Object* result; | 298 Object* result; |
288 { MaybeObject* maybe_result = | 299 { MaybeObject* maybe_result = |
289 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 300 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
290 if (!maybe_result->ToObject(&result)) return maybe_result; | 301 if (!maybe_result->ToObject(&result)) return maybe_result; |
291 } | 302 } |
292 } | 303 } |
293 return code; | 304 return code; |
294 } | 305 } |
295 | 306 |
296 | 307 |
297 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 308 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, |
298 JSObject* receiver, | 309 JSObject* receiver, |
299 JSObject* holder, | 310 JSObject* holder, |
300 Object* value) { | 311 Object* value) { |
301 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 312 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
302 Code::Flags flags = | 313 Code::Flags flags = |
303 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 314 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
304 Object* code = receiver->map()->FindInCodeCache(name, flags); | 315 Object* code = receiver->map()->FindInCodeCache(name, flags); |
305 if (code->IsUndefined()) { | 316 if (code->IsUndefined()) { |
306 KeyedLoadStubCompiler compiler; | 317 KeyedLoadStubCompiler compiler; |
307 { MaybeObject* maybe_code = | 318 { MaybeObject* maybe_code = |
308 compiler.CompileLoadConstant(name, receiver, holder, value); | 319 compiler.CompileLoadConstant(name, receiver, holder, value); |
309 if (!maybe_code->ToObject(&code)) return maybe_code; | 320 if (!maybe_code->ToObject(&code)) return maybe_code; |
310 } | 321 } |
311 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 322 PROFILE(isolate_, |
| 323 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
312 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 324 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
313 Object* result; | 325 Object* result; |
314 { MaybeObject* maybe_result = | 326 { MaybeObject* maybe_result = |
315 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 327 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
316 if (!maybe_result->ToObject(&result)) return maybe_result; | 328 if (!maybe_result->ToObject(&result)) return maybe_result; |
317 } | 329 } |
318 } | 330 } |
319 return code; | 331 return code; |
320 } | 332 } |
321 | 333 |
322 | 334 |
323 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 335 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, |
324 JSObject* receiver, | 336 JSObject* receiver, |
325 JSObject* holder) { | 337 JSObject* holder) { |
326 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 338 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
327 Code::Flags flags = | 339 Code::Flags flags = |
328 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 340 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
329 Object* code = receiver->map()->FindInCodeCache(name, flags); | 341 Object* code = receiver->map()->FindInCodeCache(name, flags); |
330 if (code->IsUndefined()) { | 342 if (code->IsUndefined()) { |
331 KeyedLoadStubCompiler compiler; | 343 KeyedLoadStubCompiler compiler; |
332 { MaybeObject* maybe_code = | 344 { MaybeObject* maybe_code = |
333 compiler.CompileLoadInterceptor(receiver, holder, name); | 345 compiler.CompileLoadInterceptor(receiver, holder, name); |
334 if (!maybe_code->ToObject(&code)) return maybe_code; | 346 if (!maybe_code->ToObject(&code)) return maybe_code; |
335 } | 347 } |
336 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 348 PROFILE(isolate_, |
| 349 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
337 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 350 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
338 Object* result; | 351 Object* result; |
339 { MaybeObject* maybe_result = | 352 { MaybeObject* maybe_result = |
340 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 353 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
341 if (!maybe_result->ToObject(&result)) return maybe_result; | 354 if (!maybe_result->ToObject(&result)) return maybe_result; |
342 } | 355 } |
343 } | 356 } |
344 return code; | 357 return code; |
345 } | 358 } |
346 | 359 |
347 | 360 |
348 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 361 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, |
349 JSObject* receiver, | 362 JSObject* receiver, |
350 JSObject* holder, | 363 JSObject* holder, |
351 AccessorInfo* callback) { | 364 AccessorInfo* callback) { |
352 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 365 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); |
353 Code::Flags flags = | 366 Code::Flags flags = |
354 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 367 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
355 Object* code = receiver->map()->FindInCodeCache(name, flags); | 368 Object* code = receiver->map()->FindInCodeCache(name, flags); |
356 if (code->IsUndefined()) { | 369 if (code->IsUndefined()) { |
357 KeyedLoadStubCompiler compiler; | 370 KeyedLoadStubCompiler compiler; |
358 { MaybeObject* maybe_code = | 371 { MaybeObject* maybe_code = |
359 compiler.CompileLoadCallback(name, receiver, holder, callback); | 372 compiler.CompileLoadCallback(name, receiver, holder, callback); |
360 if (!maybe_code->ToObject(&code)) return maybe_code; | 373 if (!maybe_code->ToObject(&code)) return maybe_code; |
361 } | 374 } |
362 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 375 PROFILE(isolate_, |
| 376 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
363 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 377 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
364 Object* result; | 378 Object* result; |
365 { MaybeObject* maybe_result = | 379 { MaybeObject* maybe_result = |
366 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 380 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
367 if (!maybe_result->ToObject(&result)) return maybe_result; | 381 if (!maybe_result->ToObject(&result)) return maybe_result; |
368 } | 382 } |
369 } | 383 } |
370 return code; | 384 return code; |
371 } | 385 } |
372 | 386 |
373 | 387 |
374 | 388 |
375 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 389 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, |
376 JSArray* receiver) { | 390 JSArray* receiver) { |
377 Code::Flags flags = | 391 Code::Flags flags = |
378 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 392 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
379 ASSERT(receiver->IsJSObject()); | 393 ASSERT(receiver->IsJSObject()); |
380 Object* code = receiver->map()->FindInCodeCache(name, flags); | 394 Object* code = receiver->map()->FindInCodeCache(name, flags); |
381 if (code->IsUndefined()) { | 395 if (code->IsUndefined()) { |
382 KeyedLoadStubCompiler compiler; | 396 KeyedLoadStubCompiler compiler; |
383 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 397 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); |
384 if (!maybe_code->ToObject(&code)) return maybe_code; | 398 if (!maybe_code->ToObject(&code)) return maybe_code; |
385 } | 399 } |
386 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 400 PROFILE(isolate_, |
| 401 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
387 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 402 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
388 Object* result; | 403 Object* result; |
389 { MaybeObject* maybe_result = | 404 { MaybeObject* maybe_result = |
390 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 405 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
391 if (!maybe_result->ToObject(&result)) return maybe_result; | 406 if (!maybe_result->ToObject(&result)) return maybe_result; |
392 } | 407 } |
393 } | 408 } |
394 return code; | 409 return code; |
395 } | 410 } |
396 | 411 |
397 | 412 |
398 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 413 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, |
399 String* receiver) { | 414 String* receiver) { |
400 Code::Flags flags = | 415 Code::Flags flags = |
401 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 416 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
402 Map* map = receiver->map(); | 417 Map* map = receiver->map(); |
403 Object* code = map->FindInCodeCache(name, flags); | 418 Object* code = map->FindInCodeCache(name, flags); |
404 if (code->IsUndefined()) { | 419 if (code->IsUndefined()) { |
405 KeyedLoadStubCompiler compiler; | 420 KeyedLoadStubCompiler compiler; |
406 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 421 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); |
407 if (!maybe_code->ToObject(&code)) return maybe_code; | 422 if (!maybe_code->ToObject(&code)) return maybe_code; |
408 } | 423 } |
409 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 424 PROFILE(isolate_, |
| 425 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
410 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 426 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
411 Object* result; | 427 Object* result; |
412 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | 428 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); |
413 if (!maybe_result->ToObject(&result)) return maybe_result; | 429 if (!maybe_result->ToObject(&result)) return maybe_result; |
414 } | 430 } |
415 } | 431 } |
416 return code; | 432 return code; |
417 } | 433 } |
418 | 434 |
419 | 435 |
420 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 436 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( |
421 String* name, | 437 String* name, |
422 JSFunction* receiver) { | 438 JSFunction* receiver) { |
423 Code::Flags flags = | 439 Code::Flags flags = |
424 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 440 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
425 Object* code = receiver->map()->FindInCodeCache(name, flags); | 441 Object* code = receiver->map()->FindInCodeCache(name, flags); |
426 if (code->IsUndefined()) { | 442 if (code->IsUndefined()) { |
427 KeyedLoadStubCompiler compiler; | 443 KeyedLoadStubCompiler compiler; |
428 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 444 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); |
429 if (!maybe_code->ToObject(&code)) return maybe_code; | 445 if (!maybe_code->ToObject(&code)) return maybe_code; |
430 } | 446 } |
431 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | 447 PROFILE(isolate_, |
| 448 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); |
432 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | 449 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); |
433 Object* result; | 450 Object* result; |
434 { MaybeObject* maybe_result = | 451 { MaybeObject* maybe_result = |
435 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 452 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
436 if (!maybe_result->ToObject(&result)) return maybe_result; | 453 if (!maybe_result->ToObject(&result)) return maybe_result; |
437 } | 454 } |
438 } | 455 } |
439 return code; | 456 return code; |
440 } | 457 } |
441 | 458 |
442 | 459 |
443 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { | 460 MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) { |
444 // Using NORMAL as the PropertyType for array element loads is a misuse. The | 461 // Using NORMAL as the PropertyType for array element loads is a misuse. The |
445 // generated stub always accesses fast elements, not slow-mode fields, but | 462 // generated stub always accesses fast elements, not slow-mode fields, but |
446 // some property type is required for the stub lookup. Note that overloading | 463 // some property type is required for the stub lookup. Note that overloading |
447 // the NORMAL PropertyType is only safe as long as no stubs are generated for | 464 // the NORMAL PropertyType is only safe as long as no stubs are generated for |
448 // other keyed field loads. This is guaranteed to be the case since all field | 465 // other keyed field loads. This is guaranteed to be the case since all field |
449 // keyed loads that are not array elements go through a generic builtin stub. | 466 // keyed loads that are not array elements go through a generic builtin stub. |
450 Code::Flags flags = | 467 Code::Flags flags = |
451 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); | 468 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL); |
452 String* name = Heap::KeyedLoadSpecialized_symbol(); | 469 String* name = isolate_->heap()->KeyedLoadSpecialized_symbol(); |
453 Object* code = receiver->map()->FindInCodeCache(name, flags); | 470 Object* code = receiver->map()->FindInCodeCache(name, flags); |
454 if (code->IsUndefined()) { | 471 if (code->IsUndefined()) { |
455 KeyedLoadStubCompiler compiler; | 472 KeyedLoadStubCompiler compiler; |
456 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); | 473 { MaybeObject* maybe_code = compiler.CompileLoadSpecialized(receiver); |
457 if (!maybe_code->ToObject(&code)) return maybe_code; | 474 if (!maybe_code->ToObject(&code)) return maybe_code; |
458 } | 475 } |
459 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); | 476 PROFILE(isolate_, |
| 477 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0)); |
460 Object* result; | 478 Object* result; |
461 { MaybeObject* maybe_result = | 479 { MaybeObject* maybe_result = |
462 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 480 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
463 if (!maybe_result->ToObject(&result)) return maybe_result; | 481 if (!maybe_result->ToObject(&result)) return maybe_result; |
464 } | 482 } |
465 } | 483 } |
466 return code; | 484 return code; |
467 } | 485 } |
468 | 486 |
469 | 487 |
470 MaybeObject* StubCache::ComputeStoreField(String* name, | 488 MaybeObject* StubCache::ComputeStoreField(String* name, |
471 JSObject* receiver, | 489 JSObject* receiver, |
472 int field_index, | 490 int field_index, |
473 Map* transition, | 491 Map* transition, |
474 StrictModeFlag strict_mode) { | 492 StrictModeFlag strict_mode) { |
475 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 493 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
476 Code::Flags flags = Code::ComputeMonomorphicFlags( | 494 Code::Flags flags = Code::ComputeMonomorphicFlags( |
477 Code::STORE_IC, type, strict_mode); | 495 Code::STORE_IC, type, strict_mode); |
478 Object* code = receiver->map()->FindInCodeCache(name, flags); | 496 Object* code = receiver->map()->FindInCodeCache(name, flags); |
479 if (code->IsUndefined()) { | 497 if (code->IsUndefined()) { |
480 StoreStubCompiler compiler(strict_mode); | 498 StoreStubCompiler compiler(strict_mode); |
481 { MaybeObject* maybe_code = | 499 { MaybeObject* maybe_code = |
482 compiler.CompileStoreField(receiver, field_index, transition, name); | 500 compiler.CompileStoreField(receiver, field_index, transition, name); |
483 if (!maybe_code->ToObject(&code)) return maybe_code; | 501 if (!maybe_code->ToObject(&code)) return maybe_code; |
484 } | 502 } |
485 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 503 PROFILE(isolate_, |
| 504 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
486 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 505 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
487 Object* result; | 506 Object* result; |
488 { MaybeObject* maybe_result = | 507 { MaybeObject* maybe_result = |
489 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 508 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
490 if (!maybe_result->ToObject(&result)) return maybe_result; | 509 if (!maybe_result->ToObject(&result)) return maybe_result; |
491 } | 510 } |
492 } | 511 } |
493 return code; | 512 return code; |
494 } | 513 } |
495 | 514 |
496 | 515 |
497 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( | 516 MaybeObject* StubCache::ComputeKeyedStoreSpecialized( |
498 JSObject* receiver, | 517 JSObject* receiver, |
499 StrictModeFlag strict_mode) { | 518 StrictModeFlag strict_mode) { |
500 Code::Flags flags = | 519 Code::Flags flags = |
501 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); | 520 Code::ComputeMonomorphicFlags(Code::KEYED_STORE_IC, NORMAL, strict_mode); |
502 String* name = Heap::KeyedStoreSpecialized_symbol(); | 521 String* name = isolate_->heap()->KeyedStoreSpecialized_symbol(); |
503 Object* code = receiver->map()->FindInCodeCache(name, flags); | 522 Object* code = receiver->map()->FindInCodeCache(name, flags); |
504 if (code->IsUndefined()) { | 523 if (code->IsUndefined()) { |
505 KeyedStoreStubCompiler compiler(strict_mode); | 524 KeyedStoreStubCompiler compiler(strict_mode); |
506 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); | 525 { MaybeObject* maybe_code = compiler.CompileStoreSpecialized(receiver); |
507 if (!maybe_code->ToObject(&code)) return maybe_code; | 526 if (!maybe_code->ToObject(&code)) return maybe_code; |
508 } | 527 } |
509 PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); | 528 PROFILE(isolate_, |
| 529 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, Code::cast(code), 0)); |
510 Object* result; | 530 Object* result; |
511 { MaybeObject* maybe_result = | 531 { MaybeObject* maybe_result = |
512 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 532 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
513 if (!maybe_result->ToObject(&result)) return maybe_result; | 533 if (!maybe_result->ToObject(&result)) return maybe_result; |
514 } | 534 } |
515 } | 535 } |
516 return code; | 536 return code; |
517 } | 537 } |
518 | 538 |
519 | 539 |
(...skipping 21 matching lines...) Expand all Loading... |
541 UNREACHABLE(); | 561 UNREACHABLE(); |
542 return static_cast<ExternalArrayType>(0); | 562 return static_cast<ExternalArrayType>(0); |
543 } | 563 } |
544 } | 564 } |
545 | 565 |
546 String* ExternalArrayTypeToStubName(ExternalArrayType array_type, | 566 String* ExternalArrayTypeToStubName(ExternalArrayType array_type, |
547 bool is_store) { | 567 bool is_store) { |
548 if (is_store) { | 568 if (is_store) { |
549 switch (array_type) { | 569 switch (array_type) { |
550 case kExternalByteArray: | 570 case kExternalByteArray: |
551 return Heap::KeyedStoreExternalByteArray_symbol(); | 571 return HEAP->KeyedStoreExternalByteArray_symbol(); |
552 case kExternalUnsignedByteArray: | 572 case kExternalUnsignedByteArray: |
553 return Heap::KeyedStoreExternalUnsignedByteArray_symbol(); | 573 return HEAP->KeyedStoreExternalUnsignedByteArray_symbol(); |
554 case kExternalShortArray: | 574 case kExternalShortArray: |
555 return Heap::KeyedStoreExternalShortArray_symbol(); | 575 return HEAP->KeyedStoreExternalShortArray_symbol(); |
556 case kExternalUnsignedShortArray: | 576 case kExternalUnsignedShortArray: |
557 return Heap::KeyedStoreExternalUnsignedShortArray_symbol(); | 577 return HEAP->KeyedStoreExternalUnsignedShortArray_symbol(); |
558 case kExternalIntArray: | 578 case kExternalIntArray: |
559 return Heap::KeyedStoreExternalIntArray_symbol(); | 579 return HEAP->KeyedStoreExternalIntArray_symbol(); |
560 case kExternalUnsignedIntArray: | 580 case kExternalUnsignedIntArray: |
561 return Heap::KeyedStoreExternalUnsignedIntArray_symbol(); | 581 return HEAP->KeyedStoreExternalUnsignedIntArray_symbol(); |
562 case kExternalFloatArray: | 582 case kExternalFloatArray: |
563 return Heap::KeyedStoreExternalFloatArray_symbol(); | 583 return HEAP->KeyedStoreExternalFloatArray_symbol(); |
564 case kExternalPixelArray: | 584 case kExternalPixelArray: |
565 return Heap::KeyedStoreExternalPixelArray_symbol(); | 585 return HEAP->KeyedStoreExternalPixelArray_symbol(); |
566 default: | 586 default: |
567 UNREACHABLE(); | 587 UNREACHABLE(); |
568 return NULL; | 588 return NULL; |
569 } | 589 } |
570 } else { | 590 } else { |
571 switch (array_type) { | 591 switch (array_type) { |
572 case kExternalByteArray: | 592 case kExternalByteArray: |
573 return Heap::KeyedLoadExternalByteArray_symbol(); | 593 return HEAP->KeyedLoadExternalByteArray_symbol(); |
574 case kExternalUnsignedByteArray: | 594 case kExternalUnsignedByteArray: |
575 return Heap::KeyedLoadExternalUnsignedByteArray_symbol(); | 595 return HEAP->KeyedLoadExternalUnsignedByteArray_symbol(); |
576 case kExternalShortArray: | 596 case kExternalShortArray: |
577 return Heap::KeyedLoadExternalShortArray_symbol(); | 597 return HEAP->KeyedLoadExternalShortArray_symbol(); |
578 case kExternalUnsignedShortArray: | 598 case kExternalUnsignedShortArray: |
579 return Heap::KeyedLoadExternalUnsignedShortArray_symbol(); | 599 return HEAP->KeyedLoadExternalUnsignedShortArray_symbol(); |
580 case kExternalIntArray: | 600 case kExternalIntArray: |
581 return Heap::KeyedLoadExternalIntArray_symbol(); | 601 return HEAP->KeyedLoadExternalIntArray_symbol(); |
582 case kExternalUnsignedIntArray: | 602 case kExternalUnsignedIntArray: |
583 return Heap::KeyedLoadExternalUnsignedIntArray_symbol(); | 603 return HEAP->KeyedLoadExternalUnsignedIntArray_symbol(); |
584 case kExternalFloatArray: | 604 case kExternalFloatArray: |
585 return Heap::KeyedLoadExternalFloatArray_symbol(); | 605 return HEAP->KeyedLoadExternalFloatArray_symbol(); |
586 case kExternalPixelArray: | 606 case kExternalPixelArray: |
587 return Heap::KeyedLoadExternalPixelArray_symbol(); | 607 return HEAP->KeyedLoadExternalPixelArray_symbol(); |
588 default: | 608 default: |
589 UNREACHABLE(); | 609 UNREACHABLE(); |
590 return NULL; | 610 return NULL; |
591 } | 611 } |
592 } | 612 } |
593 } | 613 } |
594 | 614 |
595 } // anonymous namespace | 615 } // anonymous namespace |
596 | 616 |
597 | 617 |
(...skipping 14 matching lines...) Expand all Loading... |
612 if (code->IsUndefined()) { | 632 if (code->IsUndefined()) { |
613 ExternalArrayStubCompiler compiler; | 633 ExternalArrayStubCompiler compiler; |
614 { MaybeObject* maybe_code = | 634 { MaybeObject* maybe_code = |
615 is_store ? | 635 is_store ? |
616 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : | 636 compiler.CompileKeyedStoreStub(receiver, array_type, flags) : |
617 compiler.CompileKeyedLoadStub(receiver, array_type, flags); | 637 compiler.CompileKeyedLoadStub(receiver, array_type, flags); |
618 if (!maybe_code->ToObject(&code)) return maybe_code; | 638 if (!maybe_code->ToObject(&code)) return maybe_code; |
619 } | 639 } |
620 Code::cast(code)->set_external_array_type(array_type); | 640 Code::cast(code)->set_external_array_type(array_type); |
621 if (is_store) { | 641 if (is_store) { |
622 PROFILE( | 642 PROFILE(isolate_, |
623 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, | 643 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_STORE_IC_TAG, |
624 Code::cast(code), 0)); | 644 Code::cast(code), 0)); |
625 } else { | 645 } else { |
626 PROFILE( | 646 PROFILE(isolate_, |
627 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, | 647 CodeCreateEvent(Logger::KEYED_EXTERNAL_ARRAY_LOAD_IC_TAG, |
628 Code::cast(code), 0)); | 648 Code::cast(code), 0)); |
629 } | 649 } |
630 Object* result; | 650 Object* result; |
631 { MaybeObject* maybe_result = | 651 { MaybeObject* maybe_result = |
632 receiver->map()->UpdateCodeCache(name, Code::cast(code)); | 652 receiver->map()->UpdateCodeCache(name, Code::cast(code)); |
633 if (!maybe_result->ToObject(&result)) return maybe_result; | 653 if (!maybe_result->ToObject(&result)) return maybe_result; |
634 } | 654 } |
635 } | 655 } |
636 return code; | 656 return code; |
637 } | 657 } |
638 | 658 |
639 | 659 |
640 MaybeObject* StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { | 660 MaybeObject* StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
641 return Builtins::builtin((strict_mode == kStrictMode) | 661 return isolate_->builtins()->builtin((strict_mode == kStrictMode) |
642 ? Builtins::StoreIC_Normal_Strict | 662 ? Builtins::StoreIC_Normal_Strict |
643 : Builtins::StoreIC_Normal); | 663 : Builtins::StoreIC_Normal); |
644 } | 664 } |
645 | 665 |
646 | 666 |
647 MaybeObject* StubCache::ComputeStoreGlobal(String* name, | 667 MaybeObject* StubCache::ComputeStoreGlobal(String* name, |
648 GlobalObject* receiver, | 668 GlobalObject* receiver, |
649 JSGlobalPropertyCell* cell, | 669 JSGlobalPropertyCell* cell, |
650 StrictModeFlag strict_mode) { | 670 StrictModeFlag strict_mode) { |
651 Code::Flags flags = Code::ComputeMonomorphicFlags( | 671 Code::Flags flags = Code::ComputeMonomorphicFlags( |
652 Code::STORE_IC, NORMAL, strict_mode); | 672 Code::STORE_IC, NORMAL, strict_mode); |
653 Object* code = receiver->map()->FindInCodeCache(name, flags); | 673 Object* code = receiver->map()->FindInCodeCache(name, flags); |
654 if (code->IsUndefined()) { | 674 if (code->IsUndefined()) { |
655 StoreStubCompiler compiler(strict_mode); | 675 StoreStubCompiler compiler(strict_mode); |
656 { MaybeObject* maybe_code = | 676 { MaybeObject* maybe_code = |
657 compiler.CompileStoreGlobal(receiver, cell, name); | 677 compiler.CompileStoreGlobal(receiver, cell, name); |
658 if (!maybe_code->ToObject(&code)) return maybe_code; | 678 if (!maybe_code->ToObject(&code)) return maybe_code; |
659 } | 679 } |
660 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 680 PROFILE(isolate_, |
| 681 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
661 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 682 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
662 Object* result; | 683 Object* result; |
663 { MaybeObject* maybe_result = | 684 { MaybeObject* maybe_result = |
664 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 685 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
665 if (!maybe_result->ToObject(&result)) return maybe_result; | 686 if (!maybe_result->ToObject(&result)) return maybe_result; |
666 } | 687 } |
667 } | 688 } |
668 return code; | 689 return code; |
669 } | 690 } |
670 | 691 |
671 | 692 |
672 MaybeObject* StubCache::ComputeStoreCallback( | 693 MaybeObject* StubCache::ComputeStoreCallback( |
673 String* name, | 694 String* name, |
674 JSObject* receiver, | 695 JSObject* receiver, |
675 AccessorInfo* callback, | 696 AccessorInfo* callback, |
676 StrictModeFlag strict_mode) { | 697 StrictModeFlag strict_mode) { |
677 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 698 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
678 Code::Flags flags = Code::ComputeMonomorphicFlags( | 699 Code::Flags flags = Code::ComputeMonomorphicFlags( |
679 Code::STORE_IC, CALLBACKS, strict_mode); | 700 Code::STORE_IC, CALLBACKS, strict_mode); |
680 Object* code = receiver->map()->FindInCodeCache(name, flags); | 701 Object* code = receiver->map()->FindInCodeCache(name, flags); |
681 if (code->IsUndefined()) { | 702 if (code->IsUndefined()) { |
682 StoreStubCompiler compiler(strict_mode); | 703 StoreStubCompiler compiler(strict_mode); |
683 { MaybeObject* maybe_code = | 704 { MaybeObject* maybe_code = |
684 compiler.CompileStoreCallback(receiver, callback, name); | 705 compiler.CompileStoreCallback(receiver, callback, name); |
685 if (!maybe_code->ToObject(&code)) return maybe_code; | 706 if (!maybe_code->ToObject(&code)) return maybe_code; |
686 } | 707 } |
687 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 708 PROFILE(isolate_, |
| 709 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
688 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 710 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
689 Object* result; | 711 Object* result; |
690 { MaybeObject* maybe_result = | 712 { MaybeObject* maybe_result = |
691 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 713 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
692 if (!maybe_result->ToObject(&result)) return maybe_result; | 714 if (!maybe_result->ToObject(&result)) return maybe_result; |
693 } | 715 } |
694 } | 716 } |
695 return code; | 717 return code; |
696 } | 718 } |
697 | 719 |
698 | 720 |
699 MaybeObject* StubCache::ComputeStoreInterceptor( | 721 MaybeObject* StubCache::ComputeStoreInterceptor( |
700 String* name, | 722 String* name, |
701 JSObject* receiver, | 723 JSObject* receiver, |
702 StrictModeFlag strict_mode) { | 724 StrictModeFlag strict_mode) { |
703 Code::Flags flags = Code::ComputeMonomorphicFlags( | 725 Code::Flags flags = Code::ComputeMonomorphicFlags( |
704 Code::STORE_IC, INTERCEPTOR, strict_mode); | 726 Code::STORE_IC, INTERCEPTOR, strict_mode); |
705 Object* code = receiver->map()->FindInCodeCache(name, flags); | 727 Object* code = receiver->map()->FindInCodeCache(name, flags); |
706 if (code->IsUndefined()) { | 728 if (code->IsUndefined()) { |
707 StoreStubCompiler compiler(strict_mode); | 729 StoreStubCompiler compiler(strict_mode); |
708 { MaybeObject* maybe_code = | 730 { MaybeObject* maybe_code = |
709 compiler.CompileStoreInterceptor(receiver, name); | 731 compiler.CompileStoreInterceptor(receiver, name); |
710 if (!maybe_code->ToObject(&code)) return maybe_code; | 732 if (!maybe_code->ToObject(&code)) return maybe_code; |
711 } | 733 } |
712 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); | 734 PROFILE(isolate_, |
| 735 CodeCreateEvent(Logger::STORE_IC_TAG, Code::cast(code), name)); |
713 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); | 736 GDBJIT(AddCode(GDBJITInterface::STORE_IC, name, Code::cast(code))); |
714 Object* result; | 737 Object* result; |
715 { MaybeObject* maybe_result = | 738 { MaybeObject* maybe_result = |
716 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 739 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
717 if (!maybe_result->ToObject(&result)) return maybe_result; | 740 if (!maybe_result->ToObject(&result)) return maybe_result; |
718 } | 741 } |
719 } | 742 } |
720 return code; | 743 return code; |
721 } | 744 } |
722 | 745 |
723 | 746 |
724 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, | 747 MaybeObject* StubCache::ComputeKeyedStoreField(String* name, |
725 JSObject* receiver, | 748 JSObject* receiver, |
726 int field_index, | 749 int field_index, |
727 Map* transition, | 750 Map* transition, |
728 StrictModeFlag strict_mode) { | 751 StrictModeFlag strict_mode) { |
729 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; | 752 PropertyType type = (transition == NULL) ? FIELD : MAP_TRANSITION; |
730 Code::Flags flags = Code::ComputeMonomorphicFlags( | 753 Code::Flags flags = Code::ComputeMonomorphicFlags( |
731 Code::KEYED_STORE_IC, type, strict_mode); | 754 Code::KEYED_STORE_IC, type, strict_mode); |
732 Object* code = receiver->map()->FindInCodeCache(name, flags); | 755 Object* code = receiver->map()->FindInCodeCache(name, flags); |
733 if (code->IsUndefined()) { | 756 if (code->IsUndefined()) { |
734 KeyedStoreStubCompiler compiler(strict_mode); | 757 KeyedStoreStubCompiler compiler(strict_mode); |
735 { MaybeObject* maybe_code = | 758 { MaybeObject* maybe_code = |
736 compiler.CompileStoreField(receiver, field_index, transition, name); | 759 compiler.CompileStoreField(receiver, field_index, transition, name); |
737 if (!maybe_code->ToObject(&code)) return maybe_code; | 760 if (!maybe_code->ToObject(&code)) return maybe_code; |
738 } | 761 } |
739 PROFILE(CodeCreateEvent( | 762 PROFILE(isolate_, |
740 Logger::KEYED_STORE_IC_TAG, Code::cast(code), name)); | 763 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
| 764 Code::cast(code), name)); |
741 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); | 765 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, name, Code::cast(code))); |
742 Object* result; | 766 Object* result; |
743 { MaybeObject* maybe_result = | 767 { MaybeObject* maybe_result = |
744 receiver->UpdateMapCodeCache(name, Code::cast(code)); | 768 receiver->UpdateMapCodeCache(name, Code::cast(code)); |
745 if (!maybe_result->ToObject(&result)) return maybe_result; | 769 if (!maybe_result->ToObject(&result)) return maybe_result; |
746 } | 770 } |
747 } | 771 } |
748 return code; | 772 return code; |
749 } | 773 } |
750 | 774 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 if (!function->is_compiled()) return Failure::InternalError(); | 813 if (!function->is_compiled()) return Failure::InternalError(); |
790 // Compile the stub - only create stubs for fully compiled functions. | 814 // Compile the stub - only create stubs for fully compiled functions. |
791 CallStubCompiler compiler( | 815 CallStubCompiler compiler( |
792 argc, in_loop, kind, extra_ic_state, cache_holder); | 816 argc, in_loop, kind, extra_ic_state, cache_holder); |
793 { MaybeObject* maybe_code = | 817 { MaybeObject* maybe_code = |
794 compiler.CompileCallConstant(object, holder, function, name, check); | 818 compiler.CompileCallConstant(object, holder, function, name, check); |
795 if (!maybe_code->ToObject(&code)) return maybe_code; | 819 if (!maybe_code->ToObject(&code)) return maybe_code; |
796 } | 820 } |
797 Code::cast(code)->set_check_type(check); | 821 Code::cast(code)->set_check_type(check); |
798 ASSERT_EQ(flags, Code::cast(code)->flags()); | 822 ASSERT_EQ(flags, Code::cast(code)->flags()); |
799 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 823 PROFILE(isolate_, |
| 824 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
800 Code::cast(code), name)); | 825 Code::cast(code), name)); |
801 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 826 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
802 Object* result; | 827 Object* result; |
803 { MaybeObject* maybe_result = | 828 { MaybeObject* maybe_result = |
804 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 829 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
805 if (!maybe_result->ToObject(&result)) return maybe_result; | 830 if (!maybe_result->ToObject(&result)) return maybe_result; |
806 } | 831 } |
807 } | 832 } |
808 return code; | 833 return code; |
809 } | 834 } |
(...skipping 29 matching lines...) Expand all Loading... |
839 CallStubCompiler compiler( | 864 CallStubCompiler compiler( |
840 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 865 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
841 { MaybeObject* maybe_code = | 866 { MaybeObject* maybe_code = |
842 compiler.CompileCallField(JSObject::cast(object), | 867 compiler.CompileCallField(JSObject::cast(object), |
843 holder, | 868 holder, |
844 index, | 869 index, |
845 name); | 870 name); |
846 if (!maybe_code->ToObject(&code)) return maybe_code; | 871 if (!maybe_code->ToObject(&code)) return maybe_code; |
847 } | 872 } |
848 ASSERT_EQ(flags, Code::cast(code)->flags()); | 873 ASSERT_EQ(flags, Code::cast(code)->flags()); |
849 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 874 PROFILE(isolate_, |
| 875 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
850 Code::cast(code), name)); | 876 Code::cast(code), name)); |
851 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 877 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
852 Object* result; | 878 Object* result; |
853 { MaybeObject* maybe_result = | 879 { MaybeObject* maybe_result = |
854 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 880 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
855 if (!maybe_result->ToObject(&result)) return maybe_result; | 881 if (!maybe_result->ToObject(&result)) return maybe_result; |
856 } | 882 } |
857 } | 883 } |
858 return code; | 884 return code; |
859 } | 885 } |
(...skipping 24 matching lines...) Expand all Loading... |
884 argc); | 910 argc); |
885 Object* code = map_holder->map()->FindInCodeCache(name, flags); | 911 Object* code = map_holder->map()->FindInCodeCache(name, flags); |
886 if (code->IsUndefined()) { | 912 if (code->IsUndefined()) { |
887 CallStubCompiler compiler( | 913 CallStubCompiler compiler( |
888 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); | 914 argc, NOT_IN_LOOP, kind, Code::kNoExtraICState, cache_holder); |
889 { MaybeObject* maybe_code = | 915 { MaybeObject* maybe_code = |
890 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); | 916 compiler.CompileCallInterceptor(JSObject::cast(object), holder, name); |
891 if (!maybe_code->ToObject(&code)) return maybe_code; | 917 if (!maybe_code->ToObject(&code)) return maybe_code; |
892 } | 918 } |
893 ASSERT_EQ(flags, Code::cast(code)->flags()); | 919 ASSERT_EQ(flags, Code::cast(code)->flags()); |
894 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 920 PROFILE(isolate_, |
| 921 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
895 Code::cast(code), name)); | 922 Code::cast(code), name)); |
896 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 923 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
897 Object* result; | 924 Object* result; |
898 { MaybeObject* maybe_result = | 925 { MaybeObject* maybe_result = |
899 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 926 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
900 if (!maybe_result->ToObject(&result)) return maybe_result; | 927 if (!maybe_result->ToObject(&result)) return maybe_result; |
901 } | 928 } |
902 } | 929 } |
903 return code; | 930 return code; |
904 } | 931 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
941 // internal error which will make sure we do not update any | 968 // internal error which will make sure we do not update any |
942 // caches. | 969 // caches. |
943 if (!function->is_compiled()) return Failure::InternalError(); | 970 if (!function->is_compiled()) return Failure::InternalError(); |
944 CallStubCompiler compiler( | 971 CallStubCompiler compiler( |
945 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); | 972 argc, in_loop, kind, Code::kNoExtraICState, cache_holder); |
946 { MaybeObject* maybe_code = | 973 { MaybeObject* maybe_code = |
947 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 974 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
948 if (!maybe_code->ToObject(&code)) return maybe_code; | 975 if (!maybe_code->ToObject(&code)) return maybe_code; |
949 } | 976 } |
950 ASSERT_EQ(flags, Code::cast(code)->flags()); | 977 ASSERT_EQ(flags, Code::cast(code)->flags()); |
951 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), | 978 PROFILE(isolate_, |
| 979 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), |
952 Code::cast(code), name)); | 980 Code::cast(code), name)); |
953 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); | 981 GDBJIT(AddCode(GDBJITInterface::CALL_IC, name, Code::cast(code))); |
954 Object* result; | 982 Object* result; |
955 { MaybeObject* maybe_result = | 983 { MaybeObject* maybe_result = |
956 map_holder->UpdateMapCodeCache(name, Code::cast(code)); | 984 map_holder->UpdateMapCodeCache(name, Code::cast(code)); |
957 if (!maybe_result->ToObject(&result)) return maybe_result; | 985 if (!maybe_result->ToObject(&result)) return maybe_result; |
958 } | 986 } |
959 } | 987 } |
960 return code; | 988 return code; |
961 } | 989 } |
962 | 990 |
963 | 991 |
964 static Object* GetProbeValue(Code::Flags flags) { | 992 static Object* GetProbeValue(Isolate* isolate, Code::Flags flags) { |
965 // Use raw_unchecked... so we don't get assert failures during GC. | 993 // Use raw_unchecked... so we don't get assert failures during GC. |
966 NumberDictionary* dictionary = Heap::raw_unchecked_non_monomorphic_cache(); | 994 NumberDictionary* dictionary = |
967 int entry = dictionary->FindEntry(flags); | 995 isolate->heap()->raw_unchecked_non_monomorphic_cache(); |
| 996 int entry = dictionary->FindEntry(isolate, flags); |
968 if (entry != -1) return dictionary->ValueAt(entry); | 997 if (entry != -1) return dictionary->ValueAt(entry); |
969 return Heap::raw_unchecked_undefined_value(); | 998 return isolate->heap()->raw_unchecked_undefined_value(); |
970 } | 999 } |
971 | 1000 |
972 | 1001 |
973 MUST_USE_RESULT static MaybeObject* ProbeCache(Code::Flags flags) { | 1002 MUST_USE_RESULT static MaybeObject* ProbeCache(Isolate* isolate, |
974 Object* probe = GetProbeValue(flags); | 1003 Code::Flags flags) { |
975 if (probe != Heap::undefined_value()) return probe; | 1004 Heap* heap = isolate->heap(); |
| 1005 Object* probe = GetProbeValue(isolate, flags); |
| 1006 if (probe != heap->undefined_value()) return probe; |
976 // Seed the cache with an undefined value to make sure that any | 1007 // Seed the cache with an undefined value to make sure that any |
977 // generated code object can always be inserted into the cache | 1008 // generated code object can always be inserted into the cache |
978 // without causing allocation failures. | 1009 // without causing allocation failures. |
979 Object* result; | 1010 Object* result; |
980 { MaybeObject* maybe_result = | 1011 { MaybeObject* maybe_result = |
981 Heap::non_monomorphic_cache()->AtNumberPut(flags, | 1012 heap->non_monomorphic_cache()->AtNumberPut(flags, |
982 Heap::undefined_value()); | 1013 heap->undefined_value()); |
983 if (!maybe_result->ToObject(&result)) return maybe_result; | 1014 if (!maybe_result->ToObject(&result)) return maybe_result; |
984 } | 1015 } |
985 Heap::public_set_non_monomorphic_cache(NumberDictionary::cast(result)); | 1016 heap->public_set_non_monomorphic_cache(NumberDictionary::cast(result)); |
986 return probe; | 1017 return probe; |
987 } | 1018 } |
988 | 1019 |
989 | 1020 |
990 static MaybeObject* FillCache(MaybeObject* maybe_code) { | 1021 static MaybeObject* FillCache(Isolate* isolate, MaybeObject* maybe_code) { |
991 Object* code; | 1022 Object* code; |
992 if (maybe_code->ToObject(&code)) { | 1023 if (maybe_code->ToObject(&code)) { |
993 if (code->IsCode()) { | 1024 if (code->IsCode()) { |
994 int entry = | 1025 Heap* heap = isolate->heap(); |
995 Heap::non_monomorphic_cache()->FindEntry( | 1026 int entry = heap->non_monomorphic_cache()->FindEntry( |
996 Code::cast(code)->flags()); | 1027 Code::cast(code)->flags()); |
997 // The entry must be present see comment in ProbeCache. | 1028 // The entry must be present see comment in ProbeCache. |
998 ASSERT(entry != -1); | 1029 ASSERT(entry != -1); |
999 ASSERT(Heap::non_monomorphic_cache()->ValueAt(entry) == | 1030 ASSERT(heap->non_monomorphic_cache()->ValueAt(entry) == |
1000 Heap::undefined_value()); | 1031 heap->undefined_value()); |
1001 Heap::non_monomorphic_cache()->ValueAtPut(entry, code); | 1032 heap->non_monomorphic_cache()->ValueAtPut(entry, code); |
1002 CHECK(GetProbeValue(Code::cast(code)->flags()) == code); | 1033 CHECK(GetProbeValue(isolate, Code::cast(code)->flags()) == code); |
1003 } | 1034 } |
1004 } | 1035 } |
1005 return maybe_code; | 1036 return maybe_code; |
1006 } | 1037 } |
1007 | 1038 |
1008 | 1039 |
1009 Code* StubCache::FindCallInitialize(int argc, | 1040 Code* StubCache::FindCallInitialize(int argc, |
1010 InLoopFlag in_loop, | 1041 InLoopFlag in_loop, |
1011 Code::Kind kind) { | 1042 Code::Kind kind) { |
1012 Code::Flags flags = Code::ComputeFlags(kind, | 1043 Code::Flags flags = Code::ComputeFlags(kind, |
1013 in_loop, | 1044 in_loop, |
1014 UNINITIALIZED, | 1045 UNINITIALIZED, |
1015 Code::kNoExtraICState, | 1046 Code::kNoExtraICState, |
1016 NORMAL, | 1047 NORMAL, |
1017 argc); | 1048 argc); |
1018 Object* result = ProbeCache(flags)->ToObjectUnchecked(); | 1049 Object* result = ProbeCache(isolate_, flags)->ToObjectUnchecked(); |
1019 ASSERT(!result->IsUndefined()); | 1050 ASSERT(result != isolate_->heap()->undefined_value()); |
1020 // This might be called during the marking phase of the collector | 1051 // This might be called during the marking phase of the collector |
1021 // hence the unchecked cast. | 1052 // hence the unchecked cast. |
1022 return reinterpret_cast<Code*>(result); | 1053 return reinterpret_cast<Code*>(result); |
1023 } | 1054 } |
1024 | 1055 |
1025 | 1056 |
1026 MaybeObject* StubCache::ComputeCallInitialize(int argc, | 1057 MaybeObject* StubCache::ComputeCallInitialize(int argc, |
1027 InLoopFlag in_loop, | 1058 InLoopFlag in_loop, |
1028 Code::Kind kind) { | 1059 Code::Kind kind) { |
1029 Code::Flags flags = Code::ComputeFlags(kind, | 1060 Code::Flags flags = Code::ComputeFlags(kind, |
1030 in_loop, | 1061 in_loop, |
1031 UNINITIALIZED, | 1062 UNINITIALIZED, |
1032 Code::kNoExtraICState, | 1063 Code::kNoExtraICState, |
1033 NORMAL, | 1064 NORMAL, |
1034 argc); | 1065 argc); |
1035 Object* probe; | 1066 Object* probe; |
1036 { MaybeObject* maybe_probe = ProbeCache(flags); | 1067 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1037 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1068 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1038 } | 1069 } |
1039 if (!probe->IsUndefined()) return probe; | 1070 if (!probe->IsUndefined()) return probe; |
1040 StubCompiler compiler; | 1071 StubCompiler compiler; |
1041 return FillCache(compiler.CompileCallInitialize(flags)); | 1072 return FillCache(isolate_, compiler.CompileCallInitialize(flags)); |
1042 } | 1073 } |
1043 | 1074 |
1044 | 1075 |
1045 Handle<Code> StubCache::ComputeCallInitialize(int argc, InLoopFlag in_loop) { | 1076 Handle<Code> StubCache::ComputeCallInitialize(int argc, InLoopFlag in_loop) { |
1046 if (in_loop == IN_LOOP) { | 1077 if (in_loop == IN_LOOP) { |
1047 // Force the creation of the corresponding stub outside loops, | 1078 // Force the creation of the corresponding stub outside loops, |
1048 // because it may be used when clearing the ICs later - it is | 1079 // because it may be used when clearing the ICs later - it is |
1049 // possible for a series of IC transitions to lose the in-loop | 1080 // possible for a series of IC transitions to lose the in-loop |
1050 // information, and the IC clearing code can't generate a stub | 1081 // information, and the IC clearing code can't generate a stub |
1051 // that it needs so we need to ensure it is generated already. | 1082 // that it needs so we need to ensure it is generated already. |
1052 ComputeCallInitialize(argc, NOT_IN_LOOP); | 1083 ComputeCallInitialize(argc, NOT_IN_LOOP); |
1053 } | 1084 } |
1054 CALL_HEAP_FUNCTION(ComputeCallInitialize(argc, in_loop, Code::CALL_IC), Code); | 1085 CALL_HEAP_FUNCTION(isolate_, |
| 1086 ComputeCallInitialize(argc, in_loop, Code::CALL_IC), Code); |
1055 } | 1087 } |
1056 | 1088 |
1057 | 1089 |
1058 Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc, | 1090 Handle<Code> StubCache::ComputeKeyedCallInitialize(int argc, |
1059 InLoopFlag in_loop) { | 1091 InLoopFlag in_loop) { |
1060 if (in_loop == IN_LOOP) { | 1092 if (in_loop == IN_LOOP) { |
1061 // Force the creation of the corresponding stub outside loops, | 1093 // Force the creation of the corresponding stub outside loops, |
1062 // because it may be used when clearing the ICs later - it is | 1094 // because it may be used when clearing the ICs later - it is |
1063 // possible for a series of IC transitions to lose the in-loop | 1095 // possible for a series of IC transitions to lose the in-loop |
1064 // information, and the IC clearing code can't generate a stub | 1096 // information, and the IC clearing code can't generate a stub |
1065 // that it needs so we need to ensure it is generated already. | 1097 // that it needs so we need to ensure it is generated already. |
1066 ComputeKeyedCallInitialize(argc, NOT_IN_LOOP); | 1098 ComputeKeyedCallInitialize(argc, NOT_IN_LOOP); |
1067 } | 1099 } |
1068 CALL_HEAP_FUNCTION( | 1100 CALL_HEAP_FUNCTION( |
| 1101 isolate_, |
1069 ComputeCallInitialize(argc, in_loop, Code::KEYED_CALL_IC), Code); | 1102 ComputeCallInitialize(argc, in_loop, Code::KEYED_CALL_IC), Code); |
1070 } | 1103 } |
1071 | 1104 |
1072 | 1105 |
1073 MaybeObject* StubCache::ComputeCallPreMonomorphic(int argc, | 1106 MaybeObject* StubCache::ComputeCallPreMonomorphic(int argc, |
1074 InLoopFlag in_loop, | 1107 InLoopFlag in_loop, |
1075 Code::Kind kind) { | 1108 Code::Kind kind) { |
1076 Code::Flags flags = Code::ComputeFlags(kind, | 1109 Code::Flags flags = Code::ComputeFlags(kind, |
1077 in_loop, | 1110 in_loop, |
1078 PREMONOMORPHIC, | 1111 PREMONOMORPHIC, |
1079 Code::kNoExtraICState, | 1112 Code::kNoExtraICState, |
1080 NORMAL, | 1113 NORMAL, |
1081 argc); | 1114 argc); |
1082 Object* probe; | 1115 Object* probe; |
1083 { MaybeObject* maybe_probe = ProbeCache(flags); | 1116 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1084 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1117 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1085 } | 1118 } |
1086 if (!probe->IsUndefined()) return probe; | 1119 if (!probe->IsUndefined()) return probe; |
1087 StubCompiler compiler; | 1120 StubCompiler compiler; |
1088 return FillCache(compiler.CompileCallPreMonomorphic(flags)); | 1121 return FillCache(isolate_, compiler.CompileCallPreMonomorphic(flags)); |
1089 } | 1122 } |
1090 | 1123 |
1091 | 1124 |
1092 MaybeObject* StubCache::ComputeCallNormal(int argc, | 1125 MaybeObject* StubCache::ComputeCallNormal(int argc, |
1093 InLoopFlag in_loop, | 1126 InLoopFlag in_loop, |
1094 Code::Kind kind) { | 1127 Code::Kind kind) { |
1095 Code::Flags flags = Code::ComputeFlags(kind, | 1128 Code::Flags flags = Code::ComputeFlags(kind, |
1096 in_loop, | 1129 in_loop, |
1097 MONOMORPHIC, | 1130 MONOMORPHIC, |
1098 Code::kNoExtraICState, | 1131 Code::kNoExtraICState, |
1099 NORMAL, | 1132 NORMAL, |
1100 argc); | 1133 argc); |
1101 Object* probe; | 1134 Object* probe; |
1102 { MaybeObject* maybe_probe = ProbeCache(flags); | 1135 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1103 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1136 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1104 } | 1137 } |
1105 if (!probe->IsUndefined()) return probe; | 1138 if (!probe->IsUndefined()) return probe; |
1106 StubCompiler compiler; | 1139 StubCompiler compiler; |
1107 return FillCache(compiler.CompileCallNormal(flags)); | 1140 return FillCache(isolate_, compiler.CompileCallNormal(flags)); |
1108 } | 1141 } |
1109 | 1142 |
1110 | 1143 |
1111 MaybeObject* StubCache::ComputeCallMegamorphic(int argc, | 1144 MaybeObject* StubCache::ComputeCallMegamorphic(int argc, |
1112 InLoopFlag in_loop, | 1145 InLoopFlag in_loop, |
1113 Code::Kind kind) { | 1146 Code::Kind kind) { |
1114 Code::Flags flags = Code::ComputeFlags(kind, | 1147 Code::Flags flags = Code::ComputeFlags(kind, |
1115 in_loop, | 1148 in_loop, |
1116 MEGAMORPHIC, | 1149 MEGAMORPHIC, |
1117 Code::kNoExtraICState, | 1150 Code::kNoExtraICState, |
1118 NORMAL, | 1151 NORMAL, |
1119 argc); | 1152 argc); |
1120 Object* probe; | 1153 Object* probe; |
1121 { MaybeObject* maybe_probe = ProbeCache(flags); | 1154 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1122 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1155 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1123 } | 1156 } |
1124 if (!probe->IsUndefined()) return probe; | 1157 if (!probe->IsUndefined()) return probe; |
1125 StubCompiler compiler; | 1158 StubCompiler compiler; |
1126 return FillCache(compiler.CompileCallMegamorphic(flags)); | 1159 return FillCache(isolate_, compiler.CompileCallMegamorphic(flags)); |
1127 } | 1160 } |
1128 | 1161 |
1129 | 1162 |
1130 MaybeObject* StubCache::ComputeCallMiss(int argc, Code::Kind kind) { | 1163 MaybeObject* StubCache::ComputeCallMiss(int argc, Code::Kind kind) { |
1131 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs | 1164 // MONOMORPHIC_PROTOTYPE_FAILURE state is used to make sure that miss stubs |
1132 // and monomorphic stubs are not mixed up together in the stub cache. | 1165 // and monomorphic stubs are not mixed up together in the stub cache. |
1133 Code::Flags flags = Code::ComputeFlags(kind, | 1166 Code::Flags flags = Code::ComputeFlags(kind, |
1134 NOT_IN_LOOP, | 1167 NOT_IN_LOOP, |
1135 MONOMORPHIC_PROTOTYPE_FAILURE, | 1168 MONOMORPHIC_PROTOTYPE_FAILURE, |
1136 Code::kNoExtraICState, | 1169 Code::kNoExtraICState, |
1137 NORMAL, | 1170 NORMAL, |
1138 argc, | 1171 argc, |
1139 OWN_MAP); | 1172 OWN_MAP); |
1140 Object* probe; | 1173 Object* probe; |
1141 { MaybeObject* maybe_probe = ProbeCache(flags); | 1174 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1142 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1175 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1143 } | 1176 } |
1144 if (!probe->IsUndefined()) return probe; | 1177 if (!probe->IsUndefined()) return probe; |
1145 StubCompiler compiler; | 1178 StubCompiler compiler; |
1146 return FillCache(compiler.CompileCallMiss(flags)); | 1179 return FillCache(isolate_, compiler.CompileCallMiss(flags)); |
1147 } | 1180 } |
1148 | 1181 |
1149 | 1182 |
1150 #ifdef ENABLE_DEBUGGER_SUPPORT | 1183 #ifdef ENABLE_DEBUGGER_SUPPORT |
1151 MaybeObject* StubCache::ComputeCallDebugBreak(int argc, Code::Kind kind) { | 1184 MaybeObject* StubCache::ComputeCallDebugBreak(int argc, Code::Kind kind) { |
1152 Code::Flags flags = Code::ComputeFlags(kind, | 1185 Code::Flags flags = Code::ComputeFlags(kind, |
1153 NOT_IN_LOOP, | 1186 NOT_IN_LOOP, |
1154 DEBUG_BREAK, | 1187 DEBUG_BREAK, |
1155 Code::kNoExtraICState, | 1188 Code::kNoExtraICState, |
1156 NORMAL, | 1189 NORMAL, |
1157 argc); | 1190 argc); |
1158 Object* probe; | 1191 Object* probe; |
1159 { MaybeObject* maybe_probe = ProbeCache(flags); | 1192 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1160 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1193 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1161 } | 1194 } |
1162 if (!probe->IsUndefined()) return probe; | 1195 if (!probe->IsUndefined()) return probe; |
1163 StubCompiler compiler; | 1196 StubCompiler compiler; |
1164 return FillCache(compiler.CompileCallDebugBreak(flags)); | 1197 return FillCache(isolate_, compiler.CompileCallDebugBreak(flags)); |
1165 } | 1198 } |
1166 | 1199 |
1167 | 1200 |
1168 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn(int argc, | 1201 MaybeObject* StubCache::ComputeCallDebugPrepareStepIn(int argc, |
1169 Code::Kind kind) { | 1202 Code::Kind kind) { |
1170 Code::Flags flags = Code::ComputeFlags(kind, | 1203 Code::Flags flags = Code::ComputeFlags(kind, |
1171 NOT_IN_LOOP, | 1204 NOT_IN_LOOP, |
1172 DEBUG_PREPARE_STEP_IN, | 1205 DEBUG_PREPARE_STEP_IN, |
1173 Code::kNoExtraICState, | 1206 Code::kNoExtraICState, |
1174 NORMAL, | 1207 NORMAL, |
1175 argc); | 1208 argc); |
1176 Object* probe; | 1209 Object* probe; |
1177 { MaybeObject* maybe_probe = ProbeCache(flags); | 1210 { MaybeObject* maybe_probe = ProbeCache(isolate_, flags); |
1178 if (!maybe_probe->ToObject(&probe)) return maybe_probe; | 1211 if (!maybe_probe->ToObject(&probe)) return maybe_probe; |
1179 } | 1212 } |
1180 if (!probe->IsUndefined()) return probe; | 1213 if (!probe->IsUndefined()) return probe; |
1181 StubCompiler compiler; | 1214 StubCompiler compiler; |
1182 return FillCache(compiler.CompileCallDebugPrepareStepIn(flags)); | 1215 return FillCache(isolate_, compiler.CompileCallDebugPrepareStepIn(flags)); |
1183 } | 1216 } |
1184 #endif | 1217 #endif |
1185 | 1218 |
1186 | 1219 |
1187 void StubCache::Clear() { | 1220 void StubCache::Clear() { |
1188 for (int i = 0; i < kPrimaryTableSize; i++) { | 1221 for (int i = 0; i < kPrimaryTableSize; i++) { |
1189 primary_[i].key = Heap::empty_string(); | 1222 primary_[i].key = isolate_->heap()->empty_string(); |
1190 primary_[i].value = Builtins::builtin(Builtins::Illegal); | 1223 primary_[i].value = isolate_->builtins()->builtin( |
| 1224 Builtins::Illegal); |
1191 } | 1225 } |
1192 for (int j = 0; j < kSecondaryTableSize; j++) { | 1226 for (int j = 0; j < kSecondaryTableSize; j++) { |
1193 secondary_[j].key = Heap::empty_string(); | 1227 secondary_[j].key = isolate_->heap()->empty_string(); |
1194 secondary_[j].value = Builtins::builtin(Builtins::Illegal); | 1228 secondary_[j].value = isolate_->builtins()->builtin( |
| 1229 Builtins::Illegal); |
1195 } | 1230 } |
1196 } | 1231 } |
1197 | 1232 |
1198 | 1233 |
1199 void StubCache::CollectMatchingMaps(ZoneMapList* types, | 1234 void StubCache::CollectMatchingMaps(ZoneMapList* types, |
1200 String* name, | 1235 String* name, |
1201 Code::Flags flags) { | 1236 Code::Flags flags) { |
1202 for (int i = 0; i < kPrimaryTableSize; i++) { | 1237 for (int i = 0; i < kPrimaryTableSize; i++) { |
1203 if (primary_[i].key == name) { | 1238 if (primary_[i].key == name) { |
1204 Map* map = primary_[i].value->FindFirstMap(); | 1239 Map* map = primary_[i].value->FindFirstMap(); |
(...skipping 30 matching lines...) Expand all Loading... |
1235 } | 1270 } |
1236 } | 1271 } |
1237 } | 1272 } |
1238 } | 1273 } |
1239 | 1274 |
1240 | 1275 |
1241 // ------------------------------------------------------------------------ | 1276 // ------------------------------------------------------------------------ |
1242 // StubCompiler implementation. | 1277 // StubCompiler implementation. |
1243 | 1278 |
1244 | 1279 |
1245 MaybeObject* LoadCallbackProperty(Arguments args) { | 1280 MaybeObject* LoadCallbackProperty(RUNTIME_CALLING_CONVENTION) { |
| 1281 RUNTIME_GET_ISOLATE; |
1246 ASSERT(args[0]->IsJSObject()); | 1282 ASSERT(args[0]->IsJSObject()); |
1247 ASSERT(args[1]->IsJSObject()); | 1283 ASSERT(args[1]->IsJSObject()); |
1248 AccessorInfo* callback = AccessorInfo::cast(args[3]); | 1284 AccessorInfo* callback = AccessorInfo::cast(args[3]); |
1249 Address getter_address = v8::ToCData<Address>(callback->getter()); | 1285 Address getter_address = v8::ToCData<Address>(callback->getter()); |
1250 v8::AccessorGetter fun = FUNCTION_CAST<v8::AccessorGetter>(getter_address); | 1286 v8::AccessorGetter fun = FUNCTION_CAST<v8::AccessorGetter>(getter_address); |
1251 ASSERT(fun != NULL); | 1287 ASSERT(fun != NULL); |
1252 v8::AccessorInfo info(&args[0]); | 1288 v8::AccessorInfo info(&args[0]); |
1253 HandleScope scope; | 1289 HandleScope scope(isolate); |
1254 v8::Handle<v8::Value> result; | 1290 v8::Handle<v8::Value> result; |
1255 { | 1291 { |
1256 // Leaving JavaScript. | 1292 // Leaving JavaScript. |
1257 VMState state(EXTERNAL); | 1293 VMState state(isolate, EXTERNAL); |
1258 ExternalCallbackScope call_scope(getter_address); | 1294 ExternalCallbackScope call_scope(isolate, getter_address); |
1259 result = fun(v8::Utils::ToLocal(args.at<String>(4)), info); | 1295 result = fun(v8::Utils::ToLocal(args.at<String>(4)), info); |
1260 } | 1296 } |
1261 RETURN_IF_SCHEDULED_EXCEPTION(); | 1297 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1262 if (result.IsEmpty()) return Heap::undefined_value(); | 1298 if (result.IsEmpty()) return HEAP->undefined_value(); |
1263 return *v8::Utils::OpenHandle(*result); | 1299 return *v8::Utils::OpenHandle(*result); |
1264 } | 1300 } |
1265 | 1301 |
1266 | 1302 |
1267 MaybeObject* StoreCallbackProperty(Arguments args) { | 1303 MaybeObject* StoreCallbackProperty(RUNTIME_CALLING_CONVENTION) { |
| 1304 RUNTIME_GET_ISOLATE; |
1268 JSObject* recv = JSObject::cast(args[0]); | 1305 JSObject* recv = JSObject::cast(args[0]); |
1269 AccessorInfo* callback = AccessorInfo::cast(args[1]); | 1306 AccessorInfo* callback = AccessorInfo::cast(args[1]); |
1270 Address setter_address = v8::ToCData<Address>(callback->setter()); | 1307 Address setter_address = v8::ToCData<Address>(callback->setter()); |
1271 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); | 1308 v8::AccessorSetter fun = FUNCTION_CAST<v8::AccessorSetter>(setter_address); |
1272 ASSERT(fun != NULL); | 1309 ASSERT(fun != NULL); |
1273 Handle<String> name = args.at<String>(2); | 1310 Handle<String> name = args.at<String>(2); |
1274 Handle<Object> value = args.at<Object>(3); | 1311 Handle<Object> value = args.at<Object>(3); |
1275 HandleScope scope; | 1312 HandleScope scope(isolate); |
1276 LOG(ApiNamedPropertyAccess("store", recv, *name)); | 1313 LOG(isolate, ApiNamedPropertyAccess("store", recv, *name)); |
1277 CustomArguments custom_args(callback->data(), recv, recv); | 1314 CustomArguments custom_args(isolate, callback->data(), recv, recv); |
1278 v8::AccessorInfo info(custom_args.end()); | 1315 v8::AccessorInfo info(custom_args.end()); |
1279 { | 1316 { |
1280 // Leaving JavaScript. | 1317 // Leaving JavaScript. |
1281 VMState state(EXTERNAL); | 1318 VMState state(isolate, EXTERNAL); |
1282 ExternalCallbackScope call_scope(setter_address); | 1319 ExternalCallbackScope call_scope(isolate, setter_address); |
1283 fun(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), info); | 1320 fun(v8::Utils::ToLocal(name), v8::Utils::ToLocal(value), info); |
1284 } | 1321 } |
1285 RETURN_IF_SCHEDULED_EXCEPTION(); | 1322 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1286 return *value; | 1323 return *value; |
1287 } | 1324 } |
1288 | 1325 |
1289 | 1326 |
1290 static const int kAccessorInfoOffsetInInterceptorArgs = 2; | 1327 static const int kAccessorInfoOffsetInInterceptorArgs = 2; |
1291 | 1328 |
1292 | 1329 |
1293 /** | 1330 /** |
1294 * Attempts to load a property with an interceptor (which must be present), | 1331 * Attempts to load a property with an interceptor (which must be present), |
1295 * but doesn't search the prototype chain. | 1332 * but doesn't search the prototype chain. |
1296 * | 1333 * |
1297 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't | 1334 * Returns |Heap::no_interceptor_result_sentinel()| if interceptor doesn't |
1298 * provide any value for the given name. | 1335 * provide any value for the given name. |
1299 */ | 1336 */ |
1300 MaybeObject* LoadPropertyWithInterceptorOnly(Arguments args) { | 1337 MaybeObject* LoadPropertyWithInterceptorOnly(RUNTIME_CALLING_CONVENTION) { |
| 1338 RUNTIME_GET_ISOLATE; |
1301 Handle<String> name_handle = args.at<String>(0); | 1339 Handle<String> name_handle = args.at<String>(0); |
1302 Handle<InterceptorInfo> interceptor_info = args.at<InterceptorInfo>(1); | 1340 Handle<InterceptorInfo> interceptor_info = args.at<InterceptorInfo>(1); |
1303 ASSERT(kAccessorInfoOffsetInInterceptorArgs == 2); | 1341 ASSERT(kAccessorInfoOffsetInInterceptorArgs == 2); |
1304 ASSERT(args[2]->IsJSObject()); // Receiver. | 1342 ASSERT(args[2]->IsJSObject()); // Receiver. |
1305 ASSERT(args[3]->IsJSObject()); // Holder. | 1343 ASSERT(args[3]->IsJSObject()); // Holder. |
1306 ASSERT(args.length() == 5); // Last arg is data object. | 1344 ASSERT(args.length() == 5); // Last arg is data object. |
1307 | 1345 |
1308 Address getter_address = v8::ToCData<Address>(interceptor_info->getter()); | 1346 Address getter_address = v8::ToCData<Address>(interceptor_info->getter()); |
1309 v8::NamedPropertyGetter getter = | 1347 v8::NamedPropertyGetter getter = |
1310 FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address); | 1348 FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address); |
1311 ASSERT(getter != NULL); | 1349 ASSERT(getter != NULL); |
1312 | 1350 |
1313 { | 1351 { |
1314 // Use the interceptor getter. | 1352 // Use the interceptor getter. |
1315 v8::AccessorInfo info(args.arguments() - | 1353 v8::AccessorInfo info(args.arguments() - |
1316 kAccessorInfoOffsetInInterceptorArgs); | 1354 kAccessorInfoOffsetInInterceptorArgs); |
1317 HandleScope scope; | 1355 HandleScope scope(isolate); |
1318 v8::Handle<v8::Value> r; | 1356 v8::Handle<v8::Value> r; |
1319 { | 1357 { |
1320 // Leaving JavaScript. | 1358 // Leaving JavaScript. |
1321 VMState state(EXTERNAL); | 1359 VMState state(isolate, EXTERNAL); |
1322 r = getter(v8::Utils::ToLocal(name_handle), info); | 1360 r = getter(v8::Utils::ToLocal(name_handle), info); |
1323 } | 1361 } |
1324 RETURN_IF_SCHEDULED_EXCEPTION(); | 1362 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1325 if (!r.IsEmpty()) { | 1363 if (!r.IsEmpty()) { |
1326 return *v8::Utils::OpenHandle(*r); | 1364 return *v8::Utils::OpenHandle(*r); |
1327 } | 1365 } |
1328 } | 1366 } |
1329 | 1367 |
1330 return Heap::no_interceptor_result_sentinel(); | 1368 return isolate->heap()->no_interceptor_result_sentinel(); |
1331 } | 1369 } |
1332 | 1370 |
1333 | 1371 |
1334 static MaybeObject* ThrowReferenceError(String* name) { | 1372 static MaybeObject* ThrowReferenceError(String* name) { |
1335 // If the load is non-contextual, just return the undefined result. | 1373 // If the load is non-contextual, just return the undefined result. |
1336 // Note that both keyed and non-keyed loads may end up here, so we | 1374 // Note that both keyed and non-keyed loads may end up here, so we |
1337 // can't use either LoadIC or KeyedLoadIC constructors. | 1375 // can't use either LoadIC or KeyedLoadIC constructors. |
1338 IC ic(IC::NO_EXTRA_FRAME); | 1376 IC ic(IC::NO_EXTRA_FRAME, Isolate::Current()); |
1339 ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub()); | 1377 ASSERT(ic.target()->is_load_stub() || ic.target()->is_keyed_load_stub()); |
1340 if (!ic.SlowIsContextual()) return Heap::undefined_value(); | 1378 if (!ic.SlowIsContextual()) return HEAP->undefined_value(); |
1341 | 1379 |
1342 // Throw a reference error. | 1380 // Throw a reference error. |
1343 HandleScope scope; | 1381 HandleScope scope; |
1344 Handle<String> name_handle(name); | 1382 Handle<String> name_handle(name); |
1345 Handle<Object> error = | 1383 Handle<Object> error = |
1346 Factory::NewReferenceError("not_defined", | 1384 FACTORY->NewReferenceError("not_defined", |
1347 HandleVector(&name_handle, 1)); | 1385 HandleVector(&name_handle, 1)); |
1348 return Top::Throw(*error); | 1386 return Isolate::Current()->Throw(*error); |
1349 } | 1387 } |
1350 | 1388 |
1351 | 1389 |
1352 static MaybeObject* LoadWithInterceptor(Arguments* args, | 1390 static MaybeObject* LoadWithInterceptor(Arguments* args, |
1353 PropertyAttributes* attrs) { | 1391 PropertyAttributes* attrs) { |
1354 Handle<String> name_handle = args->at<String>(0); | 1392 Handle<String> name_handle = args->at<String>(0); |
1355 Handle<InterceptorInfo> interceptor_info = args->at<InterceptorInfo>(1); | 1393 Handle<InterceptorInfo> interceptor_info = args->at<InterceptorInfo>(1); |
1356 ASSERT(kAccessorInfoOffsetInInterceptorArgs == 2); | 1394 ASSERT(kAccessorInfoOffsetInInterceptorArgs == 2); |
1357 Handle<JSObject> receiver_handle = args->at<JSObject>(2); | 1395 Handle<JSObject> receiver_handle = args->at<JSObject>(2); |
1358 Handle<JSObject> holder_handle = args->at<JSObject>(3); | 1396 Handle<JSObject> holder_handle = args->at<JSObject>(3); |
1359 ASSERT(args->length() == 5); // Last arg is data object. | 1397 ASSERT(args->length() == 5); // Last arg is data object. |
1360 | 1398 |
| 1399 Isolate* isolate = receiver_handle->GetIsolate(); |
| 1400 |
1361 Address getter_address = v8::ToCData<Address>(interceptor_info->getter()); | 1401 Address getter_address = v8::ToCData<Address>(interceptor_info->getter()); |
1362 v8::NamedPropertyGetter getter = | 1402 v8::NamedPropertyGetter getter = |
1363 FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address); | 1403 FUNCTION_CAST<v8::NamedPropertyGetter>(getter_address); |
1364 ASSERT(getter != NULL); | 1404 ASSERT(getter != NULL); |
1365 | 1405 |
1366 { | 1406 { |
1367 // Use the interceptor getter. | 1407 // Use the interceptor getter. |
1368 v8::AccessorInfo info(args->arguments() - | 1408 v8::AccessorInfo info(args->arguments() - |
1369 kAccessorInfoOffsetInInterceptorArgs); | 1409 kAccessorInfoOffsetInInterceptorArgs); |
1370 HandleScope scope; | 1410 HandleScope scope(isolate); |
1371 v8::Handle<v8::Value> r; | 1411 v8::Handle<v8::Value> r; |
1372 { | 1412 { |
1373 // Leaving JavaScript. | 1413 // Leaving JavaScript. |
1374 VMState state(EXTERNAL); | 1414 VMState state(isolate, EXTERNAL); |
1375 r = getter(v8::Utils::ToLocal(name_handle), info); | 1415 r = getter(v8::Utils::ToLocal(name_handle), info); |
1376 } | 1416 } |
1377 RETURN_IF_SCHEDULED_EXCEPTION(); | 1417 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1378 if (!r.IsEmpty()) { | 1418 if (!r.IsEmpty()) { |
1379 *attrs = NONE; | 1419 *attrs = NONE; |
1380 return *v8::Utils::OpenHandle(*r); | 1420 return *v8::Utils::OpenHandle(*r); |
1381 } | 1421 } |
1382 } | 1422 } |
1383 | 1423 |
1384 MaybeObject* result = holder_handle->GetPropertyPostInterceptor( | 1424 MaybeObject* result = holder_handle->GetPropertyPostInterceptor( |
1385 *receiver_handle, | 1425 *receiver_handle, |
1386 *name_handle, | 1426 *name_handle, |
1387 attrs); | 1427 attrs); |
1388 RETURN_IF_SCHEDULED_EXCEPTION(); | 1428 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1389 return result; | 1429 return result; |
1390 } | 1430 } |
1391 | 1431 |
1392 | 1432 |
1393 /** | 1433 /** |
1394 * Loads a property with an interceptor performing post interceptor | 1434 * Loads a property with an interceptor performing post interceptor |
1395 * lookup if interceptor failed. | 1435 * lookup if interceptor failed. |
1396 */ | 1436 */ |
1397 MaybeObject* LoadPropertyWithInterceptorForLoad(Arguments args) { | 1437 MaybeObject* LoadPropertyWithInterceptorForLoad(RUNTIME_CALLING_CONVENTION) { |
| 1438 RUNTIME_GET_ISOLATE; |
1398 PropertyAttributes attr = NONE; | 1439 PropertyAttributes attr = NONE; |
1399 Object* result; | 1440 Object* result; |
1400 { MaybeObject* maybe_result = LoadWithInterceptor(&args, &attr); | 1441 { MaybeObject* maybe_result = LoadWithInterceptor(&args, &attr); |
1401 if (!maybe_result->ToObject(&result)) return maybe_result; | 1442 if (!maybe_result->ToObject(&result)) return maybe_result; |
1402 } | 1443 } |
1403 | 1444 |
1404 // If the property is present, return it. | 1445 // If the property is present, return it. |
1405 if (attr != ABSENT) return result; | 1446 if (attr != ABSENT) return result; |
1406 return ThrowReferenceError(String::cast(args[0])); | 1447 return ThrowReferenceError(String::cast(args[0])); |
1407 } | 1448 } |
1408 | 1449 |
1409 | 1450 |
1410 MaybeObject* LoadPropertyWithInterceptorForCall(Arguments args) { | 1451 MaybeObject* LoadPropertyWithInterceptorForCall(RUNTIME_CALLING_CONVENTION) { |
| 1452 RUNTIME_GET_ISOLATE; |
1411 PropertyAttributes attr; | 1453 PropertyAttributes attr; |
1412 MaybeObject* result = LoadWithInterceptor(&args, &attr); | 1454 MaybeObject* result = LoadWithInterceptor(&args, &attr); |
1413 RETURN_IF_SCHEDULED_EXCEPTION(); | 1455 RETURN_IF_SCHEDULED_EXCEPTION(isolate); |
1414 // This is call IC. In this case, we simply return the undefined result which | 1456 // This is call IC. In this case, we simply return the undefined result which |
1415 // will lead to an exception when trying to invoke the result as a | 1457 // will lead to an exception when trying to invoke the result as a |
1416 // function. | 1458 // function. |
1417 return result; | 1459 return result; |
1418 } | 1460 } |
1419 | 1461 |
1420 | 1462 |
1421 MaybeObject* StoreInterceptorProperty(Arguments args) { | 1463 MaybeObject* StoreInterceptorProperty(RUNTIME_CALLING_CONVENTION) { |
| 1464 RUNTIME_GET_ISOLATE; |
1422 ASSERT(args.length() == 4); | 1465 ASSERT(args.length() == 4); |
1423 JSObject* recv = JSObject::cast(args[0]); | 1466 JSObject* recv = JSObject::cast(args[0]); |
1424 String* name = String::cast(args[1]); | 1467 String* name = String::cast(args[1]); |
1425 Object* value = args[2]; | 1468 Object* value = args[2]; |
1426 StrictModeFlag strict_mode = | 1469 StrictModeFlag strict_mode = |
1427 static_cast<StrictModeFlag>(Smi::cast(args[3])->value()); | 1470 static_cast<StrictModeFlag>(Smi::cast(args[3])->value()); |
1428 ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); | 1471 ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); |
1429 ASSERT(recv->HasNamedInterceptor()); | 1472 ASSERT(recv->HasNamedInterceptor()); |
1430 PropertyAttributes attr = NONE; | 1473 PropertyAttributes attr = NONE; |
1431 MaybeObject* result = recv->SetPropertyWithInterceptor( | 1474 MaybeObject* result = recv->SetPropertyWithInterceptor( |
1432 name, value, attr, strict_mode); | 1475 name, value, attr, strict_mode); |
1433 return result; | 1476 return result; |
1434 } | 1477 } |
1435 | 1478 |
1436 | 1479 |
1437 MaybeObject* KeyedLoadPropertyWithInterceptor(Arguments args) { | 1480 MaybeObject* KeyedLoadPropertyWithInterceptor(RUNTIME_CALLING_CONVENTION) { |
| 1481 RUNTIME_GET_ISOLATE; |
1438 JSObject* receiver = JSObject::cast(args[0]); | 1482 JSObject* receiver = JSObject::cast(args[0]); |
1439 ASSERT(Smi::cast(args[1])->value() >= 0); | 1483 ASSERT(Smi::cast(args[1])->value() >= 0); |
1440 uint32_t index = Smi::cast(args[1])->value(); | 1484 uint32_t index = Smi::cast(args[1])->value(); |
1441 return receiver->GetElementWithInterceptor(receiver, index); | 1485 return receiver->GetElementWithInterceptor(receiver, index); |
1442 } | 1486 } |
1443 | 1487 |
1444 | 1488 |
1445 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { | 1489 MaybeObject* StubCompiler::CompileCallInitialize(Code::Flags flags) { |
1446 HandleScope scope; | 1490 HandleScope scope(isolate()); |
1447 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1491 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1448 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1492 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1449 if (kind == Code::CALL_IC) { | 1493 if (kind == Code::CALL_IC) { |
1450 CallIC::GenerateInitialize(masm(), argc); | 1494 CallIC::GenerateInitialize(masm(), argc); |
1451 } else { | 1495 } else { |
1452 KeyedCallIC::GenerateInitialize(masm(), argc); | 1496 KeyedCallIC::GenerateInitialize(masm(), argc); |
1453 } | 1497 } |
1454 Object* result; | 1498 Object* result; |
1455 { MaybeObject* maybe_result = | 1499 { MaybeObject* maybe_result = |
1456 GetCodeWithFlags(flags, "CompileCallInitialize"); | 1500 GetCodeWithFlags(flags, "CompileCallInitialize"); |
1457 if (!maybe_result->ToObject(&result)) return maybe_result; | 1501 if (!maybe_result->ToObject(&result)) return maybe_result; |
1458 } | 1502 } |
1459 Counters::call_initialize_stubs.Increment(); | 1503 COUNTERS->call_initialize_stubs()->Increment(); |
1460 Code* code = Code::cast(result); | 1504 Code* code = Code::cast(result); |
1461 USE(code); | 1505 USE(code); |
1462 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), | 1506 PROFILE(isolate(), |
| 1507 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), |
1463 code, code->arguments_count())); | 1508 code, code->arguments_count())); |
1464 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code))); | 1509 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, Code::cast(code))); |
1465 return result; | 1510 return result; |
1466 } | 1511 } |
1467 | 1512 |
1468 | 1513 |
1469 MaybeObject* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { | 1514 MaybeObject* StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { |
1470 HandleScope scope; | 1515 HandleScope scope(isolate()); |
1471 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1516 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1472 // The code of the PreMonomorphic stub is the same as the code | 1517 // The code of the PreMonomorphic stub is the same as the code |
1473 // of the Initialized stub. They just differ on the code object flags. | 1518 // of the Initialized stub. They just differ on the code object flags. |
1474 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1519 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1475 if (kind == Code::CALL_IC) { | 1520 if (kind == Code::CALL_IC) { |
1476 CallIC::GenerateInitialize(masm(), argc); | 1521 CallIC::GenerateInitialize(masm(), argc); |
1477 } else { | 1522 } else { |
1478 KeyedCallIC::GenerateInitialize(masm(), argc); | 1523 KeyedCallIC::GenerateInitialize(masm(), argc); |
1479 } | 1524 } |
1480 Object* result; | 1525 Object* result; |
1481 { MaybeObject* maybe_result = | 1526 { MaybeObject* maybe_result = |
1482 GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); | 1527 GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); |
1483 if (!maybe_result->ToObject(&result)) return maybe_result; | 1528 if (!maybe_result->ToObject(&result)) return maybe_result; |
1484 } | 1529 } |
1485 Counters::call_premonomorphic_stubs.Increment(); | 1530 COUNTERS->call_premonomorphic_stubs()->Increment(); |
1486 Code* code = Code::cast(result); | 1531 Code* code = Code::cast(result); |
1487 USE(code); | 1532 USE(code); |
1488 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), | 1533 PROFILE(isolate(), |
| 1534 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), |
1489 code, code->arguments_count())); | 1535 code, code->arguments_count())); |
1490 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code))); | 1536 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, Code::cast(code))); |
1491 return result; | 1537 return result; |
1492 } | 1538 } |
1493 | 1539 |
1494 | 1540 |
1495 MaybeObject* StubCompiler::CompileCallNormal(Code::Flags flags) { | 1541 MaybeObject* StubCompiler::CompileCallNormal(Code::Flags flags) { |
1496 HandleScope scope; | 1542 HandleScope scope(isolate()); |
1497 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1543 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1498 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1544 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1499 if (kind == Code::CALL_IC) { | 1545 if (kind == Code::CALL_IC) { |
1500 CallIC::GenerateNormal(masm(), argc); | 1546 CallIC::GenerateNormal(masm(), argc); |
1501 } else { | 1547 } else { |
1502 KeyedCallIC::GenerateNormal(masm(), argc); | 1548 KeyedCallIC::GenerateNormal(masm(), argc); |
1503 } | 1549 } |
1504 Object* result; | 1550 Object* result; |
1505 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal"); | 1551 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallNormal"); |
1506 if (!maybe_result->ToObject(&result)) return maybe_result; | 1552 if (!maybe_result->ToObject(&result)) return maybe_result; |
1507 } | 1553 } |
1508 Counters::call_normal_stubs.Increment(); | 1554 COUNTERS->call_normal_stubs()->Increment(); |
1509 Code* code = Code::cast(result); | 1555 Code* code = Code::cast(result); |
1510 USE(code); | 1556 USE(code); |
1511 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), | 1557 PROFILE(isolate(), |
| 1558 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), |
1512 code, code->arguments_count())); | 1559 code, code->arguments_count())); |
1513 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code))); | 1560 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, Code::cast(code))); |
1514 return result; | 1561 return result; |
1515 } | 1562 } |
1516 | 1563 |
1517 | 1564 |
1518 MaybeObject* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { | 1565 MaybeObject* StubCompiler::CompileCallMegamorphic(Code::Flags flags) { |
1519 HandleScope scope; | 1566 HandleScope scope(isolate()); |
1520 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1567 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1521 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1568 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1522 if (kind == Code::CALL_IC) { | 1569 if (kind == Code::CALL_IC) { |
1523 CallIC::GenerateMegamorphic(masm(), argc); | 1570 CallIC::GenerateMegamorphic(masm(), argc); |
1524 } else { | 1571 } else { |
1525 KeyedCallIC::GenerateMegamorphic(masm(), argc); | 1572 KeyedCallIC::GenerateMegamorphic(masm(), argc); |
1526 } | 1573 } |
1527 | |
1528 Object* result; | 1574 Object* result; |
1529 { MaybeObject* maybe_result = | 1575 { MaybeObject* maybe_result = |
1530 GetCodeWithFlags(flags, "CompileCallMegamorphic"); | 1576 GetCodeWithFlags(flags, "CompileCallMegamorphic"); |
1531 if (!maybe_result->ToObject(&result)) return maybe_result; | 1577 if (!maybe_result->ToObject(&result)) return maybe_result; |
1532 } | 1578 } |
1533 Counters::call_megamorphic_stubs.Increment(); | 1579 COUNTERS->call_megamorphic_stubs()->Increment(); |
1534 Code* code = Code::cast(result); | 1580 Code* code = Code::cast(result); |
1535 USE(code); | 1581 USE(code); |
1536 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), | 1582 PROFILE(isolate(), |
| 1583 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), |
1537 code, code->arguments_count())); | 1584 code, code->arguments_count())); |
1538 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, Code::cast(code))); | 1585 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, Code::cast(code))); |
1539 return result; | 1586 return result; |
1540 } | 1587 } |
1541 | 1588 |
1542 | 1589 |
1543 MaybeObject* StubCompiler::CompileCallMiss(Code::Flags flags) { | 1590 MaybeObject* StubCompiler::CompileCallMiss(Code::Flags flags) { |
1544 HandleScope scope; | 1591 HandleScope scope(isolate()); |
1545 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1592 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1546 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1593 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1547 if (kind == Code::CALL_IC) { | 1594 if (kind == Code::CALL_IC) { |
1548 CallIC::GenerateMiss(masm(), argc); | 1595 CallIC::GenerateMiss(masm(), argc); |
1549 } else { | 1596 } else { |
1550 KeyedCallIC::GenerateMiss(masm(), argc); | 1597 KeyedCallIC::GenerateMiss(masm(), argc); |
1551 } | 1598 } |
1552 Object* result; | 1599 Object* result; |
1553 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss"); | 1600 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "CompileCallMiss"); |
1554 if (!maybe_result->ToObject(&result)) return maybe_result; | 1601 if (!maybe_result->ToObject(&result)) return maybe_result; |
1555 } | 1602 } |
1556 Counters::call_megamorphic_stubs.Increment(); | 1603 COUNTERS->call_megamorphic_stubs()->Increment(); |
1557 Code* code = Code::cast(result); | 1604 Code* code = Code::cast(result); |
1558 USE(code); | 1605 USE(code); |
1559 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), | 1606 PROFILE(isolate(), |
| 1607 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), |
1560 code, code->arguments_count())); | 1608 code, code->arguments_count())); |
1561 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, Code::cast(code))); | 1609 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, Code::cast(code))); |
1562 return result; | 1610 return result; |
1563 } | 1611 } |
1564 | 1612 |
1565 | 1613 |
1566 #ifdef ENABLE_DEBUGGER_SUPPORT | 1614 #ifdef ENABLE_DEBUGGER_SUPPORT |
1567 MaybeObject* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { | 1615 MaybeObject* StubCompiler::CompileCallDebugBreak(Code::Flags flags) { |
1568 HandleScope scope; | 1616 HandleScope scope(isolate()); |
1569 Debug::GenerateCallICDebugBreak(masm()); | 1617 Debug::GenerateCallICDebugBreak(masm()); |
1570 Object* result; | 1618 Object* result; |
1571 { MaybeObject* maybe_result = | 1619 { MaybeObject* maybe_result = |
1572 GetCodeWithFlags(flags, "CompileCallDebugBreak"); | 1620 GetCodeWithFlags(flags, "CompileCallDebugBreak"); |
1573 if (!maybe_result->ToObject(&result)) return maybe_result; | 1621 if (!maybe_result->ToObject(&result)) return maybe_result; |
1574 } | 1622 } |
1575 Code* code = Code::cast(result); | 1623 Code* code = Code::cast(result); |
1576 USE(code); | 1624 USE(code); |
1577 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1625 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1578 USE(kind); | 1626 USE(kind); |
1579 PROFILE(CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_DEBUG_BREAK_TAG), | 1627 PROFILE(isolate(), |
| 1628 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_DEBUG_BREAK_TAG), |
1580 code, code->arguments_count())); | 1629 code, code->arguments_count())); |
1581 return result; | 1630 return result; |
1582 } | 1631 } |
1583 | 1632 |
1584 | 1633 |
1585 MaybeObject* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { | 1634 MaybeObject* StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { |
1586 HandleScope scope; | 1635 HandleScope scope(isolate()); |
1587 // Use the same code for the the step in preparations as we do for | 1636 // Use the same code for the the step in preparations as we do for |
1588 // the miss case. | 1637 // the miss case. |
1589 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1638 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1590 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1639 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1591 if (kind == Code::CALL_IC) { | 1640 if (kind == Code::CALL_IC) { |
1592 CallIC::GenerateMiss(masm(), argc); | 1641 CallIC::GenerateMiss(masm(), argc); |
1593 } else { | 1642 } else { |
1594 KeyedCallIC::GenerateMiss(masm(), argc); | 1643 KeyedCallIC::GenerateMiss(masm(), argc); |
1595 } | 1644 } |
1596 Object* result; | 1645 Object* result; |
1597 { MaybeObject* maybe_result = | 1646 { MaybeObject* maybe_result = |
1598 GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); | 1647 GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); |
1599 if (!maybe_result->ToObject(&result)) return maybe_result; | 1648 if (!maybe_result->ToObject(&result)) return maybe_result; |
1600 } | 1649 } |
1601 Code* code = Code::cast(result); | 1650 Code* code = Code::cast(result); |
1602 USE(code); | 1651 USE(code); |
1603 PROFILE(CodeCreateEvent( | 1652 PROFILE(isolate(), |
1604 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), | 1653 CodeCreateEvent( |
1605 code, | 1654 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), |
1606 code->arguments_count())); | 1655 code, |
| 1656 code->arguments_count())); |
1607 return result; | 1657 return result; |
1608 } | 1658 } |
1609 #endif | 1659 #endif |
1610 | 1660 |
1611 #undef CALL_LOGGER_TAG | 1661 #undef CALL_LOGGER_TAG |
1612 | 1662 |
1613 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, | 1663 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, |
1614 const char* name) { | 1664 const char* name) { |
1615 // Check for allocation failures during stub compilation. | 1665 // Check for allocation failures during stub compilation. |
1616 if (failure_->IsFailure()) return failure_; | 1666 if (failure_->IsFailure()) return failure_; |
1617 | 1667 |
1618 // Create code object in the heap. | 1668 // Create code object in the heap. |
1619 CodeDesc desc; | 1669 CodeDesc desc; |
1620 masm_.GetCode(&desc); | 1670 masm_.GetCode(&desc); |
1621 MaybeObject* result = Heap::CreateCode(desc, flags, masm_.CodeObject()); | 1671 MaybeObject* result = HEAP->CreateCode(desc, flags, masm_.CodeObject()); |
1622 #ifdef ENABLE_DISASSEMBLER | 1672 #ifdef ENABLE_DISASSEMBLER |
1623 if (FLAG_print_code_stubs && !result->IsFailure()) { | 1673 if (FLAG_print_code_stubs && !result->IsFailure()) { |
1624 Code::cast(result->ToObjectUnchecked())->Disassemble(name); | 1674 Code::cast(result->ToObjectUnchecked())->Disassemble(name); |
1625 } | 1675 } |
1626 #endif | 1676 #endif |
1627 return result; | 1677 return result; |
1628 } | 1678 } |
1629 | 1679 |
1630 | 1680 |
1631 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, String* name) { | 1681 MaybeObject* StubCompiler::GetCodeWithFlags(Code::Flags flags, String* name) { |
1632 if (FLAG_print_code_stubs && (name != NULL)) { | 1682 if (FLAG_print_code_stubs && (name != NULL)) { |
1633 return GetCodeWithFlags(flags, *name->ToCString()); | 1683 return GetCodeWithFlags(flags, *name->ToCString()); |
1634 } | 1684 } |
1635 return GetCodeWithFlags(flags, reinterpret_cast<char*>(NULL)); | 1685 return GetCodeWithFlags(flags, reinterpret_cast<char*>(NULL)); |
1636 } | 1686 } |
1637 | 1687 |
1638 | 1688 |
1639 void StubCompiler::LookupPostInterceptor(JSObject* holder, | 1689 void StubCompiler::LookupPostInterceptor(JSObject* holder, |
1640 String* name, | 1690 String* name, |
1641 LookupResult* lookup) { | 1691 LookupResult* lookup) { |
1642 holder->LocalLookupRealNamedProperty(name, lookup); | 1692 holder->LocalLookupRealNamedProperty(name, lookup); |
1643 if (!lookup->IsProperty()) { | 1693 if (!lookup->IsProperty()) { |
1644 lookup->NotFound(); | 1694 lookup->NotFound(); |
1645 Object* proto = holder->GetPrototype(); | 1695 Object* proto = holder->GetPrototype(); |
1646 if (proto != Heap::null_value()) { | 1696 if (!proto->IsNull()) { |
1647 proto->Lookup(name, lookup); | 1697 proto->Lookup(name, lookup); |
1648 } | 1698 } |
1649 } | 1699 } |
1650 } | 1700 } |
1651 | 1701 |
1652 | 1702 |
1653 | 1703 |
1654 MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) { | 1704 MaybeObject* LoadStubCompiler::GetCode(PropertyType type, String* name) { |
1655 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1705 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); |
1656 MaybeObject* result = GetCodeWithFlags(flags, name); | 1706 MaybeObject* result = GetCodeWithFlags(flags, name); |
1657 if (!result->IsFailure()) { | 1707 if (!result->IsFailure()) { |
1658 PROFILE(CodeCreateEvent(Logger::LOAD_IC_TAG, | 1708 PROFILE(isolate(), |
| 1709 CodeCreateEvent(Logger::LOAD_IC_TAG, |
1659 Code::cast(result->ToObjectUnchecked()), | 1710 Code::cast(result->ToObjectUnchecked()), |
1660 name)); | 1711 name)); |
1661 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1712 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
1662 name, | 1713 name, |
1663 Code::cast(result->ToObjectUnchecked()))); | 1714 Code::cast(result->ToObjectUnchecked()))); |
1664 } | 1715 } |
1665 return result; | 1716 return result; |
1666 } | 1717 } |
1667 | 1718 |
1668 | 1719 |
1669 MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { | 1720 MaybeObject* KeyedLoadStubCompiler::GetCode(PropertyType type, String* name) { |
1670 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, type); | 1721 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, type); |
1671 MaybeObject* result = GetCodeWithFlags(flags, name); | 1722 MaybeObject* result = GetCodeWithFlags(flags, name); |
1672 if (!result->IsFailure()) { | 1723 if (!result->IsFailure()) { |
1673 PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, | 1724 PROFILE(isolate(), |
| 1725 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, |
1674 Code::cast(result->ToObjectUnchecked()), | 1726 Code::cast(result->ToObjectUnchecked()), |
1675 name)); | 1727 name)); |
1676 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, | 1728 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, |
1677 name, | 1729 name, |
1678 Code::cast(result->ToObjectUnchecked()))); | 1730 Code::cast(result->ToObjectUnchecked()))); |
1679 } | 1731 } |
1680 return result; | 1732 return result; |
1681 } | 1733 } |
1682 | 1734 |
1683 | 1735 |
1684 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { | 1736 MaybeObject* StoreStubCompiler::GetCode(PropertyType type, String* name) { |
1685 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1737 Code::Flags flags = Code::ComputeMonomorphicFlags( |
1686 Code::STORE_IC, type, strict_mode_); | 1738 Code::STORE_IC, type, strict_mode_); |
1687 MaybeObject* result = GetCodeWithFlags(flags, name); | 1739 MaybeObject* result = GetCodeWithFlags(flags, name); |
1688 if (!result->IsFailure()) { | 1740 if (!result->IsFailure()) { |
1689 PROFILE(CodeCreateEvent(Logger::STORE_IC_TAG, | 1741 PROFILE(isolate(), |
| 1742 CodeCreateEvent(Logger::STORE_IC_TAG, |
1690 Code::cast(result->ToObjectUnchecked()), | 1743 Code::cast(result->ToObjectUnchecked()), |
1691 name)); | 1744 name)); |
1692 GDBJIT(AddCode(GDBJITInterface::STORE_IC, | 1745 GDBJIT(AddCode(GDBJITInterface::STORE_IC, |
1693 name, | 1746 name, |
1694 Code::cast(result->ToObjectUnchecked()))); | 1747 Code::cast(result->ToObjectUnchecked()))); |
1695 } | 1748 } |
1696 return result; | 1749 return result; |
1697 } | 1750 } |
1698 | 1751 |
1699 | 1752 |
1700 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { | 1753 MaybeObject* KeyedStoreStubCompiler::GetCode(PropertyType type, String* name) { |
1701 Code::Flags flags = Code::ComputeMonomorphicFlags( | 1754 Code::Flags flags = Code::ComputeMonomorphicFlags( |
1702 Code::KEYED_STORE_IC, type, strict_mode_); | 1755 Code::KEYED_STORE_IC, type, strict_mode_); |
1703 MaybeObject* result = GetCodeWithFlags(flags, name); | 1756 MaybeObject* result = GetCodeWithFlags(flags, name); |
1704 if (!result->IsFailure()) { | 1757 if (!result->IsFailure()) { |
1705 PROFILE(CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, | 1758 PROFILE(isolate(), |
| 1759 CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, |
1706 Code::cast(result->ToObjectUnchecked()), | 1760 Code::cast(result->ToObjectUnchecked()), |
1707 name)); | 1761 name)); |
1708 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, | 1762 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, |
1709 name, | 1763 name, |
1710 Code::cast(result->ToObjectUnchecked()))); | 1764 Code::cast(result->ToObjectUnchecked()))); |
1711 } | 1765 } |
1712 return result; | 1766 return result; |
1713 } | 1767 } |
1714 | 1768 |
1715 | 1769 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1796 | 1850 |
1797 | 1851 |
1798 MaybeObject* ConstructStubCompiler::GetCode() { | 1852 MaybeObject* ConstructStubCompiler::GetCode() { |
1799 Code::Flags flags = Code::ComputeFlags(Code::STUB); | 1853 Code::Flags flags = Code::ComputeFlags(Code::STUB); |
1800 Object* result; | 1854 Object* result; |
1801 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub"); | 1855 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ConstructStub"); |
1802 if (!maybe_result->ToObject(&result)) return maybe_result; | 1856 if (!maybe_result->ToObject(&result)) return maybe_result; |
1803 } | 1857 } |
1804 Code* code = Code::cast(result); | 1858 Code* code = Code::cast(result); |
1805 USE(code); | 1859 USE(code); |
1806 PROFILE(CodeCreateEvent(Logger::STUB_TAG, code, "ConstructStub")); | 1860 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, code, "ConstructStub")); |
1807 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", Code::cast(code))); | 1861 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", Code::cast(code))); |
1808 return result; | 1862 return result; |
1809 } | 1863 } |
1810 | 1864 |
1811 | 1865 |
1812 CallOptimization::CallOptimization(LookupResult* lookup) { | 1866 CallOptimization::CallOptimization(LookupResult* lookup) { |
1813 if (!lookup->IsProperty() || !lookup->IsCacheable() || | 1867 if (!lookup->IsProperty() || !lookup->IsCacheable() || |
1814 lookup->type() != CONSTANT_FUNCTION) { | 1868 lookup->type() != CONSTANT_FUNCTION) { |
1815 Initialize(NULL); | 1869 Initialize(NULL); |
1816 } else { | 1870 } else { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1876 } | 1930 } |
1877 | 1931 |
1878 | 1932 |
1879 MaybeObject* ExternalArrayStubCompiler::GetCode(Code::Flags flags) { | 1933 MaybeObject* ExternalArrayStubCompiler::GetCode(Code::Flags flags) { |
1880 Object* result; | 1934 Object* result; |
1881 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ExternalArrayStub"); | 1935 { MaybeObject* maybe_result = GetCodeWithFlags(flags, "ExternalArrayStub"); |
1882 if (!maybe_result->ToObject(&result)) return maybe_result; | 1936 if (!maybe_result->ToObject(&result)) return maybe_result; |
1883 } | 1937 } |
1884 Code* code = Code::cast(result); | 1938 Code* code = Code::cast(result); |
1885 USE(code); | 1939 USE(code); |
1886 PROFILE(CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); | 1940 PROFILE(isolate(), |
| 1941 CodeCreateEvent(Logger::STUB_TAG, code, "ExternalArrayStub")); |
1887 return result; | 1942 return result; |
1888 } | 1943 } |
1889 | 1944 |
1890 | 1945 |
1891 } } // namespace v8::internal | 1946 } } // namespace v8::internal |
OLD | NEW |