MCPcopy
hub / github.com/google/gvisor / encodeObject

Method encodeObject

pkg/state/encode.go:677–746  ·  view source on GitHub ↗

encodeObject encodes an object.

(obj reflect.Value, how encodeStrategy, dest *wire.Object)

Source from the content-addressed store, hash-verified

675
676// encodeObject encodes an object.
677func (es *encodeState) encodeObject(obj reflect.Value, how encodeStrategy, dest *wire.Object) {
678 if how == encodeDefault && isPrimitiveZero(obj.Type()) && obj.IsZero() {
679 *dest = wire.Nil{}
680 return
681 }
682 switch obj.Kind() {
683 case reflect.Ptr: // Fast path: first.
684 r := new(wire.Ref)
685 *dest = r
686 if obj.IsNil() {
687 // May be in an array or elsewhere such that a value is
688 // required. So we encode as a reference to the zero
689 // object, which does not exist. Note that this has to
690 // be handled correctly in the decode path as well.
691 return
692 }
693 es.resolve(obj, r)
694 case reflect.Bool:
695 *dest = wire.Bool(obj.Bool())
696 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
697 *dest = wire.Int(obj.Int())
698 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
699 *dest = wire.Uint(obj.Uint())
700 case reflect.Float32:
701 *dest = wire.Float32(obj.Float())
702 case reflect.Float64:
703 *dest = wire.Float64(obj.Float())
704 case reflect.Complex64:
705 c := wire.Complex64(obj.Complex())
706 *dest = &c // Needs alloc.
707 case reflect.Complex128:
708 c := wire.Complex128(obj.Complex())
709 *dest = &c // Needs alloc.
710 case reflect.String:
711 s := wire.String(obj.String())
712 *dest = &s // Needs alloc.
713 case reflect.Array:
714 es.encodeArray(obj, dest)
715 case reflect.Slice:
716 s := &wire.Slice{
717 Capacity: wire.Uint(obj.Cap()),
718 Length: wire.Uint(obj.Len()),
719 }
720 *dest = s
721 // Note that we do need to provide a wire.Slice type here as
722 // how is not encodeDefault. If this were the case, then it
723 // would have been caught by the IsZero check above and we
724 // would have just used wire.Nil{}.
725 if obj.IsNil() {
726 return
727 }
728 // Slices need pointer resolution.
729 es.resolve(arrayFromSlice(obj), &s.Ref)
730 case reflect.Interface:
731 es.encodeInterface(obj, dest)
732 case reflect.Struct:
733 es.encodeStruct(obj, dest)
734 case reflect.Map:

Callers 5

encodeMapMethod · 0.95
encodeArrayMethod · 0.95
encodeInterfaceMethod · 0.95
SaveMethod · 0.95
saveMethod · 0.80

Calls 15

resolveMethod · 0.95
encodeArrayMethod · 0.95
encodeInterfaceMethod · 0.95
encodeStructMethod · 0.95
encodeMapMethod · 0.95
BoolTypeAlias · 0.92
IntTypeAlias · 0.92
UintTypeAlias · 0.92
Float32TypeAlias · 0.92
Float64TypeAlias · 0.92
Complex64TypeAlias · 0.92
Complex128TypeAlias · 0.92

Tested by

no test coverage detected