def _read_method_call(ctx): node = Node('BinaryMethodCall') flags = util.read_fmt(ctx.handle, '<L') node.add_leaf('Flags', flags) primitive_type = _read_primitive_type(ctx) node.add_leaf('MethodName', read_primitive(ctx.handle, primitive_type)) primitive_type = _read_primitive_type(ctx) node.add_leaf('TypeName', read_primitive(ctx.handle, primitive_type)) if (flags & MessageFlags.ContextInline.value) != 0: primitive_type = _read_primitive_type(ctx) node.add_leaf('CallContext', read_primitive(ctx.handle, primitive_type)) if (flags & MessageFlags.ArgsInline.value) != 0: args_node = _read_array_of_value_with_code(ctx) args_node.name = 'Args' node.add(args_node) elif (flags & MessageFlags.NoArgs.value) == 0: record_type = _read_record_type(ctx) args_node = _read_record(ctx, record_type) args_node.name = 'Args' node.add(args_node) return node
def _read_binary_array(ctx): node, object_id = _read_create_object(ctx, 'BinaryArray') array_type = BinaryArrayType(util.read_fmt(ctx.handle, 'B')) node.add_leaf('BinaryArrayType', array_type) rank = util.read_fmt(ctx.handle, '<l') node.add_leaf('Rank', rank) dimensions_node = Node('Dimensions') element_count = 0 for i in range(rank): dimension = util.read_fmt(ctx.handle, '<l') dimensions_node.add_leaf('Dimension', dimension) if i == 0: element_count = dimension else: element_count *= dimension node.add(dimensions_node) if array_type in (BinaryArrayType.SingleOffset, BinaryArrayType.JaggedOffset, BinaryArrayType.RectangularOffset): lower_bounds_node = Node('LowerBounds') for i in range(rank): lower_bounds_node.add_leaf('LowerBound', util.read_fmt(ctx.handle, '<l')) node.add(lower_bounds_node) binary_type = _read_binary_type(ctx) primitive_type = PrimitiveType.Invalid if binary_type in (BinaryType.Primitive, BinaryType.PrimitiveArray): primitive_type = _read_primitive_type(ctx) elif binary_type == BinaryType.SystemClass: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) elif binary_type == BinaryType.Class: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32)) elements_node = Node('Elements') for i in range(element_count): elements_node.add( _read_from_binary_type(ctx, binary_type, primitive_type)) node.add(elements_node) return node
def _read_array_single_object(ctx): node, object_id = _read_create_object(ctx, 'ArraySingleObject') length = util.read_fmt(ctx.handle, '<l') record_type = _read_record_type(ctx) elements_node = Node('Elements') for i in range(length): elements_node.add_leaf('Element', _read_record(ctx, record_type)) node.add(elements_node) return node
def _read_string(handle): length = 0 for i in range(5): num = util.read_fmt(handle, 'B') length = length | (num & 0x7F) << (i * 7) if num & 0x80 == 0: break ret = handle.read(length) return ret.decode('utf-8')
def _read_string(handle): length = 0 for i in range(5): num = util.read_fmt(handle, "B") length = length | (num & 0x7F) << (i * 7) if num & 0x80 == 0: break ret = handle.read(length) return ret.decode("utf-8")
def _read_binary_array(ctx): node, object_id = _read_create_object(ctx, 'BinaryArray') array_type = BinaryArrayType(util.read_fmt(ctx.handle, 'B')) node.add_leaf('BinaryArrayType', array_type) rank = util.read_fmt(ctx.handle, '<l') node.add_leaf('Rank', rank) dimensions_node = Node('Dimensions') element_count = 0 for i in range(rank): dimension = util.read_fmt(ctx.handle, '<l') dimensions_node.add_leaf('Dimension', dimension) if i == 0: element_count = dimension else: element_count *= dimension node.add(dimensions_node) if array_type in ( BinaryArrayType.SingleOffset, BinaryArrayType.JaggedOffset, BinaryArrayType.RectangularOffset): lower_bounds_node = Node('LowerBounds') for i in range(rank): lower_bounds_node.add_leaf( 'LowerBound', util.read_fmt(ctx.handle, '<l')) node.add(lower_bounds_node) binary_type = _read_binary_type(ctx) primitive_type = PrimitiveType.Invalid if binary_type in (BinaryType.Primitive, BinaryType.PrimitiveArray): primitive_type = _read_primitive_type(ctx) elif binary_type == BinaryType.SystemClass: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) elif binary_type == BinaryType.Class: node.add_leaf('ClassName', read_primitive(ctx.handle, PrimitiveType.String)) node.add_leaf('LibraryId', read_primitive(ctx.handle, PrimitiveType.Int32)) elements_node = Node('Elements') for i in range(element_count): elements_node.add(_read_from_binary_type(ctx, binary_type, primitive_type)) node.add(elements_node) return node
return util.read_fmt(handle, "<q") def _read_string(handle): length = 0 for i in range(5): num = util.read_fmt(handle, "B") length = length | (num & 0x7F) << (i * 7) if num & 0x80 == 0: break ret = handle.read(length) return ret.decode("utf-8") _PRIMITIVE_FACTORY_MAP = { PrimitiveType.Boolean: lambda h: util.read_fmt(h, "?"), PrimitiveType.Byte: lambda h: util.read_fmt(h, "B"), PrimitiveType.Double: lambda h: util.read_fmt(h, "d"), PrimitiveType.Int16: lambda h: util.read_fmt(h, "<h"), PrimitiveType.Int32: lambda h: util.read_fmt(h, "<l"), PrimitiveType.Int64: lambda h: util.read_fmt(h, "<q"), PrimitiveType.SByte: lambda h: util.read_fmt(h, "c"), PrimitiveType.Single: lambda h: util.read_fmt(h, "f"), PrimitiveType.TimeSpan: _read_timespan, PrimitiveType.UInt16: lambda h: util.read_fmt(h, "<H"), PrimitiveType.UInt32: lambda h: util.read_fmt(h, "<L"), PrimitiveType.UInt64: lambda h: util.read_fmt(h, "<Q"), PrimitiveType.Null: lambda h: None, PrimitiveType.String: _read_string, }
def _read_record_type(ctx): return RecordType(util.read_fmt(ctx.handle, 'B'))
def _read_binary_type(ctx): return BinaryType(util.read_fmt(ctx.handle, 'B'))
def _read_primitive_type(ctx): return PrimitiveType(util.read_fmt(ctx.handle, 'B'))
def _read_class_with_id(ctx): node, object_id = _read_create_object(ctx, 'ClassWithId') metadata_id = util.read_fmt(ctx.handle, '<l') node.add(ctx.objects[metadata_id].get('MembersMeta')) node.add(_read_class_members(ctx, metadata_id)) return node
def _read_timespan(handle): return util.read_fmt(handle, "<q")
def _read_timespan(handle): return util.read_fmt(handle, '<q')
return util.read_fmt(handle, '<q') def _read_string(handle): length = 0 for i in range(5): num = util.read_fmt(handle, 'B') length = length | (num & 0x7F) << (i * 7) if num & 0x80 == 0: break ret = handle.read(length) return ret.decode('utf-8') _PRIMITIVE_FACTORY_MAP = { PrimitiveType.Boolean: lambda h: util.read_fmt(h, '?'), PrimitiveType.Byte: lambda h: util.read_fmt(h, 'B'), PrimitiveType.Double: lambda h: util.read_fmt(h, 'd'), PrimitiveType.Int16: lambda h: util.read_fmt(h, '<h'), PrimitiveType.Int32: lambda h: util.read_fmt(h, '<l'), PrimitiveType.Int64: lambda h: util.read_fmt(h, '<q'), PrimitiveType.SByte: lambda h: util.read_fmt(h, 'c'), PrimitiveType.Single: lambda h: util.read_fmt(h, 'f'), PrimitiveType.TimeSpan: _read_timespan, PrimitiveType.UInt16: lambda h: util.read_fmt(h, '<H'), PrimitiveType.UInt32: lambda h: util.read_fmt(h, '<L'), PrimitiveType.UInt64: lambda h: util.read_fmt(h, '<Q'), PrimitiveType.Null: lambda h: None, PrimitiveType.String: _read_string, }