File tree 2 files changed +412
-6
lines changed
2 files changed +412
-6
lines changed Original file line number Diff line number Diff line change @@ -31,8 +31,8 @@ type opcodeMap struct {
31
31
}
32
32
33
33
type opcodeSet struct {
34
- codeIndent * opcode
35
- code * opcode
34
+ codeIndent sync. Pool
35
+ code sync. Pool
36
36
}
37
37
38
38
func (m * opcodeMap ) get (k uintptr ) * opcodeSet {
@@ -48,6 +48,7 @@ func (m *opcodeMap) set(k uintptr, op *opcodeSet) {
48
48
49
49
var (
50
50
encPool sync.Pool
51
+ codePool sync.Pool
51
52
cachedOpcode opcodeMap
52
53
marshalJSONType reflect.Type
53
54
marshalTextType reflect.Type
@@ -147,15 +148,20 @@ func (e *Encoder) encode(v interface{}) error {
147
148
if codeSet := cachedOpcode .get (typeptr ); codeSet != nil {
148
149
var code * opcode
149
150
if e .enabledIndent {
150
- code = codeSet .codeIndent
151
+ code = codeSet .codeIndent . Get ().( * opcode )
151
152
} else {
152
- code = codeSet .code
153
+ code = codeSet .code . Get ().( * opcode )
153
154
}
154
155
p := uintptr (header .ptr )
155
156
code .ptr = p
156
157
if err := e .run (code ); err != nil {
157
158
return err
158
159
}
160
+ if e .enabledIndent {
161
+ codeSet .codeIndent .Put (code )
162
+ } else {
163
+ codeSet .code .Put (code )
164
+ }
159
165
return nil
160
166
}
161
167
@@ -170,13 +176,25 @@ func (e *Encoder) encode(v interface{}) error {
170
176
if err != nil {
171
177
return err
172
178
}
173
- codeSet := & opcodeSet {codeIndent : codeIndent , code : code }
179
+ codeSet := & opcodeSet {
180
+ codeIndent : sync.Pool {
181
+ New : func () interface {} {
182
+ return copyOpcode (codeIndent )
183
+ },
184
+ },
185
+ code : sync.Pool {
186
+ New : func () interface {} {
187
+ return copyOpcode (code )
188
+ },
189
+ },
190
+ }
174
191
cachedOpcode .set (typeptr , codeSet )
175
192
p := uintptr (header .ptr )
176
- code .ptr = p
177
193
if e .enabledIndent {
194
+ codeIndent .ptr = p
178
195
return e .run (codeIndent )
179
196
}
197
+ code .ptr = p
180
198
return e .run (code )
181
199
}
182
200
You can’t perform that action at this time.
0 commit comments