OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 // -- rsp[kFastApiCallArguments * 8 + 8] : last argument in the internal | 430 // -- rsp[kFastApiCallArguments * 8 + 8] : last argument in the internal |
431 // frame. | 431 // frame. |
432 // ----------------------------------- | 432 // ----------------------------------- |
433 __ movq(scratch, Operand(rsp, 0)); | 433 __ movq(scratch, Operand(rsp, 0)); |
434 __ movq(Operand(rsp, kFastApiCallArguments * kPointerSize), scratch); | 434 __ movq(Operand(rsp, kFastApiCallArguments * kPointerSize), scratch); |
435 __ addq(rsp, Immediate(kPointerSize * kFastApiCallArguments)); | 435 __ addq(rsp, Immediate(kPointerSize * kFastApiCallArguments)); |
436 } | 436 } |
437 | 437 |
438 | 438 |
439 // Generates call to API function. | 439 // Generates call to API function. |
440 static bool GenerateFastApiCall(MacroAssembler* masm, | 440 static MaybeObject* GenerateFastApiCall(MacroAssembler* masm, |
441 const CallOptimization& optimization, | 441 const CallOptimization& optimization, |
442 int argc, | 442 int argc) { |
443 Failure** failure) { | |
444 // ----------- S t a t e ------------- | 443 // ----------- S t a t e ------------- |
445 // -- rsp[0] : return address | 444 // -- rsp[0] : return address |
446 // -- rsp[8] : object passing the type check | 445 // -- rsp[8] : object passing the type check |
447 // (last fast api call extra argument, | 446 // (last fast api call extra argument, |
448 // set by CheckPrototypes) | 447 // set by CheckPrototypes) |
449 // -- rsp[16] : api function | 448 // -- rsp[16] : api function |
450 // (first fast api call extra argument) | 449 // (first fast api call extra argument) |
451 // -- rsp[24] : api call data | 450 // -- rsp[24] : api call data |
452 // -- rsp[32] : last argument | 451 // -- rsp[32] : last argument |
453 // -- ... | 452 // -- ... |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
497 __ Set(StackSpaceOperand(2), argc); // v8::Arguments::length_. | 496 __ Set(StackSpaceOperand(2), argc); // v8::Arguments::length_. |
498 // v8::Arguments::is_construct_call_. | 497 // v8::Arguments::is_construct_call_. |
499 __ Set(StackSpaceOperand(3), 0); | 498 __ Set(StackSpaceOperand(3), 0); |
500 | 499 |
501 // v8::InvocationCallback's argument. | 500 // v8::InvocationCallback's argument. |
502 __ lea(arguments_arg, StackSpaceOperand(0)); | 501 __ lea(arguments_arg, StackSpaceOperand(0)); |
503 // Emitting a stub call may try to allocate (if the code is not | 502 // Emitting a stub call may try to allocate (if the code is not |
504 // already generated). Do not allow the assembler to perform a | 503 // already generated). Do not allow the assembler to perform a |
505 // garbage collection but instead return the allocation failure | 504 // garbage collection but instead return the allocation failure |
506 // object. | 505 // object. |
507 MaybeObject* result = | 506 return masm->TryCallApiFunctionAndReturn(&fun, |
508 masm->TryCallApiFunctionAndReturn(&fun, argc + kFastApiCallArguments + 1); | 507 argc + kFastApiCallArguments + 1); |
509 if (result->IsFailure()) { | |
510 *failure = Failure::cast(result); | |
511 return false; | |
512 } | |
513 return true; | |
514 } | 508 } |
515 | 509 |
516 | 510 |
517 class CallInterceptorCompiler BASE_EMBEDDED { | 511 class CallInterceptorCompiler BASE_EMBEDDED { |
518 public: | 512 public: |
519 CallInterceptorCompiler(StubCompiler* stub_compiler, | 513 CallInterceptorCompiler(StubCompiler* stub_compiler, |
520 const ParameterCount& arguments, | 514 const ParameterCount& arguments, |
521 Register name) | 515 Register name) |
522 : stub_compiler_(stub_compiler), | 516 : stub_compiler_(stub_compiler), |
523 arguments_(arguments), | 517 arguments_(arguments), |
524 name_(name) {} | 518 name_(name) {} |
525 | 519 |
526 bool Compile(MacroAssembler* masm, | 520 MaybeObject* Compile(MacroAssembler* masm, |
527 JSObject* object, | 521 JSObject* object, |
528 JSObject* holder, | 522 JSObject* holder, |
529 String* name, | 523 String* name, |
530 LookupResult* lookup, | 524 LookupResult* lookup, |
531 Register receiver, | 525 Register receiver, |
532 Register scratch1, | 526 Register scratch1, |
533 Register scratch2, | 527 Register scratch2, |
534 Register scratch3, | 528 Register scratch3, |
535 Label* miss, | 529 Label* miss) { |
536 Failure** failure) { | |
537 ASSERT(holder->HasNamedInterceptor()); | 530 ASSERT(holder->HasNamedInterceptor()); |
538 ASSERT(!holder->GetNamedInterceptor()->getter()->IsUndefined()); | 531 ASSERT(!holder->GetNamedInterceptor()->getter()->IsUndefined()); |
539 | 532 |
540 // Check that the receiver isn't a smi. | 533 // Check that the receiver isn't a smi. |
541 __ JumpIfSmi(receiver, miss); | 534 __ JumpIfSmi(receiver, miss); |
542 | 535 |
543 CallOptimization optimization(lookup); | 536 CallOptimization optimization(lookup); |
544 | 537 |
545 if (optimization.is_constant_call()) { | 538 if (optimization.is_constant_call()) { |
546 return CompileCacheable(masm, | 539 return CompileCacheable(masm, |
547 object, | 540 object, |
548 receiver, | 541 receiver, |
549 scratch1, | 542 scratch1, |
550 scratch2, | 543 scratch2, |
551 scratch3, | 544 scratch3, |
552 holder, | 545 holder, |
553 lookup, | 546 lookup, |
554 name, | 547 name, |
555 optimization, | 548 optimization, |
556 miss, | 549 miss); |
557 failure); | |
558 } else { | 550 } else { |
559 CompileRegular(masm, | 551 CompileRegular(masm, |
560 object, | 552 object, |
561 receiver, | 553 receiver, |
562 scratch1, | 554 scratch1, |
563 scratch2, | 555 scratch2, |
564 scratch3, | 556 scratch3, |
565 name, | 557 name, |
566 holder, | 558 holder, |
567 miss); | 559 miss); |
568 return true; | 560 return Heap::undefined_value(); // Success. |
569 } | 561 } |
570 } | 562 } |
571 | 563 |
572 private: | 564 private: |
573 bool CompileCacheable(MacroAssembler* masm, | 565 MaybeObject* CompileCacheable(MacroAssembler* masm, |
574 JSObject* object, | 566 JSObject* object, |
575 Register receiver, | 567 Register receiver, |
576 Register scratch1, | 568 Register scratch1, |
577 Register scratch2, | 569 Register scratch2, |
578 Register scratch3, | 570 Register scratch3, |
579 JSObject* interceptor_holder, | 571 JSObject* interceptor_holder, |
580 LookupResult* lookup, | 572 LookupResult* lookup, |
581 String* name, | 573 String* name, |
582 const CallOptimization& optimization, | 574 const CallOptimization& optimization, |
583 Label* miss_label, | 575 Label* miss_label) { |
584 Failure** failure) { | |
585 ASSERT(optimization.is_constant_call()); | 576 ASSERT(optimization.is_constant_call()); |
586 ASSERT(!lookup->holder()->IsGlobalObject()); | 577 ASSERT(!lookup->holder()->IsGlobalObject()); |
587 | 578 |
588 int depth1 = kInvalidProtoDepth; | 579 int depth1 = kInvalidProtoDepth; |
589 int depth2 = kInvalidProtoDepth; | 580 int depth2 = kInvalidProtoDepth; |
590 bool can_do_fast_api_call = false; | 581 bool can_do_fast_api_call = false; |
591 if (optimization.is_simple_api_call() && | 582 if (optimization.is_simple_api_call() && |
592 !lookup->holder()->IsGlobalObject()) { | 583 !lookup->holder()->IsGlobalObject()) { |
593 depth1 = | 584 depth1 = |
594 optimization.GetPrototypeDepthOfExpectedType(object, | 585 optimization.GetPrototypeDepthOfExpectedType(object, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 } else { | 627 } else { |
637 // CheckPrototypes has a side effect of fetching a 'holder' | 628 // CheckPrototypes has a side effect of fetching a 'holder' |
638 // for API (object which is instanceof for the signature). It's | 629 // for API (object which is instanceof for the signature). It's |
639 // safe to omit it here, as if present, it should be fetched | 630 // safe to omit it here, as if present, it should be fetched |
640 // by the previous CheckPrototypes. | 631 // by the previous CheckPrototypes. |
641 ASSERT(depth2 == kInvalidProtoDepth); | 632 ASSERT(depth2 == kInvalidProtoDepth); |
642 } | 633 } |
643 | 634 |
644 // Invoke function. | 635 // Invoke function. |
645 if (can_do_fast_api_call) { | 636 if (can_do_fast_api_call) { |
646 bool success = GenerateFastApiCall(masm, | 637 MaybeObject* result = GenerateFastApiCall(masm, |
647 optimization, | 638 optimization, |
648 arguments_.immediate(), | 639 arguments_.immediate()); |
649 failure); | 640 if (result->IsFailure()) return result; |
650 if (!success) { | |
651 return false; | |
652 } | |
653 } else { | 641 } else { |
654 __ InvokeFunction(optimization.constant_function(), arguments_, | 642 __ InvokeFunction(optimization.constant_function(), arguments_, |
655 JUMP_FUNCTION); | 643 JUMP_FUNCTION); |
656 } | 644 } |
657 | 645 |
658 // Deferred code for fast API call case---clean preallocated space. | 646 // Deferred code for fast API call case---clean preallocated space. |
659 if (can_do_fast_api_call) { | 647 if (can_do_fast_api_call) { |
660 __ bind(&miss_cleanup); | 648 __ bind(&miss_cleanup); |
661 FreeSpaceForFastApiCall(masm, scratch1); | 649 FreeSpaceForFastApiCall(masm, scratch1); |
662 __ jmp(miss_label); | 650 __ jmp(miss_label); |
663 } | 651 } |
664 | 652 |
665 // Invoke a regular function. | 653 // Invoke a regular function. |
666 __ bind(®ular_invoke); | 654 __ bind(®ular_invoke); |
667 if (can_do_fast_api_call) { | 655 if (can_do_fast_api_call) { |
668 FreeSpaceForFastApiCall(masm, scratch1); | 656 FreeSpaceForFastApiCall(masm, scratch1); |
669 } | 657 } |
670 | 658 |
671 return true; | 659 return Heap::undefined_value(); // Success. |
672 } | 660 } |
673 | 661 |
674 void CompileRegular(MacroAssembler* masm, | 662 void CompileRegular(MacroAssembler* masm, |
675 JSObject* object, | 663 JSObject* object, |
676 Register receiver, | 664 Register receiver, |
677 Register scratch1, | 665 Register scratch1, |
678 Register scratch2, | 666 Register scratch2, |
679 Register scratch3, | 667 Register scratch3, |
680 String* name, | 668 String* name, |
681 JSObject* interceptor_holder, | 669 JSObject* interceptor_holder, |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 Register reg = | 1002 Register reg = |
1015 CheckPrototypes(object, receiver, holder, | 1003 CheckPrototypes(object, receiver, holder, |
1016 scratch1, scratch2, scratch3, name, miss); | 1004 scratch1, scratch2, scratch3, name, miss); |
1017 | 1005 |
1018 // Get the value from the properties. | 1006 // Get the value from the properties. |
1019 GenerateFastPropertyLoad(masm(), rax, reg, holder, index); | 1007 GenerateFastPropertyLoad(masm(), rax, reg, holder, index); |
1020 __ ret(0); | 1008 __ ret(0); |
1021 } | 1009 } |
1022 | 1010 |
1023 | 1011 |
1024 bool StubCompiler::GenerateLoadCallback(JSObject* object, | 1012 MaybeObject* StubCompiler::GenerateLoadCallback(JSObject* object, |
1025 JSObject* holder, | 1013 JSObject* holder, |
1026 Register receiver, | 1014 Register receiver, |
1027 Register name_reg, | 1015 Register name_reg, |
1028 Register scratch1, | 1016 Register scratch1, |
1029 Register scratch2, | 1017 Register scratch2, |
1030 Register scratch3, | 1018 Register scratch3, |
1031 AccessorInfo* callback, | 1019 AccessorInfo* callback, |
1032 String* name, | 1020 String* name, |
1033 Label* miss, | 1021 Label* miss) { |
1034 Failure** failure) { | |
1035 // Check that the receiver isn't a smi. | 1022 // Check that the receiver isn't a smi. |
1036 __ JumpIfSmi(receiver, miss); | 1023 __ JumpIfSmi(receiver, miss); |
1037 | 1024 |
1038 // Check that the maps haven't changed. | 1025 // Check that the maps haven't changed. |
1039 Register reg = | 1026 Register reg = |
1040 CheckPrototypes(object, receiver, holder, scratch1, | 1027 CheckPrototypes(object, receiver, holder, scratch1, |
1041 scratch2, scratch3, name, miss); | 1028 scratch2, scratch3, name, miss); |
1042 | 1029 |
1043 Handle<AccessorInfo> callback_handle(callback); | 1030 Handle<AccessorInfo> callback_handle(callback); |
1044 | 1031 |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1088 __ movq(StackSpaceOperand(0), rax); | 1075 __ movq(StackSpaceOperand(0), rax); |
1089 | 1076 |
1090 // The context register (rsi) has been saved in PrepareCallApiFunction and | 1077 // The context register (rsi) has been saved in PrepareCallApiFunction and |
1091 // could be used to pass arguments. | 1078 // could be used to pass arguments. |
1092 __ lea(accessor_info_arg, StackSpaceOperand(0)); | 1079 __ lea(accessor_info_arg, StackSpaceOperand(0)); |
1093 | 1080 |
1094 // Emitting a stub call may try to allocate (if the code is not | 1081 // Emitting a stub call may try to allocate (if the code is not |
1095 // already generated). Do not allow the assembler to perform a | 1082 // already generated). Do not allow the assembler to perform a |
1096 // garbage collection but instead return the allocation failure | 1083 // garbage collection but instead return the allocation failure |
1097 // object. | 1084 // object. |
1098 MaybeObject* result = masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); | 1085 return masm()->TryCallApiFunctionAndReturn(&fun, kStackSpace); |
1099 if (result->IsFailure()) { | |
1100 *failure = Failure::cast(result); | |
1101 return false; | |
1102 } | |
1103 return true; | |
1104 } | 1086 } |
1105 | 1087 |
1106 | 1088 |
1107 void StubCompiler::GenerateLoadConstant(JSObject* object, | 1089 void StubCompiler::GenerateLoadConstant(JSObject* object, |
1108 JSObject* holder, | 1090 JSObject* holder, |
1109 Register receiver, | 1091 Register receiver, |
1110 Register scratch1, | 1092 Register scratch1, |
1111 Register scratch2, | 1093 Register scratch2, |
1112 Register scratch3, | 1094 Register scratch3, |
1113 Object* value, | 1095 Object* value, |
(...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2128 rbx, rdx, rdi, name, &miss); | 2110 rbx, rdx, rdi, name, &miss); |
2129 } | 2111 } |
2130 break; | 2112 break; |
2131 } | 2113 } |
2132 | 2114 |
2133 default: | 2115 default: |
2134 UNREACHABLE(); | 2116 UNREACHABLE(); |
2135 } | 2117 } |
2136 | 2118 |
2137 if (depth != kInvalidProtoDepth) { | 2119 if (depth != kInvalidProtoDepth) { |
2138 Failure* failure; | |
2139 // Move the return address on top of the stack. | 2120 // Move the return address on top of the stack. |
2140 __ movq(rax, Operand(rsp, 3 * kPointerSize)); | 2121 __ movq(rax, Operand(rsp, 3 * kPointerSize)); |
2141 __ movq(Operand(rsp, 0 * kPointerSize), rax); | 2122 __ movq(Operand(rsp, 0 * kPointerSize), rax); |
2142 | 2123 |
2143 // rsp[2 * kPointerSize] is uninitialized, rsp[3 * kPointerSize] contains | 2124 // rsp[2 * kPointerSize] is uninitialized, rsp[3 * kPointerSize] contains |
2144 // duplicate of return address and will be overwritten. | 2125 // duplicate of return address and will be overwritten. |
2145 bool success = GenerateFastApiCall(masm(), optimization, argc, &failure); | 2126 MaybeObject* result = GenerateFastApiCall(masm(), optimization, argc); |
2146 if (!success) { | 2127 if (result->IsFailure()) return result; |
2147 return failure; | |
2148 } | |
2149 } else { | 2128 } else { |
2150 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); | 2129 __ InvokeFunction(function, arguments(), JUMP_FUNCTION); |
2151 } | 2130 } |
2152 | 2131 |
2153 // Handle call cache miss. | 2132 // Handle call cache miss. |
2154 __ bind(&miss); | 2133 __ bind(&miss); |
2155 if (depth != kInvalidProtoDepth) { | 2134 if (depth != kInvalidProtoDepth) { |
2156 __ addq(rsp, Immediate(kFastApiCallArguments * kPointerSize)); | 2135 __ addq(rsp, Immediate(kFastApiCallArguments * kPointerSize)); |
2157 } | 2136 } |
2158 | 2137 |
(...skipping 28 matching lines...) Expand all Loading... |
2187 // Get the number of arguments. | 2166 // Get the number of arguments. |
2188 const int argc = arguments().immediate(); | 2167 const int argc = arguments().immediate(); |
2189 | 2168 |
2190 LookupResult lookup; | 2169 LookupResult lookup; |
2191 LookupPostInterceptor(holder, name, &lookup); | 2170 LookupPostInterceptor(holder, name, &lookup); |
2192 | 2171 |
2193 // Get the receiver from the stack. | 2172 // Get the receiver from the stack. |
2194 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 2173 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
2195 | 2174 |
2196 CallInterceptorCompiler compiler(this, arguments(), rcx); | 2175 CallInterceptorCompiler compiler(this, arguments(), rcx); |
2197 Failure* failure; | 2176 MaybeObject* result = compiler.Compile(masm(), |
2198 bool success = compiler.Compile(masm(), | 2177 object, |
2199 object, | 2178 holder, |
2200 holder, | 2179 name, |
2201 name, | 2180 &lookup, |
2202 &lookup, | 2181 rdx, |
2203 rdx, | 2182 rbx, |
2204 rbx, | 2183 rdi, |
2205 rdi, | 2184 rax, |
2206 rax, | 2185 &miss); |
2207 &miss, | 2186 if (result->IsFailure()) return result; |
2208 &failure); | |
2209 if (!success) { | |
2210 return failure; | |
2211 } | |
2212 | 2187 |
2213 // Restore receiver. | 2188 // Restore receiver. |
2214 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); | 2189 __ movq(rdx, Operand(rsp, (argc + 1) * kPointerSize)); |
2215 | 2190 |
2216 // Check that the function really is a function. | 2191 // Check that the function really is a function. |
2217 __ JumpIfSmi(rax, &miss); | 2192 __ JumpIfSmi(rax, &miss); |
2218 __ CmpObjectType(rax, JS_FUNCTION_TYPE, rbx); | 2193 __ CmpObjectType(rax, JS_FUNCTION_TYPE, rbx); |
2219 __ j(not_equal, &miss); | 2194 __ j(not_equal, &miss); |
2220 | 2195 |
2221 // Patch the receiver on the stack with the global proxy if | 2196 // Patch the receiver on the stack with the global proxy if |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2641 JSObject* object, | 2616 JSObject* object, |
2642 JSObject* holder, | 2617 JSObject* holder, |
2643 AccessorInfo* callback) { | 2618 AccessorInfo* callback) { |
2644 // ----------- S t a t e ------------- | 2619 // ----------- S t a t e ------------- |
2645 // -- rax : receiver | 2620 // -- rax : receiver |
2646 // -- rcx : name | 2621 // -- rcx : name |
2647 // -- rsp[0] : return address | 2622 // -- rsp[0] : return address |
2648 // ----------------------------------- | 2623 // ----------------------------------- |
2649 Label miss; | 2624 Label miss; |
2650 | 2625 |
2651 Failure* failure = Failure::InternalError(); | 2626 MaybeObject* result = GenerateLoadCallback(object, holder, rax, rcx, rdx, rbx, |
2652 bool success = GenerateLoadCallback(object, holder, rax, rcx, rdx, rbx, rdi, | 2627 rdi, callback, name, &miss); |
2653 callback, name, &miss, &failure); | 2628 if (result->IsFailure()) { |
2654 if (!success) { | |
2655 miss.Unuse(); | 2629 miss.Unuse(); |
2656 return failure; | 2630 return result; |
2657 } | 2631 } |
2658 | 2632 |
2659 __ bind(&miss); | 2633 __ bind(&miss); |
2660 GenerateLoadMiss(masm(), Code::LOAD_IC); | 2634 GenerateLoadMiss(masm(), Code::LOAD_IC); |
2661 | 2635 |
2662 // Return the generated code. | 2636 // Return the generated code. |
2663 return GetCode(CALLBACKS, name); | 2637 return GetCode(CALLBACKS, name); |
2664 } | 2638 } |
2665 | 2639 |
2666 | 2640 |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2805 // -- rsp[0] : return address | 2779 // -- rsp[0] : return address |
2806 // ----------------------------------- | 2780 // ----------------------------------- |
2807 Label miss; | 2781 Label miss; |
2808 | 2782 |
2809 __ IncrementCounter(&Counters::keyed_load_callback, 1); | 2783 __ IncrementCounter(&Counters::keyed_load_callback, 1); |
2810 | 2784 |
2811 // Check that the name has not changed. | 2785 // Check that the name has not changed. |
2812 __ Cmp(rax, Handle<String>(name)); | 2786 __ Cmp(rax, Handle<String>(name)); |
2813 __ j(not_equal, &miss); | 2787 __ j(not_equal, &miss); |
2814 | 2788 |
2815 Failure* failure = Failure::InternalError(); | 2789 MaybeObject* result = GenerateLoadCallback(receiver, holder, rdx, rax, rbx, |
2816 bool success = GenerateLoadCallback(receiver, holder, rdx, rax, rbx, rcx, rdi, | 2790 rcx, rdi, callback, name, &miss); |
2817 callback, name, &miss, &failure); | 2791 if (result->IsFailure()) { |
2818 if (!success) { | |
2819 miss.Unuse(); | 2792 miss.Unuse(); |
2820 return failure; | 2793 return result; |
2821 } | 2794 } |
2822 | 2795 |
2823 __ bind(&miss); | 2796 __ bind(&miss); |
2824 | 2797 |
2825 __ DecrementCounter(&Counters::keyed_load_callback, 1); | 2798 __ DecrementCounter(&Counters::keyed_load_callback, 1); |
2826 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 2799 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
2827 | 2800 |
2828 // Return the generated code. | 2801 // Return the generated code. |
2829 return GetCode(CALLBACKS, name); | 2802 return GetCode(CALLBACKS, name); |
2830 } | 2803 } |
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3442 __ TailCallRuntime(Runtime::kSetProperty, 3, 1); | 3415 __ TailCallRuntime(Runtime::kSetProperty, 3, 1); |
3443 | 3416 |
3444 return GetCode(flags); | 3417 return GetCode(flags); |
3445 } | 3418 } |
3446 | 3419 |
3447 #undef __ | 3420 #undef __ |
3448 | 3421 |
3449 } } // namespace v8::internal | 3422 } } // namespace v8::internal |
3450 | 3423 |
3451 #endif // V8_TARGET_ARCH_X64 | 3424 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |