OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 LoadStubCompiler compiler(isolate_); | 299 LoadStubCompiler compiler(isolate_); |
300 Handle<Code> code = | 300 Handle<Code> code = |
301 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 301 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
302 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 302 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
303 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 303 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
304 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); | 304 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
305 return code; | 305 return code; |
306 } | 306 } |
307 | 307 |
308 | 308 |
309 MaybeObject* StubCache::ComputeKeyedLoadField(String* name, | 309 Handle<Code> KeyedLoadStubCompiler::CompileLoadField(Handle<String> name, |
310 JSObject* receiver, | 310 Handle<JSObject> object, |
311 JSObject* holder, | 311 Handle<JSObject> holder, |
| 312 int index) { |
| 313 CALL_HEAP_FUNCTION(isolate(), |
| 314 CompileLoadField(*name, *object, *holder, index), |
| 315 Code); |
| 316 } |
| 317 |
| 318 |
| 319 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, |
| 320 Handle<JSObject> receiver, |
| 321 Handle<JSObject> holder, |
312 int field_index) { | 322 int field_index) { |
313 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 323 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
314 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); | 324 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, FIELD); |
315 Object* code = receiver->map()->FindInCodeCache(name, flags); | 325 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
316 if (code->IsUndefined()) { | 326 if (probe->IsCode()) return Handle<Code>::cast(probe); |
317 HandleScope scope(isolate_); | 327 |
318 KeyedLoadStubCompiler compiler(isolate_); | 328 KeyedLoadStubCompiler compiler(isolate_); |
319 { MaybeObject* maybe_code = | 329 Handle<Code> code = |
320 compiler.CompileLoadField(name, receiver, holder, field_index); | 330 compiler.CompileLoadField(name, receiver, holder, field_index); |
321 if (!maybe_code->ToObject(&code)) return maybe_code; | 331 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
322 } | 332 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
323 PROFILE(isolate_, | 333 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
324 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
325 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
326 Object* result; | |
327 { MaybeObject* maybe_result = | |
328 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
329 if (!maybe_result->ToObject(&result)) return maybe_result; | |
330 } | |
331 } | |
332 return code; | 334 return code; |
333 } | 335 } |
334 | 336 |
335 | 337 |
336 MaybeObject* StubCache::ComputeKeyedLoadConstant(String* name, | 338 Handle<Code> KeyedLoadStubCompiler::CompileLoadConstant(Handle<String> name, |
337 JSObject* receiver, | 339 Handle<JSObject> object, |
338 JSObject* holder, | 340 Handle<JSObject> holder, |
339 Object* value) { | 341 Handle<Object> value) { |
340 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 342 CALL_HEAP_FUNCTION(isolate(), |
| 343 CompileLoadConstant(*name, *object, *holder, *value), |
| 344 Code); |
| 345 } |
| 346 |
| 347 |
| 348 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, |
| 349 Handle<JSObject> receiver, |
| 350 Handle<JSObject> holder, |
| 351 Handle<Object> value) { |
| 352 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
341 Code::Flags flags = | 353 Code::Flags flags = |
342 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); | 354 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CONSTANT_FUNCTION); |
343 Object* code = receiver->map()->FindInCodeCache(name, flags); | 355 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
344 if (code->IsUndefined()) { | 356 if (probe->IsCode()) return Handle<Code>::cast(probe); |
345 HandleScope scope(isolate_); | 357 |
346 KeyedLoadStubCompiler compiler(isolate_); | 358 KeyedLoadStubCompiler compiler(isolate_); |
347 { MaybeObject* maybe_code = | 359 Handle<Code> code = |
348 compiler.CompileLoadConstant(name, receiver, holder, value); | 360 compiler.CompileLoadConstant(name, receiver, holder, value); |
349 if (!maybe_code->ToObject(&code)) return maybe_code; | 361 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
350 } | 362 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
351 PROFILE(isolate_, | 363 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
352 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
353 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
354 Object* result; | |
355 { MaybeObject* maybe_result = | |
356 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
357 if (!maybe_result->ToObject(&result)) return maybe_result; | |
358 } | |
359 } | |
360 return code; | 364 return code; |
361 } | 365 } |
362 | 366 |
363 | 367 |
364 MaybeObject* StubCache::ComputeKeyedLoadInterceptor(String* name, | 368 Handle<Code> KeyedLoadStubCompiler::CompileLoadInterceptor( |
365 JSObject* receiver, | 369 Handle<JSObject> object, |
366 JSObject* holder) { | 370 Handle<JSObject> holder, |
367 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 371 Handle<String> name) { |
| 372 CALL_HEAP_FUNCTION(isolate(), |
| 373 CompileLoadInterceptor(*object, *holder, *name), |
| 374 Code); |
| 375 } |
| 376 |
| 377 |
| 378 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, |
| 379 Handle<JSObject> receiver, |
| 380 Handle<JSObject> holder) { |
| 381 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
368 Code::Flags flags = | 382 Code::Flags flags = |
369 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); | 383 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, INTERCEPTOR); |
370 Object* code = receiver->map()->FindInCodeCache(name, flags); | 384 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
371 if (code->IsUndefined()) { | 385 if (probe->IsCode()) return Handle<Code>::cast(probe); |
372 HandleScope scope(isolate_); | 386 |
373 KeyedLoadStubCompiler compiler(isolate_); | 387 KeyedLoadStubCompiler compiler(isolate_); |
374 { MaybeObject* maybe_code = | 388 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); |
375 compiler.CompileLoadInterceptor(receiver, holder, name); | 389 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
376 if (!maybe_code->ToObject(&code)) return maybe_code; | 390 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
377 } | 391 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
378 PROFILE(isolate_, | |
379 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
380 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
381 Object* result; | |
382 { MaybeObject* maybe_result = | |
383 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
384 if (!maybe_result->ToObject(&result)) return maybe_result; | |
385 } | |
386 } | |
387 return code; | 392 return code; |
388 } | 393 } |
389 | 394 |
390 | 395 |
391 MaybeObject* StubCache::ComputeKeyedLoadCallback(String* name, | 396 Handle<Code> KeyedLoadStubCompiler::CompileLoadCallback( |
392 JSObject* receiver, | 397 Handle<String> name, |
393 JSObject* holder, | 398 Handle<JSObject> object, |
394 AccessorInfo* callback) { | 399 Handle<JSObject> holder, |
395 ASSERT(IC::GetCodeCacheForObject(receiver, holder) == OWN_MAP); | 400 Handle<AccessorInfo> callback) { |
| 401 CALL_HEAP_FUNCTION(isolate(), |
| 402 CompileLoadCallback(*name, *object, *holder, *callback), |
| 403 Code); |
| 404 } |
| 405 |
| 406 |
| 407 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
| 408 Handle<String> name, |
| 409 Handle<JSObject> receiver, |
| 410 Handle<JSObject> holder, |
| 411 Handle<AccessorInfo> callback) { |
| 412 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
396 Code::Flags flags = | 413 Code::Flags flags = |
397 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 414 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
398 Object* code = receiver->map()->FindInCodeCache(name, flags); | 415 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
399 if (code->IsUndefined()) { | 416 if (probe->IsCode()) return Handle<Code>::cast(probe); |
400 HandleScope scope(isolate_); | 417 |
401 KeyedLoadStubCompiler compiler(isolate_); | 418 KeyedLoadStubCompiler compiler(isolate_); |
402 { MaybeObject* maybe_code = | 419 Handle<Code> code = |
403 compiler.CompileLoadCallback(name, receiver, holder, callback); | 420 compiler.CompileLoadCallback(name, receiver, holder, callback); |
404 if (!maybe_code->ToObject(&code)) return maybe_code; | 421 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
405 } | 422 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
406 PROFILE(isolate_, | 423 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
407 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
408 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
409 Object* result; | |
410 { MaybeObject* maybe_result = | |
411 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
412 if (!maybe_result->ToObject(&result)) return maybe_result; | |
413 } | |
414 } | |
415 return code; | 424 return code; |
416 } | 425 } |
417 | 426 |
418 | 427 |
| 428 Handle<Code> KeyedLoadStubCompiler::CompileLoadArrayLength( |
| 429 Handle<String> name) { |
| 430 CALL_HEAP_FUNCTION(isolate(), |
| 431 CompileLoadArrayLength(*name), |
| 432 Code); |
| 433 } |
419 | 434 |
420 MaybeObject* StubCache::ComputeKeyedLoadArrayLength(String* name, | 435 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, |
421 JSArray* receiver) { | 436 Handle<JSArray> receiver) { |
422 Code::Flags flags = | 437 Code::Flags flags = |
423 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 438 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
424 ASSERT(receiver->IsJSObject()); | 439 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
425 Object* code = receiver->map()->FindInCodeCache(name, flags); | 440 if (probe->IsCode()) return Handle<Code>::cast(probe); |
426 if (code->IsUndefined()) { | 441 |
427 HandleScope scope(isolate_); | 442 KeyedLoadStubCompiler compiler(isolate_); |
428 KeyedLoadStubCompiler compiler(isolate_); | 443 Handle<Code> code = compiler.CompileLoadArrayLength(name); |
429 { MaybeObject* maybe_code = compiler.CompileLoadArrayLength(name); | 444 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
430 if (!maybe_code->ToObject(&code)) return maybe_code; | 445 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
431 } | 446 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
432 PROFILE(isolate_, | |
433 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
434 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
435 Object* result; | |
436 { MaybeObject* maybe_result = | |
437 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
438 if (!maybe_result->ToObject(&result)) return maybe_result; | |
439 } | |
440 } | |
441 return code; | 447 return code; |
442 } | 448 } |
443 | 449 |
444 | 450 |
445 MaybeObject* StubCache::ComputeKeyedLoadStringLength(String* name, | 451 Handle<Code> KeyedLoadStubCompiler::CompileLoadStringLength( |
446 String* receiver) { | 452 Handle<String> name) { |
| 453 CALL_HEAP_FUNCTION(isolate(), |
| 454 CompileLoadStringLength(*name), |
| 455 Code); |
| 456 } |
| 457 |
| 458 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, |
| 459 Handle<String> receiver) { |
447 Code::Flags flags = | 460 Code::Flags flags = |
448 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 461 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
449 Map* map = receiver->map(); | 462 Handle<Map> map(receiver->map()); |
450 Object* code = map->FindInCodeCache(name, flags); | 463 Handle<Object> probe(map->FindInCodeCache(*name, flags)); |
451 if (code->IsUndefined()) { | 464 if (probe->IsCode()) return Handle<Code>::cast(probe); |
452 HandleScope scope(isolate_); | 465 |
453 KeyedLoadStubCompiler compiler(isolate_); | 466 KeyedLoadStubCompiler compiler(isolate_); |
454 { MaybeObject* maybe_code = compiler.CompileLoadStringLength(name); | 467 Handle<Code> code = compiler.CompileLoadStringLength(name); |
455 if (!maybe_code->ToObject(&code)) return maybe_code; | 468 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
456 } | 469 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
457 PROFILE(isolate_, | 470 Map::UpdateCodeCache(map, name, code); |
458 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
459 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
460 Object* result; | |
461 { MaybeObject* maybe_result = map->UpdateCodeCache(name, Code::cast(code)); | |
462 if (!maybe_result->ToObject(&result)) return maybe_result; | |
463 } | |
464 } | |
465 return code; | 471 return code; |
466 } | 472 } |
467 | 473 |
468 | 474 |
469 MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype( | 475 Handle<Code> KeyedLoadStubCompiler::CompileLoadFunctionPrototype( |
470 String* name, | 476 Handle<String> name) { |
471 JSFunction* receiver) { | 477 CALL_HEAP_FUNCTION(isolate(), |
| 478 CompileLoadFunctionPrototype(*name), |
| 479 Code); |
| 480 } |
| 481 |
| 482 |
| 483 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( |
| 484 Handle<String> name, |
| 485 Handle<JSFunction> receiver) { |
472 Code::Flags flags = | 486 Code::Flags flags = |
473 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); | 487 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, CALLBACKS); |
474 Object* code = receiver->map()->FindInCodeCache(name, flags); | 488 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
475 if (code->IsUndefined()) { | 489 if (probe->IsCode()) return Handle<Code>::cast(probe); |
476 HandleScope scope(isolate_); | 490 |
477 KeyedLoadStubCompiler compiler(isolate_); | 491 KeyedLoadStubCompiler compiler(isolate_); |
478 { MaybeObject* maybe_code = compiler.CompileLoadFunctionPrototype(name); | 492 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); |
479 if (!maybe_code->ToObject(&code)) return maybe_code; | 493 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
480 } | 494 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
481 PROFILE(isolate_, | 495 JSObject::UpdateMapCodeCache(isolate_, receiver, name, code); |
482 CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), name)); | |
483 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, name, Code::cast(code))); | |
484 Object* result; | |
485 { MaybeObject* maybe_result = | |
486 receiver->UpdateMapCodeCache(name, Code::cast(code)); | |
487 if (!maybe_result->ToObject(&result)) return maybe_result; | |
488 } | |
489 } | |
490 return code; | 496 return code; |
491 } | 497 } |
492 | 498 |
493 | 499 |
494 Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object, | 500 Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object, |
495 int index, | 501 int index, |
496 Handle<Map> transition, | 502 Handle<Map> transition, |
497 Handle<String> name) { | 503 Handle<String> name) { |
498 CALL_HEAP_FUNCTION(isolate(), | 504 CALL_HEAP_FUNCTION(isolate(), |
499 CompileStoreField(*object, | 505 CompileStoreField(*object, |
(...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1925 expected_receiver_type_ = | 1931 expected_receiver_type_ = |
1926 FunctionTemplateInfo::cast(signature->receiver()); | 1932 FunctionTemplateInfo::cast(signature->receiver()); |
1927 } | 1933 } |
1928 } | 1934 } |
1929 | 1935 |
1930 is_simple_api_call_ = true; | 1936 is_simple_api_call_ = true; |
1931 } | 1937 } |
1932 | 1938 |
1933 | 1939 |
1934 } } // namespace v8::internal | 1940 } } // namespace v8::internal |
OLD | NEW |