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