@@ -107,8 +107,8 @@ var (
107
107
positionCounters = []* Func {}
108
108
)
109
109
110
- func registerPosition (funcName string , file string , line int ) uintptr {
111
- key := file + ":" + itoa (line )
110
+ func registerPosition (funcName string , file string , line int , col int ) uintptr {
111
+ key := file + ":" + itoa (line ) + ":" + itoa ( col )
112
112
if pc , found := knownPositions [key ]; found {
113
113
return pc
114
114
}
@@ -135,6 +135,7 @@ type basicFrame struct {
135
135
FuncName string
136
136
File string
137
137
Line int
138
+ Col int
138
139
}
139
140
140
141
func callstack (skip , limit int ) []basicFrame {
@@ -189,6 +190,7 @@ func ParseCallFrame(info *js.Object) basicFrame {
189
190
return basicFrame {
190
191
File : parts .Call ("slice" , 1 , parts .Length ()- 2 ).Call ("join" , ":" ).String (),
191
192
Line : parts .Index (parts .Length () - 2 ).Int (),
193
+ Col : parts .Index (parts .Length () - 1 ).Int (),
192
194
FuncName : parts .Index (0 ).String (),
193
195
}
194
196
}
@@ -202,12 +204,13 @@ func ParseCallFrame(info *js.Object) basicFrame {
202
204
File : parts .Call ("slice" , 0 , parts .Length ()- 2 ).Call ("join" , ":" ).
203
205
Call ("replace" , js .Global .Get ("RegExp" ).New (`^\s*at ` ), "" ).String (),
204
206
Line : parts .Index (parts .Length () - 2 ).Int (),
207
+ Col : parts .Index (parts .Length () - 1 ).Int (),
205
208
FuncName : "<none>" ,
206
209
}
207
210
}
208
211
209
212
var file , funcName string
210
- var line int
213
+ var line , col int
211
214
212
215
pos := info .Call ("substring" , openIdx + 1 , info .Call ("indexOf" , ")" ).Int ())
213
216
parts := pos .Call ("split" , ":" )
@@ -217,6 +220,7 @@ func ParseCallFrame(info *js.Object) basicFrame {
217
220
} else {
218
221
file = parts .Call ("slice" , 0 , parts .Length ()- 2 ).Call ("join" , ":" ).String ()
219
222
line = parts .Index (parts .Length () - 2 ).Int ()
223
+ col = parts .Index (parts .Length () - 1 ).Int ()
220
224
}
221
225
fn := info .Call ("substring" , info .Call ("indexOf" , "at " ).Int ()+ 3 , info .Call ("indexOf" , " (" ).Int ())
222
226
if idx := fn .Call ("indexOf" , "[as " ).Int (); idx > 0 {
@@ -227,6 +231,7 @@ func ParseCallFrame(info *js.Object) basicFrame {
227
231
return basicFrame {
228
232
File : file ,
229
233
Line : line ,
234
+ Col : col ,
230
235
FuncName : funcName ,
231
236
}
232
237
}
@@ -237,7 +242,7 @@ func Caller(skip int) (pc uintptr, file string, line int, ok bool) {
237
242
if len (frames ) != 1 {
238
243
return 0 , "" , 0 , false
239
244
}
240
- pc = registerPosition (frames [0 ].FuncName , frames [0 ].File , frames [0 ].Line )
245
+ pc = registerPosition (frames [0 ].FuncName , frames [0 ].File , frames [0 ].Line , frames [ 0 ]. Col )
241
246
return pc , frames [0 ].File , frames [0 ].Line , true
242
247
}
243
248
@@ -261,7 +266,7 @@ func Caller(skip int) (pc uintptr, file string, line int, ok bool) {
261
266
func Callers (skip int , pc []uintptr ) int {
262
267
frames := callstack (skip , len (pc ))
263
268
for i , frame := range frames {
264
- pc [i ] = registerPosition (frame .FuncName , frame .File , frame .Line )
269
+ pc [i ] = registerPosition (frame .FuncName , frame .File , frame .Line , frame . Col )
265
270
}
266
271
return len (frames )
267
272
}
0 commit comments