1 //go:build race
2 // +build race
3 4 /*
5 * Copyright 2021 ByteDance Inc.
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19 20 package encoder
21 22 import (
23 `encoding/json`
24 25 `github.com/bytedance/sonic/internal/rt`
26 )
27 28 29 func helpDetectDataRace(val interface{}) {
30 var out []byte
31 defer func() {
32 if v := recover(); v != nil {
33 // NOTICE: help user to locate where panic occurs
34 println("panic when encoding on: ", truncate(out))
35 panic(v)
36 }
37 }()
38 out, _ = json.Marshal(val)
39 }
40 41 func encodeIntoCheckRace(buf *[]byte, val interface{}, opts Options) error {
42 err := encodeInto(buf, val, opts)
43 /* put last to make the panic from sonic will always be caught at first */
44 helpDetectDataRace(val)
45 return err
46 }
47 48 func truncate(json []byte) string {
49 if len(json) <= 256 {
50 return rt.Mem2Str(json)
51 } else {
52 return rt.Mem2Str(json[len(json)-256:])
53 }
54 }
55