(ctx *compileContext)
| 478 | } |
| 479 | |
| 480 | func (c *StructCode) ToAnonymousOpcode(ctx *compileContext) Opcodes { |
| 481 | // header => code => structField => code => end |
| 482 | // ^ | |
| 483 | // |__________| |
| 484 | if c.isRecursive { |
| 485 | recursive := newRecursiveCode(ctx, c.typ, &CompiledCode{}) |
| 486 | recursive.Type = c.typ |
| 487 | ctx.incIndex() |
| 488 | *ctx.recursiveCodes = append(*ctx.recursiveCodes, recursive) |
| 489 | return Opcodes{recursive} |
| 490 | } |
| 491 | codes := Opcodes{} |
| 492 | var prevField *Opcode |
| 493 | for idx, field := range c.fields { |
| 494 | isFirstField := idx == 0 |
| 495 | isEndField := idx == len(c.fields)-1 |
| 496 | fieldCodes := field.ToAnonymousOpcode(ctx, isFirstField, isEndField) |
| 497 | for _, code := range fieldCodes { |
| 498 | if c.isIndirect { |
| 499 | code.Flags |= IndirectFlags |
| 500 | } |
| 501 | } |
| 502 | firstField := fieldCodes.First() |
| 503 | if len(codes) > 0 { |
| 504 | codes.Last().Next = firstField |
| 505 | firstField.Idx = codes.First().Idx |
| 506 | } |
| 507 | if prevField != nil { |
| 508 | prevField.NextField = firstField |
| 509 | } |
| 510 | if isEndField { |
| 511 | lastField := fieldCodes.Last() |
| 512 | if len(codes) > 0 { |
| 513 | codes.First().End = lastField |
| 514 | } else { |
| 515 | firstField.End = lastField |
| 516 | } |
| 517 | } |
| 518 | prevField = firstField |
| 519 | codes = codes.Add(fieldCodes...) |
| 520 | } |
| 521 | ctx.structTypeToCodes[uintptr(unsafe.Pointer(c.typ))] = codes |
| 522 | return codes |
| 523 | } |
| 524 | |
| 525 | func (c *StructCode) removeFieldsByTags(tags runtime.StructTags) { |
| 526 | fields := make([]*StructFieldCode, 0, len(c.fields)) |
nothing calls this directly
no test coverage detected