forked from mirror/go-json
83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
|
package encoder
|
||
|
|
||
|
import (
|
||
|
"github.com/goccy/go-json/internal/runtime"
|
||
|
)
|
||
|
|
||
|
type compileContext struct {
|
||
|
typ *runtime.Type
|
||
|
opcodeIndex int
|
||
|
ptrIndex int
|
||
|
indent int
|
||
|
structTypeToCompiledCode map[uintptr]*CompiledCode
|
||
|
|
||
|
parent *compileContext
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) context() *compileContext {
|
||
|
return &compileContext{
|
||
|
typ: c.typ,
|
||
|
opcodeIndex: c.opcodeIndex,
|
||
|
ptrIndex: c.ptrIndex,
|
||
|
indent: c.indent,
|
||
|
structTypeToCompiledCode: c.structTypeToCompiledCode,
|
||
|
parent: c,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) withType(typ *runtime.Type) *compileContext {
|
||
|
ctx := c.context()
|
||
|
ctx.typ = typ
|
||
|
return ctx
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) incIndent() *compileContext {
|
||
|
ctx := c.context()
|
||
|
ctx.indent++
|
||
|
return ctx
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) decIndent() *compileContext {
|
||
|
ctx := c.context()
|
||
|
ctx.indent--
|
||
|
return ctx
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) incIndex() {
|
||
|
c.incOpcodeIndex()
|
||
|
c.incPtrIndex()
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) decIndex() {
|
||
|
c.decOpcodeIndex()
|
||
|
c.decPtrIndex()
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) incOpcodeIndex() {
|
||
|
c.opcodeIndex++
|
||
|
if c.parent != nil {
|
||
|
c.parent.incOpcodeIndex()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) decOpcodeIndex() {
|
||
|
c.opcodeIndex--
|
||
|
if c.parent != nil {
|
||
|
c.parent.decOpcodeIndex()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) incPtrIndex() {
|
||
|
c.ptrIndex++
|
||
|
if c.parent != nil {
|
||
|
c.parent.incPtrIndex()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *compileContext) decPtrIndex() {
|
||
|
c.ptrIndex--
|
||
|
if c.parent != nil {
|
||
|
c.parent.decPtrIndex()
|
||
|
}
|
||
|
}
|