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

Side by Side Diff: src/arm64/lithium-codegen-arm64.cc

Issue 346413004: Remove distinction between hidden and normal runtime functions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix natives fuzzing Created 6 years, 6 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/arm64/lithium-codegen-arm64.h" 7 #include "src/arm64/lithium-codegen-arm64.h"
8 #include "src/arm64/lithium-gap-resolver-arm64.h" 8 #include "src/arm64/lithium-gap-resolver-arm64.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/hydrogen-osr.h" 10 #include "src/hydrogen-osr.h"
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 Comment(";;; Allocate local context"); 696 Comment(";;; Allocate local context");
697 bool need_write_barrier = true; 697 bool need_write_barrier = true;
698 // Argument to NewContext is the function, which is in x1. 698 // Argument to NewContext is the function, which is in x1.
699 if (heap_slots <= FastNewContextStub::kMaximumSlots) { 699 if (heap_slots <= FastNewContextStub::kMaximumSlots) {
700 FastNewContextStub stub(isolate(), heap_slots); 700 FastNewContextStub stub(isolate(), heap_slots);
701 __ CallStub(&stub); 701 __ CallStub(&stub);
702 // Result of FastNewContextStub is always in new space. 702 // Result of FastNewContextStub is always in new space.
703 need_write_barrier = false; 703 need_write_barrier = false;
704 } else { 704 } else {
705 __ Push(x1); 705 __ Push(x1);
706 __ CallRuntime(Runtime::kHiddenNewFunctionContext, 1); 706 __ CallRuntime(Runtime::kNewFunctionContext, 1);
707 } 707 }
708 RecordSafepoint(Safepoint::kNoLazyDeopt); 708 RecordSafepoint(Safepoint::kNoLazyDeopt);
709 // Context is returned in x0. It replaces the context passed to us. It's 709 // Context is returned in x0. It replaces the context passed to us. It's
710 // saved in the stack and kept live in cp. 710 // saved in the stack and kept live in cp.
711 __ Mov(cp, x0); 711 __ Mov(cp, x0);
712 __ Str(x0, MemOperand(fp, StandardFrameConstants::kContextOffset)); 712 __ Str(x0, MemOperand(fp, StandardFrameConstants::kContextOffset));
713 // Copy any necessary parameters into the context. 713 // Copy any necessary parameters into the context.
714 int num_parameters = scope()->num_parameters(); 714 int num_parameters = scope()->num_parameters();
715 for (int i = 0; i < num_parameters; i++) { 715 for (int i = 0; i < num_parameters; i++) {
716 Variable* var = scope()->parameter(i); 716 Variable* var = scope()->parameter(i);
(...skipping 931 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) { 1648 } else if (instr->hydrogen()->IsOldDataSpaceAllocation()) {
1649 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation()); 1649 ASSERT(!instr->hydrogen()->IsNewSpaceAllocation());
1650 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE); 1650 flags = AllocateTargetSpace::update(flags, OLD_DATA_SPACE);
1651 } else { 1651 } else {
1652 flags = AllocateTargetSpace::update(flags, NEW_SPACE); 1652 flags = AllocateTargetSpace::update(flags, NEW_SPACE);
1653 } 1653 }
1654 __ Mov(x10, Smi::FromInt(flags)); 1654 __ Mov(x10, Smi::FromInt(flags));
1655 __ Push(size, x10); 1655 __ Push(size, x10);
1656 1656
1657 CallRuntimeFromDeferred( 1657 CallRuntimeFromDeferred(
1658 Runtime::kHiddenAllocateInTargetSpace, 2, instr, instr->context()); 1658 Runtime::kAllocateInTargetSpace, 2, instr, instr->context());
1659 __ StoreToSafepointRegisterSlot(x0, ToRegister(instr->result())); 1659 __ StoreToSafepointRegisterSlot(x0, ToRegister(instr->result()));
1660 } 1660 }
1661 1661
1662 1662
1663 void LCodeGen::DoApplyArguments(LApplyArguments* instr) { 1663 void LCodeGen::DoApplyArguments(LApplyArguments* instr) {
1664 Register receiver = ToRegister(instr->receiver()); 1664 Register receiver = ToRegister(instr->receiver());
1665 Register function = ToRegister(instr->function()); 1665 Register function = ToRegister(instr->function());
1666 Register length = ToRegister32(instr->length()); 1666 Register length = ToRegister32(instr->length());
1667 1667
1668 Register elements = ToRegister(instr->elements()); 1668 Register elements = ToRegister(instr->elements());
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 FastNewClosureStub stub(isolate(), 2874 FastNewClosureStub stub(isolate(),
2875 instr->hydrogen()->strict_mode(), 2875 instr->hydrogen()->strict_mode(),
2876 instr->hydrogen()->is_generator()); 2876 instr->hydrogen()->is_generator());
2877 __ Mov(x2, Operand(instr->hydrogen()->shared_info())); 2877 __ Mov(x2, Operand(instr->hydrogen()->shared_info()));
2878 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); 2878 CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr);
2879 } else { 2879 } else {
2880 __ Mov(x2, Operand(instr->hydrogen()->shared_info())); 2880 __ Mov(x2, Operand(instr->hydrogen()->shared_info()));
2881 __ Mov(x1, Operand(pretenure ? factory()->true_value() 2881 __ Mov(x1, Operand(pretenure ? factory()->true_value()
2882 : factory()->false_value())); 2882 : factory()->false_value()));
2883 __ Push(cp, x2, x1); 2883 __ Push(cp, x2, x1);
2884 CallRuntime(Runtime::kHiddenNewClosure, 3, instr); 2884 CallRuntime(Runtime::kNewClosure, 3, instr);
2885 } 2885 }
2886 } 2886 }
2887 2887
2888 2888
2889 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { 2889 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) {
2890 Register map = ToRegister(instr->map()); 2890 Register map = ToRegister(instr->map());
2891 Register result = ToRegister(instr->result()); 2891 Register result = ToRegister(instr->result());
2892 Label load_cache, done; 2892 Label load_cache, done;
2893 2893
2894 __ EnumLengthUntagged(result, map); 2894 __ EnumLengthUntagged(result, map);
(...skipping 903 matching lines...) Expand 10 before | Expand all | Expand 10 after
3798 // be valid. 3798 // be valid.
3799 Label result_ok; 3799 Label result_ok;
3800 Register input = ToRegister(instr->value()); 3800 Register input = ToRegister(instr->value());
3801 __ JumpIfSmi(result, &result_ok); 3801 __ JumpIfSmi(result, &result_ok);
3802 __ Cmp(input, result); 3802 __ Cmp(input, result);
3803 __ Assert(eq, kUnexpectedValue); 3803 __ Assert(eq, kUnexpectedValue);
3804 __ Bind(&result_ok); 3804 __ Bind(&result_ok);
3805 } 3805 }
3806 3806
3807 { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 3807 { PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
3808 CallRuntimeFromDeferred(Runtime::kHiddenAllocateHeapNumber, 0, instr, 3808 CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr,
3809 instr->context()); 3809 instr->context());
3810 __ StoreToSafepointRegisterSlot(x0, result); 3810 __ StoreToSafepointRegisterSlot(x0, result);
3811 } 3811 }
3812 // The inline (non-deferred) code will store result_bits into result. 3812 // The inline (non-deferred) code will store result_bits into result.
3813 } 3813 }
3814 3814
3815 3815
3816 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) { 3816 void LCodeGen::DoMathAbsTagged(LMathAbsTagged* instr) {
3817 // Class for deferred case. 3817 // Class for deferred case.
3818 class DeferredMathAbsTagged: public LDeferredCode { 3818 class DeferredMathAbsTagged: public LDeferredCode {
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
4524 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) { 4524 void LCodeGen::DoDeferredNumberTagD(LNumberTagD* instr) {
4525 // TODO(3095996): Get rid of this. For now, we need to make the 4525 // TODO(3095996): Get rid of this. For now, we need to make the
4526 // result register contain a valid pointer because it is already 4526 // result register contain a valid pointer because it is already
4527 // contained in the register pointer map. 4527 // contained in the register pointer map.
4528 Register result = ToRegister(instr->result()); 4528 Register result = ToRegister(instr->result());
4529 __ Mov(result, 0); 4529 __ Mov(result, 0);
4530 4530
4531 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4531 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
4532 // NumberTagU and NumberTagD use the context from the frame, rather than 4532 // NumberTagU and NumberTagD use the context from the frame, rather than
4533 // the environment's HContext or HInlinedContext value. 4533 // the environment's HContext or HInlinedContext value.
4534 // They only call Runtime::kHiddenAllocateHeapNumber. 4534 // They only call Runtime::kAllocateHeapNumber.
4535 // The corresponding HChange instructions are added in a phase that does 4535 // The corresponding HChange instructions are added in a phase that does
4536 // not have easy access to the local context. 4536 // not have easy access to the local context.
4537 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4537 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4538 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber); 4538 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
4539 RecordSafepointWithRegisters( 4539 RecordSafepointWithRegisters(
4540 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4540 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4541 __ StoreToSafepointRegisterSlot(x0, result); 4541 __ StoreToSafepointRegisterSlot(x0, result);
4542 } 4542 }
4543 4543
4544 4544
4545 void LCodeGen::DoNumberTagD(LNumberTagD* instr) { 4545 void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
4546 class DeferredNumberTagD: public LDeferredCode { 4546 class DeferredNumberTagD: public LDeferredCode {
4547 public: 4547 public:
4548 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr) 4548 DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr)
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4590 // TODO(3095996): Put a valid pointer value in the stack slot where the result 4590 // TODO(3095996): Put a valid pointer value in the stack slot where the result
4591 // register is stored, as this register is in the pointer map, but contains an 4591 // register is stored, as this register is in the pointer map, but contains an
4592 // integer value. 4592 // integer value.
4593 __ Mov(dst, 0); 4593 __ Mov(dst, 0);
4594 { 4594 {
4595 // Preserve the value of all registers. 4595 // Preserve the value of all registers.
4596 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 4596 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
4597 4597
4598 // NumberTagU and NumberTagD use the context from the frame, rather than 4598 // NumberTagU and NumberTagD use the context from the frame, rather than
4599 // the environment's HContext or HInlinedContext value. 4599 // the environment's HContext or HInlinedContext value.
4600 // They only call Runtime::kHiddenAllocateHeapNumber. 4600 // They only call Runtime::kAllocateHeapNumber.
4601 // The corresponding HChange instructions are added in a phase that does 4601 // The corresponding HChange instructions are added in a phase that does
4602 // not have easy access to the local context. 4602 // not have easy access to the local context.
4603 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4603 __ Ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4604 __ CallRuntimeSaveDoubles(Runtime::kHiddenAllocateHeapNumber); 4604 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
4605 RecordSafepointWithRegisters( 4605 RecordSafepointWithRegisters(
4606 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 4606 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
4607 __ StoreToSafepointRegisterSlot(x0, dst); 4607 __ StoreToSafepointRegisterSlot(x0, dst);
4608 } 4608 }
4609 4609
4610 // Convert number to floating point and store in the newly allocated heap 4610 // Convert number to floating point and store in the newly allocated heap
4611 // number. 4611 // number.
4612 __ Bind(&convert_and_store); 4612 __ Bind(&convert_and_store);
4613 DoubleRegister dbl_scratch = double_scratch(); 4613 DoubleRegister dbl_scratch = double_scratch();
4614 __ Ucvtf(dbl_scratch, src); 4614 __ Ucvtf(dbl_scratch, src);
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
5024 Register scratch1 = x5; 5024 Register scratch1 = x5;
5025 Register scratch2 = x6; 5025 Register scratch2 = x6;
5026 ASSERT(instr->IsMarkedAsCall()); 5026 ASSERT(instr->IsMarkedAsCall());
5027 5027
5028 ASM_UNIMPLEMENTED_BREAK("DoDeclareGlobals"); 5028 ASM_UNIMPLEMENTED_BREAK("DoDeclareGlobals");
5029 // TODO(all): if Mov could handle object in new space then it could be used 5029 // TODO(all): if Mov could handle object in new space then it could be used
5030 // here. 5030 // here.
5031 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); 5031 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs());
5032 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); 5032 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags()));
5033 __ Push(cp, scratch1, scratch2); // The context is the first argument. 5033 __ Push(cp, scratch1, scratch2); // The context is the first argument.
5034 CallRuntime(Runtime::kHiddenDeclareGlobals, 3, instr); 5034 CallRuntime(Runtime::kDeclareGlobals, 3, instr);
5035 } 5035 }
5036 5036
5037 5037
5038 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { 5038 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
5039 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5039 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
5040 LoadContextFromDeferred(instr->context()); 5040 LoadContextFromDeferred(instr->context());
5041 __ CallRuntimeSaveDoubles(Runtime::kHiddenStackGuard); 5041 __ CallRuntimeSaveDoubles(Runtime::kStackGuard);
5042 RecordSafepointWithLazyDeopt( 5042 RecordSafepointWithLazyDeopt(
5043 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 5043 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
5044 ASSERT(instr->HasEnvironment()); 5044 ASSERT(instr->HasEnvironment());
5045 LEnvironment* env = instr->environment(); 5045 LEnvironment* env = instr->environment();
5046 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 5046 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
5047 } 5047 }
5048 5048
5049 5049
5050 void LCodeGen::DoStackCheck(LStackCheck* instr) { 5050 void LCodeGen::DoStackCheck(LStackCheck* instr) {
5051 class DeferredStackCheck: public LDeferredCode { 5051 class DeferredStackCheck: public LDeferredCode {
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
5491 // contained in the register pointer map. 5491 // contained in the register pointer map.
5492 __ Mov(result, 0); 5492 __ Mov(result, 0);
5493 5493
5494 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); 5494 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
5495 __ Push(string); 5495 __ Push(string);
5496 // Push the index as a smi. This is safe because of the checks in 5496 // Push the index as a smi. This is safe because of the checks in
5497 // DoStringCharCodeAt above. 5497 // DoStringCharCodeAt above.
5498 Register index = ToRegister(instr->index()); 5498 Register index = ToRegister(instr->index());
5499 __ SmiTagAndPush(index); 5499 __ SmiTagAndPush(index);
5500 5500
5501 CallRuntimeFromDeferred(Runtime::kHiddenStringCharCodeAt, 2, instr, 5501 CallRuntimeFromDeferred(Runtime::kStringCharCodeAtRT, 2, instr,
5502 instr->context()); 5502 instr->context());
5503 __ AssertSmi(x0); 5503 __ AssertSmi(x0);
5504 __ SmiUntag(x0); 5504 __ SmiUntag(x0);
5505 __ StoreToSafepointRegisterSlot(x0, result); 5505 __ StoreToSafepointRegisterSlot(x0, result);
5506 } 5506 }
5507 5507
5508 5508
5509 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) { 5509 void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
5510 class DeferredStringCharFromCode: public LDeferredCode { 5510 class DeferredStringCharFromCode: public LDeferredCode {
5511 public: 5511 public:
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
5715 __ LoadObject(x7, instr->hydrogen()->literals()); 5715 __ LoadObject(x7, instr->hydrogen()->literals());
5716 __ Ldr(x1, FieldMemOperand(x7, literal_offset)); 5716 __ Ldr(x1, FieldMemOperand(x7, literal_offset));
5717 __ JumpIfNotRoot(x1, Heap::kUndefinedValueRootIndex, &materialized); 5717 __ JumpIfNotRoot(x1, Heap::kUndefinedValueRootIndex, &materialized);
5718 5718
5719 // Create regexp literal using runtime function 5719 // Create regexp literal using runtime function
5720 // Result will be in x0. 5720 // Result will be in x0.
5721 __ Mov(x12, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); 5721 __ Mov(x12, Operand(Smi::FromInt(instr->hydrogen()->literal_index())));
5722 __ Mov(x11, Operand(instr->hydrogen()->pattern())); 5722 __ Mov(x11, Operand(instr->hydrogen()->pattern()));
5723 __ Mov(x10, Operand(instr->hydrogen()->flags())); 5723 __ Mov(x10, Operand(instr->hydrogen()->flags()));
5724 __ Push(x7, x12, x11, x10); 5724 __ Push(x7, x12, x11, x10);
5725 CallRuntime(Runtime::kHiddenMaterializeRegExpLiteral, 4, instr); 5725 CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr);
5726 __ Mov(x1, x0); 5726 __ Mov(x1, x0);
5727 5727
5728 __ Bind(&materialized); 5728 __ Bind(&materialized);
5729 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; 5729 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize;
5730 Label allocated, runtime_allocate; 5730 Label allocated, runtime_allocate;
5731 5731
5732 __ Allocate(size, x0, x10, x11, &runtime_allocate, TAG_OBJECT); 5732 __ Allocate(size, x0, x10, x11, &runtime_allocate, TAG_OBJECT);
5733 __ B(&allocated); 5733 __ B(&allocated);
5734 5734
5735 __ Bind(&runtime_allocate); 5735 __ Bind(&runtime_allocate);
5736 __ Mov(x0, Smi::FromInt(size)); 5736 __ Mov(x0, Smi::FromInt(size));
5737 __ Push(x1, x0); 5737 __ Push(x1, x0);
5738 CallRuntime(Runtime::kHiddenAllocateInNewSpace, 1, instr); 5738 CallRuntime(Runtime::kAllocateInNewSpace, 1, instr);
5739 __ Pop(x1); 5739 __ Pop(x1);
5740 5740
5741 __ Bind(&allocated); 5741 __ Bind(&allocated);
5742 // Copy the content into the newly allocated memory. 5742 // Copy the content into the newly allocated memory.
5743 __ CopyFields(x0, x1, CPURegList(x10, x11, x12), size / kPointerSize); 5743 __ CopyFields(x0, x1, CPURegList(x10, x11, x12), size / kPointerSize);
5744 } 5744 }
5745 5745
5746 5746
5747 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { 5747 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
5748 Register object = ToRegister(instr->object()); 5748 Register object = ToRegister(instr->object());
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
6045 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { 6045 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) {
6046 Register context = ToRegister(instr->context()); 6046 Register context = ToRegister(instr->context());
6047 __ Str(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); 6047 __ Str(context, MemOperand(fp, StandardFrameConstants::kContextOffset));
6048 } 6048 }
6049 6049
6050 6050
6051 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) { 6051 void LCodeGen::DoAllocateBlockContext(LAllocateBlockContext* instr) {
6052 Handle<ScopeInfo> scope_info = instr->scope_info(); 6052 Handle<ScopeInfo> scope_info = instr->scope_info();
6053 __ Push(scope_info); 6053 __ Push(scope_info);
6054 __ Push(ToRegister(instr->function())); 6054 __ Push(ToRegister(instr->function()));
6055 CallRuntime(Runtime::kHiddenPushBlockContext, 2, instr); 6055 CallRuntime(Runtime::kPushBlockContext, 2, instr);
6056 RecordSafepoint(Safepoint::kNoLazyDeopt); 6056 RecordSafepoint(Safepoint::kNoLazyDeopt);
6057 } 6057 }
6058 6058
6059 6059
6060 6060
6061 } } // namespace v8::internal 6061 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698