op: make MacroOp methods take value receivers

The only mutable field is "recording", which is used for a sanity
check. THat check is performed (less generally) by Ops.macroStack.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-06-02 11:05:39 +02:00
parent 3e8c502550
commit acc23a5b3e
+11 -26
View File
@@ -105,10 +105,9 @@ type StackOp struct {
// MacroOp records a list of operations for later use. // MacroOp records a list of operations for later use.
type MacroOp struct { type MacroOp struct {
recording bool ops *Ops
ops *Ops id stackID
id stackID pc pc
pc pc
} }
// CallOp invokes all the operations from a separate // CallOp invokes all the operations from a separate
@@ -219,35 +218,24 @@ func (o *Ops) pc() pc {
// Record a macro of operations. // Record a macro of operations.
func Record(o *Ops) MacroOp { func Record(o *Ops) MacroOp {
var m MacroOp m := MacroOp{
m.record(o) ops: o,
return m id: o.macroStack.push(),
} pc: o.pc(),
func (m *MacroOp) record(o *Ops) {
if m.recording {
panic("already recording")
} }
m.recording = true
m.ops = o
m.id = m.ops.macroStack.push()
m.pc = o.pc()
// Reserve room for a macro definition. Updated in Stop. // Reserve room for a macro definition. Updated in Stop.
m.ops.Write(opconst.TypeMacroDefLen) m.ops.Write(opconst.TypeMacroDefLen)
m.fill() m.fill()
return m
} }
// Stop ends a previously started recording. // Stop ends a previously started recording.
func (m *MacroOp) Stop() { func (m MacroOp) Stop() {
if !m.recording {
panic("not recording")
}
m.ops.macroStack.pop(m.id) m.ops.macroStack.pop(m.id)
m.recording = false
m.fill() m.fill()
} }
func (m *MacroOp) fill() { func (m MacroOp) fill() {
pc := m.ops.pc() pc := m.ops.pc()
// Fill out the macro definition reserved in Record. // Fill out the macro definition reserved in Record.
data := m.ops.data[m.pc.data:] data := m.ops.data[m.pc.data:]
@@ -259,10 +247,7 @@ func (m *MacroOp) fill() {
} }
// Add the recorded list of operations. // Add the recorded list of operations.
func (m *MacroOp) Add() { func (m MacroOp) Add() {
if m.recording {
panic("a recording is in progress")
}
if m.ops == nil { if m.ops == nil {
return return
} }