@@ -25,13 +25,15 @@ void JSDispatchEntry::MakeJSDispatchEntry(Address object, Address entrypoint,
2525                                          uint16_t  parameter_count,
2626                                          bool  mark_as_alive) {
2727  DCHECK_EQ (object & kHeapObjectTag , 0 );
28+ #if  !defined(__illumos__) || !defined(V8_TARGET_ARCH_64_BIT)
2829  DCHECK_EQ ((((object - kObjectPointerOffset ) << kObjectPointerShift ) >>
2930             kObjectPointerShift ) +
3031                kObjectPointerOffset ,
3132            object);
3233  DCHECK_EQ ((object - kObjectPointerOffset ) + kObjectPointerOffset , object);
3334  DCHECK_LT ((object - kObjectPointerOffset ),
3435            1ULL  << ((sizeof (encoded_word_) * 8 ) - kObjectPointerShift ));
36+ #endif  /*  __illumos__ & 64-bit */ 
3537
3638  Address payload = ((object - kObjectPointerOffset ) << kObjectPointerShift ) |
3739                    (parameter_count & kParameterCountMask );
@@ -57,8 +59,16 @@ Address JSDispatchEntry::GetCodePointer() const {
5759  //  and so may be 0 or 1 here. As the return value is a tagged pointer, the
5860  //  bit must be 1 when returned, so we need to set it here.
5961  Address payload = encoded_word_.load (std::memory_order_acquire);
62+ #if  defined(__illumos__) && defined(V8_TARGET_ARCH_64_BIT)
63+   //  Unsigned types won't sign-extend on shift-right, but we need to do
64+   //  this with illumos VA48 addressing.
65+   DCHECK_EQ (kObjectPointerOffset , 0 );
66+   return  (Address)((intptr_t )payload >> (int )kObjectPointerShift ) |
67+     kHeapObjectTag ;
68+ #else 
6069  return  ((payload >> kObjectPointerShift ) + kObjectPointerOffset ) |
6170         kHeapObjectTag ;
71+ #endif  /*  __illumos__ & 64-bit */ 
6272}
6373
6474Tagged<Code> JSDispatchEntry::GetCode () const  {
@@ -220,7 +230,12 @@ void JSDispatchEntry::MakeFreelistEntry(uint32_t next_entry_index) {
220230bool  JSDispatchEntry::IsFreelistEntry () const  {
221231#ifdef  V8_TARGET_ARCH_64_BIT
222232  auto  entrypoint = entrypoint_.load (std::memory_order_relaxed);
233+ #ifdef  __illumos__
234+   //  See the illumos definition of kFreeEntryTag for why we have to do this.
235+   return  (entrypoint & 0xffff000000000000ull ) == kFreeEntryTag ;
236+ #else 
223237  return  (entrypoint & kFreeEntryTag ) == kFreeEntryTag ;
238+ #endif  /*  __illumos__ */ 
224239#else 
225240  return  next_free_entry_.load (std::memory_order_relaxed) != 0 ;
226241#endif 
0 commit comments