Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Side by Side Diff: src/stub-cache.cc

Issue 25260002: Always store stubs on the JSObject receiver, even when in slow mode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/stub-cache.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 92
93 // Update primary cache. 93 // Update primary cache.
94 primary->key = name; 94 primary->key = name;
95 primary->value = code; 95 primary->value = code;
96 primary->map = map; 96 primary->map = map;
97 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); 97 isolate()->counters()->megamorphic_stub_cache_updates()->Increment();
98 return code; 98 return code;
99 } 99 }
100 100
101 101
102 Handle<JSObject> StubCache::StubHolder(Handle<JSObject> receiver,
103 Handle<JSObject> holder) {
104 InlineCacheHolderFlag cache_holder =
105 IC::GetCodeCacheForObject(*receiver, *holder);
106 return Handle<JSObject>(IC::GetCodeCacheHolder(
107 isolate_, *receiver, cache_holder));
108 }
109
110
111 Handle<Code> StubCache::FindIC(Handle<Name> name, 102 Handle<Code> StubCache::FindIC(Handle<Name> name,
112 Handle<Map> stub_holder_map, 103 Handle<Map> stub_holder_map,
113 Code::Kind kind, 104 Code::Kind kind,
114 Code::StubType type, 105 Code::StubType type,
115 Code::ExtraICState extra_state) { 106 Code::ExtraICState extra_state) {
116 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_state, type); 107 Code::Flags flags = Code::ComputeMonomorphicFlags(kind, extra_state, type);
117 Handle<Object> probe(stub_holder_map->FindInCodeCache(*name, flags), 108 Handle<Object> probe(stub_holder_map->FindInCodeCache(*name, flags),
118 isolate_); 109 isolate_);
119 if (probe->IsCode()) return Handle<Code>::cast(probe); 110 if (probe->IsCode()) return Handle<Code>::cast(probe);
120 return Handle<Code>::null(); 111 return Handle<Code>::null();
121 } 112 }
122 113
123 114
124 Handle<Code> StubCache::FindIC(Handle<Name> name, 115 Handle<Code> StubCache::FindIC(Handle<Name> name,
125 Handle<JSObject> stub_holder, 116 Handle<JSObject> stub_holder,
126 Code::Kind kind, 117 Code::Kind kind,
127 Code::StubType type, 118 Code::StubType type,
128 Code::ExtraICState extra_ic_state) { 119 Code::ExtraICState extra_ic_state) {
129 return FindIC(name, Handle<Map>(stub_holder->map()), kind, 120 return FindIC(name, Handle<Map>(stub_holder->map()), kind,
130 type, extra_ic_state); 121 type, extra_ic_state);
131 } 122 }
132 123
133 124
134 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name, 125 Handle<Code> StubCache::FindLoadHandler(Handle<Name> name,
135 Handle<JSObject> receiver, 126 Handle<JSObject> receiver,
136 Handle<JSObject> stub_holder,
137 Code::Kind kind, 127 Code::Kind kind,
138 Code::StubType type) { 128 Code::StubType type) {
139 InlineCacheHolderFlag holder_flag = receiver.is_identical_to(stub_holder)
140 ? OWN_MAP : PROTOTYPE_MAP;
141 ASSERT(type != Code::NORMAL); 129 ASSERT(type != Code::NORMAL);
142 Code::Flags flags = Code::ComputeMonomorphicFlags( 130 Code::Flags flags = Code::ComputeMonomorphicFlags(
143 Code::HANDLER, Code::kNoExtraICState, type, kind, holder_flag); 131 Code::HANDLER, Code::kNoExtraICState, type, kind);
144 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 132 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
145 isolate_); 133 isolate_);
146 if (probe->IsCode()) return Handle<Code>::cast(probe); 134 if (probe->IsCode()) return Handle<Code>::cast(probe);
147 return Handle<Code>::null(); 135 return Handle<Code>::null();
148 } 136 }
149 137
150 138
151 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name, 139 Handle<Code> StubCache::FindStoreHandler(Handle<Name> name,
152 Handle<JSObject> receiver, 140 Handle<JSObject> receiver,
153 Code::Kind kind, 141 Code::Kind kind,
154 Code::StubType type, 142 Code::StubType type,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 global = Handle<GlobalObject>::cast(current); 201 global = Handle<GlobalObject>::cast(current);
214 cache_name = name; 202 cache_name = name;
215 } else if (!current->HasFastProperties()) { 203 } else if (!current->HasFastProperties()) {
216 cache_name = name; 204 cache_name = name;
217 } 205 }
218 } while (!next->IsNull()); 206 } while (!next->IsNull());
219 207
220 // Compile the stub that is either shared for all names or 208 // Compile the stub that is either shared for all names or
221 // name specific if there are global objects involved. 209 // name specific if there are global objects involved.
222 Handle<Code> handler = FindLoadHandler( 210 Handle<Code> handler = FindLoadHandler(
223 cache_name, receiver, receiver, Code::LOAD_IC, Code::NONEXISTENT); 211 cache_name, receiver, Code::LOAD_IC, Code::NONEXISTENT);
224 if (!handler.is_null()) return handler; 212 if (!handler.is_null()) return handler;
225 213
226 LoadStubCompiler compiler(isolate_); 214 LoadStubCompiler compiler(isolate_);
227 handler = 215 handler =
228 compiler.CompileLoadNonexistent(receiver, current, cache_name, global); 216 compiler.CompileLoadNonexistent(receiver, current, cache_name, global);
229 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler); 217 HeapObject::UpdateMapCodeCache(receiver, cache_name, handler);
230 return handler; 218 return handler;
231 } 219 }
232 220
233 221
234 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name, 222 Handle<Code> StubCache::ComputeLoadField(Handle<Name> name,
235 Handle<JSObject> receiver, 223 Handle<JSObject> receiver,
236 Handle<JSObject> holder, 224 Handle<JSObject> holder,
237 PropertyIndex field, 225 PropertyIndex field,
238 Representation representation) { 226 Representation representation) {
239 if (receiver.is_identical_to(holder)) { 227 if (receiver.is_identical_to(holder)) {
240 LoadFieldStub stub(field.is_inobject(holder), 228 LoadFieldStub stub(field.is_inobject(holder),
241 field.translate(holder), 229 field.translate(holder),
242 representation); 230 representation);
243 return stub.GetCode(isolate()); 231 return stub.GetCode(isolate());
244 } 232 }
245 233
246 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
247 Handle<Code> stub = FindLoadHandler( 234 Handle<Code> stub = FindLoadHandler(
248 name, receiver, stub_holder, Code::LOAD_IC, Code::FIELD); 235 name, receiver, Code::LOAD_IC, Code::FIELD);
249 if (!stub.is_null()) return stub; 236 if (!stub.is_null()) return stub;
250 237
251 LoadStubCompiler compiler(isolate_); 238 LoadStubCompiler compiler(isolate_);
252 Handle<Code> handler = 239 Handle<Code> handler =
253 compiler.CompileLoadField(receiver, holder, name, field, representation); 240 compiler.CompileLoadField(receiver, holder, name, field, representation);
254 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 241 HeapObject::UpdateMapCodeCache(receiver, name, handler);
255 return handler; 242 return handler;
256 } 243 }
257 244
258 245
259 Handle<Code> StubCache::ComputeLoadCallback( 246 Handle<Code> StubCache::ComputeLoadCallback(
260 Handle<Name> name, 247 Handle<Name> name,
261 Handle<JSObject> receiver, 248 Handle<JSObject> receiver,
262 Handle<JSObject> holder, 249 Handle<JSObject> holder,
263 Handle<ExecutableAccessorInfo> callback) { 250 Handle<ExecutableAccessorInfo> callback) {
264 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); 251 ASSERT(v8::ToCData<Address>(callback->getter()) != 0);
265 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
266 Handle<Code> stub = FindLoadHandler( 252 Handle<Code> stub = FindLoadHandler(
267 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 253 name, receiver, Code::LOAD_IC, Code::CALLBACKS);
268 if (!stub.is_null()) return stub; 254 if (!stub.is_null()) return stub;
269 255
270 LoadStubCompiler compiler(isolate_); 256 LoadStubCompiler compiler(isolate_);
271 Handle<Code> handler = 257 Handle<Code> handler =
272 compiler.CompileLoadCallback(receiver, holder, name, callback); 258 compiler.CompileLoadCallback(receiver, holder, name, callback);
273 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 259 HeapObject::UpdateMapCodeCache(receiver, name, handler);
274 return handler; 260 return handler;
275 } 261 }
276 262
277 263
278 Handle<Code> StubCache::ComputeLoadCallback( 264 Handle<Code> StubCache::ComputeLoadCallback(
279 Handle<Name> name, 265 Handle<Name> name,
280 Handle<JSObject> receiver, 266 Handle<JSObject> receiver,
281 Handle<JSObject> holder, 267 Handle<JSObject> holder,
282 const CallOptimization& call_optimization) { 268 const CallOptimization& call_optimization) {
283 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
284 Handle<Code> stub = FindLoadHandler( 269 Handle<Code> stub = FindLoadHandler(
285 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 270 name, receiver, Code::LOAD_IC, Code::CALLBACKS);
286 if (!stub.is_null()) return stub; 271 if (!stub.is_null()) return stub;
287 272
288 LoadStubCompiler compiler(isolate_); 273 LoadStubCompiler compiler(isolate_);
289 Handle<Code> handler = 274 Handle<Code> handler =
290 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); 275 compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
291 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 276 HeapObject::UpdateMapCodeCache(receiver, name, handler);
292 return handler; 277 return handler;
293 } 278 }
294 279
295 280
296 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name, 281 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<Name> name,
297 Handle<JSObject> receiver, 282 Handle<JSObject> receiver,
298 Handle<JSObject> holder, 283 Handle<JSObject> holder,
299 Handle<JSFunction> getter) { 284 Handle<JSFunction> getter) {
300 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
301 Handle<Code> stub = FindLoadHandler( 285 Handle<Code> stub = FindLoadHandler(
302 name, receiver, stub_holder, Code::LOAD_IC, Code::CALLBACKS); 286 name, receiver, Code::LOAD_IC, Code::CALLBACKS);
303 if (!stub.is_null()) return stub; 287 if (!stub.is_null()) return stub;
304 288
305 LoadStubCompiler compiler(isolate_); 289 LoadStubCompiler compiler(isolate_);
306 Handle<Code> handler = 290 Handle<Code> handler =
307 compiler.CompileLoadViaGetter(receiver, holder, name, getter); 291 compiler.CompileLoadViaGetter(receiver, holder, name, getter);
308 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 292 HeapObject::UpdateMapCodeCache(receiver, name, handler);
309 return handler; 293 return handler;
310 } 294 }
311 295
312 296
313 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name, 297 Handle<Code> StubCache::ComputeLoadConstant(Handle<Name> name,
314 Handle<JSObject> receiver, 298 Handle<JSObject> receiver,
315 Handle<JSObject> holder, 299 Handle<JSObject> holder,
316 Handle<Object> value) { 300 Handle<Object> value) {
317 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
318 Handle<Code> handler = FindLoadHandler( 301 Handle<Code> handler = FindLoadHandler(
319 name, receiver, stub_holder, Code::LOAD_IC, Code::CONSTANT); 302 name, receiver, Code::LOAD_IC, Code::CONSTANT);
320 if (!handler.is_null()) return handler; 303 if (!handler.is_null()) return handler;
321 304
322 LoadStubCompiler compiler(isolate_); 305 LoadStubCompiler compiler(isolate_);
323 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 306 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
324 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 307 HeapObject::UpdateMapCodeCache(receiver, name, handler);
325 308
326 return handler; 309 return handler;
327 } 310 }
328 311
329 312
330 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name, 313 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<Name> name,
331 Handle<JSObject> receiver, 314 Handle<JSObject> receiver,
332 Handle<JSObject> holder) { 315 Handle<JSObject> holder) {
333 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
334 Handle<Code> stub = FindLoadHandler( 316 Handle<Code> stub = FindLoadHandler(
335 name, receiver, stub_holder, Code::LOAD_IC, Code::INTERCEPTOR); 317 name, receiver, Code::LOAD_IC, Code::INTERCEPTOR);
336 if (!stub.is_null()) return stub; 318 if (!stub.is_null()) return stub;
337 319
338 LoadStubCompiler compiler(isolate_); 320 LoadStubCompiler compiler(isolate_);
339 Handle<Code> handler = 321 Handle<Code> handler =
340 compiler.CompileLoadInterceptor(receiver, holder, name); 322 compiler.CompileLoadInterceptor(receiver, holder, name);
341 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 323 HeapObject::UpdateMapCodeCache(receiver, name, handler);
342 return handler; 324 return handler;
343 } 325 }
344 326
345 327
346 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name, 328 Handle<Code> StubCache::ComputeLoadNormal(Handle<Name> name,
347 Handle<JSObject> receiver) { 329 Handle<JSObject> receiver) {
348 return isolate_->builtins()->LoadIC_Normal(); 330 return isolate_->builtins()->LoadIC_Normal();
349 } 331 }
350 332
351 333
352 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name, 334 Handle<Code> StubCache::ComputeLoadGlobal(Handle<Name> name,
353 Handle<JSObject> receiver, 335 Handle<JSObject> receiver,
354 Handle<GlobalObject> holder, 336 Handle<GlobalObject> holder,
355 Handle<PropertyCell> cell, 337 Handle<PropertyCell> cell,
356 bool is_dont_delete) { 338 bool is_dont_delete) {
357 Handle<JSObject> stub_holder = StubHolder(receiver, holder); 339 Handle<Code> stub = FindIC(name, receiver, Code::LOAD_IC, Code::NORMAL);
358 Handle<Code> stub = FindIC(name, stub_holder, Code::LOAD_IC, Code::NORMAL);
359 if (!stub.is_null()) return stub; 340 if (!stub.is_null()) return stub;
360 341
361 LoadStubCompiler compiler(isolate_); 342 LoadStubCompiler compiler(isolate_);
362 Handle<Code> ic = 343 Handle<Code> ic =
363 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); 344 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete);
364 HeapObject::UpdateMapCodeCache(stub_holder, name, ic); 345 HeapObject::UpdateMapCodeCache(receiver, name, ic);
365 return ic; 346 return ic;
366 } 347 }
367 348
368 349
369 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name, 350 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<Name> name,
370 Handle<JSObject> receiver, 351 Handle<JSObject> receiver,
371 Handle<JSObject> holder, 352 Handle<JSObject> holder,
372 PropertyIndex field, 353 PropertyIndex field,
373 Representation representation) { 354 Representation representation) {
374 if (receiver.is_identical_to(holder)) { 355 if (receiver.is_identical_to(holder)) {
375 // TODO(titzer): this should use an HObjectAccess 356 // TODO(titzer): this should use an HObjectAccess
376 KeyedLoadFieldStub stub(field.is_inobject(holder), 357 KeyedLoadFieldStub stub(field.is_inobject(holder),
377 field.translate(holder), 358 field.translate(holder),
378 representation); 359 representation);
379 return stub.GetCode(isolate()); 360 return stub.GetCode(isolate());
380 } 361 }
381 362
382 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
383 Handle<Code> stub = FindLoadHandler( 363 Handle<Code> stub = FindLoadHandler(
384 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::FIELD); 364 name, receiver, Code::KEYED_LOAD_IC, Code::FIELD);
385 if (!stub.is_null()) return stub; 365 if (!stub.is_null()) return stub;
386 366
387 KeyedLoadStubCompiler compiler(isolate_); 367 KeyedLoadStubCompiler compiler(isolate_);
388 Handle<Code> handler = 368 Handle<Code> handler =
389 compiler.CompileLoadField(receiver, holder, name, field, representation); 369 compiler.CompileLoadField(receiver, holder, name, field, representation);
390 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 370 HeapObject::UpdateMapCodeCache(receiver, name, handler);
391 return handler; 371 return handler;
392 } 372 }
393 373
394 374
395 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name, 375 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<Name> name,
396 Handle<JSObject> receiver, 376 Handle<JSObject> receiver,
397 Handle<JSObject> holder, 377 Handle<JSObject> holder,
398 Handle<Object> value) { 378 Handle<Object> value) {
399 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
400 Handle<Code> handler = FindLoadHandler( 379 Handle<Code> handler = FindLoadHandler(
401 name, receiver, stub_holder, Code::KEYED_LOAD_IC, 380 name, receiver, Code::KEYED_LOAD_IC, Code::CONSTANT);
402 Code::CONSTANT);
403 if (!handler.is_null()) return handler; 381 if (!handler.is_null()) return handler;
404 382
405 KeyedLoadStubCompiler compiler(isolate_); 383 KeyedLoadStubCompiler compiler(isolate_);
406 handler = compiler.CompileLoadConstant(receiver, holder, name, value); 384 handler = compiler.CompileLoadConstant(receiver, holder, name, value);
407 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 385 HeapObject::UpdateMapCodeCache(receiver, name, handler);
408 return handler; 386 return handler;
409 } 387 }
410 388
411 389
412 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name, 390 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<Name> name,
413 Handle<JSObject> receiver, 391 Handle<JSObject> receiver,
414 Handle<JSObject> holder) { 392 Handle<JSObject> holder) {
415 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
416 Handle<Code> stub = FindLoadHandler( 393 Handle<Code> stub = FindLoadHandler(
417 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::INTERCEPTOR); 394 name, receiver, Code::KEYED_LOAD_IC, Code::INTERCEPTOR);
418 if (!stub.is_null()) return stub; 395 if (!stub.is_null()) return stub;
419 396
420 KeyedLoadStubCompiler compiler(isolate_); 397 KeyedLoadStubCompiler compiler(isolate_);
421 Handle<Code> handler = 398 Handle<Code> handler =
422 compiler.CompileLoadInterceptor(receiver, holder, name); 399 compiler.CompileLoadInterceptor(receiver, holder, name);
423 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 400 HeapObject::UpdateMapCodeCache(receiver, name, handler);
424 return handler; 401 return handler;
425 } 402 }
426 403
427 404
428 Handle<Code> StubCache::ComputeKeyedLoadCallback( 405 Handle<Code> StubCache::ComputeKeyedLoadCallback(
429 Handle<Name> name, 406 Handle<Name> name,
430 Handle<JSObject> receiver, 407 Handle<JSObject> receiver,
431 Handle<JSObject> holder, 408 Handle<JSObject> holder,
432 Handle<ExecutableAccessorInfo> callback) { 409 Handle<ExecutableAccessorInfo> callback) {
433 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
434 Handle<Code> stub = FindLoadHandler( 410 Handle<Code> stub = FindLoadHandler(
435 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); 411 name, receiver, Code::KEYED_LOAD_IC, Code::CALLBACKS);
436 if (!stub.is_null()) return stub; 412 if (!stub.is_null()) return stub;
437 413
438 KeyedLoadStubCompiler compiler(isolate_); 414 KeyedLoadStubCompiler compiler(isolate_);
439 Handle<Code> handler = 415 Handle<Code> handler =
440 compiler.CompileLoadCallback(receiver, holder, name, callback); 416 compiler.CompileLoadCallback(receiver, holder, name, callback);
441 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 417 HeapObject::UpdateMapCodeCache(receiver, name, handler);
442 return handler; 418 return handler;
443 } 419 }
444 420
445 421
446 Handle<Code> StubCache::ComputeKeyedLoadCallback( 422 Handle<Code> StubCache::ComputeKeyedLoadCallback(
447 Handle<Name> name, 423 Handle<Name> name,
448 Handle<JSObject> receiver, 424 Handle<JSObject> receiver,
449 Handle<JSObject> holder, 425 Handle<JSObject> holder,
450 const CallOptimization& call_optimization) { 426 const CallOptimization& call_optimization) {
451 Handle<JSObject> stub_holder = StubHolder(receiver, holder);
452 Handle<Code> stub = FindLoadHandler( 427 Handle<Code> stub = FindLoadHandler(
453 name, receiver, stub_holder, Code::KEYED_LOAD_IC, Code::CALLBACKS); 428 name, receiver, Code::KEYED_LOAD_IC, Code::CALLBACKS);
454 if (!stub.is_null()) return stub; 429 if (!stub.is_null()) return stub;
455 430
456 KeyedLoadStubCompiler compiler(isolate_); 431 KeyedLoadStubCompiler compiler(isolate_);
457 Handle<Code> handler = 432 Handle<Code> handler =
458 compiler.CompileLoadCallback(receiver, holder, name, call_optimization); 433 compiler.CompileLoadCallback(receiver, holder, name, call_optimization);
459 HeapObject::UpdateMapCodeCache(stub_holder, name, handler); 434 HeapObject::UpdateMapCodeCache(receiver, name, handler);
460 return handler; 435 return handler;
461 } 436 }
462 437
463 438
464 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name, 439 Handle<Code> StubCache::ComputeStoreField(Handle<Name> name,
465 Handle<JSObject> receiver, 440 Handle<JSObject> receiver,
466 LookupResult* lookup, 441 LookupResult* lookup,
467 StrictModeFlag strict_mode) { 442 StrictModeFlag strict_mode) {
468 Handle<Code> stub = FindStoreHandler( 443 Handle<Code> stub = FindStoreHandler(
469 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode); 444 name, receiver, Code::STORE_IC, Code::FIELD, strict_mode);
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 788
814 789
815 Handle<Code> StubCache::ComputeCallGlobal(int argc, 790 Handle<Code> StubCache::ComputeCallGlobal(int argc,
816 Code::Kind kind, 791 Code::Kind kind,
817 Code::ExtraICState extra_state, 792 Code::ExtraICState extra_state,
818 Handle<Name> name, 793 Handle<Name> name,
819 Handle<JSObject> receiver, 794 Handle<JSObject> receiver,
820 Handle<GlobalObject> holder, 795 Handle<GlobalObject> holder,
821 Handle<PropertyCell> cell, 796 Handle<PropertyCell> cell,
822 Handle<JSFunction> function) { 797 Handle<JSFunction> function) {
823 InlineCacheHolderFlag cache_holder =
824 IC::GetCodeCacheForObject(*receiver, *holder);
825 Handle<JSObject> stub_holder(IC::GetCodeCacheHolder(
826 isolate_, *receiver, cache_holder));
827 Code::Flags flags = Code::ComputeMonomorphicFlags( 798 Code::Flags flags = Code::ComputeMonomorphicFlags(
828 kind, extra_state, Code::NORMAL, argc, cache_holder); 799 kind, extra_state, Code::NORMAL, argc);
829 Handle<Object> probe(stub_holder->map()->FindInCodeCache(*name, flags), 800 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags),
830 isolate_); 801 isolate_);
831 if (probe->IsCode()) return Handle<Code>::cast(probe); 802 if (probe->IsCode()) return Handle<Code>::cast(probe);
832 803
833 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); 804 CallStubCompiler compiler(isolate(), argc, kind, extra_state);
834 Handle<Code> code = 805 Handle<Code> code =
835 compiler.CompileCallGlobal(receiver, holder, cell, function, name); 806 compiler.CompileCallGlobal(receiver, holder, cell, function, name);
836 ASSERT(flags == code->flags()); 807 ASSERT(flags == code->flags());
837 PROFILE(isolate(), 808 PROFILE(isolate(),
838 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); 809 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name));
839 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); 810 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code));
840 if (CallStubCompiler::CanBeCached(function)) { 811 if (CallStubCompiler::CanBeCached(function)) {
841 HeapObject::UpdateMapCodeCache(stub_holder, name, code); 812 HeapObject::UpdateMapCodeCache(receiver, name, code);
842 } 813 }
843 return code; 814 return code;
844 } 815 }
845 816
846 817
847 static void FillCache(Isolate* isolate, Handle<Code> code) { 818 static void FillCache(Isolate* isolate, Handle<Code> code) {
848 Handle<UnseededNumberDictionary> dictionary = 819 Handle<UnseededNumberDictionary> dictionary =
849 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), 820 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(),
850 code->flags(), 821 code->flags(),
851 code); 822 code);
(...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after
2197 Handle<FunctionTemplateInfo>( 2168 Handle<FunctionTemplateInfo>(
2198 FunctionTemplateInfo::cast(signature->receiver())); 2169 FunctionTemplateInfo::cast(signature->receiver()));
2199 } 2170 }
2200 } 2171 }
2201 2172
2202 is_simple_api_call_ = true; 2173 is_simple_api_call_ = true;
2203 } 2174 }
2204 2175
2205 2176
2206 } } // namespace v8::internal 2177 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698