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 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 // -- esp[kFastApiCallArguments * 4 + 4] : last argument in the internal | 444 // -- esp[kFastApiCallArguments * 4 + 4] : last argument in the internal |
445 // frame. | 445 // frame. |
446 // ----------------------------------- | 446 // ----------------------------------- |
447 __ pop(scratch); | 447 __ pop(scratch); |
448 __ add(Operand(esp), Immediate(kPointerSize * kFastApiCallArguments)); | 448 __ add(Operand(esp), Immediate(kPointerSize * kFastApiCallArguments)); |
449 __ push(scratch); | 449 __ push(scratch); |
450 } | 450 } |
451 | 451 |
452 | 452 |
453 // Generates call to API function. | 453 // Generates call to API function. |
454 static bool GenerateFastApiCall(MacroAssembler* masm, | 454 static MaybeObject* GenerateFastApiCall(MacroAssembler* masm, |
455 const CallOptimization& optimization, | 455 const CallOptimization& optimization, |
456 int argc, | 456 int argc) { |
457 Failure** failure) { | |
458 // ----------- S t a t e ------------- | 457 // ----------- S t a t e ------------- |
459 // -- esp[0] : return address | 458 // -- esp[0] : return address |
460 // -- esp[4] : object passing the type check | 459 // -- esp[4] : object passing the type check |
461 // (last fast api call extra argument, | 460 // (last fast api call extra argument, |
462 // set by CheckPrototypes) | 461 // set by CheckPrototypes) |
463 // -- esp[8] : api function | 462 // -- esp[8] : api function |
464 // (first fast api call extra argument) | 463 // (first fast api call extra argument) |
465 // -- esp[12] : api call data | 464 // -- esp[12] : api call data |
466 // -- esp[16] : last argument | 465 // -- esp[16] : last argument |
467 // -- ... | 466 // -- ... |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 __ Set(ApiParameterOperand(4), Immediate(0)); | 508 __ Set(ApiParameterOperand(4), Immediate(0)); |
510 | 509 |
511 // v8::InvocationCallback's argument. | 510 // v8::InvocationCallback's argument. |
512 __ lea(eax, ApiParameterOperand(1)); | 511 __ lea(eax, ApiParameterOperand(1)); |
513 __ mov(ApiParameterOperand(0), eax); | 512 __ mov(ApiParameterOperand(0), eax); |
514 | 513 |
515 // Emitting a stub call may try to allocate (if the code is not | 514 // Emitting a stub call may try to allocate (if the code is not |
516 // already generated). Do not allow the assembler to perform a | 515 // already generated). Do not allow the assembler to perform a |
517 // garbage collection but instead return the allocation failure | 516 // garbage collection but instead return the allocation failure |
518 // object. | 517 // object. |
519 MaybeObject* result = | 518 return masm->TryCallApiFunctionAndReturn(&fun, |
520 masm->TryCallApiFunctionAndReturn(&fun, argc + kFastApiCallArguments + 1); | 519 argc + kFastApiCallArguments + 1); |
521 if (result->IsFailure()) { | |
522 *failure = Failure::cast(result); | |
523 return false; | |
524 } | |
525 return true; | |
526 } | 520 } |
527 | 521 |
528 | 522 |
529 class CallInterceptorCompiler BASE_EMBEDDED { | 523 class CallInterceptorCompiler BASE_EMBEDDED { |
530 public: | 524 public: |
531 CallInterceptorCompiler(StubCompiler* stub_compiler, | 525 CallInterceptorCompiler(StubCompiler* stub_compiler, |
532 const ParameterCount& arguments, | 526 const ParameterCount& arguments, |
533 Register name) | 527 Register name) |
534 : stub_compiler_(stub_compiler), | 528 : stub_compiler_(stub_compiler), |
535 arguments_(arguments), | 529 arguments_(arguments), |
536 name_(name) {} | 530 name_(name) {} |
537 | 531 |
538 bool Compile(MacroAssembler* masm, | 532 MaybeObject* Compile(MacroAssembler* masm, |
539 JSObject* object, | 533 JSObject* object, |
540 JSObject* holder, | 534 JSObject* holder, |
541 String* name, | 535 String* name, |
542 LookupResult* lookup, | 536 LookupResult* lookup, |
543 Register receiver, | 537 Register receiver, |
544 Register scratch1, | 538 Register scratch1, |
545 Register scratch2, | 539 Register scratch2, |
546 Register scratch3, | 540 Register scratch3, |
547 Label* miss, | 541 Label* miss) { |
548 Failure** failure) { | |
549 ASSERT(holder->HasNamedInterceptor()); | 542 ASSERT(holder->HasNamedInterceptor()); |
550 ASSERT(!holder->GetNamedInterceptor()->getter()->IsUndefined()); | 543 ASSERT(!holder->GetNamedInterceptor()->getter()->IsUndefined()); |
551 | 544 |
552 // Check that the receiver isn't a smi. | 545 // Check that the receiver isn't a smi. |
553 __ test(receiver, Immediate(kSmiTagMask)); | 546 __ test(receiver, Immediate(kSmiTagMask)); |
554 __ j(zero, miss, not_taken); | 547 __ j(zero, miss, not_taken); |
555 | 548 |
556 CallOptimization optimization(lookup); | 549 CallOptimization optimization(lookup); |
557 | 550 |
558 if (optimization.is_constant_call()) { | 551 if (optimization.is_constant_call()) { |
559 return CompileCacheable(masm, | 552 return CompileCacheable(masm, |
560 object, | 553 object, |
561 receiver, | 554 receiver, |
562 scratch1, | 555 scratch1, |
563 scratch2, | 556 scratch2, |
564 scratch3, | 557 scratch3, |
565 holder, | 558 holder, |
566 lookup, | 559 lookup, |
567 name, | 560 name, |
568 optimization, | 561 optimization, |
569 miss, | 562 miss); |
570 failure); | |
571 } else { | 563 } else { |
572 CompileRegular(masm, | 564 CompileRegular(masm, |
573 object, | 565 object, |
574 receiver, | 566 receiver, |
575 scratch1, | 567 scratch1, |
576 scratch2, | 568 scratch2, |
577 scratch3, | 569 scratch3, |
578 name, | 570 name, |
579 holder, | 571 holder, |
580 miss); | 572 miss); |
581 return true; | 573 return Heap::undefined_value(); // Success. |
582 } | 574 } |
583 } | 575 } |
584 | 576 |
585 private: | 577 private: |
586 bool CompileCacheable(MacroAssembler* masm, | 578 MaybeObject* CompileCacheable(MacroAssembler* masm, |
587 JSObject* object, | 579 JSObject* object, |
588 Register receiver, | 580 Register receiver, |
589 Register scratch1, | 581 Register scratch1, |
590 Register scratch2, | 582 Register scratch2, |
591 Register scratch3, | 583 Register scratch3, |
592 JSObject* interceptor_holder, | 584 JSObject* interceptor_holder, |
593 LookupResult* lookup, | 585 LookupResult* lookup, |
594 String* name, | 586 String* name, |
595 const CallOptimization& optimization, | 587 const CallOptimization& optimization, |
596 Label* miss_label, | 588 Label* miss_label) { |
597 Failure** failure) { | |
598 ASSERT(optimization.is_constant_call()); | 589 ASSERT(optimization.is_constant_call()); |
599 ASSERT(!lookup->holder()->IsGlobalObject()); | 590 ASSERT(!lookup->holder()->IsGlobalObject()); |
600 | 591 |
601 int depth1 = kInvalidProtoDepth; | 592 int depth1 = kInvalidProtoDepth; |
602 int depth2 = kInvalidProtoDepth; | 593 int depth2 = kInvalidProtoDepth; |
603 bool can_do_fast_api_call = false; | 594 bool can_do_fast_api_call = false; |
604 if (optimization.is_simple_api_call() && | 595 if (optimization.is_simple_api_call() && |
605 !lookup->holder()->IsGlobalObject()) { | 596 !lookup->holder()->IsGlobalObject()) { |
606 depth1 = | 597 depth1 = |
607 optimization.GetPrototypeDepthOfExpectedType(object, | 598 optimization.GetPrototypeDepthOfExpectedType(object, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 } else { | 640 } else { |
650 // CheckPrototypes has a side effect of fetching a 'holder' | 641 // CheckPrototypes has a side effect of fetching a 'holder' |
651 // for API (object which is instanceof for the signature). It's | 642 // for API (object which is instanceof for the signature). It's |
652 // safe to omit it here, as if present, it should be fetched | 643 // safe to omit it here, as if present, it should be fetched |
653 // by the previous CheckPrototypes. | 644 // by the previous CheckPrototypes. |
654 ASSERT(depth2 == kInvalidProtoDepth); | 645 ASSERT(depth2 == kInvalidProtoDepth); |
655 } | 646 } |
656 | 647 |
657 // Invoke function. | 648 // Invoke function. |
658 if (can_do_fast_api_call) { | 649 if (can_do_fast_api_call) { |
659 bool success = GenerateFastApiCall(masm, optimization, | 650 MaybeObject* result = |
660 arguments_.immediate(), failure); | 651 GenerateFastApiCall(masm, optimization, arguments_.immediate()); |
661 if (!success) { | 652 if (result->IsFailure()) return result; |
662 return false; | |
663 } | |
664 } else { | 653 } else { |
665 __ InvokeFunction(optimization.constant_function(), arguments_, | 654 __ InvokeFunction(optimization.constant_function(), arguments_, |
666 JUMP_FUNCTION); | 655 JUMP_FUNCTION); |
667 } | 656 } |
668 | 657 |
669 // Deferred code for fast API call case---clean preallocated space. | 658 // Deferred code for fast API call case---clean preallocated space. |
670 if (can_do_fast_api_call) { | 659 if (can_do_fast_api_call) { |
671 __ bind(&miss_cleanup); | 660 __ bind(&miss_cleanup); |
672 FreeSpaceForFastApiCall(masm, scratch1); | 661 FreeSpaceForFastApiCall(masm, scratch1); |
673 __ jmp(miss_label); | 662 __ jmp(miss_label); |
674 } | 663 } |
675 | 664 |
676 // Invoke a regular function. | 665 // Invoke a regular function. |
677 __ bind(®ular_invoke); | 666 __ bind(®ular_invoke); |
678 if (can_do_fast_api_call) { | 667 if (can_do_fast_api_call) { |
679 FreeSpaceForFastApiCall(masm, scratch1); | 668 FreeSpaceForFastApiCall(masm, scratch1); |
680 } | 669 } |
681 | 670 |
682 return true; | 671 return Heap::undefined_value(); // Success. |
683 } | 672 } |
684 | 673 |
685 void CompileRegular(MacroAssembler* masm, | 674 void CompileRegular(MacroAssembler* masm, |
686 JSObject* object, | 675 JSObject* object, |
687 Register receiver, | 676 Register receiver, |
688 Register scratch1, | 677 Register scratch1, |
689 Register scratch2, | 678 Register scratch2, |
690 Register scratch3, | 679 Register scratch3, |
691 String* name, | 680 String* name, |
692 JSObject* interceptor_holder, | 681 JSObject* interceptor_holder, |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 Register reg = | 1039 Register reg = |
1051 CheckPrototypes(object, receiver, holder, | 1040 CheckPrototypes(object, receiver, holder, |
1052 scratch1, scratch2, scratch3, name, miss); | 1041 scratch1, scratch2, scratch3, name, miss); |
1053 | 1042 |
1054 // Get the value from the properties. | 1043 // Get the value from the properties. |
1055 GenerateFastPropertyLoad(masm(), eax, reg, holder, index); | 1044 GenerateFastPropertyLoad(masm(), eax, reg, holder, index); |
1056 __ ret(0); | 1045 __ ret(0); |
1057 } | 1046 } |
1058 | 1047 |
1059 | 1048 |
1060 bool StubCompiler::GenerateLoadCallback(JSObject* object, | 1049 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, |
1061 JSObject* holder, | 1050 JSObject* holder, |
1062 Register receiver, | 1051 Register receiver, |
1063 Register name_reg, | 1052 Register name_reg, |
1064 Register scratch1, | 1053 Register scratch1, |
1065 Register scratch2, | 1054 Register scratch2, |
1066 Register scratch3, | 1055 Register scratch3, |
1067 AccessorInfo* callback, | 1056 AccessorInfo* callback, |
1068 String* name, | 1057 String* name, |
1069 Label* miss, | 1058 Label* miss) { |
1070 Failure** failure) { | |
1071 // Check that the receiver isn't a smi. | 1059 // Check that the receiver isn't a smi. |
1072 __ test(receiver, Immediate(kSmiTagMask)); | 1060 __ test(receiver, Immediate(kSmiTagMask)); |
1073 __ j(zero, miss, not_taken); | 1061 __ j(zero, miss, not_taken); |
1074 | 1062 |
1075 // Check that the maps haven't changed. | 1063 // Check that the maps haven't changed. |
1076 Register reg = | 1064 Register reg = |
1077 CheckPrototypes(object, receiver, holder, scratch1, | 1065 CheckPrototypes(object, receiver, holder, scratch1, |
1078 scratch2, scratch3, name, miss); | 1066 scratch2, scratch3, name, miss); |
1079 | 1067 |
1080 Handle<AccessorInfo> callback_handle(callback); | 1068 Handle<AccessorInfo> callback_handle(callback); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 | 1103 |
1116 __ PrepareCallApiFunction(kApiArgc, eax); | 1104 __ PrepareCallApiFunction(kApiArgc, eax); |
1117 __ mov(ApiParameterOperand(0), ebx); // name. | 1105 __ mov(ApiParameterOperand(0), ebx); // name. |
1118 __ add(Operand(ebx), Immediate(kPointerSize)); | 1106 __ add(Operand(ebx), Immediate(kPointerSize)); |
1119 __ mov(ApiParameterOperand(1), ebx); // arguments pointer. | 1107 __ mov(ApiParameterOperand(1), ebx); // arguments pointer. |
1120 | 1108 |
1121 // Emitting a stub call may try to allocate (if the code is not | 1109 // Emitting a stub call may try to allocate (if the code is not |
1122 // already generated). Do not allow the assembler to perform a | 1110 // already generated). Do not allow the assembler to perform a |
1123 // garbage collection but instead return the allocation failure | 1111 // garbage collection but instead return the allocation failure |
1124 // object. | 1112 // object. |
1125 MaybeObject* result = masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); | 1113 return masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); |
1126 if (result->IsFailure()) { | |
1127 *failure = Failure::cast(result); | |
1128 return false; | |
1129 } | |
1130 | |
1131 return true; | |
1132 } | 1114 } |
1133 | 1115 |
1134 | 1116 |
1135 void StubCompiler::GenerateLoadConstant(JSObject* object, | 1117 void StubCompiler::GenerateLoadConstant(JSObject* object, |
1136 JSObject* holder, | 1118 JSObject* holder, |
1137 Register receiver, | 1119 Register receiver, |
1138 Register scratch1, | 1120 Register scratch1, |
1139 Register scratch2, | 1121 Register scratch2, |
1140 Register scratch3, | 1122 Register scratch3, |
1141 Object* value, | 1123 Object* value, |
(...skipping 1131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2273 ebx, edx, edi, name, &miss); | 2255 ebx, edx, edi, name, &miss); |
2274 } | 2256 } |
2275 break; | 2257 break; |
2276 } | 2258 } |
2277 | 2259 |
2278 default: | 2260 default: |
2279 UNREACHABLE(); | 2261 UNREACHABLE(); |
2280 } | 2262 } |
2281 | 2263 |
2282 if (depth != kInvalidProtoDepth) { | 2264 if (depth != kInvalidProtoDepth) { |
2283 Failure* failure; | |
2284 // Move the return address on top of the stack. | 2265 // Move the return address on top of the stack. |
2285 __ mov(eax, Operand(esp, 3 * kPointerSize)); | 2266 __ mov(eax, Operand(esp, 3 * kPointerSize)); |
2286 __ mov(Operand(esp, 0 * kPointerSize), eax); | 2267 __ mov(Operand(esp, 0 * kPointerSize), eax); |
2287 | 2268 |
2288 // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains | 2269 // esp[2 * kPointerSize] is uninitialized, esp[3 * kPointerSize] contains |
2289 // duplicate of return address and will be overwritten. | 2270 // duplicate of return address and will be overwritten. |
2290 bool success = GenerateFastApiCall(masm(), optimization, argc, &failure); | 2271 MaybeObject* result = GenerateFastApiCall(masm(), optimization, argc); |
2291 if (!success) { | 2272 if (result->IsFailure()) return result; |
2292 return failure; | |
2293 } | |
2294 } else { | 2273 } else { |
2295 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2274 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
2296 } | 2275 } |
2297 | 2276 |
2298 // Handle call cache miss. | 2277 // Handle call cache miss. |
2299 __ bind(&miss); | 2278 __ bind(&miss); |
2300 if (depth != kInvalidProtoDepth) { | 2279 if (depth != kInvalidProtoDepth) { |
2301 __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); | 2280 __ add(Operand(esp), Immediate(kFastApiCallArguments * kPointerSize)); |
2302 } | 2281 } |
2303 __ bind(&miss_in_smi_check); | 2282 __ bind(&miss_in_smi_check); |
(...skipping 24 matching lines...) Expand all Loading... |
2328 // Get the number of arguments. | 2307 // Get the number of arguments. |
2329 const int argc = arguments().immediate(); | 2308 const int argc = arguments().immediate(); |
2330 | 2309 |
2331 LookupResult lookup; | 2310 LookupResult lookup; |
2332 LookupPostInterceptor(holder, name, &lookup); | 2311 LookupPostInterceptor(holder, name, &lookup); |
2333 | 2312 |
2334 // Get the receiver from the stack. | 2313 // Get the receiver from the stack. |
2335 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2314 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
2336 | 2315 |
2337 CallInterceptorCompiler compiler(this, arguments(), ecx); | 2316 CallInterceptorCompiler compiler(this, arguments(), ecx); |
2338 Failure* failure; | 2317 MaybeObject* result = compiler.Compile(masm(), |
2339 bool success = compiler.Compile(masm(), | 2318 object, |
2340 object, | 2319 holder, |
2341 holder, | 2320 name, |
2342 name, | 2321 &lookup, |
2343 &lookup, | 2322 edx, |
2344 edx, | 2323 ebx, |
2345 ebx, | 2324 edi, |
2346 edi, | 2325 eax, |
2347 eax, | 2326 &miss); |
2348 &miss, | 2327 if (result->IsFailure()) return result; |
2349 &failure); | |
2350 if (!success) { | |
2351 return failure; | |
2352 } | |
2353 | 2328 |
2354 // Restore receiver. | 2329 // Restore receiver. |
2355 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); | 2330 __ mov(edx, Operand(esp, (argc + 1) * kPointerSize)); |
2356 | 2331 |
2357 // Check that the function really is a function. | 2332 // Check that the function really is a function. |
2358 __ test(eax, Immediate(kSmiTagMask)); | 2333 __ test(eax, Immediate(kSmiTagMask)); |
2359 __ j(zero, &miss, not_taken); | 2334 __ j(zero, &miss, not_taken); |
2360 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); | 2335 __ CmpObjectType(eax, JS_FUNCTION_TYPE, ebx); |
2361 __ j(not_equal, &miss, not_taken); | 2336 __ j(not_equal, &miss, not_taken); |
2362 | 2337 |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2792 JSObject* object, | 2767 JSObject* object, |
2793 JSObject* holder, | 2768 JSObject* holder, |
2794 AccessorInfo* callback) { | 2769 AccessorInfo* callback) { |
2795 // ----------- S t a t e ------------- | 2770 // ----------- S t a t e ------------- |
2796 // -- eax : receiver | 2771 // -- eax : receiver |
2797 // -- ecx : name | 2772 // -- ecx : name |
2798 // -- esp[0] : return address | 2773 // -- esp[0] : return address |
2799 // ----------------------------------- | 2774 // ----------------------------------- |
2800 Label miss; | 2775 Label miss; |
2801 | 2776 |
2802 Failure* failure = Failure::InternalError(); | 2777 MaybeObject* result = GenerateLoadCallback(object, holder, eax, ecx, ebx, edx, |
2803 bool success = GenerateLoadCallback(object, holder, eax, ecx, ebx, edx, edi, | 2778 edi, callback, name, &miss); |
2804 callback, name, &miss, &failure); | 2779 if (result->IsFailure()) { |
2805 if (!success) { | |
2806 miss.Unuse(); | 2780 miss.Unuse(); |
2807 return failure; | 2781 return result; |
2808 } | 2782 } |
2809 | 2783 |
2810 __ bind(&miss); | 2784 __ bind(&miss); |
2811 GenerateLoadMiss(masm(), Code::LOAD_IC); | 2785 GenerateLoadMiss(masm(), Code::LOAD_IC); |
2812 | 2786 |
2813 // Return the generated code. | 2787 // Return the generated code. |
2814 return GetCode(CALLBACKS, name); | 2788 return GetCode(CALLBACKS, name); |
2815 } | 2789 } |
2816 | 2790 |
2817 | 2791 |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2961 // -- esp[0] : return address | 2935 // -- esp[0] : return address |
2962 // ----------------------------------- | 2936 // ----------------------------------- |
2963 Label miss; | 2937 Label miss; |
2964 | 2938 |
2965 __ IncrementCounter(&Counters::keyed_load_callback, 1); | 2939 __ IncrementCounter(&Counters::keyed_load_callback, 1); |
2966 | 2940 |
2967 // Check that the name has not changed. | 2941 // Check that the name has not changed. |
2968 __ cmp(Operand(eax), Immediate(Handle<String>(name))); | 2942 __ cmp(Operand(eax), Immediate(Handle<String>(name))); |
2969 __ j(not_equal, &miss, not_taken); | 2943 __ j(not_equal, &miss, not_taken); |
2970 | 2944 |
2971 Failure* failure = Failure::InternalError(); | 2945 MaybeObject* result = GenerateLoadCallback(receiver, holder, edx, eax, ebx, |
2972 bool success = GenerateLoadCallback(receiver, holder, edx, eax, ebx, ecx, edi, | 2946 ecx, edi, callback, name, &miss); |
2973 callback, name, &miss, &failure); | 2947 if (result->IsFailure()) { |
2974 if (!success) { | |
2975 miss.Unuse(); | 2948 miss.Unuse(); |
2976 return failure; | 2949 return result; |
2977 } | 2950 } |
2978 | 2951 |
2979 __ bind(&miss); | 2952 __ bind(&miss); |
2980 | 2953 |
2981 __ DecrementCounter(&Counters::keyed_load_callback, 1); | 2954 __ DecrementCounter(&Counters::keyed_load_callback, 1); |
2982 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 2955 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
2983 | 2956 |
2984 // Return the generated code. | 2957 // Return the generated code. |
2985 return GetCode(CALLBACKS, name); | 2958 return GetCode(CALLBACKS, name); |
2986 } | 2959 } |
(...skipping 675 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3662 | 3635 |
3663 return GetCode(flags); | 3636 return GetCode(flags); |
3664 } | 3637 } |
3665 | 3638 |
3666 | 3639 |
3667 #undef __ | 3640 #undef __ |
3668 | 3641 |
3669 } } // namespace v8::internal | 3642 } } // namespace v8::internal |
3670 | 3643 |
3671 #endif // V8_TARGET_ARCH_IA32 | 3644 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |