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