// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package inlheur import "strings" func (funcProps *FuncProps) SerializeToString() string { if funcProps == nil { return "" } var sb strings.Builder writeUleb128(&sb, uint64(funcProps.Flags)) writeUleb128(&sb, uint64(len(funcProps.ParamFlags))) for _, pf := range funcProps.ParamFlags { writeUleb128(&sb, uint64(pf)) } writeUleb128(&sb, uint64(len(funcProps.ResultFlags))) for _, rf := range funcProps.ResultFlags { writeUleb128(&sb, uint64(rf)) } return sb.String() } func DeserializeFromString(s string) *FuncProps { if len(s) == 0 { return nil } var funcProps FuncProps var v uint64 sl := []byte(s) v, sl = readULEB128(sl) funcProps.Flags = FuncPropBits(v) v, sl = readULEB128(sl) funcProps.ParamFlags = make([]ParamPropBits, v) for i := range funcProps.ParamFlags { v, sl = readULEB128(sl) funcProps.ParamFlags[i] = ParamPropBits(v) } v, sl = readULEB128(sl) funcProps.ResultFlags = make([]ResultPropBits, v) for i := range funcProps.ResultFlags { v, sl = readULEB128(sl) funcProps.ResultFlags[i] = ResultPropBits(v) } return &funcProps } func readULEB128(sl []byte) (value uint64, rsl []byte) { var shift uint for { b := sl[0] sl = sl[1:] value |= (uint64(b&0x7F) << shift) if b&0x80 == 0 { break } shift += 7 } return value, sl } func writeUleb128(sb *strings.Builder, v uint64) { if v < 128 { sb.WriteByte(uint8(v)) return } more := true for more { c := uint8(v & 0x7f) v >>= 7 more = v != 0 if more { c |= 0x80 } sb.WriteByte(c) } }