v8 147.3.0

Rust bindings to V8
Documentation
<?xml version="1.0" encoding="utf-8" ?>
<AutoVisualizer
    xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="gfx::Point">
    <AlternativeType Name="gfx::PointF"/>
    <DisplayString>({x_}, {y_})</DisplayString>
  </Type>
  <Type Name="gfx::Size">
    <AlternativeType Name="gfx::SizeF"/>
    <DisplayString>({width_}, {height_})</DisplayString>
  </Type>
  <Type Name="gfx::Rect">
    <AlternativeType Name="gfx::RectF"/>
    <DisplayString>({origin_.x_}, {origin_.y_}) x ({size_.width_}, {size_.height_})</DisplayString>
  </Type>
  <Type Name="gfx::Matrix44">
    <Expand>
      <ArrayItems>
        <!-- Matrix44 is stored column-major, "Backward" makes the index appear as [row,col]. -->
        <Direction>Backward</Direction>
        <Rank>2</Rank>
        <Size>4</Size>
        <ValuePointer>matrix_[0]</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
  <Type Name="gfx::AxisTransform2d">
    <DisplayString>({scale_.x_}, {scale_.y_}) + ({translation_.x_}, {translation_.y_})</DisplayString>
  </Type>
  <Type Name="gfx::Transform">
    <DisplayString Condition="full_matrix_">{{ full_matrix_={full_matrix_} }}</DisplayString>
    <DisplayString Condition="!full_matrix_">{{ axis_2d_={axis_2d_} }}</DisplayString>
    <Expand>
      <ExpandedItem Condition="full_matrix_ == true">matrix_</ExpandedItem>
      <ExpandedItem Condition="!full_matrix_">axis_2d_</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="gpu::Mailbox">
    <!-- Special case when `IsZero` -->
    <DisplayString Condition="name[0] == 0 &amp;&amp;  name[1] == 0 &amp;&amp;  name[2] == 0 &amp;&amp;  name[3] == 0
                  &amp;&amp;  name[4] == 0 &amp;&amp;  name[5] == 0 &amp;&amp;  name[6] == 0 &amp;&amp;  name[7] == 0
                  &amp;&amp;  name[8] == 0 &amp;&amp;  name[9] == 0 &amp;&amp; name[10] == 0 &amp;&amp; name[11] == 0
                  &amp;&amp; name[12] == 0 &amp;&amp; name[13] == 0 &amp;&amp; name[14] == 0 &amp;&amp; name[15] == 0">{{ name=[zero] }}</DisplayString>
    <!-- Displays the `ToDebugString` output, which is the name, as hex, with the bytes separated with a colon ":". -->
    <DisplayString>{{ name={name[0],nvoXb}:{name[1],nvoXb}:{name[2],nvoXb}:{name[3],nvoXb}:{name[4],nvoXb}:{name[5],nvoXb}:{name[6],nvoXb}:{name[7],nvoXb}:{name[8],nvoXb}:{name[9],nvoXb}:{name[10],nvoXb}:{name[11],nvoXb}:{name[12],nvoXb}:{name[13],nvoXb}:{name[14],nvoXb}:{name[15],nvoXb} }}</DisplayString>
  </Type>
  <Type Name="viz::SharedImageFormat">
    <DisplayString Condition="plane_type_ == kSinglePlane">{format_.singleplanar_format}</DisplayString>
    <DisplayString Condition="plane_type_ == kMultiPlane">{format_.multiplanar_format}</DisplayString>
  </Type>
  <Type Name="scoped_refptr&lt;*&gt;">
    <SmartPointer Usage="Minimal">ptr_</SmartPointer>
    <DisplayString Condition="ptr_ == 0">null</DisplayString>
    <DisplayString>[{((base::subtle::RefCountedBase*)ptr_)-&gt;ref_count_}] {(void*)ptr_} {*ptr_}</DisplayString>
    <Expand>
      <Item Name="Ptr">ptr_</Item>
      <Item Name="RefCount" Condition="ptr_ != 0">((base::subtle::RefCountedBase*)ptr_)-&gt;ref_count_</Item>
      <ExpandedItem Condition="ptr_ != 0">ptr_</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="IPC::Message::Header">
    <DisplayString>{{Routing: {routing}, Type: {type}}}</DisplayString>
    <Expand>
      <Item Name="RoutingId">routing</Item>
      <Item Name="Type">type</Item>
      <Synthetic Name="Priority"
                 Condition="(flags &amp; IPC::Message::PRIORITY_MASK) ==
                                IPC::Message::PRIORITY_LOW">
        <DisplayString>Low</DisplayString>
      </Synthetic>
      <Synthetic Name="Priority"
                 Condition="(flags &amp; IPC::Message::PRIORITY_MASK) ==
                                IPC::Message::PRIORITY_NORMAL">
        <DisplayString>Normal</DisplayString>
      </Synthetic>
      <Synthetic Name="Priority"
                 Condition="(flags &amp; IPC::Message::PRIORITY_MASK) ==
                                IPC::Message::PRIORITY_HIGH">
        <DisplayString>High</DisplayString>
      </Synthetic>
      <Synthetic Name="Sync"
                 Condition="(flags &amp; IPC::Message::SYNC_BIT) != 0">
        <DisplayString>true</DisplayString>
      </Synthetic>
      <Synthetic Name="Sync"
                 Condition="(flags &amp; IPC::Message::SYNC_BIT) == 0">
        <DisplayString>false</DisplayString>
      </Synthetic>
      <Synthetic Name="Reply"
                 Condition="(flags &amp; IPC::Message::REPLY_BIT) != 0">
        <DisplayString>true</DisplayString>
      </Synthetic>
      <Synthetic Name="Reply"
                 Condition="(flags &amp; IPC::Message::REPLY_BIT) == 0">
        <DisplayString>false</DisplayString>
      </Synthetic>
      <Synthetic Name="ReplyError"
                 Condition="(flags &amp; IPC::Message::REPLY_ERROR_BIT) != 0">
        <DisplayString>true</DisplayString>
      </Synthetic>
      <Synthetic Name="ReplyError"
                 Condition="(flags &amp; IPC::Message::REPLY_ERROR_BIT) == 0">
        <DisplayString>false</DisplayString>
      </Synthetic>
      <Synthetic Name="Unblock"
                 Condition="(flags &amp; IPC::Message::UNBLOCK_BIT) != 0">
        <DisplayString>true</DisplayString>
      </Synthetic>
      <Synthetic Name="Unblock"
                 Condition="(flags &amp; IPC::Message::UNBLOCK_BIT) == 0">
        <DisplayString>false</DisplayString>
      </Synthetic>
      <Synthetic Name="PumpingMessages"
                 Condition="(flags &amp; IPC::Message::PUMPING_MSGS_BIT) != 0">
        <DisplayString>true</DisplayString>
      </Synthetic>
      <Synthetic Name="PumpingMessages"
                 Condition="(flags &amp; IPC::Message::PUMPING_MSGS_BIT) == 0">
        <DisplayString>false</DisplayString>
      </Synthetic>
      <Synthetic Name="HasSentTime"
                 Condition="(flags &amp; IPC::Message::HAS_SENT_TIME_BIT) != 0">
        <DisplayString>true</DisplayString>
      </Synthetic>
      <Synthetic Name="HasSentTime"
                 Condition="(flags &amp; IPC::Message::HAS_SENT_TIME_BIT) == 0">
        <DisplayString>false</DisplayString>
      </Synthetic>
    </Expand>
  </Type>
  <Type Name="IPC::Message">
    <DisplayString>{{size = {header_size_+capacity_after_header_}}}</DisplayString>
    <Expand>
      <ExpandedItem>*((IPC::Message::Header*)header_),nd</ExpandedItem>
      <Item Name="Payload">(void*)((char*)header_ + header_size_)</Item>
    </Expand>
  </Type>
  <Type Name="base::FilePath">
    <DisplayString>{path_}</DisplayString>
  </Type>
  <!-- Handles most classes inside base/time/time.h -->
  <Type Name="base::time_internal::TimeBase&lt;*&gt;">
    <Intrinsic Name="microseconds" Expression="us_.value_" />
    <!-- These static constexpr values are not consistently embedded in
        the PDB. To ensure it works in all build configs, define them directly
        here. If/when https://github.com/llvm/llvm-project/issues/46924 gets
        resolved, we can likely remove these in favor of referencing the
        symbol. -->
    <Intrinsic Name="kHoursPerDay" Expression="24" />
    <Intrinsic Name="kMinutesPerHour" Expression="60" />
    <Intrinsic Name="kSecondsPerMinute" Expression="60" />
    <Intrinsic Name="kMillisecondsPerSecond" Expression="1000" />
    <Intrinsic Name="kMicrosecondsPerMillisecond" Expression="1000" />
    <Intrinsic Name="kMicrosecondsPerSecond" Expression="kMicrosecondsPerMillisecond() * kMillisecondsPerSecond()" />
    <Intrinsic Name="kMicrosecondsPerMinute" Expression="kMicrosecondsPerSecond() * kSecondsPerMinute()" />
    <Intrinsic Name="kMicrosecondsPerHour" Expression="(int64_t)kMicrosecondsPerMinute() * kMinutesPerHour()" />
    <Intrinsic Name="kMicrosecondsPerDay" Expression="(int64_t)kMicrosecondsPerHour() * kHoursPerDay()" />
    <Intrinsic Name="microseconds_float" Expression="microseconds() * 1.0" />
    <DisplayString Condition="microseconds() % kMicrosecondsPerDay() == 0">{microseconds() / kMicrosecondsPerDay()}d</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerHour() == 0">{microseconds() / kMicrosecondsPerHour()}h</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerMinute() == 0">{microseconds() / kMicrosecondsPerMinute()}m</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerSecond() == 0">{microseconds() / kMicrosecondsPerSecond()}s</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerMillisecond() == 0">{microseconds() / kMicrosecondsPerMillisecond()}ms</DisplayString>
    <DisplayString>{microseconds()}us</DisplayString>
    <Expand>
      <Item Name="[in days]">microseconds_float() / kMicrosecondsPerDay()</Item>
      <Item Name="[in hours]">microseconds_float() / kMicrosecondsPerHour()</Item>
      <Item Name="[in minutes]">microseconds_float() / kMicrosecondsPerMinute()</Item>
      <Item Name="[in seconds]">microseconds_float() / kMicrosecondsPerSecond()</Item>
      <Item Name="[in milliseconds]">microseconds_float() / kMicrosecondsPerMillisecond()</Item>
      <Item Name="[in microseconds]">microseconds()</Item>
    </Expand>
  </Type>
  <Type Name="base::TimeDelta">
    <Intrinsic Name="microseconds" Expression="delta_.value_" />
    <!-- The below should be identical to the Type definition for base::time_internal::TimeBase<*>. -->
    <Intrinsic Name="kHoursPerDay" Expression="24" />
    <Intrinsic Name="kMinutesPerHour" Expression="60" />
    <Intrinsic Name="kSecondsPerMinute" Expression="60" />
    <Intrinsic Name="kMillisecondsPerSecond" Expression="1000" />
    <Intrinsic Name="kMicrosecondsPerMillisecond" Expression="1000" />
    <Intrinsic Name="kMicrosecondsPerSecond" Expression="kMicrosecondsPerMillisecond() * kMillisecondsPerSecond()" />
    <Intrinsic Name="kMicrosecondsPerMinute" Expression="kMicrosecondsPerSecond() * kSecondsPerMinute()" />
    <Intrinsic Name="kMicrosecondsPerHour" Expression="(int64_t)kMicrosecondsPerMinute() * kMinutesPerHour()" />
    <Intrinsic Name="kMicrosecondsPerDay" Expression="(int64_t)kMicrosecondsPerHour() * kHoursPerDay()" />
    <Intrinsic Name="microseconds_float" Expression="microseconds() * 1.0" />
    <DisplayString Condition="microseconds() % kMicrosecondsPerDay() == 0">{microseconds() / kMicrosecondsPerDay()}d</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerHour() == 0">{microseconds() / kMicrosecondsPerHour()}h</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerMinute() == 0">{microseconds() / kMicrosecondsPerMinute()}m</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerSecond() == 0">{microseconds() / kMicrosecondsPerSecond()}s</DisplayString>
    <DisplayString Condition="microseconds() % kMicrosecondsPerMillisecond() == 0">{microseconds() / kMicrosecondsPerMillisecond()}ms</DisplayString>
    <DisplayString>{microseconds()}us</DisplayString>
    <Expand>
      <Item Name="[in days]">microseconds_float() / kMicrosecondsPerDay()</Item>
      <Item Name="[in hours]">microseconds_float() / kMicrosecondsPerHour()</Item>
      <Item Name="[in minutes]">microseconds_float() / kMicrosecondsPerMinute()</Item>
      <Item Name="[in seconds]">microseconds_float() / kMicrosecondsPerSecond()</Item>
      <Item Name="[in milliseconds]">microseconds_float() / kMicrosecondsPerMillisecond()</Item>
      <Item Name="[in microseconds]">microseconds()</Item>
    </Expand>
  </Type>
  <Type Name="GURL">
    <DisplayString>{spec_}</DisplayString>
  </Type>
  <Type Name="base::ManualConstructor&lt;*&gt;">
    <!-- $T1 expands to the first "*" in the name which is the template
         type. Use that to cast to the correct value. -->
    <DisplayString>{*($T1*)space_.data_}</DisplayString>
    <Expand>
      <ExpandedItem>*($T1*)space_.data_</ExpandedItem>
    </Expand>
  </Type>
  <!-- This type handles the case where there is one additional "is null" value. -->
  <Type Name="base::IdType&lt;*,*,*,*,*&gt;">
    <Intrinsic Name="is_null" Expression="value_ == $T3 || value_ == $T5" />
    <DisplayString Condition="!is_null()">{value_}</DisplayString>
    <DisplayString>null</DisplayString>
    <Expand>
      <Item Name="[value]">value_</Item>
      <Item Name="[is_null]">is_null()</Item>
    </Expand>
  </Type>
  <!-- This type handles the other cases, with a limitation warning displayed to the user if we see a 6th template value. -->
  <Type Name="base::IdType&lt;*&gt;">
    <Intrinsic Name="is_null" Expression="value_ == $T3" />
    <DisplayString Condition="!is_null()">{value_}</DisplayString>
    <DisplayString>null</DisplayString>
    <Expand>
      <Item Name="[value]">value_</Item>
      <Item Name="[is_null]">is_null()</Item>
      <!-- We can't handle arbitrary kExtraInvalidValues, so this may be null even if this indicates otherwise.
           If this is a common scenario, add a more specific Type with the matching number of parameters
           like we do for five template parameters above. -->
      <Item Name="more values that may be null (see chrome.natvis)" Optional="true" ExcludeView="simple">$T6</Item>
    </Expand>
  </Type>
  <Type Name="base::internal::flat_tree&lt;*&gt;">
    <DisplayString>{body_}</DisplayString>
    <Expand>
      <ExpandedItem>body_</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="base::Value">
    <Intrinsic Name="index" Expression="(int)data_.__impl_.__index"/>
    <DisplayString Condition="index() == base::Value::Type::NONE" Optional="true">None</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::BOOLEAN" Optional="true">Boolean {data_.__impl_.__data.__tail.__head.__value}</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::INTEGER" Optional="true">Integer {data_.__impl_.__data.__tail.__tail.__head.__value}</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::DOUBLE" Optional="true">Double {*(double*)&amp;data_.__impl_.__data.__tail.__tail.__tail.__head.__value.v_}</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::STRING" Optional="true">String {data_.__impl_.__data.__tail.__tail.__tail.__tail.__head.__value,na}</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::BINARY" Optional="true">Binary {data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__head.__value}</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::DICT" Optional="true">Dict {data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value}</DisplayString>
    <DisplayString Condition="index() == base::Value::Type::LIST" Optional="true">List {data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value}</DisplayString>
    <DisplayString>Unknown type</DisplayString>
    <Expand>
      <ExpandedItem Condition="index() == base::Value::Type::STRING" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__head.__value,na</ExpandedItem>
      <ExpandedItem Condition="index() == base::Value::Type::BINARY" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__head.__value</ExpandedItem>
      <ExpandedItem Condition="index() == base::Value::Type::DICT" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value</ExpandedItem>
      <ExpandedItem Condition="index() == base::Value::Type::LIST" Optional="true">data_.__impl_.__data.__tail.__tail.__tail.__tail.__tail.__tail.__tail.__head.__value</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="base::DictValue" >
    <DisplayString>{storage_}</DisplayString>
    <Expand>
      <ExpandedItem>storage_</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="base::LazyInstance&lt;*,*&gt;">
    <Intrinsic Name="atomic_value" Expression="*(unsigned long long*)&amp;private_instance_" />
    <Intrinsic Name="is_created" Expression="atomic_value() != 0" />
    <Intrinsic Name="instance_ptr" Expression="(($T1*)private_buf_)" />
    <DisplayString Condition="!is_created()">{{ not created }}</DisplayString>
    <DisplayString Condition="is_created()">{{ created: {*instance_ptr()} }}</DisplayString>
    <Expand>
      <Item Name="[IsCreated]" ExcludeView="simple">is_created()</Item>
      <Item Name="[instance]" Condition="is_created()">*instance_ptr()</Item>
    </Expand>
  </Type>
  <Type Name="base::ListValue" >
    <DisplayString>{storage_}</DisplayString>
    <Expand>
      <ExpandedItem>storage_</ExpandedItem>
    </Expand>
  </Type>
  <Type Name="base::StrongAlias&lt;*,*&gt;">
    <DisplayString>{value_}</DisplayString>
  </Type>
  <Type Name="base::span&lt;*&gt;">
    <Intrinsic Name="size" Expression="size_" />
    <DisplayString>{{ size={size()} }}</DisplayString>
    <Expand>
      <ArrayItems>
        <Size>size()</Size>
        <ValuePointer>data_</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
  <Type Name="base::WeakPtr&lt;*&gt;">
    <Intrinsic Name="ref_is_valid" Expression="ref_.flag_.ptr_ &amp;&amp; (uint8_t*)&amp;(ref_.flag_.ptr_-&gt;invalidated_.flag_)" />
    <Intrinsic Name="was_invalidated" Expression="ptr_ &amp;&amp; !ref_is_valid()" />
    <Intrinsic Name="value" Expression="*($T1**)&amp;ptr_" />
    <SmartPointer Usage="Minimal">value()</SmartPointer>
    <DisplayString Condition="was_invalidated()">invalidated</DisplayString>
    <DisplayString Condition="value() == 0">empty</DisplayString>
    <DisplayString Condition="value() != 0">WeakPtr {value()}</DisplayString>
    <Expand>
      <Item Condition="ref_is_valid() &amp;&amp; value() != 0" Name="[ptr]">value()</Item>
      <Item Condition="!ref_is_valid() &amp;&amp; value() != 0" Name="[invalidated ptr]">value()</Item>
      <Item Name="[ref_is_valid]" ExcludeView="simple">ref_is_valid()</Item>
      <Item Name="[was_invalidated]" Condition="!ref_is_valid()" ExcludeView="simple">was_invalidated()</Item>
    </Expand>
  </Type>
</AutoVisualizer>