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

Side by Side Diff: include/v8.h

Issue 6242005: Using unsigned shifts and masks when dealing with 64-bit addresses. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressing Slava's comments Created 9 years, 11 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 | « no previous file | src/api.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 2007-2009 the V8 project authors. All rights reserved. 1 // Copyright 2007-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 3349 matching lines...) Expand 10 before | Expand all | Expand 10 after
3360 static const int kSmiShiftSize = 0; 3360 static const int kSmiShiftSize = 0;
3361 static const int kSmiValueSize = 31; 3361 static const int kSmiValueSize = 31;
3362 static inline int SmiToInt(internal::Object* value) { 3362 static inline int SmiToInt(internal::Object* value) {
3363 int shift_bits = kSmiTagSize + kSmiShiftSize; 3363 int shift_bits = kSmiTagSize + kSmiShiftSize;
3364 // Throw away top 32 bits and shift down (requires >> to be sign extending). 3364 // Throw away top 32 bits and shift down (requires >> to be sign extending).
3365 return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits; 3365 return static_cast<int>(reinterpret_cast<intptr_t>(value)) >> shift_bits;
3366 } 3366 }
3367 3367
3368 // For 32-bit systems any 2 bytes aligned pointer can be encoded as smi 3368 // For 32-bit systems any 2 bytes aligned pointer can be encoded as smi
3369 // with a plain reinterpret_cast. 3369 // with a plain reinterpret_cast.
3370 static const intptr_t kEncodablePointerMask = 0x1; 3370 static const uintptr_t kEncodablePointerMask = 0x1;
3371 static const int kPointerToSmiShift = 0; 3371 static const int kPointerToSmiShift = 0;
3372 }; 3372 };
3373 3373
3374 // Smi constants for 64-bit systems. 3374 // Smi constants for 64-bit systems.
3375 template <> struct SmiTagging<8> { 3375 template <> struct SmiTagging<8> {
3376 static const int kSmiShiftSize = 31; 3376 static const int kSmiShiftSize = 31;
3377 static const int kSmiValueSize = 32; 3377 static const int kSmiValueSize = 32;
3378 static inline int SmiToInt(internal::Object* value) { 3378 static inline int SmiToInt(internal::Object* value) {
3379 int shift_bits = kSmiTagSize + kSmiShiftSize; 3379 int shift_bits = kSmiTagSize + kSmiShiftSize;
3380 // Shift down and throw away top 32 bits. 3380 // Shift down and throw away top 32 bits.
3381 return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits); 3381 return static_cast<int>(reinterpret_cast<intptr_t>(value) >> shift_bits);
3382 } 3382 }
3383 3383
3384 // To maximize the range of pointers that can be encoded 3384 // To maximize the range of pointers that can be encoded
3385 // in the available 32 bits, we require them to be 8 bytes aligned. 3385 // in the available 32 bits, we require them to be 8 bytes aligned.
3386 // This gives 2 ^ (32 + 3) = 32G address space covered. 3386 // This gives 2 ^ (32 + 3) = 32G address space covered.
3387 // It might be not enough to cover stack allocated objects on some platforms. 3387 // It might be not enough to cover stack allocated objects on some platforms.
3388 static const int kPointerAlignment = 3; 3388 static const int kPointerAlignment = 3;
3389 3389
3390 static const intptr_t kEncodablePointerMask = 3390 static const uintptr_t kEncodablePointerMask =
3391 ~(intptr_t(0xffffffff) << kPointerAlignment); 3391 ~(uintptr_t(0xffffffff) << kPointerAlignment);
3392 3392
3393 static const int kPointerToSmiShift = 3393 static const int kPointerToSmiShift =
3394 kSmiTagSize + kSmiShiftSize - kPointerAlignment; 3394 kSmiTagSize + kSmiShiftSize - kPointerAlignment;
3395 }; 3395 };
3396 3396
3397 typedef SmiTagging<kApiPointerSize> PlatformSmiTagging; 3397 typedef SmiTagging<kApiPointerSize> PlatformSmiTagging;
3398 const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize; 3398 const int kSmiShiftSize = PlatformSmiTagging::kSmiShiftSize;
3399 const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize; 3399 const int kSmiValueSize = PlatformSmiTagging::kSmiValueSize;
3400 const intptr_t kEncodablePointerMask = 3400 const uintptr_t kEncodablePointerMask =
3401 PlatformSmiTagging::kEncodablePointerMask; 3401 PlatformSmiTagging::kEncodablePointerMask;
3402 const int kPointerToSmiShift = PlatformSmiTagging::kPointerToSmiShift; 3402 const int kPointerToSmiShift = PlatformSmiTagging::kPointerToSmiShift;
3403 3403
3404 template <size_t ptr_size> struct InternalConstants; 3404 template <size_t ptr_size> struct InternalConstants;
3405 3405
3406 // Internal constants for 32-bit systems. 3406 // Internal constants for 32-bit systems.
3407 template <> struct InternalConstants<4> { 3407 template <> struct InternalConstants<4> {
3408 static const int kStringResourceOffset = 3 * kApiPointerSize; 3408 static const int kStringResourceOffset = 3 * kApiPointerSize;
3409 }; 3409 };
3410 3410
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
3450 return PlatformSmiTagging::SmiToInt(value); 3450 return PlatformSmiTagging::SmiToInt(value);
3451 } 3451 }
3452 3452
3453 static inline int GetInstanceType(internal::Object* obj) { 3453 static inline int GetInstanceType(internal::Object* obj) {
3454 typedef internal::Object O; 3454 typedef internal::Object O;
3455 O* map = ReadField<O*>(obj, kHeapObjectMapOffset); 3455 O* map = ReadField<O*>(obj, kHeapObjectMapOffset);
3456 return ReadField<uint8_t>(map, kMapInstanceTypeOffset); 3456 return ReadField<uint8_t>(map, kMapInstanceTypeOffset);
3457 } 3457 }
3458 3458
3459 static inline void* GetExternalPointerFromSmi(internal::Object* value) { 3459 static inline void* GetExternalPointerFromSmi(internal::Object* value) {
3460 const intptr_t address = reinterpret_cast<intptr_t>(value); 3460 const uintptr_t address = reinterpret_cast<uintptr_t>(value);
3461 return reinterpret_cast<void*>(address >> kPointerToSmiShift); 3461 return reinterpret_cast<void*>(address >> kPointerToSmiShift);
3462 } 3462 }
3463 3463
3464 static inline void* GetExternalPointer(internal::Object* obj) { 3464 static inline void* GetExternalPointer(internal::Object* obj) {
3465 if (HasSmiTag(obj)) { 3465 if (HasSmiTag(obj)) {
3466 return GetExternalPointerFromSmi(obj); 3466 return GetExternalPointerFromSmi(obj);
3467 } else if (GetInstanceType(obj) == kProxyType) { 3467 } else if (GetInstanceType(obj) == kProxyType) {
3468 return ReadField<void*>(obj, kProxyProxyOffset); 3468 return ReadField<void*>(obj, kProxyProxyOffset);
3469 } else { 3469 } else {
3470 return NULL; 3470 return NULL;
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
3823 3823
3824 3824
3825 } // namespace v8 3825 } // namespace v8
3826 3826
3827 3827
3828 #undef V8EXPORT 3828 #undef V8EXPORT
3829 #undef TYPE_CHECK 3829 #undef TYPE_CHECK
3830 3830
3831 3831
3832 #endif // V8_H_ 3832 #endif // V8_H_
OLDNEW
« no previous file with comments | « no previous file | src/api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698