mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-05 09:25:38 +00:00
op: introduce CallOp
We'd like to improve the API of Flex, Stack and similar layouts that use MacroOps internall. Unfortunately, the func (m MacroOp) Add(o *Ops) method causes the MacroOp to be allocated on the heap, ruining the nice garbage-free property of layouts. Fortunately, layouts don't need the feature that caused the heap allocation: invoking operation lists different than the current. CallOp separates the invoke-different-list semantic from MacroOp, in preparation for removing the feature from MacroOp. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -38,6 +38,11 @@ type macroOp struct {
|
||||
pc pc
|
||||
}
|
||||
|
||||
// Shadow of op.CallOp.
|
||||
type callOp struct {
|
||||
ops *op.Ops
|
||||
}
|
||||
|
||||
type pc struct {
|
||||
data int
|
||||
refs int
|
||||
@@ -94,6 +99,24 @@ func (r *Reader) Decode() (EncodedOp, bool) {
|
||||
block := r.stack[len(r.stack)-1]
|
||||
n += block.endPC.data - r.pc.data - opconst.TypeAuxLen
|
||||
data = data[:n]
|
||||
case opconst.TypeCall:
|
||||
var op callOp
|
||||
op.decode(data, refs)
|
||||
endPC := pc{
|
||||
data: len(op.ops.Data()),
|
||||
refs: len(op.ops.Refs()),
|
||||
}
|
||||
retPC := r.pc
|
||||
retPC.data += n
|
||||
retPC.refs += nrefs
|
||||
r.stack = append(r.stack, macro{
|
||||
ops: r.ops,
|
||||
retPC: retPC,
|
||||
endPC: endPC,
|
||||
})
|
||||
r.pc = pc{}
|
||||
r.ops = op.ops
|
||||
continue
|
||||
case opconst.TypeMacro:
|
||||
var op macroOp
|
||||
op.decode(data, refs)
|
||||
@@ -148,6 +171,15 @@ func (op *opMacroDef) decode(data []byte) {
|
||||
}
|
||||
}
|
||||
|
||||
func (m *callOp) decode(data []byte, refs []interface{}) {
|
||||
if opconst.OpType(data[0]) != opconst.TypeCall {
|
||||
panic("invalid op")
|
||||
}
|
||||
*m = callOp{
|
||||
ops: refs[0].(*op.Ops),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *macroOp) decode(data []byte, refs []interface{}) {
|
||||
if opconst.OpType(data[0]) != opconst.TypeMacro {
|
||||
panic("invalid op")
|
||||
|
||||
Reference in New Issue
Block a user