You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.5 KiB
76 lines
1.5 KiB
// +build js
|
|
|
|
package gls
|
|
|
|
// This file is used for GopherJS builds, which don't have normal runtime
|
|
// stack trace support
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/gopherjs/gopherjs/js"
|
|
)
|
|
|
|
const (
|
|
jsFuncNamePrefix = "github_com_jtolds_gls_mark"
|
|
)
|
|
|
|
func jsMarkStack() (f []uintptr) {
|
|
lines := strings.Split(
|
|
js.Global.Get("Error").New().Get("stack").String(), "\n")
|
|
f = make([]uintptr, 0, len(lines))
|
|
for i, line := range lines {
|
|
line = strings.TrimSpace(line)
|
|
if line == "" {
|
|
continue
|
|
}
|
|
if i == 0 {
|
|
if line != "Error" {
|
|
panic("didn't understand js stack trace")
|
|
}
|
|
continue
|
|
}
|
|
fields := strings.Fields(line)
|
|
if len(fields) < 2 || fields[0] != "at" {
|
|
panic("didn't understand js stack trace")
|
|
}
|
|
|
|
pos := strings.Index(fields[1], jsFuncNamePrefix)
|
|
if pos < 0 {
|
|
continue
|
|
}
|
|
pos += len(jsFuncNamePrefix)
|
|
if pos >= len(fields[1]) {
|
|
panic("didn't understand js stack trace")
|
|
}
|
|
char := string(fields[1][pos])
|
|
switch char {
|
|
case "S":
|
|
f = append(f, uintptr(0))
|
|
default:
|
|
val, err := strconv.ParseUint(char, 16, 8)
|
|
if err != nil {
|
|
panic("didn't understand js stack trace")
|
|
}
|
|
f = append(f, uintptr(val)+1)
|
|
}
|
|
}
|
|
return f
|
|
}
|
|
|
|
// variables to prevent inlining
|
|
var (
|
|
findPtr = func() uintptr {
|
|
funcs := jsMarkStack()
|
|
if len(funcs) == 0 {
|
|
panic("failed to find function pointer")
|
|
}
|
|
return funcs[0]
|
|
}
|
|
|
|
getStack = func(offset, amount int) (stack []uintptr, next_offset int) {
|
|
return jsMarkStack(), 0
|
|
}
|
|
)
|