13fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# Copyright 2011 the V8 project authors. All rights reserved.
23fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# Redistribution and use in source and binary forms, with or without
33fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# modification, are permitted provided that the following conditions are
43fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# met:
53fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#
63fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#     * Redistributions of source code must retain the above copyright
73fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#       notice, this list of conditions and the following disclaimer.
83fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#     * Redistributions in binary form must reproduce the above
93fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#       copyright notice, this list of conditions and the following
103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#       disclaimer in the documentation and/or other materials provided
113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#       with the distribution.
123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#     * Neither the name of Google Inc. nor the names of its
133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#       contributors may be used to endorse or promote products derived
143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#       from this software without specific prior written permission.
153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#
163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiTag = 0
303fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiTagSize = 1
313fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiTagMask = (1 << kSmiTagSize) - 1
323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
343fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkHeapObjectTag = 1
353fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkHeapObjectTagSize = 2
363fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1
373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
393fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkFailureTag = 3
403fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkFailureTagSize = 2
413fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkFailureTagMask = (1 << kFailureTagSize) - 1
423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
443fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiShiftSize32 = 0
453fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiValueSize32 = 31
463fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiShiftBits32 = kSmiTagSize + kSmiShiftSize32
473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
493fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiShiftSize64 = 31
503fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiValueSize64 = 32
513fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkSmiShiftBits64 = kSmiTagSize + kSmiShiftSize64
523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
543fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkAllBits = 0xFFFFFFFF
553fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkTopBit32 = 0x80000000
563fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochkTopBit64 = 0x8000000000000000
573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdocht_u32 = gdb.lookup_type('unsigned int')
603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdocht_u64 = gdb.lookup_type('unsigned long long')
613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef has_smi_tag(v):
643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return v & kSmiTagMask == kSmiTag
653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef has_failure_tag(v):
683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return v & kFailureTagMask == kFailureTag
693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef has_heap_object_tag(v):
723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return v & kHeapObjectTagMask == kHeapObjectTag
733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef raw_heap_object(v):
763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return v - kHeapObjectTag
773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef smi_to_int_32(v):
803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  v = v & kAllBits
813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (v & kTopBit32) == kTopBit32:
823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return ((v & kAllBits) >> kSmiShiftBits32) - 2147483648
833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  else:
843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return (v & kAllBits) >> kSmiShiftBits32
853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef smi_to_int_64(v):
883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return (v >> kSmiShiftBits64)
893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef decode_v8_value(v, bitness):
923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  base_str = 'v8[%x]' % v
933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if has_smi_tag(v):
943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if bitness == 32:
953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return base_str + (" SMI(%d)" % smi_to_int_32(v))
963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    else:
973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return base_str + (" SMI(%d)" % smi_to_int_64(v))
983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elif has_failure_tag(v):
993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return base_str + " (failure)"
1003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elif has_heap_object_tag(v):
1013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return base_str + (" H(0x%x)" % raw_heap_object(v))
1023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  else:
1033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return base_str
1043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass V8ValuePrinter(object):
1073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  "Print a v8value."
1083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  def __init__(self, val):
1093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    self.val = val
1103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  def to_string(self):
1113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    if self.val.type.sizeof == 4:
1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      v_u32 = self.val.cast(t_u32)
1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return decode_v8_value(int(v_u32), 32)
1143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    elif self.val.type.sizeof == 8:
1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      v_u64 = self.val.cast(t_u64)
1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return decode_v8_value(int(v_u64), 64)
1173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    else:
1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      return 'v8value?'
1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  def display_hint(self):
1203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return 'v8value'
1213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef v8_pretty_printers(val):
1243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  lookup_tag = val.type.tag
1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if lookup_tag == None:
1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return None
1273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elif lookup_tag == 'v8value':
1283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return V8ValuePrinter(val)
1293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return None
1303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochgdb.pretty_printers.append(v8_pretty_printers)
1313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef v8_to_int(v):
1343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if v.type.sizeof == 4:
1353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return int(v.cast(t_u32))
1363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elif v.type.sizeof == 8:
1373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return int(v.cast(t_u64))
1383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  else:
1393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return '?'
1403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
141589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef v8_get_value(vstring):
1433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  v = gdb.parse_and_eval(vstring)
1443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return v8_to_int(v)
1453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass V8PrintObject (gdb.Command):
1483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  """Prints a v8 object."""
1493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  def __init__ (self):
1503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    super (V8PrintObject, self).__init__ ("v8print", gdb.COMMAND_DATA)
1513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  def invoke (self, arg, from_tty):
1523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    v = v8_get_value(arg)
1533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    gdb.execute('call __gdb_print_v8_object(%d)' % v)
1543fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochV8PrintObject()
155