Fix recursive call

This commit is contained in:
Masaaki Goshima 2021-03-11 17:59:22 +09:00
parent b78ca46c15
commit d84b6bca18
5 changed files with 439 additions and 402 deletions

View File

@ -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 {

View File

@ -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

View File

@ -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
}

View File

@ -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 {

View File

@ -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 {