| 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 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 345 | 345 |
| 346 switch (target->kind()) { | 346 switch (target->kind()) { |
| 347 case Code::LOAD_IC: return LoadIC::Clear(address, target); | 347 case Code::LOAD_IC: return LoadIC::Clear(address, target); |
| 348 case Code::KEYED_LOAD_IC: | 348 case Code::KEYED_LOAD_IC: |
| 349 return KeyedLoadIC::Clear(address, target); | 349 return KeyedLoadIC::Clear(address, target); |
| 350 case Code::STORE_IC: return StoreIC::Clear(address, target); | 350 case Code::STORE_IC: return StoreIC::Clear(address, target); |
| 351 case Code::KEYED_STORE_IC: | 351 case Code::KEYED_STORE_IC: |
| 352 return KeyedStoreIC::Clear(address, target); | 352 return KeyedStoreIC::Clear(address, target); |
| 353 case Code::CALL_IC: return CallIC::Clear(address, target); | 353 case Code::CALL_IC: return CallIC::Clear(address, target); |
| 354 case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target); | 354 case Code::KEYED_CALL_IC: return KeyedCallIC::Clear(address, target); |
| 355 case Code::COMPARE_IC: return CompareIC::Clear(address, target); |
| 355 case Code::UNARY_OP_IC: | 356 case Code::UNARY_OP_IC: |
| 356 case Code::BINARY_OP_IC: | 357 case Code::BINARY_OP_IC: |
| 357 case Code::COMPARE_IC: | |
| 358 case Code::TO_BOOLEAN_IC: | 358 case Code::TO_BOOLEAN_IC: |
| 359 // Clearing these is tricky and does not | 359 // Clearing these is tricky and does not |
| 360 // make any performance difference. | 360 // make any performance difference. |
| 361 return; | 361 return; |
| 362 default: UNREACHABLE(); | 362 default: UNREACHABLE(); |
| 363 } | 363 } |
| 364 } | 364 } |
| 365 | 365 |
| 366 | 366 |
| 367 void CallICBase::Clear(Address address, Code* target) { | 367 void CallICBase::Clear(Address address, Code* target) { |
| 368 if (target->ic_state() == UNINITIALIZED) return; |
| 368 bool contextual = CallICBase::Contextual::decode(target->extra_ic_state()); | 369 bool contextual = CallICBase::Contextual::decode(target->extra_ic_state()); |
| 369 State state = target->ic_state(); | |
| 370 if (state == UNINITIALIZED) return; | |
| 371 Code* code = | 370 Code* code = |
| 372 Isolate::Current()->stub_cache()->FindCallInitialize( | 371 Isolate::Current()->stub_cache()->FindCallInitialize( |
| 373 target->arguments_count(), | 372 target->arguments_count(), |
| 374 contextual ? RelocInfo::CODE_TARGET_CONTEXT : RelocInfo::CODE_TARGET, | 373 contextual ? RelocInfo::CODE_TARGET_CONTEXT : RelocInfo::CODE_TARGET, |
| 375 target->kind()); | 374 target->kind()); |
| 376 SetTargetAtAddress(address, code); | 375 SetTargetAtAddress(address, code); |
| 377 } | 376 } |
| 378 | 377 |
| 379 | 378 |
| 380 void KeyedLoadIC::Clear(Address address, Code* target) { | 379 void KeyedLoadIC::Clear(Address address, Code* target) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 403 | 402 |
| 404 void KeyedStoreIC::Clear(Address address, Code* target) { | 403 void KeyedStoreIC::Clear(Address address, Code* target) { |
| 405 if (target->ic_state() == UNINITIALIZED) return; | 404 if (target->ic_state() == UNINITIALIZED) return; |
| 406 SetTargetAtAddress(address, | 405 SetTargetAtAddress(address, |
| 407 (Code::GetStrictMode(target->extra_ic_state()) == kStrictMode) | 406 (Code::GetStrictMode(target->extra_ic_state()) == kStrictMode) |
| 408 ? initialize_stub_strict() | 407 ? initialize_stub_strict() |
| 409 : initialize_stub()); | 408 : initialize_stub()); |
| 410 } | 409 } |
| 411 | 410 |
| 412 | 411 |
| 412 void CompareIC::Clear(Address address, Code* target) { |
| 413 // Only clear ICCompareStubs, we currently cannot clear generic CompareStubs. |
| 414 if (target->major_key() != CodeStub::CompareIC) return; |
| 415 // Only clear CompareICs that can retain objects. |
| 416 if (target->compare_state() != KNOWN_OBJECTS) return; |
| 417 Token::Value op = CompareIC::ComputeOperation(target); |
| 418 SetTargetAtAddress(address, GetRawUninitialized(op)); |
| 419 PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); |
| 420 } |
| 421 |
| 422 |
| 413 static bool HasInterceptorGetter(JSObject* object) { | 423 static bool HasInterceptorGetter(JSObject* object) { |
| 414 return !object->GetNamedInterceptor()->getter()->IsUndefined(); | 424 return !object->GetNamedInterceptor()->getter()->IsUndefined(); |
| 415 } | 425 } |
| 416 | 426 |
| 417 | 427 |
| 418 static void LookupForRead(Handle<Object> object, | 428 static void LookupForRead(Handle<Object> object, |
| 419 Handle<String> name, | 429 Handle<String> name, |
| 420 LookupResult* lookup) { | 430 LookupResult* lookup) { |
| 421 // Skip all the objects with named interceptors, but | 431 // Skip all the objects with named interceptors, but |
| 422 // without actual getter. | 432 // without actual getter. |
| (...skipping 1966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2389 BinaryOpIC::GetName(previous_type), | 2399 BinaryOpIC::GetName(previous_type), |
| 2390 BinaryOpIC::GetName(type), | 2400 BinaryOpIC::GetName(type), |
| 2391 BinaryOpIC::GetName(result_type), | 2401 BinaryOpIC::GetName(result_type), |
| 2392 Token::Name(op)); | 2402 Token::Name(op)); |
| 2393 } | 2403 } |
| 2394 BinaryOpIC ic(isolate); | 2404 BinaryOpIC ic(isolate); |
| 2395 ic.patch(*code); | 2405 ic.patch(*code); |
| 2396 | 2406 |
| 2397 // Activate inlined smi code. | 2407 // Activate inlined smi code. |
| 2398 if (previous_type == BinaryOpIC::UNINITIALIZED) { | 2408 if (previous_type == BinaryOpIC::UNINITIALIZED) { |
| 2399 PatchInlinedSmiCode(ic.address()); | 2409 PatchInlinedSmiCode(ic.address(), ENABLE_INLINED_SMI_CHECK); |
| 2400 } | 2410 } |
| 2401 } | 2411 } |
| 2402 | 2412 |
| 2403 Handle<JSBuiltinsObject> builtins = Handle<JSBuiltinsObject>( | 2413 Handle<JSBuiltinsObject> builtins = Handle<JSBuiltinsObject>( |
| 2404 isolate->thread_local_top()->context_->builtins(), isolate); | 2414 isolate->thread_local_top()->context_->builtins(), isolate); |
| 2405 Object* builtin = NULL; // Initialization calms down the compiler. | 2415 Object* builtin = NULL; // Initialization calms down the compiler. |
| 2406 switch (op) { | 2416 switch (op) { |
| 2407 case Token::ADD: | 2417 case Token::ADD: |
| 2408 builtin = builtins->javascript_builtin(Builtins::ADD); | 2418 builtin = builtins->javascript_builtin(Builtins::ADD); |
| 2409 break; | 2419 break; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2450 ARRAY_SIZE(builtin_args), | 2460 ARRAY_SIZE(builtin_args), |
| 2451 builtin_args, | 2461 builtin_args, |
| 2452 &caught_exception); | 2462 &caught_exception); |
| 2453 if (caught_exception) { | 2463 if (caught_exception) { |
| 2454 return Failure::Exception(); | 2464 return Failure::Exception(); |
| 2455 } | 2465 } |
| 2456 return *result; | 2466 return *result; |
| 2457 } | 2467 } |
| 2458 | 2468 |
| 2459 | 2469 |
| 2470 Code* CompareIC::GetRawUninitialized(Token::Value op) { |
| 2471 ICCompareStub stub(op, UNINITIALIZED); |
| 2472 Code* code = NULL; |
| 2473 CHECK(stub.FindCodeInCache(&code)); |
| 2474 return code; |
| 2475 } |
| 2476 |
| 2477 |
| 2460 Handle<Code> CompareIC::GetUninitialized(Token::Value op) { | 2478 Handle<Code> CompareIC::GetUninitialized(Token::Value op) { |
| 2461 ICCompareStub stub(op, UNINITIALIZED); | 2479 ICCompareStub stub(op, UNINITIALIZED); |
| 2462 return stub.GetCode(); | 2480 return stub.GetCode(); |
| 2463 } | 2481 } |
| 2464 | 2482 |
| 2465 | 2483 |
| 2466 CompareIC::State CompareIC::ComputeState(Code* target) { | 2484 CompareIC::State CompareIC::ComputeState(Code* target) { |
| 2467 int key = target->major_key(); | 2485 int key = target->major_key(); |
| 2468 if (key == CodeStub::Compare) return GENERIC; | 2486 if (key == CodeStub::Compare) return GENERIC; |
| 2469 ASSERT(key == CodeStub::CompareIC); | 2487 ASSERT(key == CodeStub::CompareIC); |
| 2470 return static_cast<State>(target->compare_state()); | 2488 return static_cast<State>(target->compare_state()); |
| 2471 } | 2489 } |
| 2472 | 2490 |
| 2473 | 2491 |
| 2492 Token::Value CompareIC::ComputeOperation(Code* target) { |
| 2493 ASSERT(target->major_key() == CodeStub::CompareIC); |
| 2494 return static_cast<Token::Value>(target->compare_operation()); |
| 2495 } |
| 2496 |
| 2497 |
| 2474 const char* CompareIC::GetStateName(State state) { | 2498 const char* CompareIC::GetStateName(State state) { |
| 2475 switch (state) { | 2499 switch (state) { |
| 2476 case UNINITIALIZED: return "UNINITIALIZED"; | 2500 case UNINITIALIZED: return "UNINITIALIZED"; |
| 2477 case SMIS: return "SMIS"; | 2501 case SMIS: return "SMIS"; |
| 2478 case HEAP_NUMBERS: return "HEAP_NUMBERS"; | 2502 case HEAP_NUMBERS: return "HEAP_NUMBERS"; |
| 2479 case OBJECTS: return "OBJECTS"; | 2503 case OBJECTS: return "OBJECTS"; |
| 2480 case KNOWN_OBJECTS: return "OBJECTS"; | 2504 case KNOWN_OBJECTS: return "OBJECTS"; |
| 2481 case SYMBOLS: return "SYMBOLS"; | 2505 case SYMBOLS: return "SYMBOLS"; |
| 2482 case STRINGS: return "STRINGS"; | 2506 case STRINGS: return "STRINGS"; |
| 2483 case GENERIC: return "GENERIC"; | 2507 case GENERIC: return "GENERIC"; |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2582 #undef ADDR | 2606 #undef ADDR |
| 2583 }; | 2607 }; |
| 2584 | 2608 |
| 2585 | 2609 |
| 2586 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2610 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 2587 return IC_utilities[id]; | 2611 return IC_utilities[id]; |
| 2588 } | 2612 } |
| 2589 | 2613 |
| 2590 | 2614 |
| 2591 } } // namespace v8::internal | 2615 } } // namespace v8::internal |
| OLD | NEW |