140 lines
2.9 KiB
Go
140 lines
2.9 KiB
Go
// Copyright 2018 The OPA Authors. All rights reserved.
|
|
// Use of this source code is governed by an Apache2
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package instruction
|
|
|
|
import (
|
|
"github.com/open-policy-agent/opa/internal/wasm/opcode"
|
|
"github.com/open-policy-agent/opa/internal/wasm/types"
|
|
)
|
|
|
|
// Unreachable reprsents an unreachable opcode.
|
|
type Unreachable struct {
|
|
NoImmediateArgs
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (Unreachable) Op() opcode.Opcode {
|
|
return opcode.Unreachable
|
|
}
|
|
|
|
// Nop represents a WASM no-op instruction.
|
|
type Nop struct {
|
|
NoImmediateArgs
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (Nop) Op() opcode.Opcode {
|
|
return opcode.Nop
|
|
}
|
|
|
|
// Block represents a WASM block instruction.
|
|
type Block struct {
|
|
NoImmediateArgs
|
|
Type *types.ValueType
|
|
Instrs []Instruction
|
|
}
|
|
|
|
// Op returns the opcode of the instruction
|
|
func (Block) Op() opcode.Opcode {
|
|
return opcode.Block
|
|
}
|
|
|
|
// BlockType returns the type of the block's return value.
|
|
func (i Block) BlockType() *types.ValueType {
|
|
return i.Type
|
|
}
|
|
|
|
// Instructions returns the instructions contained in the block.
|
|
func (i Block) Instructions() []Instruction {
|
|
return i.Instrs
|
|
}
|
|
|
|
// Loop represents a WASM loop instruction.
|
|
type Loop struct {
|
|
NoImmediateArgs
|
|
Type *types.ValueType
|
|
Instrs []Instruction
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (Loop) Op() opcode.Opcode {
|
|
return opcode.Loop
|
|
}
|
|
|
|
// BlockType returns the type of the loop's return value.
|
|
func (i Loop) BlockType() *types.ValueType {
|
|
return i.Type
|
|
}
|
|
|
|
// Instructions represents the instructions contained in the loop.
|
|
func (i Loop) Instructions() []Instruction {
|
|
return i.Instrs
|
|
}
|
|
|
|
// Br represents a WASM br instruction.
|
|
type Br struct {
|
|
Index uint32
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (Br) Op() opcode.Opcode {
|
|
return opcode.Br
|
|
}
|
|
|
|
// ImmediateArgs returns the block index to break to.
|
|
func (i Br) ImmediateArgs() []interface{} {
|
|
return []interface{}{i.Index}
|
|
}
|
|
|
|
// BrIf represents a WASM br_if instruction.
|
|
type BrIf struct {
|
|
Index uint32
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (BrIf) Op() opcode.Opcode {
|
|
return opcode.BrIf
|
|
}
|
|
|
|
// ImmediateArgs returns the block index to break to.
|
|
func (i BrIf) ImmediateArgs() []interface{} {
|
|
return []interface{}{i.Index}
|
|
}
|
|
|
|
// Call represents a WASM call instruction.
|
|
type Call struct {
|
|
Index uint32
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (Call) Op() opcode.Opcode {
|
|
return opcode.Call
|
|
}
|
|
|
|
// ImmediateArgs returns the function index.
|
|
func (i Call) ImmediateArgs() []interface{} {
|
|
return []interface{}{i.Index}
|
|
}
|
|
|
|
// Return represents a WASM return instruction.
|
|
type Return struct {
|
|
NoImmediateArgs
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (Return) Op() opcode.Opcode {
|
|
return opcode.Return
|
|
}
|
|
|
|
// End represents the special WASM end instruction.
|
|
type End struct {
|
|
NoImmediateArgs
|
|
}
|
|
|
|
// Op returns the opcode of the instruction.
|
|
func (End) Op() opcode.Opcode {
|
|
return opcode.End
|
|
}
|