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

Side by Side Diff: src/ia32/code-stubs-ia32.cc

Issue 6992072: Implement set trap for proxies, and revamp class hierarchy in preparation (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Address review. Created 9 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
« no previous file with comments | « src/ia32/builtins-ia32.cc ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 // Get the map and type of the heap object. 271 // Get the map and type of the heap object.
272 __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset)); 272 __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset));
273 __ movzx_b(ecx, FieldOperand(edx, Map::kInstanceTypeOffset)); 273 __ movzx_b(ecx, FieldOperand(edx, Map::kInstanceTypeOffset));
274 274
275 // Undetectable => false. 275 // Undetectable => false.
276 __ test_b(FieldOperand(edx, Map::kBitFieldOffset), 276 __ test_b(FieldOperand(edx, Map::kBitFieldOffset),
277 1 << Map::kIsUndetectable); 277 1 << Map::kIsUndetectable);
278 __ j(not_zero, &false_result, Label::kNear); 278 __ j(not_zero, &false_result, Label::kNear);
279 279
280 // JavaScript object => true. 280 // JavaScript object => true.
281 __ CmpInstanceType(edx, FIRST_JS_OBJECT_TYPE); 281 __ CmpInstanceType(edx, FIRST_SPEC_OBJECT_TYPE);
282 __ j(above_equal, &true_result, Label::kNear); 282 __ j(above_equal, &true_result, Label::kNear);
283 283
284 // String value => false iff empty. 284 // String value => false iff empty.
285 __ CmpInstanceType(edx, FIRST_NONSTRING_TYPE); 285 __ CmpInstanceType(edx, FIRST_NONSTRING_TYPE);
286 __ j(above_equal, &not_string, Label::kNear); 286 __ j(above_equal, &not_string, Label::kNear);
287 STATIC_ASSERT(kSmiTag == 0); 287 STATIC_ASSERT(kSmiTag == 0);
288 __ cmp(FieldOperand(eax, String::kLengthOffset), Immediate(0)); 288 __ cmp(FieldOperand(eax, String::kLengthOffset), Immediate(0));
289 __ j(zero, &false_result, Label::kNear); 289 __ j(zero, &false_result, Label::kNear);
290 __ jmp(&true_result, Label::kNear); 290 __ jmp(&true_result, Label::kNear);
291 291
(...skipping 3357 matching lines...) Expand 10 before | Expand all | Expand 10 after
3649 if (never_nan_nan_ && (cc_ == equal)) { 3649 if (never_nan_nan_ && (cc_ == equal)) {
3650 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); 3650 __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
3651 __ ret(0); 3651 __ ret(0);
3652 } else { 3652 } else {
3653 Label heap_number; 3653 Label heap_number;
3654 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), 3654 __ cmp(FieldOperand(edx, HeapObject::kMapOffset),
3655 Immediate(masm->isolate()->factory()->heap_number_map())); 3655 Immediate(masm->isolate()->factory()->heap_number_map()));
3656 __ j(equal, &heap_number, Label::kNear); 3656 __ j(equal, &heap_number, Label::kNear);
3657 if (cc_ != equal) { 3657 if (cc_ != equal) {
3658 // Call runtime on identical JSObjects. Otherwise return equal. 3658 // Call runtime on identical JSObjects. Otherwise return equal.
3659 __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx); 3659 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx);
3660 __ j(above_equal, &not_identical); 3660 __ j(above_equal, &not_identical);
3661 } 3661 }
3662 __ Set(eax, Immediate(Smi::FromInt(EQUAL))); 3662 __ Set(eax, Immediate(Smi::FromInt(EQUAL)));
3663 __ ret(0); 3663 __ ret(0);
3664 3664
3665 __ bind(&heap_number); 3665 __ bind(&heap_number);
3666 // It is a heap number, so return non-equal if it's NaN and equal if 3666 // It is a heap number, so return non-equal if it's NaN and equal if
3667 // it's not NaN. 3667 // it's not NaN.
3668 // The representation of NaN values has all exponent bits (52..62) set, 3668 // The representation of NaN values has all exponent bits (52..62) set,
3669 // and not all mantissa bits (0..51) clear. 3669 // and not all mantissa bits (0..51) clear.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
3737 __ ret(0); 3737 __ ret(0);
3738 3738
3739 __ bind(&not_smis); 3739 __ bind(&not_smis);
3740 // If either operand is a JSObject or an oddball value, then they are not 3740 // If either operand is a JSObject or an oddball value, then they are not
3741 // equal since their pointers are different 3741 // equal since their pointers are different
3742 // There is no test for undetectability in strict equality. 3742 // There is no test for undetectability in strict equality.
3743 3743
3744 // Get the type of the first operand. 3744 // Get the type of the first operand.
3745 // If the first object is a JS object, we have done pointer comparison. 3745 // If the first object is a JS object, we have done pointer comparison.
3746 Label first_non_object; 3746 Label first_non_object;
3747 STATIC_ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); 3747 STATIC_ASSERT(LAST_TYPE == LAST_SPEC_OBJECT_TYPE);
3748 __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx); 3748 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx);
3749 __ j(below, &first_non_object, Label::kNear); 3749 __ j(below, &first_non_object, Label::kNear);
3750 3750
3751 // Return non-zero (eax is not zero) 3751 // Return non-zero (eax is not zero)
3752 Label return_not_equal; 3752 Label return_not_equal;
3753 STATIC_ASSERT(kHeapObjectTag != 0); 3753 STATIC_ASSERT(kHeapObjectTag != 0);
3754 __ bind(&return_not_equal); 3754 __ bind(&return_not_equal);
3755 __ ret(0); 3755 __ ret(0);
3756 3756
3757 __ bind(&first_non_object); 3757 __ bind(&first_non_object);
3758 // Check for oddballs: true, false, null, undefined. 3758 // Check for oddballs: true, false, null, undefined.
3759 __ CmpInstanceType(ecx, ODDBALL_TYPE); 3759 __ CmpInstanceType(ecx, ODDBALL_TYPE);
3760 __ j(equal, &return_not_equal); 3760 __ j(equal, &return_not_equal);
3761 3761
3762 __ CmpObjectType(edx, FIRST_JS_OBJECT_TYPE, ecx); 3762 __ CmpObjectType(edx, FIRST_SPEC_OBJECT_TYPE, ecx);
3763 __ j(above_equal, &return_not_equal); 3763 __ j(above_equal, &return_not_equal);
3764 3764
3765 // Check for oddballs: true, false, null, undefined. 3765 // Check for oddballs: true, false, null, undefined.
3766 __ CmpInstanceType(ecx, ODDBALL_TYPE); 3766 __ CmpInstanceType(ecx, ODDBALL_TYPE);
3767 __ j(equal, &return_not_equal); 3767 __ j(equal, &return_not_equal);
3768 3768
3769 // Fall through to the general case. 3769 // Fall through to the general case.
3770 __ bind(&slow); 3770 __ bind(&slow);
3771 } 3771 }
3772 3772
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
3876 Label not_both_objects; 3876 Label not_both_objects;
3877 Label return_unequal; 3877 Label return_unequal;
3878 // At most one is a smi, so we can test for smi by adding the two. 3878 // At most one is a smi, so we can test for smi by adding the two.
3879 // A smi plus a heap object has the low bit set, a heap object plus 3879 // A smi plus a heap object has the low bit set, a heap object plus
3880 // a heap object has the low bit clear. 3880 // a heap object has the low bit clear.
3881 STATIC_ASSERT(kSmiTag == 0); 3881 STATIC_ASSERT(kSmiTag == 0);
3882 STATIC_ASSERT(kSmiTagMask == 1); 3882 STATIC_ASSERT(kSmiTagMask == 1);
3883 __ lea(ecx, Operand(eax, edx, times_1, 0)); 3883 __ lea(ecx, Operand(eax, edx, times_1, 0));
3884 __ test(ecx, Immediate(kSmiTagMask)); 3884 __ test(ecx, Immediate(kSmiTagMask));
3885 __ j(not_zero, &not_both_objects, Label::kNear); 3885 __ j(not_zero, &not_both_objects, Label::kNear);
3886 __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, ecx); 3886 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx);
3887 __ j(below, &not_both_objects, Label::kNear); 3887 __ j(below, &not_both_objects, Label::kNear);
3888 __ CmpObjectType(edx, FIRST_JS_OBJECT_TYPE, ebx); 3888 __ CmpObjectType(edx, FIRST_SPEC_OBJECT_TYPE, ebx);
3889 __ j(below, &not_both_objects, Label::kNear); 3889 __ j(below, &not_both_objects, Label::kNear);
3890 // We do not bail out after this point. Both are JSObjects, and 3890 // We do not bail out after this point. Both are JSObjects, and
3891 // they are equal if and only if both are undetectable. 3891 // they are equal if and only if both are undetectable.
3892 // The and of the undetectable flags is 1 if and only if they are equal. 3892 // The and of the undetectable flags is 1 if and only if they are equal.
3893 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), 3893 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset),
3894 1 << Map::kIsUndetectable); 3894 1 << Map::kIsUndetectable);
3895 __ j(zero, &return_unequal, Label::kNear); 3895 __ j(zero, &return_unequal, Label::kNear);
3896 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), 3896 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset),
3897 1 << Map::kIsUndetectable); 3897 1 << Map::kIsUndetectable);
3898 __ j(zero, &return_unequal, Label::kNear); 3898 __ j(zero, &return_unequal, Label::kNear);
(...skipping 2304 matching lines...) Expand 10 before | Expand all | Expand 10 after
6203 __ Drop(1); 6203 __ Drop(1);
6204 __ ret(2 * kPointerSize); 6204 __ ret(2 * kPointerSize);
6205 } 6205 }
6206 6206
6207 6207
6208 #undef __ 6208 #undef __
6209 6209
6210 } } // namespace v8::internal 6210 } } // namespace v8::internal
6211 6211
6212 #endif // V8_TARGET_ARCH_IA32 6212 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/builtins-ia32.cc ('k') | src/ia32/full-codegen-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698