[ptr-compr] Fix decompression functions in v8-internal.h
In the final version of our pointer compression scheme, decompression uses zero-extension of the compressed value. The API copy of that code erroneously still used a sign-extending decompression from an earlier iteration of the scheme. Bug: v8:9706, v8:10198 Change-Id: I17c3a52d26ce26bc0623627d725f686c379fbd6e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2051954 Commit-Queue: Jakob Kummerow <jkummerow@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Reviewed-by: Igor Sheludko <ishell@chromium.org> Cr-Commit-Position: refs/heads/master@{#66256}
This commit is contained in:
parent
6516b1ccbe
commit
8738ab8027
@ -308,9 +308,9 @@ class Internals {
|
||||
V8_INLINE static internal::Address ReadTaggedPointerField(
|
||||
internal::Address heap_object_ptr, int offset) {
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
|
||||
uint32_t value = ReadRawField<uint32_t>(heap_object_ptr, offset);
|
||||
internal::Address root = GetRootFromOnHeapAddress(heap_object_ptr);
|
||||
return root + static_cast<internal::Address>(static_cast<intptr_t>(value));
|
||||
return root + static_cast<internal::Address>(static_cast<uintptr_t>(value));
|
||||
#else
|
||||
return ReadRawField<internal::Address>(heap_object_ptr, offset);
|
||||
#endif
|
||||
@ -319,8 +319,8 @@ class Internals {
|
||||
V8_INLINE static internal::Address ReadTaggedSignedField(
|
||||
internal::Address heap_object_ptr, int offset) {
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
int32_t value = ReadRawField<int32_t>(heap_object_ptr, offset);
|
||||
return static_cast<internal::Address>(static_cast<intptr_t>(value));
|
||||
uint32_t value = ReadRawField<uint32_t>(heap_object_ptr, offset);
|
||||
return static_cast<internal::Address>(static_cast<uintptr_t>(value));
|
||||
#else
|
||||
return ReadRawField<internal::Address>(heap_object_ptr, offset);
|
||||
#endif
|
||||
@ -337,13 +337,9 @@ class Internals {
|
||||
}
|
||||
|
||||
V8_INLINE static internal::Address DecompressTaggedAnyField(
|
||||
internal::Address heap_object_ptr, int32_t value) {
|
||||
internal::Address root_mask = static_cast<internal::Address>(
|
||||
-static_cast<intptr_t>(value & kSmiTagMask));
|
||||
internal::Address root_or_zero =
|
||||
root_mask & GetRootFromOnHeapAddress(heap_object_ptr);
|
||||
return root_or_zero +
|
||||
static_cast<internal::Address>(static_cast<intptr_t>(value));
|
||||
internal::Address heap_object_ptr, uint32_t value) {
|
||||
internal::Address root = GetRootFromOnHeapAddress(heap_object_ptr);
|
||||
return root + static_cast<internal::Address>(static_cast<uintptr_t>(value));
|
||||
}
|
||||
#endif // V8_COMPRESS_POINTERS
|
||||
};
|
||||
|
@ -11239,7 +11239,7 @@ Local<Value> Object::GetInternalField(int index) {
|
||||
#ifdef V8_COMPRESS_POINTERS
|
||||
// We read the full pointer value and then decompress it in order to avoid
|
||||
// dealing with potential endiannes issues.
|
||||
value = I::DecompressTaggedAnyField(obj, static_cast<int32_t>(value));
|
||||
value = I::DecompressTaggedAnyField(obj, static_cast<uint32_t>(value));
|
||||
#endif
|
||||
internal::Isolate* isolate =
|
||||
internal::IsolateFromNeverReadOnlySpaceObject(obj);
|
||||
@ -11883,7 +11883,7 @@ Local<Value> Context::GetEmbedderData(int index) {
|
||||
// We read the full pointer value and then decompress it in order to avoid
|
||||
// dealing with potential endiannes issues.
|
||||
value =
|
||||
I::DecompressTaggedAnyField(embedder_data, static_cast<int32_t>(value));
|
||||
I::DecompressTaggedAnyField(embedder_data, static_cast<uint32_t>(value));
|
||||
#endif
|
||||
internal::Isolate* isolate = internal::IsolateFromNeverReadOnlySpaceObject(
|
||||
*reinterpret_cast<A*>(this));
|
||||
|
Loading…
Reference in New Issue
Block a user