primitives.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /**
  2. * Copyright 2024 ByteDance Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package alg
  17. import (
  18. "encoding"
  19. "encoding/json"
  20. "reflect"
  21. "unsafe"
  22. "github.com/bytedance/sonic/internal/encoder/vars"
  23. "github.com/bytedance/sonic/internal/resolver"
  24. "github.com/bytedance/sonic/internal/rt"
  25. )
  26. func Compact(p *[]byte, v []byte) error {
  27. buf := vars.NewBuffer()
  28. err := json.Compact(buf, v)
  29. /* check for errors */
  30. if err != nil {
  31. return err
  32. }
  33. /* add to result */
  34. v = buf.Bytes()
  35. *p = append(*p, v...)
  36. /* return the buffer into pool */
  37. vars.FreeBuffer(buf)
  38. return nil
  39. }
  40. func EncodeNil(rb *[]byte) error {
  41. *rb = append(*rb, 'n', 'u', 'l', 'l')
  42. return nil
  43. }
  44. // func Make_EncodeTypedPointer(computor func(*rt.GoType, ...interface{}) (interface{}, error)) func(*[]byte, *rt.GoType, *unsafe.Pointer, *vars.Stack, uint64) error {
  45. // return func(buf *[]byte, vt *rt.GoType, vp *unsafe.Pointer, sb *vars.Stack, fv uint64) error {
  46. // if vt == nil {
  47. // return EncodeNil(buf)
  48. // } else if fn, err := vars.FindOrCompile(vt, (fv&(1<<BitPointerValue)) != 0, computor); err != nil {
  49. // return err
  50. // } else if vt.Indirect() {
  51. // err := fn(buf, *vp, sb, fv)
  52. // return err
  53. // } else {
  54. // err := fn(buf, unsafe.Pointer(vp), sb, fv)
  55. // return err
  56. // }
  57. // }
  58. // }
  59. func EncodeJsonMarshaler(buf *[]byte, val json.Marshaler, opt uint64) error {
  60. if ret, err := val.MarshalJSON(); err != nil {
  61. return err
  62. } else {
  63. if opt&(1<<BitCompactMarshaler) != 0 {
  64. return Compact(buf, ret)
  65. }
  66. if opt&(1<<BitNoValidateJSONMarshaler) == 0 {
  67. if ok, s := Valid(ret); !ok {
  68. return vars.Error_marshaler(ret, s)
  69. }
  70. }
  71. *buf = append(*buf, ret...)
  72. return nil
  73. }
  74. }
  75. func EncodeTextMarshaler(buf *[]byte, val encoding.TextMarshaler, opt uint64) error {
  76. if ret, err := val.MarshalText(); err != nil {
  77. return err
  78. } else {
  79. if opt&(1<<BitNoQuoteTextMarshaler) != 0 {
  80. *buf = append(*buf, ret...)
  81. return nil
  82. }
  83. *buf = Quote(*buf, rt.Mem2Str(ret), false)
  84. return nil
  85. }
  86. }
  87. func IsZero(val unsafe.Pointer, fv *resolver.FieldMeta) bool {
  88. rv := reflect.NewAt(fv.Type, val).Elem()
  89. b1 := fv.IsZero == nil && rv.IsZero()
  90. b2 := fv.IsZero != nil && fv.IsZero(rv)
  91. return b1 || b2
  92. }