(s *Struct)
| 171 | } |
| 172 | |
| 173 | func (e *encodeGen) structmap(s *Struct) { |
| 174 | oeIdentPrefix := randIdent() |
| 175 | |
| 176 | var data []byte |
| 177 | nfields := len(s.Fields) |
| 178 | bm := bmask{ |
| 179 | bitlen: nfields, |
| 180 | varname: oeIdentPrefix + "Mask", |
| 181 | } |
| 182 | |
| 183 | omitempty := s.AnyHasTagPart("omitempty") |
| 184 | omitzero := s.AnyHasTagPart("omitzero") |
| 185 | var closeZero bool |
| 186 | var fieldNVar string |
| 187 | if omitempty || omitzero { |
| 188 | |
| 189 | fieldNVar = oeIdentPrefix + "Len" |
| 190 | |
| 191 | e.p.printf("\n// check for omitted fields") |
| 192 | e.p.printf("\n%s := uint32(%d)", fieldNVar, nfields) |
| 193 | e.p.printf("\n%s", bm.typeDecl()) |
| 194 | e.p.printf("\n_ = %s", bm.varname) |
| 195 | for i, sf := range s.Fields { |
| 196 | if !e.p.ok() { |
| 197 | return |
| 198 | } |
| 199 | if ize := sf.FieldElem.IfZeroExpr(); ize != "" && sf.HasTagPart("omitempty") { |
| 200 | e.p.printf("\nif %s {", ize) |
| 201 | e.p.printf("\n%s--", fieldNVar) |
| 202 | e.p.printf("\n%s", bm.setStmt(i)) |
| 203 | e.p.printf("\n}") |
| 204 | } else if sf.HasTagPart("omitzero") { |
| 205 | e.p.printf("\nif %s.IsZero() {", sf.FieldElem.Varname()) |
| 206 | e.p.printf("\n%s--", fieldNVar) |
| 207 | e.p.printf("\n%s", bm.setStmt(i)) |
| 208 | e.p.printf("\n}") |
| 209 | } |
| 210 | } |
| 211 | |
| 212 | e.p.printf("\n// variable map header, size %s", fieldNVar) |
| 213 | e.p.varWriteMapHeader("en", fieldNVar, nfields) |
| 214 | e.p.print("\nif err != nil { return }") |
| 215 | if !e.p.ok() { |
| 216 | return |
| 217 | } |
| 218 | |
| 219 | // Skip block, if no fields are set. |
| 220 | if nfields > 1 { |
| 221 | e.p.printf("\n\n// skip if no fields are to be emitted") |
| 222 | e.p.printf("\nif %s != 0 {", fieldNVar) |
| 223 | closeZero = true |
| 224 | } |
| 225 | |
| 226 | } else { |
| 227 | |
| 228 | // non-omit version |
| 229 | data = msgp.AppendMapHeader(nil, uint32(nfields)) |
| 230 | e.p.printf("\n// map header, size %d", nfields) |
no test coverage detected