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

Method ToOpcode

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

Source from the content-addressed store, hash-verified

408}
409
410func (c *StructCode) ToOpcode(ctx *compileContext) Opcodes {
411 // header => code => structField => code => end
412 // ^ |
413 // |__________|
414 if c.isRecursive {
415 recursive := newRecursiveCode(ctx, c.typ, &CompiledCode{})
416 recursive.Type = c.typ
417 ctx.incIndex()
418 *ctx.recursiveCodes = append(*ctx.recursiveCodes, recursive)
419 return Opcodes{recursive}
420 }
421 codes := Opcodes{}
422 var prevField *Opcode
423 ctx.incIndent()
424 for idx, field := range c.fields {
425 isFirstField := idx == 0
426 isEndField := idx == len(c.fields)-1
427 fieldCodes := field.ToOpcode(ctx, isFirstField, isEndField)
428 for _, code := range fieldCodes {
429 if c.isIndirect {
430 code.Flags |= IndirectFlags
431 }
432 }
433 firstField := fieldCodes.First()
434 if len(codes) > 0 {
435 codes.Last().Next = firstField
436 firstField.Idx = codes.First().Idx
437 }
438 if prevField != nil {
439 prevField.NextField = firstField
440 }
441 if isEndField {
442 endField := fieldCodes.Last()
443 if len(codes) > 0 {
444 codes.First().End = endField
445 } else {
446 firstField.End = endField
447 }
448 codes = codes.Add(fieldCodes...)
449 break
450 }
451 prevField = c.lastFieldCode(field, firstField)
452 codes = codes.Add(fieldCodes...)
453 }
454 if len(codes) == 0 {
455 head := &Opcode{
456 Op: OpStructHead,
457 Idx: opcodeOffset(ctx.ptrIndex),
458 Type: c.typ,
459 DisplayIdx: ctx.opcodeIndex,
460 Indent: ctx.indent,
461 }
462 ctx.incOpcodeIndex()
463 end := &Opcode{
464 Op: OpStructEnd,
465 Idx: opcodeOffset(ctx.ptrIndex),
466 DisplayIdx: ctx.opcodeIndex,
467 Indent: ctx.indent,

Callers

nothing calls this directly

Calls 11

FirstMethod · 0.95
LastMethod · 0.95
AddMethod · 0.95
lastFieldCodeMethod · 0.95
newRecursiveCodeFunction · 0.85
opcodeOffsetFunction · 0.85
incIndexMethod · 0.80
incIndentMethod · 0.80
incOpcodeIndexMethod · 0.80
decIndentMethod · 0.80
ToOpcodeMethod · 0.65

Tested by

no test coverage detected