12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- // +build !js
- package gls
- // This file is used for standard Go builds, which have the expected runtime support
- import (
- "reflect"
- "runtime"
- )
- func init() {
- setEntries := func(f func(uint, func()), v int8) {
- pc_lookup[reflect.ValueOf(f).Pointer()] = v
- if v >= 0 {
- mark_lookup[v] = f
- }
- }
- setEntries(markS, -0x1)
- setEntries(mark0, 0x0)
- setEntries(mark1, 0x1)
- setEntries(mark2, 0x2)
- setEntries(mark3, 0x3)
- setEntries(mark4, 0x4)
- setEntries(mark5, 0x5)
- setEntries(mark6, 0x6)
- setEntries(mark7, 0x7)
- setEntries(mark8, 0x8)
- setEntries(mark9, 0x9)
- setEntries(markA, 0xa)
- setEntries(markB, 0xb)
- setEntries(markC, 0xc)
- setEntries(markD, 0xd)
- setEntries(markE, 0xe)
- setEntries(markF, 0xf)
- }
- func currentStack(skip int) []uintptr {
- stack := make([]uintptr, maxCallers)
- return stack[:runtime.Callers(3+skip, stack)]
- }
- func readStackTags(skip int) (tags []uint) {
- stack := currentStack(skip)
- var current_tag uint
- for _, pc := range stack {
- pc = runtime.FuncForPC(pc).Entry()
- val, ok := pc_lookup[pc]
- if !ok {
- continue
- }
- if val < 0 {
- tags = append(tags, current_tag)
- current_tag = 0
- continue
- }
- current_tag <<= bitWidth
- current_tag += uint(val)
- }
- return
- }
|