From d84b6bca18afd5364505e9571917b6ecd88cd9cc Mon Sep 17 00:00:00 2001 From: Masaaki Goshima Date: Thu, 11 Mar 2021 17:59:22 +0900 Subject: [PATCH] Fix recursive call --- cmd/generator/main.go | 2 +- encode_compile.go | 14 +- encode_optype.go | 804 ++++++++++++++++++++++-------------------- encode_vm.go | 10 +- encode_vm_escaped.go | 11 +- 5 files changed, 439 insertions(+), 402 deletions(-) diff --git a/cmd/generator/main.go b/cmd/generator/main.go index 26c6043..6c3d7e0 100644 --- a/cmd/generator/main.go +++ b/cmd/generator/main.go @@ -237,7 +237,7 @@ func (t opType) fieldToStringTagField() opType { "array", "map", "slice", "struct", "MarshalJSON", "MarshalText", "recursive", "intString", "uintString", "intPtr", "uintPtr", "float32Ptr", "float64Ptr", "boolPtr", "stringPtr", "bytesPtr", "numberPtr", - "arrayPtr", "mapPtr", "slicePtr", "marshalJSONPtr", "marshalTextPtr", "interfacePtr", + "arrayPtr", "mapPtr", "slicePtr", "marshalJSONPtr", "marshalTextPtr", "interfacePtr", "recursivePtr", } primitiveTypesUpper := []string{} for _, typ := range primitiveTypes { diff --git a/encode_compile.go b/encode_compile.go index 65ed1dd..10fef4b 100644 --- a/encode_compile.go +++ b/encode_compile.go @@ -103,7 +103,7 @@ func encodeCompileHead(ctx *encodeCompileContext) (*opcode, error) { func encodeLinkRecursiveCode(c *opcode) { for code := c; code.op != opEnd && code.op != opStructFieldRecursiveEnd; { switch code.op { - case opStructFieldRecursive, opStructFieldPtrHeadRecursive: + case opStructFieldRecursive, opStructFieldRecursivePtr: if code.jmp.linked { code = code.next continue @@ -144,7 +144,7 @@ func encodeLinkRecursiveCode(c *opcode) { func encodeOptimizeStructEnd(c *opcode) { for code := c; code.op != opEnd; { - if code.op == opStructFieldRecursive { + if code.op == opStructFieldRecursive || code.op == opStructFieldRecursivePtr { // ignore if exists recursive operation return } @@ -313,6 +313,8 @@ func encodeConvertPtrOp(code *opcode) opType { return opMarshalTextPtr case opInterface: return opInterfacePtr + case opStructFieldRecursive: + return opStructFieldRecursivePtr } return code.op } @@ -867,8 +869,6 @@ func encodeTypeToFieldType(ctx *encodeCompileContext, code *opcode) opType { return opStructFieldMarshalText case opMarshalTextPtr: return opStructFieldMarshalTextPtr - case opStructFieldRecursive: - return opStructFieldRecursive } return opStructField } @@ -1294,12 +1294,6 @@ func encodeCompileStruct(ctx *encodeCompileContext, isPtr bool) (*opcode, error) } if field.Anonymous { - if valueCode.op == opPtr && valueCode.next.op == opStructFieldRecursive { - valueCode = valueCode.next - valueCode.decOpcodeIndex() - ctx.decIndex() - valueCode.op = opStructFieldPtrHeadRecursive - } tagKey := "" if tag.isTaggedKey { tagKey = tag.key diff --git a/encode_optype.go b/encode_optype.go index 8914d47..0a384f3 100644 --- a/encode_optype.go +++ b/encode_optype.go @@ -22,7 +22,7 @@ const ( codeStructEnd codeType = 11 ) -var opTypeStrings = [429]string{ +var opTypeStrings = [442]string{ "End", "Interface", "Ptr", @@ -68,6 +68,7 @@ var opTypeStrings = [429]string{ "MarshalJSONPtr", "MarshalTextPtr", "InterfacePtr", + "RecursivePtr", "StructFieldHeadInt", "StructFieldHeadOmitEmptyInt", "StructFieldHeadStringTagInt", @@ -254,6 +255,12 @@ var opTypeStrings = [429]string{ "StructFieldPtrHeadInterfacePtr", "StructFieldPtrHeadOmitEmptyInterfacePtr", "StructFieldPtrHeadStringTagInterfacePtr", + "StructFieldHeadRecursivePtr", + "StructFieldHeadOmitEmptyRecursivePtr", + "StructFieldHeadStringTagRecursivePtr", + "StructFieldPtrHeadRecursivePtr", + "StructFieldPtrHeadOmitEmptyRecursivePtr", + "StructFieldPtrHeadStringTagRecursivePtr", "StructFieldHead", "StructFieldHeadOmitEmpty", "StructFieldHeadStringTag", @@ -353,6 +360,9 @@ var opTypeStrings = [429]string{ "StructFieldInterfacePtr", "StructFieldOmitEmptyInterfacePtr", "StructFieldStringTagInterfacePtr", + "StructFieldRecursivePtr", + "StructFieldOmitEmptyRecursivePtr", + "StructFieldStringTagRecursivePtr", "StructField", "StructFieldOmitEmpty", "StructFieldStringTag", @@ -449,6 +459,9 @@ var opTypeStrings = [429]string{ "StructEndInterfacePtr", "StructEndOmitEmptyInterfacePtr", "StructEndStringTagInterfacePtr", + "StructEndRecursivePtr", + "StructEndOmitEmptyRecursivePtr", + "StructEndStringTagRecursivePtr", "StructEnd", "StructEndOmitEmpty", "StructEndStringTag", @@ -502,394 +515,407 @@ const ( opMarshalJSONPtr opType = 42 opMarshalTextPtr opType = 43 opInterfacePtr opType = 44 - opStructFieldHeadInt opType = 45 - opStructFieldHeadOmitEmptyInt opType = 46 - opStructFieldHeadStringTagInt opType = 47 - opStructFieldPtrHeadInt opType = 48 - opStructFieldPtrHeadOmitEmptyInt opType = 49 - opStructFieldPtrHeadStringTagInt opType = 50 - opStructFieldHeadUint opType = 51 - opStructFieldHeadOmitEmptyUint opType = 52 - opStructFieldHeadStringTagUint opType = 53 - opStructFieldPtrHeadUint opType = 54 - opStructFieldPtrHeadOmitEmptyUint opType = 55 - opStructFieldPtrHeadStringTagUint opType = 56 - opStructFieldHeadFloat32 opType = 57 - opStructFieldHeadOmitEmptyFloat32 opType = 58 - opStructFieldHeadStringTagFloat32 opType = 59 - opStructFieldPtrHeadFloat32 opType = 60 - opStructFieldPtrHeadOmitEmptyFloat32 opType = 61 - opStructFieldPtrHeadStringTagFloat32 opType = 62 - opStructFieldHeadFloat64 opType = 63 - opStructFieldHeadOmitEmptyFloat64 opType = 64 - opStructFieldHeadStringTagFloat64 opType = 65 - opStructFieldPtrHeadFloat64 opType = 66 - opStructFieldPtrHeadOmitEmptyFloat64 opType = 67 - opStructFieldPtrHeadStringTagFloat64 opType = 68 - opStructFieldHeadBool opType = 69 - opStructFieldHeadOmitEmptyBool opType = 70 - opStructFieldHeadStringTagBool opType = 71 - opStructFieldPtrHeadBool opType = 72 - opStructFieldPtrHeadOmitEmptyBool opType = 73 - opStructFieldPtrHeadStringTagBool opType = 74 - opStructFieldHeadString opType = 75 - opStructFieldHeadOmitEmptyString opType = 76 - opStructFieldHeadStringTagString opType = 77 - opStructFieldPtrHeadString opType = 78 - opStructFieldPtrHeadOmitEmptyString opType = 79 - opStructFieldPtrHeadStringTagString opType = 80 - opStructFieldHeadBytes opType = 81 - opStructFieldHeadOmitEmptyBytes opType = 82 - opStructFieldHeadStringTagBytes opType = 83 - opStructFieldPtrHeadBytes opType = 84 - opStructFieldPtrHeadOmitEmptyBytes opType = 85 - opStructFieldPtrHeadStringTagBytes opType = 86 - opStructFieldHeadNumber opType = 87 - opStructFieldHeadOmitEmptyNumber opType = 88 - opStructFieldHeadStringTagNumber opType = 89 - opStructFieldPtrHeadNumber opType = 90 - opStructFieldPtrHeadOmitEmptyNumber opType = 91 - opStructFieldPtrHeadStringTagNumber opType = 92 - opStructFieldHeadArray opType = 93 - opStructFieldHeadOmitEmptyArray opType = 94 - opStructFieldHeadStringTagArray opType = 95 - opStructFieldPtrHeadArray opType = 96 - opStructFieldPtrHeadOmitEmptyArray opType = 97 - opStructFieldPtrHeadStringTagArray opType = 98 - opStructFieldHeadMap opType = 99 - opStructFieldHeadOmitEmptyMap opType = 100 - opStructFieldHeadStringTagMap opType = 101 - opStructFieldPtrHeadMap opType = 102 - opStructFieldPtrHeadOmitEmptyMap opType = 103 - opStructFieldPtrHeadStringTagMap opType = 104 - opStructFieldHeadSlice opType = 105 - opStructFieldHeadOmitEmptySlice opType = 106 - opStructFieldHeadStringTagSlice opType = 107 - opStructFieldPtrHeadSlice opType = 108 - opStructFieldPtrHeadOmitEmptySlice opType = 109 - opStructFieldPtrHeadStringTagSlice opType = 110 - opStructFieldHeadStruct opType = 111 - opStructFieldHeadOmitEmptyStruct opType = 112 - opStructFieldHeadStringTagStruct opType = 113 - opStructFieldPtrHeadStruct opType = 114 - opStructFieldPtrHeadOmitEmptyStruct opType = 115 - opStructFieldPtrHeadStringTagStruct opType = 116 - opStructFieldHeadMarshalJSON opType = 117 - opStructFieldHeadOmitEmptyMarshalJSON opType = 118 - opStructFieldHeadStringTagMarshalJSON opType = 119 - opStructFieldPtrHeadMarshalJSON opType = 120 - opStructFieldPtrHeadOmitEmptyMarshalJSON opType = 121 - opStructFieldPtrHeadStringTagMarshalJSON opType = 122 - opStructFieldHeadMarshalText opType = 123 - opStructFieldHeadOmitEmptyMarshalText opType = 124 - opStructFieldHeadStringTagMarshalText opType = 125 - opStructFieldPtrHeadMarshalText opType = 126 - opStructFieldPtrHeadOmitEmptyMarshalText opType = 127 - opStructFieldPtrHeadStringTagMarshalText opType = 128 - opStructFieldHeadRecursive opType = 129 - opStructFieldHeadOmitEmptyRecursive opType = 130 - opStructFieldHeadStringTagRecursive opType = 131 - opStructFieldPtrHeadRecursive opType = 132 - opStructFieldPtrHeadOmitEmptyRecursive opType = 133 - opStructFieldPtrHeadStringTagRecursive opType = 134 - opStructFieldHeadIntString opType = 135 - opStructFieldHeadOmitEmptyIntString opType = 136 - opStructFieldHeadStringTagIntString opType = 137 - opStructFieldPtrHeadIntString opType = 138 - opStructFieldPtrHeadOmitEmptyIntString opType = 139 - opStructFieldPtrHeadStringTagIntString opType = 140 - opStructFieldHeadUintString opType = 141 - opStructFieldHeadOmitEmptyUintString opType = 142 - opStructFieldHeadStringTagUintString opType = 143 - opStructFieldPtrHeadUintString opType = 144 - opStructFieldPtrHeadOmitEmptyUintString opType = 145 - opStructFieldPtrHeadStringTagUintString opType = 146 - opStructFieldHeadIntPtr opType = 147 - opStructFieldHeadOmitEmptyIntPtr opType = 148 - opStructFieldHeadStringTagIntPtr opType = 149 - opStructFieldPtrHeadIntPtr opType = 150 - opStructFieldPtrHeadOmitEmptyIntPtr opType = 151 - opStructFieldPtrHeadStringTagIntPtr opType = 152 - opStructFieldHeadUintPtr opType = 153 - opStructFieldHeadOmitEmptyUintPtr opType = 154 - opStructFieldHeadStringTagUintPtr opType = 155 - opStructFieldPtrHeadUintPtr opType = 156 - opStructFieldPtrHeadOmitEmptyUintPtr opType = 157 - opStructFieldPtrHeadStringTagUintPtr opType = 158 - opStructFieldHeadFloat32Ptr opType = 159 - opStructFieldHeadOmitEmptyFloat32Ptr opType = 160 - opStructFieldHeadStringTagFloat32Ptr opType = 161 - opStructFieldPtrHeadFloat32Ptr opType = 162 - opStructFieldPtrHeadOmitEmptyFloat32Ptr opType = 163 - opStructFieldPtrHeadStringTagFloat32Ptr opType = 164 - opStructFieldHeadFloat64Ptr opType = 165 - opStructFieldHeadOmitEmptyFloat64Ptr opType = 166 - opStructFieldHeadStringTagFloat64Ptr opType = 167 - opStructFieldPtrHeadFloat64Ptr opType = 168 - opStructFieldPtrHeadOmitEmptyFloat64Ptr opType = 169 - opStructFieldPtrHeadStringTagFloat64Ptr opType = 170 - opStructFieldHeadBoolPtr opType = 171 - opStructFieldHeadOmitEmptyBoolPtr opType = 172 - opStructFieldHeadStringTagBoolPtr opType = 173 - opStructFieldPtrHeadBoolPtr opType = 174 - opStructFieldPtrHeadOmitEmptyBoolPtr opType = 175 - opStructFieldPtrHeadStringTagBoolPtr opType = 176 - opStructFieldHeadStringPtr opType = 177 - opStructFieldHeadOmitEmptyStringPtr opType = 178 - opStructFieldHeadStringTagStringPtr opType = 179 - opStructFieldPtrHeadStringPtr opType = 180 - opStructFieldPtrHeadOmitEmptyStringPtr opType = 181 - opStructFieldPtrHeadStringTagStringPtr opType = 182 - opStructFieldHeadBytesPtr opType = 183 - opStructFieldHeadOmitEmptyBytesPtr opType = 184 - opStructFieldHeadStringTagBytesPtr opType = 185 - opStructFieldPtrHeadBytesPtr opType = 186 - opStructFieldPtrHeadOmitEmptyBytesPtr opType = 187 - opStructFieldPtrHeadStringTagBytesPtr opType = 188 - opStructFieldHeadNumberPtr opType = 189 - opStructFieldHeadOmitEmptyNumberPtr opType = 190 - opStructFieldHeadStringTagNumberPtr opType = 191 - opStructFieldPtrHeadNumberPtr opType = 192 - opStructFieldPtrHeadOmitEmptyNumberPtr opType = 193 - opStructFieldPtrHeadStringTagNumberPtr opType = 194 - opStructFieldHeadArrayPtr opType = 195 - opStructFieldHeadOmitEmptyArrayPtr opType = 196 - opStructFieldHeadStringTagArrayPtr opType = 197 - opStructFieldPtrHeadArrayPtr opType = 198 - opStructFieldPtrHeadOmitEmptyArrayPtr opType = 199 - opStructFieldPtrHeadStringTagArrayPtr opType = 200 - opStructFieldHeadMapPtr opType = 201 - opStructFieldHeadOmitEmptyMapPtr opType = 202 - opStructFieldHeadStringTagMapPtr opType = 203 - opStructFieldPtrHeadMapPtr opType = 204 - opStructFieldPtrHeadOmitEmptyMapPtr opType = 205 - opStructFieldPtrHeadStringTagMapPtr opType = 206 - opStructFieldHeadSlicePtr opType = 207 - opStructFieldHeadOmitEmptySlicePtr opType = 208 - opStructFieldHeadStringTagSlicePtr opType = 209 - opStructFieldPtrHeadSlicePtr opType = 210 - opStructFieldPtrHeadOmitEmptySlicePtr opType = 211 - opStructFieldPtrHeadStringTagSlicePtr opType = 212 - opStructFieldHeadMarshalJSONPtr opType = 213 - opStructFieldHeadOmitEmptyMarshalJSONPtr opType = 214 - opStructFieldHeadStringTagMarshalJSONPtr opType = 215 - opStructFieldPtrHeadMarshalJSONPtr opType = 216 - opStructFieldPtrHeadOmitEmptyMarshalJSONPtr opType = 217 - opStructFieldPtrHeadStringTagMarshalJSONPtr opType = 218 - opStructFieldHeadMarshalTextPtr opType = 219 - opStructFieldHeadOmitEmptyMarshalTextPtr opType = 220 - opStructFieldHeadStringTagMarshalTextPtr opType = 221 - opStructFieldPtrHeadMarshalTextPtr opType = 222 - opStructFieldPtrHeadOmitEmptyMarshalTextPtr opType = 223 - opStructFieldPtrHeadStringTagMarshalTextPtr opType = 224 - opStructFieldHeadInterfacePtr opType = 225 - opStructFieldHeadOmitEmptyInterfacePtr opType = 226 - opStructFieldHeadStringTagInterfacePtr opType = 227 - opStructFieldPtrHeadInterfacePtr opType = 228 - opStructFieldPtrHeadOmitEmptyInterfacePtr opType = 229 - opStructFieldPtrHeadStringTagInterfacePtr opType = 230 - opStructFieldHead opType = 231 - opStructFieldHeadOmitEmpty opType = 232 - opStructFieldHeadStringTag opType = 233 - opStructFieldPtrHead opType = 234 - opStructFieldPtrHeadOmitEmpty opType = 235 - opStructFieldPtrHeadStringTag opType = 236 - opStructFieldInt opType = 237 - opStructFieldOmitEmptyInt opType = 238 - opStructFieldStringTagInt opType = 239 - opStructFieldUint opType = 240 - opStructFieldOmitEmptyUint opType = 241 - opStructFieldStringTagUint opType = 242 - opStructFieldFloat32 opType = 243 - opStructFieldOmitEmptyFloat32 opType = 244 - opStructFieldStringTagFloat32 opType = 245 - opStructFieldFloat64 opType = 246 - opStructFieldOmitEmptyFloat64 opType = 247 - opStructFieldStringTagFloat64 opType = 248 - opStructFieldBool opType = 249 - opStructFieldOmitEmptyBool opType = 250 - opStructFieldStringTagBool opType = 251 - opStructFieldString opType = 252 - opStructFieldOmitEmptyString opType = 253 - opStructFieldStringTagString opType = 254 - opStructFieldBytes opType = 255 - opStructFieldOmitEmptyBytes opType = 256 - opStructFieldStringTagBytes opType = 257 - opStructFieldNumber opType = 258 - opStructFieldOmitEmptyNumber opType = 259 - opStructFieldStringTagNumber opType = 260 - opStructFieldArray opType = 261 - opStructFieldOmitEmptyArray opType = 262 - opStructFieldStringTagArray opType = 263 - opStructFieldMap opType = 264 - opStructFieldOmitEmptyMap opType = 265 - opStructFieldStringTagMap opType = 266 - opStructFieldSlice opType = 267 - opStructFieldOmitEmptySlice opType = 268 - opStructFieldStringTagSlice opType = 269 - opStructFieldStruct opType = 270 - opStructFieldOmitEmptyStruct opType = 271 - opStructFieldStringTagStruct opType = 272 - opStructFieldMarshalJSON opType = 273 - opStructFieldOmitEmptyMarshalJSON opType = 274 - opStructFieldStringTagMarshalJSON opType = 275 - opStructFieldMarshalText opType = 276 - opStructFieldOmitEmptyMarshalText opType = 277 - opStructFieldStringTagMarshalText opType = 278 - opStructFieldRecursive opType = 279 - opStructFieldOmitEmptyRecursive opType = 280 - opStructFieldStringTagRecursive opType = 281 - opStructFieldIntString opType = 282 - opStructFieldOmitEmptyIntString opType = 283 - opStructFieldStringTagIntString opType = 284 - opStructFieldUintString opType = 285 - opStructFieldOmitEmptyUintString opType = 286 - opStructFieldStringTagUintString opType = 287 - opStructFieldIntPtr opType = 288 - opStructFieldOmitEmptyIntPtr opType = 289 - opStructFieldStringTagIntPtr opType = 290 - opStructFieldUintPtr opType = 291 - opStructFieldOmitEmptyUintPtr opType = 292 - opStructFieldStringTagUintPtr opType = 293 - opStructFieldFloat32Ptr opType = 294 - opStructFieldOmitEmptyFloat32Ptr opType = 295 - opStructFieldStringTagFloat32Ptr opType = 296 - opStructFieldFloat64Ptr opType = 297 - opStructFieldOmitEmptyFloat64Ptr opType = 298 - opStructFieldStringTagFloat64Ptr opType = 299 - opStructFieldBoolPtr opType = 300 - opStructFieldOmitEmptyBoolPtr opType = 301 - opStructFieldStringTagBoolPtr opType = 302 - opStructFieldStringPtr opType = 303 - opStructFieldOmitEmptyStringPtr opType = 304 - opStructFieldStringTagStringPtr opType = 305 - opStructFieldBytesPtr opType = 306 - opStructFieldOmitEmptyBytesPtr opType = 307 - opStructFieldStringTagBytesPtr opType = 308 - opStructFieldNumberPtr opType = 309 - opStructFieldOmitEmptyNumberPtr opType = 310 - opStructFieldStringTagNumberPtr opType = 311 - opStructFieldArrayPtr opType = 312 - opStructFieldOmitEmptyArrayPtr opType = 313 - opStructFieldStringTagArrayPtr opType = 314 - opStructFieldMapPtr opType = 315 - opStructFieldOmitEmptyMapPtr opType = 316 - opStructFieldStringTagMapPtr opType = 317 - opStructFieldSlicePtr opType = 318 - opStructFieldOmitEmptySlicePtr opType = 319 - opStructFieldStringTagSlicePtr opType = 320 - opStructFieldMarshalJSONPtr opType = 321 - opStructFieldOmitEmptyMarshalJSONPtr opType = 322 - opStructFieldStringTagMarshalJSONPtr opType = 323 - opStructFieldMarshalTextPtr opType = 324 - opStructFieldOmitEmptyMarshalTextPtr opType = 325 - opStructFieldStringTagMarshalTextPtr opType = 326 - opStructFieldInterfacePtr opType = 327 - opStructFieldOmitEmptyInterfacePtr opType = 328 - opStructFieldStringTagInterfacePtr opType = 329 - opStructField opType = 330 - opStructFieldOmitEmpty opType = 331 - opStructFieldStringTag opType = 332 - opStructEndInt opType = 333 - opStructEndOmitEmptyInt opType = 334 - opStructEndStringTagInt opType = 335 - opStructEndUint opType = 336 - opStructEndOmitEmptyUint opType = 337 - opStructEndStringTagUint opType = 338 - opStructEndFloat32 opType = 339 - opStructEndOmitEmptyFloat32 opType = 340 - opStructEndStringTagFloat32 opType = 341 - opStructEndFloat64 opType = 342 - opStructEndOmitEmptyFloat64 opType = 343 - opStructEndStringTagFloat64 opType = 344 - opStructEndBool opType = 345 - opStructEndOmitEmptyBool opType = 346 - opStructEndStringTagBool opType = 347 - opStructEndString opType = 348 - opStructEndOmitEmptyString opType = 349 - opStructEndStringTagString opType = 350 - opStructEndBytes opType = 351 - opStructEndOmitEmptyBytes opType = 352 - opStructEndStringTagBytes opType = 353 - opStructEndNumber opType = 354 - opStructEndOmitEmptyNumber opType = 355 - opStructEndStringTagNumber opType = 356 - opStructEndArray opType = 357 - opStructEndOmitEmptyArray opType = 358 - opStructEndStringTagArray opType = 359 - opStructEndMap opType = 360 - opStructEndOmitEmptyMap opType = 361 - opStructEndStringTagMap opType = 362 - opStructEndSlice opType = 363 - opStructEndOmitEmptySlice opType = 364 - opStructEndStringTagSlice opType = 365 - opStructEndStruct opType = 366 - opStructEndOmitEmptyStruct opType = 367 - opStructEndStringTagStruct opType = 368 - opStructEndMarshalJSON opType = 369 - opStructEndOmitEmptyMarshalJSON opType = 370 - opStructEndStringTagMarshalJSON opType = 371 - opStructEndMarshalText opType = 372 - opStructEndOmitEmptyMarshalText opType = 373 - opStructEndStringTagMarshalText opType = 374 - opStructEndRecursive opType = 375 - opStructEndOmitEmptyRecursive opType = 376 - opStructEndStringTagRecursive opType = 377 - opStructEndIntString opType = 378 - opStructEndOmitEmptyIntString opType = 379 - opStructEndStringTagIntString opType = 380 - opStructEndUintString opType = 381 - opStructEndOmitEmptyUintString opType = 382 - opStructEndStringTagUintString opType = 383 - opStructEndIntPtr opType = 384 - opStructEndOmitEmptyIntPtr opType = 385 - opStructEndStringTagIntPtr opType = 386 - opStructEndUintPtr opType = 387 - opStructEndOmitEmptyUintPtr opType = 388 - opStructEndStringTagUintPtr opType = 389 - opStructEndFloat32Ptr opType = 390 - opStructEndOmitEmptyFloat32Ptr opType = 391 - opStructEndStringTagFloat32Ptr opType = 392 - opStructEndFloat64Ptr opType = 393 - opStructEndOmitEmptyFloat64Ptr opType = 394 - opStructEndStringTagFloat64Ptr opType = 395 - opStructEndBoolPtr opType = 396 - opStructEndOmitEmptyBoolPtr opType = 397 - opStructEndStringTagBoolPtr opType = 398 - opStructEndStringPtr opType = 399 - opStructEndOmitEmptyStringPtr opType = 400 - opStructEndStringTagStringPtr opType = 401 - opStructEndBytesPtr opType = 402 - opStructEndOmitEmptyBytesPtr opType = 403 - opStructEndStringTagBytesPtr opType = 404 - opStructEndNumberPtr opType = 405 - opStructEndOmitEmptyNumberPtr opType = 406 - opStructEndStringTagNumberPtr opType = 407 - opStructEndArrayPtr opType = 408 - opStructEndOmitEmptyArrayPtr opType = 409 - opStructEndStringTagArrayPtr opType = 410 - opStructEndMapPtr opType = 411 - opStructEndOmitEmptyMapPtr opType = 412 - opStructEndStringTagMapPtr opType = 413 - opStructEndSlicePtr opType = 414 - opStructEndOmitEmptySlicePtr opType = 415 - opStructEndStringTagSlicePtr opType = 416 - opStructEndMarshalJSONPtr opType = 417 - opStructEndOmitEmptyMarshalJSONPtr opType = 418 - opStructEndStringTagMarshalJSONPtr opType = 419 - opStructEndMarshalTextPtr opType = 420 - opStructEndOmitEmptyMarshalTextPtr opType = 421 - opStructEndStringTagMarshalTextPtr opType = 422 - opStructEndInterfacePtr opType = 423 - opStructEndOmitEmptyInterfacePtr opType = 424 - opStructEndStringTagInterfacePtr opType = 425 - opStructEnd opType = 426 - opStructEndOmitEmpty opType = 427 - opStructEndStringTag opType = 428 + opRecursivePtr opType = 45 + opStructFieldHeadInt opType = 46 + opStructFieldHeadOmitEmptyInt opType = 47 + opStructFieldHeadStringTagInt opType = 48 + opStructFieldPtrHeadInt opType = 49 + opStructFieldPtrHeadOmitEmptyInt opType = 50 + opStructFieldPtrHeadStringTagInt opType = 51 + opStructFieldHeadUint opType = 52 + opStructFieldHeadOmitEmptyUint opType = 53 + opStructFieldHeadStringTagUint opType = 54 + opStructFieldPtrHeadUint opType = 55 + opStructFieldPtrHeadOmitEmptyUint opType = 56 + opStructFieldPtrHeadStringTagUint opType = 57 + opStructFieldHeadFloat32 opType = 58 + opStructFieldHeadOmitEmptyFloat32 opType = 59 + opStructFieldHeadStringTagFloat32 opType = 60 + opStructFieldPtrHeadFloat32 opType = 61 + opStructFieldPtrHeadOmitEmptyFloat32 opType = 62 + opStructFieldPtrHeadStringTagFloat32 opType = 63 + opStructFieldHeadFloat64 opType = 64 + opStructFieldHeadOmitEmptyFloat64 opType = 65 + opStructFieldHeadStringTagFloat64 opType = 66 + opStructFieldPtrHeadFloat64 opType = 67 + opStructFieldPtrHeadOmitEmptyFloat64 opType = 68 + opStructFieldPtrHeadStringTagFloat64 opType = 69 + opStructFieldHeadBool opType = 70 + opStructFieldHeadOmitEmptyBool opType = 71 + opStructFieldHeadStringTagBool opType = 72 + opStructFieldPtrHeadBool opType = 73 + opStructFieldPtrHeadOmitEmptyBool opType = 74 + opStructFieldPtrHeadStringTagBool opType = 75 + opStructFieldHeadString opType = 76 + opStructFieldHeadOmitEmptyString opType = 77 + opStructFieldHeadStringTagString opType = 78 + opStructFieldPtrHeadString opType = 79 + opStructFieldPtrHeadOmitEmptyString opType = 80 + opStructFieldPtrHeadStringTagString opType = 81 + opStructFieldHeadBytes opType = 82 + opStructFieldHeadOmitEmptyBytes opType = 83 + opStructFieldHeadStringTagBytes opType = 84 + opStructFieldPtrHeadBytes opType = 85 + opStructFieldPtrHeadOmitEmptyBytes opType = 86 + opStructFieldPtrHeadStringTagBytes opType = 87 + opStructFieldHeadNumber opType = 88 + opStructFieldHeadOmitEmptyNumber opType = 89 + opStructFieldHeadStringTagNumber opType = 90 + opStructFieldPtrHeadNumber opType = 91 + opStructFieldPtrHeadOmitEmptyNumber opType = 92 + opStructFieldPtrHeadStringTagNumber opType = 93 + opStructFieldHeadArray opType = 94 + opStructFieldHeadOmitEmptyArray opType = 95 + opStructFieldHeadStringTagArray opType = 96 + opStructFieldPtrHeadArray opType = 97 + opStructFieldPtrHeadOmitEmptyArray opType = 98 + opStructFieldPtrHeadStringTagArray opType = 99 + opStructFieldHeadMap opType = 100 + opStructFieldHeadOmitEmptyMap opType = 101 + opStructFieldHeadStringTagMap opType = 102 + opStructFieldPtrHeadMap opType = 103 + opStructFieldPtrHeadOmitEmptyMap opType = 104 + opStructFieldPtrHeadStringTagMap opType = 105 + opStructFieldHeadSlice opType = 106 + opStructFieldHeadOmitEmptySlice opType = 107 + opStructFieldHeadStringTagSlice opType = 108 + opStructFieldPtrHeadSlice opType = 109 + opStructFieldPtrHeadOmitEmptySlice opType = 110 + opStructFieldPtrHeadStringTagSlice opType = 111 + opStructFieldHeadStruct opType = 112 + opStructFieldHeadOmitEmptyStruct opType = 113 + opStructFieldHeadStringTagStruct opType = 114 + opStructFieldPtrHeadStruct opType = 115 + opStructFieldPtrHeadOmitEmptyStruct opType = 116 + opStructFieldPtrHeadStringTagStruct opType = 117 + opStructFieldHeadMarshalJSON opType = 118 + opStructFieldHeadOmitEmptyMarshalJSON opType = 119 + opStructFieldHeadStringTagMarshalJSON opType = 120 + opStructFieldPtrHeadMarshalJSON opType = 121 + opStructFieldPtrHeadOmitEmptyMarshalJSON opType = 122 + opStructFieldPtrHeadStringTagMarshalJSON opType = 123 + opStructFieldHeadMarshalText opType = 124 + opStructFieldHeadOmitEmptyMarshalText opType = 125 + opStructFieldHeadStringTagMarshalText opType = 126 + opStructFieldPtrHeadMarshalText opType = 127 + opStructFieldPtrHeadOmitEmptyMarshalText opType = 128 + opStructFieldPtrHeadStringTagMarshalText opType = 129 + opStructFieldHeadRecursive opType = 130 + opStructFieldHeadOmitEmptyRecursive opType = 131 + opStructFieldHeadStringTagRecursive opType = 132 + opStructFieldPtrHeadRecursive opType = 133 + opStructFieldPtrHeadOmitEmptyRecursive opType = 134 + opStructFieldPtrHeadStringTagRecursive opType = 135 + opStructFieldHeadIntString opType = 136 + opStructFieldHeadOmitEmptyIntString opType = 137 + opStructFieldHeadStringTagIntString opType = 138 + opStructFieldPtrHeadIntString opType = 139 + opStructFieldPtrHeadOmitEmptyIntString opType = 140 + opStructFieldPtrHeadStringTagIntString opType = 141 + opStructFieldHeadUintString opType = 142 + opStructFieldHeadOmitEmptyUintString opType = 143 + opStructFieldHeadStringTagUintString opType = 144 + opStructFieldPtrHeadUintString opType = 145 + opStructFieldPtrHeadOmitEmptyUintString opType = 146 + opStructFieldPtrHeadStringTagUintString opType = 147 + opStructFieldHeadIntPtr opType = 148 + opStructFieldHeadOmitEmptyIntPtr opType = 149 + opStructFieldHeadStringTagIntPtr opType = 150 + opStructFieldPtrHeadIntPtr opType = 151 + opStructFieldPtrHeadOmitEmptyIntPtr opType = 152 + opStructFieldPtrHeadStringTagIntPtr opType = 153 + opStructFieldHeadUintPtr opType = 154 + opStructFieldHeadOmitEmptyUintPtr opType = 155 + opStructFieldHeadStringTagUintPtr opType = 156 + opStructFieldPtrHeadUintPtr opType = 157 + opStructFieldPtrHeadOmitEmptyUintPtr opType = 158 + opStructFieldPtrHeadStringTagUintPtr opType = 159 + opStructFieldHeadFloat32Ptr opType = 160 + opStructFieldHeadOmitEmptyFloat32Ptr opType = 161 + opStructFieldHeadStringTagFloat32Ptr opType = 162 + opStructFieldPtrHeadFloat32Ptr opType = 163 + opStructFieldPtrHeadOmitEmptyFloat32Ptr opType = 164 + opStructFieldPtrHeadStringTagFloat32Ptr opType = 165 + opStructFieldHeadFloat64Ptr opType = 166 + opStructFieldHeadOmitEmptyFloat64Ptr opType = 167 + opStructFieldHeadStringTagFloat64Ptr opType = 168 + opStructFieldPtrHeadFloat64Ptr opType = 169 + opStructFieldPtrHeadOmitEmptyFloat64Ptr opType = 170 + opStructFieldPtrHeadStringTagFloat64Ptr opType = 171 + opStructFieldHeadBoolPtr opType = 172 + opStructFieldHeadOmitEmptyBoolPtr opType = 173 + opStructFieldHeadStringTagBoolPtr opType = 174 + opStructFieldPtrHeadBoolPtr opType = 175 + opStructFieldPtrHeadOmitEmptyBoolPtr opType = 176 + opStructFieldPtrHeadStringTagBoolPtr opType = 177 + opStructFieldHeadStringPtr opType = 178 + opStructFieldHeadOmitEmptyStringPtr opType = 179 + opStructFieldHeadStringTagStringPtr opType = 180 + opStructFieldPtrHeadStringPtr opType = 181 + opStructFieldPtrHeadOmitEmptyStringPtr opType = 182 + opStructFieldPtrHeadStringTagStringPtr opType = 183 + opStructFieldHeadBytesPtr opType = 184 + opStructFieldHeadOmitEmptyBytesPtr opType = 185 + opStructFieldHeadStringTagBytesPtr opType = 186 + opStructFieldPtrHeadBytesPtr opType = 187 + opStructFieldPtrHeadOmitEmptyBytesPtr opType = 188 + opStructFieldPtrHeadStringTagBytesPtr opType = 189 + opStructFieldHeadNumberPtr opType = 190 + opStructFieldHeadOmitEmptyNumberPtr opType = 191 + opStructFieldHeadStringTagNumberPtr opType = 192 + opStructFieldPtrHeadNumberPtr opType = 193 + opStructFieldPtrHeadOmitEmptyNumberPtr opType = 194 + opStructFieldPtrHeadStringTagNumberPtr opType = 195 + opStructFieldHeadArrayPtr opType = 196 + opStructFieldHeadOmitEmptyArrayPtr opType = 197 + opStructFieldHeadStringTagArrayPtr opType = 198 + opStructFieldPtrHeadArrayPtr opType = 199 + opStructFieldPtrHeadOmitEmptyArrayPtr opType = 200 + opStructFieldPtrHeadStringTagArrayPtr opType = 201 + opStructFieldHeadMapPtr opType = 202 + opStructFieldHeadOmitEmptyMapPtr opType = 203 + opStructFieldHeadStringTagMapPtr opType = 204 + opStructFieldPtrHeadMapPtr opType = 205 + opStructFieldPtrHeadOmitEmptyMapPtr opType = 206 + opStructFieldPtrHeadStringTagMapPtr opType = 207 + opStructFieldHeadSlicePtr opType = 208 + opStructFieldHeadOmitEmptySlicePtr opType = 209 + opStructFieldHeadStringTagSlicePtr opType = 210 + opStructFieldPtrHeadSlicePtr opType = 211 + opStructFieldPtrHeadOmitEmptySlicePtr opType = 212 + opStructFieldPtrHeadStringTagSlicePtr opType = 213 + opStructFieldHeadMarshalJSONPtr opType = 214 + opStructFieldHeadOmitEmptyMarshalJSONPtr opType = 215 + opStructFieldHeadStringTagMarshalJSONPtr opType = 216 + opStructFieldPtrHeadMarshalJSONPtr opType = 217 + opStructFieldPtrHeadOmitEmptyMarshalJSONPtr opType = 218 + opStructFieldPtrHeadStringTagMarshalJSONPtr opType = 219 + opStructFieldHeadMarshalTextPtr opType = 220 + opStructFieldHeadOmitEmptyMarshalTextPtr opType = 221 + opStructFieldHeadStringTagMarshalTextPtr opType = 222 + opStructFieldPtrHeadMarshalTextPtr opType = 223 + opStructFieldPtrHeadOmitEmptyMarshalTextPtr opType = 224 + opStructFieldPtrHeadStringTagMarshalTextPtr opType = 225 + opStructFieldHeadInterfacePtr opType = 226 + opStructFieldHeadOmitEmptyInterfacePtr opType = 227 + opStructFieldHeadStringTagInterfacePtr opType = 228 + opStructFieldPtrHeadInterfacePtr opType = 229 + opStructFieldPtrHeadOmitEmptyInterfacePtr opType = 230 + opStructFieldPtrHeadStringTagInterfacePtr opType = 231 + opStructFieldHeadRecursivePtr opType = 232 + opStructFieldHeadOmitEmptyRecursivePtr opType = 233 + opStructFieldHeadStringTagRecursivePtr opType = 234 + opStructFieldPtrHeadRecursivePtr opType = 235 + opStructFieldPtrHeadOmitEmptyRecursivePtr opType = 236 + opStructFieldPtrHeadStringTagRecursivePtr opType = 237 + opStructFieldHead opType = 238 + opStructFieldHeadOmitEmpty opType = 239 + opStructFieldHeadStringTag opType = 240 + opStructFieldPtrHead opType = 241 + opStructFieldPtrHeadOmitEmpty opType = 242 + opStructFieldPtrHeadStringTag opType = 243 + opStructFieldInt opType = 244 + opStructFieldOmitEmptyInt opType = 245 + opStructFieldStringTagInt opType = 246 + opStructFieldUint opType = 247 + opStructFieldOmitEmptyUint opType = 248 + opStructFieldStringTagUint opType = 249 + opStructFieldFloat32 opType = 250 + opStructFieldOmitEmptyFloat32 opType = 251 + opStructFieldStringTagFloat32 opType = 252 + opStructFieldFloat64 opType = 253 + opStructFieldOmitEmptyFloat64 opType = 254 + opStructFieldStringTagFloat64 opType = 255 + opStructFieldBool opType = 256 + opStructFieldOmitEmptyBool opType = 257 + opStructFieldStringTagBool opType = 258 + opStructFieldString opType = 259 + opStructFieldOmitEmptyString opType = 260 + opStructFieldStringTagString opType = 261 + opStructFieldBytes opType = 262 + opStructFieldOmitEmptyBytes opType = 263 + opStructFieldStringTagBytes opType = 264 + opStructFieldNumber opType = 265 + opStructFieldOmitEmptyNumber opType = 266 + opStructFieldStringTagNumber opType = 267 + opStructFieldArray opType = 268 + opStructFieldOmitEmptyArray opType = 269 + opStructFieldStringTagArray opType = 270 + opStructFieldMap opType = 271 + opStructFieldOmitEmptyMap opType = 272 + opStructFieldStringTagMap opType = 273 + opStructFieldSlice opType = 274 + opStructFieldOmitEmptySlice opType = 275 + opStructFieldStringTagSlice opType = 276 + opStructFieldStruct opType = 277 + opStructFieldOmitEmptyStruct opType = 278 + opStructFieldStringTagStruct opType = 279 + opStructFieldMarshalJSON opType = 280 + opStructFieldOmitEmptyMarshalJSON opType = 281 + opStructFieldStringTagMarshalJSON opType = 282 + opStructFieldMarshalText opType = 283 + opStructFieldOmitEmptyMarshalText opType = 284 + opStructFieldStringTagMarshalText opType = 285 + opStructFieldRecursive opType = 286 + opStructFieldOmitEmptyRecursive opType = 287 + opStructFieldStringTagRecursive opType = 288 + opStructFieldIntString opType = 289 + opStructFieldOmitEmptyIntString opType = 290 + opStructFieldStringTagIntString opType = 291 + opStructFieldUintString opType = 292 + opStructFieldOmitEmptyUintString opType = 293 + opStructFieldStringTagUintString opType = 294 + opStructFieldIntPtr opType = 295 + opStructFieldOmitEmptyIntPtr opType = 296 + opStructFieldStringTagIntPtr opType = 297 + opStructFieldUintPtr opType = 298 + opStructFieldOmitEmptyUintPtr opType = 299 + opStructFieldStringTagUintPtr opType = 300 + opStructFieldFloat32Ptr opType = 301 + opStructFieldOmitEmptyFloat32Ptr opType = 302 + opStructFieldStringTagFloat32Ptr opType = 303 + opStructFieldFloat64Ptr opType = 304 + opStructFieldOmitEmptyFloat64Ptr opType = 305 + opStructFieldStringTagFloat64Ptr opType = 306 + opStructFieldBoolPtr opType = 307 + opStructFieldOmitEmptyBoolPtr opType = 308 + opStructFieldStringTagBoolPtr opType = 309 + opStructFieldStringPtr opType = 310 + opStructFieldOmitEmptyStringPtr opType = 311 + opStructFieldStringTagStringPtr opType = 312 + opStructFieldBytesPtr opType = 313 + opStructFieldOmitEmptyBytesPtr opType = 314 + opStructFieldStringTagBytesPtr opType = 315 + opStructFieldNumberPtr opType = 316 + opStructFieldOmitEmptyNumberPtr opType = 317 + opStructFieldStringTagNumberPtr opType = 318 + opStructFieldArrayPtr opType = 319 + opStructFieldOmitEmptyArrayPtr opType = 320 + opStructFieldStringTagArrayPtr opType = 321 + opStructFieldMapPtr opType = 322 + opStructFieldOmitEmptyMapPtr opType = 323 + opStructFieldStringTagMapPtr opType = 324 + opStructFieldSlicePtr opType = 325 + opStructFieldOmitEmptySlicePtr opType = 326 + opStructFieldStringTagSlicePtr opType = 327 + opStructFieldMarshalJSONPtr opType = 328 + opStructFieldOmitEmptyMarshalJSONPtr opType = 329 + opStructFieldStringTagMarshalJSONPtr opType = 330 + opStructFieldMarshalTextPtr opType = 331 + opStructFieldOmitEmptyMarshalTextPtr opType = 332 + opStructFieldStringTagMarshalTextPtr opType = 333 + opStructFieldInterfacePtr opType = 334 + opStructFieldOmitEmptyInterfacePtr opType = 335 + opStructFieldStringTagInterfacePtr opType = 336 + opStructFieldRecursivePtr opType = 337 + opStructFieldOmitEmptyRecursivePtr opType = 338 + opStructFieldStringTagRecursivePtr opType = 339 + opStructField opType = 340 + opStructFieldOmitEmpty opType = 341 + opStructFieldStringTag opType = 342 + opStructEndInt opType = 343 + opStructEndOmitEmptyInt opType = 344 + opStructEndStringTagInt opType = 345 + opStructEndUint opType = 346 + opStructEndOmitEmptyUint opType = 347 + opStructEndStringTagUint opType = 348 + opStructEndFloat32 opType = 349 + opStructEndOmitEmptyFloat32 opType = 350 + opStructEndStringTagFloat32 opType = 351 + opStructEndFloat64 opType = 352 + opStructEndOmitEmptyFloat64 opType = 353 + opStructEndStringTagFloat64 opType = 354 + opStructEndBool opType = 355 + opStructEndOmitEmptyBool opType = 356 + opStructEndStringTagBool opType = 357 + opStructEndString opType = 358 + opStructEndOmitEmptyString opType = 359 + opStructEndStringTagString opType = 360 + opStructEndBytes opType = 361 + opStructEndOmitEmptyBytes opType = 362 + opStructEndStringTagBytes opType = 363 + opStructEndNumber opType = 364 + opStructEndOmitEmptyNumber opType = 365 + opStructEndStringTagNumber opType = 366 + opStructEndArray opType = 367 + opStructEndOmitEmptyArray opType = 368 + opStructEndStringTagArray opType = 369 + opStructEndMap opType = 370 + opStructEndOmitEmptyMap opType = 371 + opStructEndStringTagMap opType = 372 + opStructEndSlice opType = 373 + opStructEndOmitEmptySlice opType = 374 + opStructEndStringTagSlice opType = 375 + opStructEndStruct opType = 376 + opStructEndOmitEmptyStruct opType = 377 + opStructEndStringTagStruct opType = 378 + opStructEndMarshalJSON opType = 379 + opStructEndOmitEmptyMarshalJSON opType = 380 + opStructEndStringTagMarshalJSON opType = 381 + opStructEndMarshalText opType = 382 + opStructEndOmitEmptyMarshalText opType = 383 + opStructEndStringTagMarshalText opType = 384 + opStructEndRecursive opType = 385 + opStructEndOmitEmptyRecursive opType = 386 + opStructEndStringTagRecursive opType = 387 + opStructEndIntString opType = 388 + opStructEndOmitEmptyIntString opType = 389 + opStructEndStringTagIntString opType = 390 + opStructEndUintString opType = 391 + opStructEndOmitEmptyUintString opType = 392 + opStructEndStringTagUintString opType = 393 + opStructEndIntPtr opType = 394 + opStructEndOmitEmptyIntPtr opType = 395 + opStructEndStringTagIntPtr opType = 396 + opStructEndUintPtr opType = 397 + opStructEndOmitEmptyUintPtr opType = 398 + opStructEndStringTagUintPtr opType = 399 + opStructEndFloat32Ptr opType = 400 + opStructEndOmitEmptyFloat32Ptr opType = 401 + opStructEndStringTagFloat32Ptr opType = 402 + opStructEndFloat64Ptr opType = 403 + opStructEndOmitEmptyFloat64Ptr opType = 404 + opStructEndStringTagFloat64Ptr opType = 405 + opStructEndBoolPtr opType = 406 + opStructEndOmitEmptyBoolPtr opType = 407 + opStructEndStringTagBoolPtr opType = 408 + opStructEndStringPtr opType = 409 + opStructEndOmitEmptyStringPtr opType = 410 + opStructEndStringTagStringPtr opType = 411 + opStructEndBytesPtr opType = 412 + opStructEndOmitEmptyBytesPtr opType = 413 + opStructEndStringTagBytesPtr opType = 414 + opStructEndNumberPtr opType = 415 + opStructEndOmitEmptyNumberPtr opType = 416 + opStructEndStringTagNumberPtr opType = 417 + opStructEndArrayPtr opType = 418 + opStructEndOmitEmptyArrayPtr opType = 419 + opStructEndStringTagArrayPtr opType = 420 + opStructEndMapPtr opType = 421 + opStructEndOmitEmptyMapPtr opType = 422 + opStructEndStringTagMapPtr opType = 423 + opStructEndSlicePtr opType = 424 + opStructEndOmitEmptySlicePtr opType = 425 + opStructEndStringTagSlicePtr opType = 426 + opStructEndMarshalJSONPtr opType = 427 + opStructEndOmitEmptyMarshalJSONPtr opType = 428 + opStructEndStringTagMarshalJSONPtr opType = 429 + opStructEndMarshalTextPtr opType = 430 + opStructEndOmitEmptyMarshalTextPtr opType = 431 + opStructEndStringTagMarshalTextPtr opType = 432 + opStructEndInterfacePtr opType = 433 + opStructEndOmitEmptyInterfacePtr opType = 434 + opStructEndStringTagInterfacePtr opType = 435 + opStructEndRecursivePtr opType = 436 + opStructEndOmitEmptyRecursivePtr opType = 437 + opStructEndStringTagRecursivePtr opType = 438 + opStructEnd opType = 439 + opStructEndOmitEmpty opType = 440 + opStructEndStringTag opType = 441 ) func (t opType) String() string { - if int(t) >= 429 { + if int(t) >= 442 { return "" } return opTypeStrings[int(t)] @@ -1137,6 +1163,12 @@ func (t opType) fieldToEnd() opType { return opStructEndOmitEmptyInterfacePtr case opStructFieldStringTagInterfacePtr: return opStructEndStringTagInterfacePtr + case opStructFieldRecursivePtr: + return opStructEndRecursivePtr + case opStructFieldOmitEmptyRecursivePtr: + return opStructEndOmitEmptyRecursivePtr + case opStructFieldStringTagRecursivePtr: + return opStructEndStringTagRecursivePtr } return t } diff --git a/encode_vm.go b/encode_vm.go index 7501414..0488be3 100644 --- a/encode_vm.go +++ b/encode_vm.go @@ -432,8 +432,14 @@ func encodeRun(ctx *encodeRuntimeContext, b []byte, codeSet *opcodeSet, opt Enco mapCtx.buf = buf releaseMapContext(mapCtx) code = code.next - case opStructFieldPtrHeadRecursive: - store(ctxptr, code.idx, ptrToPtr(load(ctxptr, code.idx))) + case opStructFieldRecursivePtr: + p := load(ctxptr, code.idx) + if p == 0 { + code = code.next + break + } + store(ctxptr, code.idx, ptrToPtr(p)) + fallthrough case opStructFieldRecursive: ptr := load(ctxptr, code.idx) if ptr != 0 { diff --git a/encode_vm_escaped.go b/encode_vm_escaped.go index a34d9d3..82c1953 100644 --- a/encode_vm_escaped.go +++ b/encode_vm_escaped.go @@ -14,7 +14,6 @@ func encodeRunEscaped(ctx *encodeRuntimeContext, b []byte, codeSet *opcodeSet, o ptrOffset := uintptr(0) ctxptr := ctx.ptr() code := codeSet.code - //fmt.Println(code.dump()) for { switch code.op { @@ -393,8 +392,14 @@ func encodeRunEscaped(ctx *encodeRuntimeContext, b []byte, codeSet *opcodeSet, o mapCtx.buf = buf releaseMapContext(mapCtx) code = code.next - case opStructFieldPtrHeadRecursive: - store(ctxptr, code.idx, ptrToPtr(load(ctxptr, code.idx))) + case opStructFieldRecursivePtr: + p := load(ctxptr, code.idx) + if p == 0 { + code = code.next + break + } + store(ctxptr, code.idx, ptrToPtr(p)) + fallthrough case opStructFieldRecursive: ptr := load(ctxptr, code.idx) if ptr != 0 {