Merge pull request #3237 from nspcc-dev/emit-smth

vm: allow to emit `any` based on its type
This commit is contained in:
Roman Khimov 2023-11-28 18:01:06 +03:00 committed by GitHub
commit 98de5b9ccb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -98,7 +98,21 @@ func bigInt(w *io.BinWriter, n *big.Int, trySmall bool) {
w.WriteBytes(padRight(1<<padSize, buf))
}
// Array emits an array of elements to the given buffer. It accepts elements of the following types:
// Array emits an array of elements to the given buffer. It accepts everything that
// Any accepts.
func Array(w *io.BinWriter, es ...any) {
if len(es) == 0 {
Opcodes(w, opcode.NEWARRAY0)
return
}
for i := len(es) - 1; i >= 0; i-- {
Any(w, es[i])
}
Int(w, int64(len(es)))
Opcodes(w, opcode.PACK)
}
// Any emits element if supported. It accepts elements of the following types:
// - int8, int16, int32, int64, int
// - uint8, uint16, uint32, uint64, uint
// - *big.Int
@ -108,13 +122,8 @@ func bigInt(w *io.BinWriter, n *big.Int, trySmall bool) {
// - stackitem.Convertible, stackitem.Item
// - nil
// - []any
func Array(w *io.BinWriter, es ...any) {
if len(es) == 0 {
Opcodes(w, opcode.NEWARRAY0)
return
}
for i := len(es) - 1; i >= 0; i-- {
switch e := es[i].(type) {
func Any(w *io.BinWriter, something any) {
switch e := something.(type) {
case []any:
Array(w, e...)
case int64:
@ -166,16 +175,13 @@ func Array(w *io.BinWriter, es ...any) {
case stackitem.Item:
StackItem(w, e)
default:
if es[i] != nil {
if something != nil {
w.Err = fmt.Errorf("unsupported type: %T", e)
return
}
Opcodes(w, opcode.PUSHNULL)
}
}
Int(w, int64(len(es)))
Opcodes(w, opcode.PACK)
}
// Convertible converts provided stackitem.Convertible to the stackitem.Item and
// emits the item to the given buffer.