MCPcopy Index your code
hub / github.com/goccy/go-json / ToAnonymousOpcode

Method ToAnonymousOpcode

internal/encoder/code.go:480–523  ·  view source on GitHub ↗
(ctx *compileContext)

Source from the content-addressed store, hash-verified

478}
479
480func (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
525func (c *StructCode) removeFieldsByTags(tags runtime.StructTags) {
526 fields := make([]*StructFieldCode, 0, len(c.fields))

Callers

nothing calls this directly

Calls 6

FirstMethod · 0.95
LastMethod · 0.95
AddMethod · 0.95
newRecursiveCodeFunction · 0.85
incIndexMethod · 0.80
ToAnonymousOpcodeMethod · 0.65

Tested by

no test coverage detected