OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 | 112 |
113 | 113 |
114 Handle<Code> StubCache::FindIC(Handle<Name> name, | 114 Handle<Code> StubCache::FindIC(Handle<Name> name, |
115 Handle<JSObject> stub_holder, | 115 Handle<JSObject> stub_holder, |
116 Code::Kind kind, | 116 Code::Kind kind, |
117 Code::ExtraICState extra_ic_state) { | 117 Code::ExtraICState extra_ic_state) { |
118 return FindIC(name, Handle<Map>(stub_holder->map()), kind, extra_ic_state); | 118 return FindIC(name, Handle<Map>(stub_holder->map()), kind, extra_ic_state); |
119 } | 119 } |
120 | 120 |
121 | 121 |
122 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name, | 122 Handle<Code> StubCache::FindHandler(Handle<Name> name, |
123 Handle<JSObject> receiver, | 123 Handle<JSObject> receiver, |
124 Code::Kind kind) { | 124 Code::Kind kind, |
125 Code::Flags flags = Code::ComputeMonomorphicFlags( | 125 StrictModeFlag strict_mode) { |
126 Code::HANDLER, Code::kNoExtraICState, Code::NORMAL, kind); | 126 Code::ExtraICState extra_ic_state = Code::kNoExtraICState; |
127 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 127 if (kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC) { |
128 isolate_); | 128 extra_ic_state = Code::ComputeExtraICState( |
129 if (probe->IsCode()) return Handle<Code>::cast(probe); | 129 STANDARD_STORE, strict_mode); |
130 return Handle<Code>::null(); | 130 } |
131 } | |
132 | |
133 | |
134 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name, | |
135 Handle<JSObject> receiver, | |
136 Code::Kind kind, | |
137 StrictModeFlag strict_mode) { | |
138 Code::ExtraICState extra_ic_state = Code::ComputeExtraICState( | |
139 STANDARD_STORE, strict_mode); | |
140 Code::Flags flags = Code::ComputeMonomorphicFlags( | 131 Code::Flags flags = Code::ComputeMonomorphicFlags( |
141 Code::HANDLER, extra_ic_state, Code::NORMAL, kind); | 132 Code::HANDLER, extra_ic_state, Code::NORMAL, kind); |
142 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), | 133 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags), |
143 isolate_); | 134 isolate_); |
144 if (probe->IsCode()) return Handle<Code>::cast(probe); | 135 if (probe->IsCode()) return Handle<Code>::cast(probe); |
145 return Handle<Code>::null(); | 136 return Handle<Code>::null(); |
146 } | 137 } |
147 | 138 |
148 | 139 |
149 Handle<Code> StubCache::ComputeMonomorphicIC(Handle<HeapObject> receiver, | 140 Handle<Code> StubCache::ComputeMonomorphicIC(Handle<HeapObject> receiver, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 if (current->IsGlobalObject()) { | 184 if (current->IsGlobalObject()) { |
194 global = Handle<GlobalObject>::cast(current); | 185 global = Handle<GlobalObject>::cast(current); |
195 cache_name = name; | 186 cache_name = name; |
196 } else if (!current->HasFastProperties()) { | 187 } else if (!current->HasFastProperties()) { |
197 cache_name = name; | 188 cache_name = name; |
198 } | 189 } |
199 } while (!next->IsNull()); | 190 } while (!next->IsNull()); |
200 | 191 |
201 // Compile the stub that is either shared for all names or | 192 // Compile the stub that is either shared for all names or |
202 // name specific if there are global objects involved. | 193 // name specific if there are global objects involved. |
203 Handle<Code> handler = FindLoadHandler(cache_name, receiver, Code::LOAD_IC); | 194 Handle<Code> handler = FindHandler(cache_name, receiver, Code::LOAD_IC); |
204 if (!handler.is_null()) return handler; | 195 if (!handler.is_null()) return handler; |
205 | 196 |
206 LoadStubCompiler compiler(isolate_); | 197 LoadStubCompiler compiler(isolate_); |
207 handler = | 198 handler = |
208 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); | 199 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); |
209 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler); | 200 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler); |
210 return handler; | 201 return handler; |
211 } | 202 } |
212 | 203 |
213 | 204 |
214 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, | 205 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, |
215 Handle<JSObject> receiver, | 206 Handle<JSObject> receiver, |
216 Handle<JSObject> holder, | 207 Handle<JSObject> holder, |
217 PropertyIndex field, | 208 PropertyIndex field, |
218 Representation representation) { | 209 Representation representation) { |
219 if (receiver.is_identical_to(holder)) { | 210 if (receiver.is_identical_to(holder)) { |
220 LoadFieldStub stub(field.is_inobject(holder), | 211 LoadFieldStub stub(field.is_inobject(holder), |
221 field.translate(holder), | 212 field.translate(holder), |
222 representation); | 213 representation); |
223 return stub.GetCode(isolate()); | 214 return stub.GetCode(isolate()); |
224 } | 215 } |
225 | 216 |
226 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC); | |
227 if (!stub.is_null()) return stub; | |
228 | |
229 LoadStubCompiler compiler(isolate_); | 217 LoadStubCompiler compiler(isolate_); |
230 Handle<Code> handler = | 218 return compiler.CompileLoadField( |
231 compiler.CompileLoadField(receiver, holder, name, field, representation); | 219 receiver, holder, name, field, representation); |
232 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
233 return handler; | |
234 } | 220 } |
235 | 221 |
236 | 222 |
237 Handle<Code> StubCache::ComputeLoadCallback( | 223 Handle<Code> StubCache::ComputeLoadCallback( |
238 Handle<Name> name, | 224 Handle<Name> name, |
239 Handle<JSObject> receiver, | 225 Handle<JSObject> receiver, |
240 Handle<JSObject> holder, | 226 Handle<JSObject> holder, |
241 Handle<ExecutableAccessorInfo> callback) { | 227 Handle<ExecutableAccessorInfo> callback) { |
242 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 228 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
243 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC); | |
244 if (!stub.is_null()) return stub; | |
245 | |
246 LoadStubCompiler compiler(isolate_); | 229 LoadStubCompiler compiler(isolate_); |
247 Handle<Code> handler = | 230 return compiler.CompileLoadCallback(receiver, holder, name, callback); |
248 compiler.CompileLoadCallback(receiver, holder, name, callback); | |
249 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
250 return handler; | |
251 } | 231 } |
252 | 232 |
253 | 233 |
254 Handle<Code> StubCache::ComputeLoadCallback( | 234 Handle<Code> StubCache::ComputeLoadCallback( |
255 Handle<Name> name, | 235 Handle<Name> name, |
256 Handle<JSObject> receiver, | 236 Handle<JSObject> receiver, |
257 Handle<JSObject> holder, | 237 Handle<JSObject> holder, |
258 const CallOptimization& call_optimization) { | 238 const CallOptimization& call_optimization) { |
259 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC); | |
260 if (!stub.is_null()) return stub; | |
261 | |
262 LoadStubCompiler compiler(isolate_); | 239 LoadStubCompiler compiler(isolate_); |
263 Handle<Code> handler = | 240 return compiler.CompileLoadCallback( |
264 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); | 241 receiver, holder, name, call_optimization); |
265 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
266 return handler; | |
267 } | 242 } |
268 | 243 |
269 | 244 |
270 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, | 245 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, |
271 Handle<JSObject> receiver, | 246 Handle<JSObject> receiver, |
272 Handle<JSObject> holder, | 247 Handle<JSObject> holder, |
273 Handle<JSFunction> getter) { | 248 Handle<JSFunction> getter) { |
274 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC); | |
275 if (!stub.is_null()) return stub; | |
276 | |
277 LoadStubCompiler compiler(isolate_); | 249 LoadStubCompiler compiler(isolate_); |
278 Handle<Code> handler = | 250 return compiler.CompileLoadViaGetter(receiver, holder, name, getter); |
279 compiler.CompileLoadViaGetter(receiver, holder, name, getter); | |
280 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
281 return handler; | |
282 } | 251 } |
283 | 252 |
284 | 253 |
285 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, | 254 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, |
286 Handle<JSObject> receiver, | 255 Handle<JSObject> receiver, |
287 Handle<JSObject> holder, | 256 Handle<JSObject> holder, |
288 Handle<Object> value) { | 257 Handle<Object> value) { |
289 Handle<Code> handler = FindLoadHandler(name, receiver, Code::LOAD_IC); | |
290 if (!handler.is_null()) return handler; | |
291 | |
292 LoadStubCompiler compiler(isolate_); | 258 LoadStubCompiler compiler(isolate_); |
293 handler = compiler.CompileLoadConstant(receiver, holder, name, value); | 259 return compiler.CompileLoadConstant(receiver, holder, name, value); |
294 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
295 | |
296 return handler; | |
297 } | 260 } |
298 | 261 |
299 | 262 |
300 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, | 263 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, |
301 Handle<JSObject> receiver, | 264 Handle<JSObject> receiver, |
302 Handle<JSObject> holder) { | 265 Handle<JSObject> holder) { |
303 Handle<Code> stub = FindLoadHandler(name, receiver, Code::LOAD_IC); | |
304 if (!stub.is_null()) return stub; | |
305 | |
306 LoadStubCompiler compiler(isolate_); | 266 LoadStubCompiler compiler(isolate_); |
307 Handle<Code> handler = | 267 return compiler.CompileLoadInterceptor(receiver, holder, name); |
308 compiler.CompileLoadInterceptor(receiver, holder, name); | |
309 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
310 return handler; | |
311 } | 268 } |
312 | 269 |
313 | 270 |
314 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, | 271 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, |
315 Handle<JSObject> receiver) { | 272 Handle<JSObject> receiver) { |
316 return isolate_->builtins()->LoadIC_Normal(); | 273 return isolate_->builtins()->LoadIC_Normal(); |
317 } | 274 } |
318 | 275 |
319 | 276 |
320 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, | 277 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, |
(...skipping 18 matching lines...) Expand all Loading... |
339 PropertyIndex field, | 296 PropertyIndex field, |
340 Representation representation) { | 297 Representation representation) { |
341 if (receiver.is_identical_to(holder)) { | 298 if (receiver.is_identical_to(holder)) { |
342 // TODO(titzer): this should use an HObjectAccess | 299 // TODO(titzer): this should use an HObjectAccess |
343 KeyedLoadFieldStub stub(field.is_inobject(holder), | 300 KeyedLoadFieldStub stub(field.is_inobject(holder), |
344 field.translate(holder), | 301 field.translate(holder), |
345 representation); | 302 representation); |
346 return stub.GetCode(isolate()); | 303 return stub.GetCode(isolate()); |
347 } | 304 } |
348 | 305 |
349 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC); | |
350 if (!stub.is_null()) return stub; | |
351 | |
352 KeyedLoadStubCompiler compiler(isolate_); | 306 KeyedLoadStubCompiler compiler(isolate_); |
353 Handle<Code> handler = | 307 return compiler.CompileLoadField( |
354 compiler.CompileLoadField(receiver, holder, name, field, representation); | 308 receiver, holder, name, field, representation); |
355 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
356 return handler; | |
357 } | 309 } |
358 | 310 |
359 | 311 |
360 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, | 312 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, |
361 Handle<JSObject> receiver, | 313 Handle<JSObject> receiver, |
362 Handle<JSObject> holder, | 314 Handle<JSObject> holder, |
363 Handle<Object> value) { | 315 Handle<Object> value) { |
364 Handle<Code> handler = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC); | |
365 if (!handler.is_null()) return handler; | |
366 | |
367 KeyedLoadStubCompiler compiler(isolate_); | 316 KeyedLoadStubCompiler compiler(isolate_); |
368 handler = compiler.CompileLoadConstant(receiver, holder, name, value); | 317 return compiler.CompileLoadConstant( |
369 HeapObject::UpdateMapCodeCache(receiver, name, handler); | 318 receiver, holder, name, value); |
370 return handler; | |
371 } | 319 } |
372 | 320 |
373 | 321 |
374 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, | 322 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, |
375 Handle<JSObject> receiver, | 323 Handle<JSObject> receiver, |
376 Handle<JSObject> holder) { | 324 Handle<JSObject> holder) { |
377 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC); | |
378 if (!stub.is_null()) return stub; | |
379 | |
380 KeyedLoadStubCompiler compiler(isolate_); | 325 KeyedLoadStubCompiler compiler(isolate_); |
381 Handle<Code> handler = | 326 return compiler.CompileLoadInterceptor(receiver, holder, name); |
382 compiler.CompileLoadInterceptor(receiver, holder, name); | |
383 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
384 return handler; | |
385 } | 327 } |
386 | 328 |
387 | 329 |
388 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 330 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
389 Handle<Name> name, | 331 Handle<Name> name, |
390 Handle<JSObject> receiver, | 332 Handle<JSObject> receiver, |
391 Handle<JSObject> holder, | 333 Handle<JSObject> holder, |
392 Handle<ExecutableAccessorInfo> callback) { | 334 Handle<ExecutableAccessorInfo> callback) { |
393 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC); | |
394 if (!stub.is_null()) return stub; | |
395 | |
396 KeyedLoadStubCompiler compiler(isolate_); | 335 KeyedLoadStubCompiler compiler(isolate_); |
397 Handle<Code> handler = | 336 return compiler.CompileLoadCallback(receiver, holder, name, callback); |
398 compiler.CompileLoadCallback(receiver, holder, name, callback); | |
399 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
400 return handler; | |
401 } | 337 } |
402 | 338 |
403 | 339 |
404 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 340 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
405 Handle<Name> name, | 341 Handle<Name> name, |
406 Handle<JSObject> receiver, | 342 Handle<JSObject> receiver, |
407 Handle<JSObject> holder, | 343 Handle<JSObject> holder, |
408 const CallOptimization& call_optimization) { | 344 const CallOptimization& call_optimization) { |
409 Handle<Code> stub = FindLoadHandler(name, receiver, Code::KEYED_LOAD_IC); | |
410 if (!stub.is_null()) return stub; | |
411 | |
412 KeyedLoadStubCompiler compiler(isolate_); | 345 KeyedLoadStubCompiler compiler(isolate_); |
413 Handle<Code> handler = | 346 return compiler.CompileLoadCallback( |
414 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); | 347 receiver, holder, name, call_optimization); |
415 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
416 return handler; | |
417 } | 348 } |
418 | 349 |
419 | 350 |
420 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, | 351 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, |
421 Handle<JSObject> receiver, | 352 Handle<JSObject> receiver, |
422 LookupResult* lookup, | 353 LookupResult* lookup, |
423 StrictModeFlag strict_mode) { | 354 StrictModeFlag strict_mode) { |
424 Handle<Code> stub = FindStoreHandler( | |
425 name, receiver, Code::STORE_IC, strict_mode); | |
426 if (!stub.is_null()) return stub; | |
427 | |
428 StoreStubCompiler compiler(isolate_, strict_mode); | 355 StoreStubCompiler compiler(isolate_, strict_mode); |
429 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name); | 356 return compiler.CompileStoreField(receiver, lookup, name); |
430 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
431 return handler; | |
432 } | 357 } |
433 | 358 |
434 | 359 |
435 Handle<Code> StubCache::ComputeStoreTransition(Handle<Name> name, | 360 Handle<Code> StubCache::ComputeStoreTransition(Handle<Name> name, |
436 Handle<JSObject> receiver, | 361 Handle<JSObject> receiver, |
437 LookupResult* lookup, | 362 LookupResult* lookup, |
438 Handle<Map> transition, | 363 Handle<Map> transition, |
439 StrictModeFlag strict_mode) { | 364 StrictModeFlag strict_mode) { |
440 Handle<Code> stub = FindStoreHandler( | |
441 name, receiver, Code::STORE_IC, strict_mode); | |
442 if (!stub.is_null()) return stub; | |
443 | |
444 StoreStubCompiler compiler(isolate_, strict_mode); | 365 StoreStubCompiler compiler(isolate_, strict_mode); |
445 Handle<Code> handler = | 366 return compiler.CompileStoreTransition(receiver, lookup, transition, name); |
446 compiler.CompileStoreTransition(receiver, lookup, transition, name); | |
447 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
448 return handler; | |
449 } | 367 } |
450 | 368 |
451 | 369 |
452 Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { | 370 Handle<Code> StubCache::ComputeKeyedLoadElement(Handle<Map> receiver_map) { |
453 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC); | 371 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC); |
454 Handle<Name> name = | 372 Handle<Name> name = |
455 isolate()->factory()->KeyedLoadElementMonomorphic_string(); | 373 isolate()->factory()->KeyedLoadElementMonomorphic_string(); |
456 | 374 |
457 Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); | 375 Handle<Object> probe(receiver_map->FindInCodeCache(*name, flags), isolate_); |
458 if (probe->IsCode()) return Handle<Code>::cast(probe); | 376 if (probe->IsCode()) return Handle<Code>::cast(probe); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 } | 448 } |
531 | 449 |
532 | 450 |
533 Handle<Code> StubCache::ComputeStoreCallback( | 451 Handle<Code> StubCache::ComputeStoreCallback( |
534 Handle<Name> name, | 452 Handle<Name> name, |
535 Handle<JSObject> receiver, | 453 Handle<JSObject> receiver, |
536 Handle<JSObject> holder, | 454 Handle<JSObject> holder, |
537 Handle<ExecutableAccessorInfo> callback, | 455 Handle<ExecutableAccessorInfo> callback, |
538 StrictModeFlag strict_mode) { | 456 StrictModeFlag strict_mode) { |
539 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 457 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
540 Handle<Code> stub = FindStoreHandler( | |
541 name, receiver, Code::STORE_IC, strict_mode); | |
542 if (!stub.is_null()) return stub; | |
543 | |
544 StoreStubCompiler compiler(isolate_, strict_mode); | 458 StoreStubCompiler compiler(isolate_, strict_mode); |
545 Handle<Code> handler = compiler.CompileStoreCallback( | 459 return compiler.CompileStoreCallback(receiver, holder, name, callback); |
546 receiver, holder, name, callback); | |
547 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
548 return handler; | |
549 } | 460 } |
550 | 461 |
551 | 462 |
552 Handle<Code> StubCache::ComputeStoreCallback( | 463 Handle<Code> StubCache::ComputeStoreCallback( |
553 Handle<Name> name, | 464 Handle<Name> name, |
554 Handle<JSObject> receiver, | 465 Handle<JSObject> receiver, |
555 Handle<JSObject> holder, | 466 Handle<JSObject> holder, |
556 const CallOptimization& call_optimization, | 467 const CallOptimization& call_optimization, |
557 StrictModeFlag strict_mode) { | 468 StrictModeFlag strict_mode) { |
558 Handle<Code> stub = FindStoreHandler( | |
559 name, receiver, Code::STORE_IC, strict_mode); | |
560 if (!stub.is_null()) return stub; | |
561 | |
562 StoreStubCompiler compiler(isolate_, strict_mode); | 469 StoreStubCompiler compiler(isolate_, strict_mode); |
563 Handle<Code> handler = compiler.CompileStoreCallback( | 470 return compiler.CompileStoreCallback( |
564 receiver, holder, name, call_optimization); | 471 receiver, holder, name, call_optimization); |
565 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
566 return handler; | |
567 } | 472 } |
568 | 473 |
569 | 474 |
570 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name, | 475 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<Name> name, |
571 Handle<JSObject> receiver, | 476 Handle<JSObject> receiver, |
572 Handle<JSObject> holder, | 477 Handle<JSObject> holder, |
573 Handle<JSFunction> setter, | 478 Handle<JSFunction> setter, |
574 StrictModeFlag strict_mode) { | 479 StrictModeFlag strict_mode) { |
575 Handle<Code> stub = FindStoreHandler( | |
576 name, receiver, Code::STORE_IC, strict_mode); | |
577 if (!stub.is_null()) return stub; | |
578 | |
579 StoreStubCompiler compiler(isolate_, strict_mode); | 480 StoreStubCompiler compiler(isolate_, strict_mode); |
580 Handle<Code> handler = compiler.CompileStoreViaSetter( | 481 return compiler.CompileStoreViaSetter(receiver, holder, name, setter); |
581 receiver, holder, name, setter); | |
582 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
583 return handler; | |
584 } | 482 } |
585 | 483 |
586 | 484 |
587 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name, | 485 Handle<Code> StubCache::ComputeStoreInterceptor(Handle<Name> name, |
588 Handle<JSObject> receiver, | 486 Handle<JSObject> receiver, |
589 StrictModeFlag strict_mode) { | 487 StrictModeFlag strict_mode) { |
590 Handle<Code> stub = FindStoreHandler( | |
591 name, receiver, Code::STORE_IC, strict_mode); | |
592 if (!stub.is_null()) return stub; | |
593 | |
594 StoreStubCompiler compiler(isolate_, strict_mode); | 488 StoreStubCompiler compiler(isolate_, strict_mode); |
595 Handle<Code> handler = compiler.CompileStoreInterceptor(receiver, name); | 489 return compiler.CompileStoreInterceptor(receiver, name); |
596 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
597 return handler; | |
598 } | 490 } |
599 | 491 |
600 | 492 |
601 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name, | 493 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<Name> name, |
602 Handle<JSObject> receiver, | 494 Handle<JSObject> receiver, |
603 LookupResult* lookup, | 495 LookupResult* lookup, |
604 StrictModeFlag strict_mode) { | 496 StrictModeFlag strict_mode) { |
605 Handle<Code> stub = FindStoreHandler( | |
606 name, receiver, Code::KEYED_STORE_IC, strict_mode); | |
607 if (!stub.is_null()) return stub; | |
608 | |
609 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); | 497 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); |
610 Handle<Code> handler = compiler.CompileStoreField(receiver, lookup, name); | 498 return compiler.CompileStoreField(receiver, lookup, name); |
611 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
612 return handler; | |
613 } | 499 } |
614 | 500 |
615 | 501 |
616 Handle<Code> StubCache::ComputeKeyedStoreTransition( | 502 Handle<Code> StubCache::ComputeKeyedStoreTransition( |
617 Handle<Name> name, | 503 Handle<Name> name, |
618 Handle<JSObject> receiver, | 504 Handle<JSObject> receiver, |
619 LookupResult* lookup, | 505 LookupResult* lookup, |
620 Handle<Map> transition, | 506 Handle<Map> transition, |
621 StrictModeFlag strict_mode) { | 507 StrictModeFlag strict_mode) { |
622 Handle<Code> stub = FindStoreHandler( | |
623 name, receiver, Code::KEYED_STORE_IC, strict_mode); | |
624 if (!stub.is_null()) return stub; | |
625 | |
626 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); | 508 KeyedStoreStubCompiler compiler(isolate(), strict_mode, STANDARD_STORE); |
627 Handle<Code> handler = | 509 return compiler.CompileStoreTransition(receiver, lookup, transition, name); |
628 compiler.CompileStoreTransition(receiver, lookup, transition, name); | |
629 HeapObject::UpdateMapCodeCache(receiver, name, handler); | |
630 return handler; | |
631 } | 510 } |
632 | 511 |
633 | 512 |
634 #define CALL_LOGGER_TAG(kind, type) \ | 513 #define CALL_LOGGER_TAG(kind, type) \ |
635 (kind == Code::CALL_IC ? Logger::type : Logger::KEYED_##type) | 514 (kind == Code::CALL_IC ? Logger::type : Logger::KEYED_##type) |
636 | 515 |
637 Handle<Code> StubCache::ComputeCallConstant(int argc, | 516 Handle<Code> StubCache::ComputeCallConstant(int argc, |
638 Code::Kind kind, | 517 Code::Kind kind, |
639 Code::ExtraICState extra_state, | 518 Code::ExtraICState extra_state, |
640 Handle<Name> name, | 519 Handle<Name> name, |
(...skipping 1508 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2149 Handle<FunctionTemplateInfo>( | 2028 Handle<FunctionTemplateInfo>( |
2150 FunctionTemplateInfo::cast(signature->receiver())); | 2029 FunctionTemplateInfo::cast(signature->receiver())); |
2151 } | 2030 } |
2152 } | 2031 } |
2153 | 2032 |
2154 is_simple_api_call_ = true; | 2033 is_simple_api_call_ = true; |
2155 } | 2034 } |
2156 | 2035 |
2157 | 2036 |
2158 } } // namespace v8::internal | 2037 } } // namespace v8::internal |
OLD | NEW |