14f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# Copyright 2011 the V8 project authors. All rights reserved.
24f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# Redistribution and use in source and binary forms, with or without
34f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# modification, are permitted provided that the following conditions are
44f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# met:
54f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#
64f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#     * Redistributions of source code must retain the above copyright
74f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#       notice, this list of conditions and the following disclaimer.
84f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#     * Redistributions in binary form must reproduce the above
94f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#       copyright notice, this list of conditions and the following
104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#       disclaimer in the documentation and/or other materials provided
114f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#       with the distribution.
124f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#     * Neither the name of Google Inc. nor the names of its
134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#       contributors may be used to endorse or promote products derived
144f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#       from this software without specific prior written permission.
154f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org#
164f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
174f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
184f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
204f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
214f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
234f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
264f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
284f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
294f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiTag = 0
304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiTagSize = 1
314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiTagMask = (1 << kSmiTagSize) - 1
324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
344f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkHeapObjectTag = 1
354f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkHeapObjectTagSize = 2
364f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1
374f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
384f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
394f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkFailureTag = 3
404f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkFailureTagSize = 2
414f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkFailureTagMask = (1 << kFailureTagSize) - 1
424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
444f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiShiftSize32 = 0
454f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiValueSize32 = 31
464f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiShiftBits32 = kSmiTagSize + kSmiShiftSize32
474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
484f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
494f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiShiftSize64 = 31
504f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiValueSize64 = 32
514f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkSmiShiftBits64 = kSmiTagSize + kSmiShiftSize64
524f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
544f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkAllBits = 0xFFFFFFFF
554f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkTopBit32 = 0x80000000
564f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgkTopBit64 = 0x8000000000000000
574f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
584f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
594f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgt_u32 = gdb.lookup_type('unsigned int')
604f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgt_u64 = gdb.lookup_type('unsigned long long')
614f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef has_smi_tag(v):
644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return v & kSmiTagMask == kSmiTag
654f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
664f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
674f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef has_failure_tag(v):
684f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return v & kFailureTagMask == kFailureTag
694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
704f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
714f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef has_heap_object_tag(v):
724f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return v & kHeapObjectTagMask == kHeapObjectTag
734f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
744f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
754f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef raw_heap_object(v):
764f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return v - kHeapObjectTag
774f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
784f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
794f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef smi_to_int_32(v):
804f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  v = v & kAllBits
814f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  if (v & kTopBit32) == kTopBit32:
824f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return ((v & kAllBits) >> kSmiShiftBits32) - 2147483648
834f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  else:
844f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return (v & kAllBits) >> kSmiShiftBits32
854f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
864f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
874f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef smi_to_int_64(v):
884f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return (v >> kSmiShiftBits64)
894f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
904f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
914f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef decode_v8_value(v, bitness):
924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  base_str = 'v8[%x]' % v
934f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  if has_smi_tag(v):
944f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    if bitness == 32:
954f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      return base_str + (" SMI(%d)" % smi_to_int_32(v))
964f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    else:
974f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      return base_str + (" SMI(%d)" % smi_to_int_64(v))
984f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  elif has_failure_tag(v):
994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return base_str + " (failure)"
1004f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  elif has_heap_object_tag(v):
1014f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return base_str + (" H(0x%x)" % raw_heap_object(v))
1024f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  else:
1034f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return base_str
1044f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1054f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1064f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgclass V8ValuePrinter(object):
1074f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  "Print a v8value."
1084f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  def __init__(self, val):
1094f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    self.val = val
1104f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  def to_string(self):
1114f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    if self.val.type.sizeof == 4:
1124f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      v_u32 = self.val.cast(t_u32)
1134f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      return decode_v8_value(int(v_u32), 32)
1144f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    elif self.val.type.sizeof == 8:
1154f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      v_u64 = self.val.cast(t_u64)
1164f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      return decode_v8_value(int(v_u64), 64)
1174f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    else:
1184f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org      return 'v8value?'
1194f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  def display_hint(self):
1204f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return 'v8value'
1214f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1224f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1234f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef v8_pretty_printers(val):
1244f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  lookup_tag = val.type.tag
1254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  if lookup_tag == None:
1264f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return None
1274f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  elif lookup_tag == 'v8value':
1284f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return V8ValuePrinter(val)
1294f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return None
1304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orggdb.pretty_printers.append(v8_pretty_printers)
1314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1334f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef v8_to_int(v):
1344f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  if v.type.sizeof == 4:
1354f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return int(v.cast(t_u32))
1364f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  elif v.type.sizeof == 8:
1374f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return int(v.cast(t_u64))
1384f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  else:
1394f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    return '?'
1404f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1411805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org
1424f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgdef v8_get_value(vstring):
1434f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  v = gdb.parse_and_eval(vstring)
1444f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  return v8_to_int(v)
1454f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1464f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
1474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgclass V8PrintObject (gdb.Command):
1484f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  """Prints a v8 object."""
1494f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  def __init__ (self):
1504f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    super (V8PrintObject, self).__init__ ("v8print", gdb.COMMAND_DATA)
1514f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  def invoke (self, arg, from_tty):
1524f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    v = v8_get_value(arg)
1534f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org    gdb.execute('call __gdb_print_v8_object(%d)' % v)
1544f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.orgV8PrintObject()
155