OLD | NEW |
(Empty) | |
| 1 dart_library.library('stack_trace', null, /* Imports */[ |
| 2 'dart_sdk', |
| 3 'path' |
| 4 ], function(exports, dart_sdk, path) { |
| 5 'use strict'; |
| 6 const core = dart_sdk.core; |
| 7 const collection = dart_sdk.collection; |
| 8 const math = dart_sdk.math; |
| 9 const async = dart_sdk.async; |
| 10 const dart = dart_sdk.dart; |
| 11 const dartx = dart_sdk.dartx; |
| 12 const path$ = path.path; |
| 13 const src__trace = Object.create(null); |
| 14 const src__chain = Object.create(null); |
| 15 const src__vm_trace = Object.create(null); |
| 16 const src__lazy_trace = Object.create(null); |
| 17 const src__utils = Object.create(null); |
| 18 const src__frame = Object.create(null); |
| 19 const src__stack_zone_specification = Object.create(null); |
| 20 const src__unparsed_frame = Object.create(null); |
| 21 const stack_trace = Object.create(null); |
| 22 dart.defineLazy(src__trace, { |
| 23 get _terseRegExp() { |
| 24 return core.RegExp.new("(-patch)?([/\\\\].*)?$"); |
| 25 } |
| 26 }); |
| 27 dart.defineLazy(src__trace, { |
| 28 get _v8Trace() { |
| 29 return core.RegExp.new("\\n ?at "); |
| 30 } |
| 31 }); |
| 32 dart.defineLazy(src__trace, { |
| 33 get _v8TraceLine() { |
| 34 return core.RegExp.new(" ?at "); |
| 35 } |
| 36 }); |
| 37 dart.defineLazy(src__trace, { |
| 38 get _firefoxSafariTrace() { |
| 39 return core.RegExp.new("^" + "(" + "([.0-9A-Za-z_$/<]|\\(.*\\))*" + "@" +
")?" + "[^\\s]*" + ":\\d*" + "$", {multiLine: true}); |
| 40 } |
| 41 }); |
| 42 dart.defineLazy(src__trace, { |
| 43 get _friendlyTrace() { |
| 44 return core.RegExp.new("^[^\\s]+( \\d+(:\\d+)?)?[ \\t]+[^\\s]+$", {multiLi
ne: true}); |
| 45 } |
| 46 }); |
| 47 src__trace.Trace = class Trace extends core.Object { |
| 48 static format(stackTrace, opts) { |
| 49 let terse = opts && 'terse' in opts ? opts.terse : true; |
| 50 let trace = src__trace.Trace.from(stackTrace); |
| 51 if (dart.notNull(terse)) trace = trace.terse; |
| 52 return dart.toString(trace); |
| 53 } |
| 54 static current(level) { |
| 55 if (level === void 0) level = 0; |
| 56 if (dart.notNull(level) < 0) { |
| 57 dart.throw(new core.ArgumentError("Argument [level] must be greater than
or equal " + "to 0.")); |
| 58 } |
| 59 let trace = src__trace.Trace.from(core.StackTrace.current); |
| 60 return new src__lazy_trace.LazyTrace(dart.fn(() => new src__trace.Trace(tr
ace.frames[dartx.skip](dart.notNull(level) + 1)), src__trace.Trace, [])); |
| 61 } |
| 62 static from(trace) { |
| 63 if (trace == null) { |
| 64 dart.throw(new core.ArgumentError("Cannot create a Trace from null.")); |
| 65 } |
| 66 if (dart.is(trace, src__trace.Trace)) return trace; |
| 67 if (dart.is(trace, src__chain.Chain)) return trace.toTrace(); |
| 68 return new src__lazy_trace.LazyTrace(dart.fn(() => src__trace.Trace.parse(
dart.toString(trace)), src__trace.Trace, [])); |
| 69 } |
| 70 static parse(trace) { |
| 71 try { |
| 72 if (dart.notNull(trace[dartx.isEmpty])) return new src__trace.Trace(dart
.list([], src__frame.Frame)); |
| 73 if (dart.notNull(trace[dartx.contains](src__trace._v8Trace))) return new
src__trace.Trace.parseV8(trace); |
| 74 if (dart.notNull(trace[dartx.contains]("\tat "))) return new src__trace.
Trace.parseJSCore(trace); |
| 75 if (dart.notNull(trace[dartx.contains](src__trace._firefoxSafariTrace)))
{ |
| 76 return new src__trace.Trace.parseFirefox(trace); |
| 77 } |
| 78 if (dart.notNull(trace[dartx.contains](src__utils.chainGap))) return src
__chain.Chain.parse(trace).toTrace(); |
| 79 if (dart.notNull(trace[dartx.contains](src__trace._friendlyTrace))) { |
| 80 return new src__trace.Trace.parseFriendly(trace); |
| 81 } |
| 82 return new src__trace.Trace.parseVM(trace); |
| 83 } catch (error) { |
| 84 if (dart.is(error, core.FormatException)) { |
| 85 dart.throw(new core.FormatException(`${error.message}\nStack trace:\n$
{trace}`)); |
| 86 } else |
| 87 throw error; |
| 88 } |
| 89 |
| 90 } |
| 91 parseVM(trace) { |
| 92 this.Trace(src__trace.Trace._parseVM(trace)); |
| 93 } |
| 94 static _parseVM(trace) { |
| 95 let lines = trace[dartx.trim]()[dartx.split]("\n"); |
| 96 let frames = lines[dartx.take](dart.notNull(lines[dartx.length]) - 1)[dart
x.map](src__frame.Frame)(dart.fn(line => src__frame.Frame.parseVM(line), src__fr
ame.Frame, [core.String]))[dartx.toList](); |
| 97 if (!dart.notNull(lines[dartx.last][dartx.endsWith](".da"))) { |
| 98 frames[dartx.add](src__frame.Frame.parseVM(lines[dartx.last])); |
| 99 } |
| 100 return frames; |
| 101 } |
| 102 parseV8(trace) { |
| 103 this.Trace(trace[dartx.split]("\n")[dartx.skip](1)[dartx.skipWhile](dart.f
n(line => !dart.notNull(line[dartx.startsWith](src__trace._v8TraceLine)), core.b
ool, [core.String]))[dartx.map](src__frame.Frame)(dart.fn(line => src__frame.Fra
me.parseV8(line), src__frame.Frame, [core.String]))); |
| 104 } |
| 105 parseJSCore(trace) { |
| 106 this.Trace(trace[dartx.split]("\n")[dartx.where](dart.fn(line => line != "
\tat ", core.bool, [core.String]))[dartx.map](src__frame.Frame)(dart.fn(line =>
src__frame.Frame.parseV8(line), src__frame.Frame, [core.String]))); |
| 107 } |
| 108 parseIE(trace) { |
| 109 this.parseV8(trace); |
| 110 } |
| 111 parseFirefox(trace) { |
| 112 this.Trace(trace[dartx.trim]()[dartx.split]("\n")[dartx.where](dart.fn(lin
e => dart.notNull(line[dartx.isNotEmpty]) && line != '[native code]', core.bool,
[core.String]))[dartx.map](src__frame.Frame)(dart.fn(line => src__frame.Frame.p
arseFirefox(line), src__frame.Frame, [core.String]))); |
| 113 } |
| 114 parseSafari(trace) { |
| 115 this.parseFirefox(trace); |
| 116 } |
| 117 parseSafari6_1(trace) { |
| 118 this.parseSafari(trace); |
| 119 } |
| 120 parseSafari6_0(trace) { |
| 121 this.Trace(trace[dartx.trim]()[dartx.split]("\n")[dartx.where](dart.fn(lin
e => line != '[native code]', core.bool, [core.String]))[dartx.map](src__frame.F
rame)(dart.fn(line => src__frame.Frame.parseFirefox(line), src__frame.Frame, [co
re.String]))); |
| 122 } |
| 123 parseFriendly(trace) { |
| 124 this.Trace(dart.notNull(trace[dartx.isEmpty]) ? dart.list([], src__frame.F
rame) : trace[dartx.trim]()[dartx.split]("\n")[dartx.where](dart.fn(line => !dar
t.notNull(line[dartx.startsWith]('=====')), core.bool, [core.String]))[dartx.map
](src__frame.Frame)(dart.fn(line => src__frame.Frame.parseFriendly(line), src__f
rame.Frame, [core.String]))); |
| 125 } |
| 126 Trace(frames) { |
| 127 this.frames = new (collection.UnmodifiableListView$(src__frame.Frame))(fra
mes[dartx.toList]()); |
| 128 } |
| 129 get vmTrace() { |
| 130 return new src__vm_trace.VMTrace(this.frames); |
| 131 } |
| 132 get terse() { |
| 133 return this.foldFrames(dart.fn(_ => false, core.bool, [src__frame.Frame]),
{terse: true}); |
| 134 } |
| 135 foldFrames(predicate, opts) { |
| 136 let terse = opts && 'terse' in opts ? opts.terse : false; |
| 137 if (dart.notNull(terse)) { |
| 138 let oldPredicate = predicate; |
| 139 predicate = dart.fn(frame => { |
| 140 if (dart.notNull(oldPredicate(frame))) return true; |
| 141 if (dart.notNull(frame.isCore)) return true; |
| 142 if (frame.package == 'stack_trace') return true; |
| 143 if (!dart.notNull(frame.member[dartx.contains]('<async>'))) return fal
se; |
| 144 return frame.line == null; |
| 145 }, core.bool, [src__frame.Frame]); |
| 146 } |
| 147 let newFrames = dart.list([], src__frame.Frame); |
| 148 for (let frame of this.frames[dartx.reversed]) { |
| 149 if (dart.is(frame, src__unparsed_frame.UnparsedFrame) || !dart.notNull(p
redicate(frame))) { |
| 150 newFrames[dartx.add](frame); |
| 151 } else if (dart.notNull(newFrames[dartx.isEmpty]) || !dart.notNull(predi
cate(newFrames[dartx.last]))) { |
| 152 newFrames[dartx.add](new src__frame.Frame(frame.uri, frame.line, frame
.column, frame.member)); |
| 153 } |
| 154 } |
| 155 if (dart.notNull(terse)) { |
| 156 newFrames = newFrames[dartx.map](src__frame.Frame)(dart.fn(frame => { |
| 157 if (dart.is(frame, src__unparsed_frame.UnparsedFrame) || !dart.notNull
(predicate(frame))) return frame; |
| 158 let library = frame.library[dartx.replaceAll](src__trace._terseRegExp,
''); |
| 159 return new src__frame.Frame(core.Uri.parse(library), null, null, frame
.member); |
| 160 }, src__frame.Frame, [src__frame.Frame]))[dartx.toList](); |
| 161 if (dart.notNull(newFrames[dartx.length]) > 1 && dart.notNull(newFrames[
dartx.first].isCore)) newFrames[dartx.removeAt](0); |
| 162 } |
| 163 return new src__trace.Trace(newFrames[dartx.reversed]); |
| 164 } |
| 165 toString() { |
| 166 let longest = this.frames[dartx.map](core.int)(dart.fn(frame => frame.loca
tion[dartx.length], core.int, [src__frame.Frame]))[dartx.fold](core.int)(0, dart
.gbind(math.max, core.int)); |
| 167 return this.frames[dartx.map](core.String)(dart.fn(frame => { |
| 168 if (dart.is(frame, src__unparsed_frame.UnparsedFrame)) return `${frame}\
n`; |
| 169 return `${src__utils.padRight(frame.location, longest)} ${frame.member}
\n`; |
| 170 }, core.String, [src__frame.Frame]))[dartx.join](); |
| 171 } |
| 172 }; |
| 173 dart.defineNamedConstructor(src__trace.Trace, 'parseVM'); |
| 174 dart.defineNamedConstructor(src__trace.Trace, 'parseV8'); |
| 175 dart.defineNamedConstructor(src__trace.Trace, 'parseJSCore'); |
| 176 dart.defineNamedConstructor(src__trace.Trace, 'parseIE'); |
| 177 dart.defineNamedConstructor(src__trace.Trace, 'parseFirefox'); |
| 178 dart.defineNamedConstructor(src__trace.Trace, 'parseSafari'); |
| 179 dart.defineNamedConstructor(src__trace.Trace, 'parseSafari6_1'); |
| 180 dart.defineNamedConstructor(src__trace.Trace, 'parseSafari6_0'); |
| 181 dart.defineNamedConstructor(src__trace.Trace, 'parseFriendly'); |
| 182 src__trace.Trace[dart.implements] = () => [core.StackTrace]; |
| 183 dart.setSignature(src__trace.Trace, { |
| 184 constructors: () => ({ |
| 185 current: [src__trace.Trace, [], [core.int]], |
| 186 from: [src__trace.Trace, [core.StackTrace]], |
| 187 parse: [src__trace.Trace, [core.String]], |
| 188 parseVM: [src__trace.Trace, [core.String]], |
| 189 parseV8: [src__trace.Trace, [core.String]], |
| 190 parseJSCore: [src__trace.Trace, [core.String]], |
| 191 parseIE: [src__trace.Trace, [core.String]], |
| 192 parseFirefox: [src__trace.Trace, [core.String]], |
| 193 parseSafari: [src__trace.Trace, [core.String]], |
| 194 parseSafari6_1: [src__trace.Trace, [core.String]], |
| 195 parseSafari6_0: [src__trace.Trace, [core.String]], |
| 196 parseFriendly: [src__trace.Trace, [core.String]], |
| 197 Trace: [src__trace.Trace, [core.Iterable$(src__frame.Frame)]] |
| 198 }), |
| 199 methods: () => ({foldFrames: [src__trace.Trace, [dart.functionType(core.bool
, [src__frame.Frame])], {terse: core.bool}]}), |
| 200 statics: () => ({ |
| 201 format: [core.String, [core.StackTrace], {terse: core.bool}], |
| 202 _parseVM: [core.List$(src__frame.Frame), [core.String]] |
| 203 }), |
| 204 names: ['format', '_parseVM'] |
| 205 }); |
| 206 src__chain.ChainHandler = dart.typedef('ChainHandler', () => dart.functionType
(dart.void, [dart.dynamic, src__chain.Chain])); |
| 207 src__chain.Chain = class Chain extends core.Object { |
| 208 static get _currentSpec() { |
| 209 return dart.as(async.Zone.current.get(dart.const(core.Symbol.new('stack_tr
ace.stack_zone.spec'))), src__stack_zone_specification.StackZoneSpecification); |
| 210 } |
| 211 static capture(T) { |
| 212 return (callback, opts) => { |
| 213 let onError = opts && 'onError' in opts ? opts.onError : null; |
| 214 let when = opts && 'when' in opts ? opts.when : true; |
| 215 if (!dart.notNull(when)) { |
| 216 let newOnError = null; |
| 217 if (onError != null) { |
| 218 newOnError = dart.fn((error, stackTrace) => { |
| 219 dart.dcall(onError, error, src__chain.Chain.forTrace(dart.as(stack
Trace, core.StackTrace))); |
| 220 }); |
| 221 } |
| 222 return async.runZoned(T)(callback, {onError: dart.as(newOnError, core.
Function)}); |
| 223 } |
| 224 let spec = new src__stack_zone_specification.StackZoneSpecification(onEr
ror); |
| 225 return async.runZoned(T)(dart.fn(() => { |
| 226 try { |
| 227 return callback(); |
| 228 } catch (error) { |
| 229 let stackTrace = dart.stackTrace(error); |
| 230 return async.Zone.current.handleUncaughtError(T)(error, stackTrace); |
| 231 } |
| 232 |
| 233 }, T, []), {zoneSpecification: spec.toSpec(), zoneValues: dart.map([dart
.const(core.Symbol.new('stack_trace.stack_zone.spec')), spec])}); |
| 234 }; |
| 235 } |
| 236 static track(futureOrStream) { |
| 237 return futureOrStream; |
| 238 } |
| 239 static current(level) { |
| 240 if (level === void 0) level = 0; |
| 241 if (src__chain.Chain._currentSpec != null) return src__chain.Chain._curren
tSpec.currentChain(dart.notNull(level) + 1); |
| 242 return new src__chain.Chain(dart.list([src__trace.Trace.current(dart.notNu
ll(level) + 1)], src__trace.Trace)); |
| 243 } |
| 244 static forTrace(trace) { |
| 245 if (dart.is(trace, src__chain.Chain)) return trace; |
| 246 if (src__chain.Chain._currentSpec == null) return new src__chain.Chain(dar
t.list([src__trace.Trace.from(trace)], src__trace.Trace)); |
| 247 return src__chain.Chain._currentSpec.chainFor(trace); |
| 248 } |
| 249 static parse(chain) { |
| 250 if (dart.notNull(chain[dartx.isEmpty])) return new src__chain.Chain(dart.l
ist([], src__trace.Trace)); |
| 251 if (!dart.notNull(chain[dartx.contains](src__utils.chainGap))) return new
src__chain.Chain(dart.list([src__trace.Trace.parse(chain)], src__trace.Trace)); |
| 252 return new src__chain.Chain(chain[dartx.split](src__utils.chainGap)[dartx.
map](src__trace.Trace)(dart.fn(trace => new src__trace.Trace.parseFriendly(trace
), src__trace.Trace, [core.String]))); |
| 253 } |
| 254 Chain(traces) { |
| 255 this.traces = new (collection.UnmodifiableListView$(src__trace.Trace))(tra
ces[dartx.toList]()); |
| 256 } |
| 257 get terse() { |
| 258 return this.foldFrames(dart.fn(_ => false, core.bool, [src__frame.Frame]),
{terse: true}); |
| 259 } |
| 260 foldFrames(predicate, opts) { |
| 261 let terse = opts && 'terse' in opts ? opts.terse : false; |
| 262 let foldedTraces = this.traces[dartx.map](src__trace.Trace)(dart.fn(trace
=> trace.foldFrames(predicate, {terse: terse}), src__trace.Trace, [src__trace.Tr
ace])); |
| 263 let nonEmptyTraces = foldedTraces[dartx.where](dart.fn(trace => { |
| 264 if (dart.notNull(trace.frames[dartx.length]) > 1) return true; |
| 265 if (dart.notNull(trace.frames[dartx.isEmpty])) return false; |
| 266 if (!dart.notNull(terse)) return false; |
| 267 return trace.frames[dartx.single].line != null; |
| 268 }, core.bool, [src__trace.Trace])); |
| 269 if (dart.notNull(nonEmptyTraces[dartx.isEmpty]) && dart.notNull(foldedTrac
es[dartx.isNotEmpty])) { |
| 270 return new src__chain.Chain(dart.list([foldedTraces[dartx.last]], src__t
race.Trace)); |
| 271 } |
| 272 return new src__chain.Chain(nonEmptyTraces); |
| 273 } |
| 274 toTrace() { |
| 275 return new src__trace.Trace(this.traces[dartx.expand](src__frame.Frame)(da
rt.fn(trace => trace.frames, core.List$(src__frame.Frame), [src__trace.Trace])))
; |
| 276 } |
| 277 toString() { |
| 278 let longest = this.traces[dartx.map](core.int)(dart.fn(trace => trace.fram
es[dartx.map](core.int)(dart.fn(frame => frame.location[dartx.length], core.int,
[src__frame.Frame]))[dartx.fold](core.int)(0, dart.gbind(math.max, core.int)),
core.int, [src__trace.Trace]))[dartx.fold](core.int)(0, dart.gbind(math.max, cor
e.int)); |
| 279 return this.traces[dartx.map](core.String)(dart.fn(trace => trace.frames[d
artx.map](core.String)(dart.fn(frame => `${src__utils.padRight(frame.location, l
ongest)} ${frame.member}\n`, core.String, [src__frame.Frame]))[dartx.join](), c
ore.String, [src__trace.Trace]))[dartx.join](src__utils.chainGap); |
| 280 } |
| 281 }; |
| 282 src__chain.Chain[dart.implements] = () => [core.StackTrace]; |
| 283 dart.setSignature(src__chain.Chain, { |
| 284 constructors: () => ({ |
| 285 current: [src__chain.Chain, [], [core.int]], |
| 286 forTrace: [src__chain.Chain, [core.StackTrace]], |
| 287 parse: [src__chain.Chain, [core.String]], |
| 288 Chain: [src__chain.Chain, [core.Iterable$(src__trace.Trace)]] |
| 289 }), |
| 290 methods: () => ({ |
| 291 foldFrames: [src__chain.Chain, [dart.functionType(core.bool, [src__frame.F
rame])], {terse: core.bool}], |
| 292 toTrace: [src__trace.Trace, []] |
| 293 }), |
| 294 statics: () => ({ |
| 295 capture: [T => [T, [dart.functionType(T, [])], {onError: dart.functionType
(dart.void, [dart.dynamic, src__chain.Chain]), when: core.bool}]], |
| 296 track: [dart.dynamic, [dart.dynamic]] |
| 297 }), |
| 298 names: ['capture', 'track'] |
| 299 }); |
| 300 src__vm_trace.VMTrace = class VMTrace extends core.Object { |
| 301 VMTrace(frames) { |
| 302 this.frames = frames; |
| 303 } |
| 304 toString() { |
| 305 let i = 1; |
| 306 return this.frames[dartx.map](core.String)(dart.fn(frame => { |
| 307 let number = src__utils.padRight(`#${i++}`, 8); |
| 308 let member = frame.member[dartx.replaceAllMapped](core.RegExp.new("[^.]+
\\.<async>"), dart.fn(match => `${match.get(1)}.<${match.get(1)}_async_body>`, c
ore.String, [core.Match]))[dartx.replaceAll]("<fn>", "<anonymous closure>"); |
| 309 let line = frame.line == null ? 0 : frame.line; |
| 310 let column = frame.column == null ? 0 : frame.column; |
| 311 return `${number}${member} (${frame.uri}:${line}:${column})\n`; |
| 312 }, core.String, [src__frame.Frame]))[dartx.join](); |
| 313 } |
| 314 }; |
| 315 src__vm_trace.VMTrace[dart.implements] = () => [core.StackTrace]; |
| 316 dart.setSignature(src__vm_trace.VMTrace, { |
| 317 constructors: () => ({VMTrace: [src__vm_trace.VMTrace, [core.List$(src__fram
e.Frame)]]}) |
| 318 }); |
| 319 src__lazy_trace.TraceThunk = dart.typedef('TraceThunk', () => dart.functionTyp
e(src__trace.Trace, [])); |
| 320 const _thunk = Symbol('_thunk'); |
| 321 const _inner = Symbol('_inner'); |
| 322 const _trace = Symbol('_trace'); |
| 323 src__lazy_trace.LazyTrace = class LazyTrace extends core.Object { |
| 324 LazyTrace(thunk) { |
| 325 this[_thunk] = thunk; |
| 326 this[_inner] = null; |
| 327 } |
| 328 get [_trace]() { |
| 329 if (this[_inner] == null) this[_inner] = this[_thunk](); |
| 330 return this[_inner]; |
| 331 } |
| 332 get frames() { |
| 333 return this[_trace].frames; |
| 334 } |
| 335 get vmTrace() { |
| 336 return this[_trace].vmTrace; |
| 337 } |
| 338 get terse() { |
| 339 return new src__lazy_trace.LazyTrace(dart.fn(() => this[_trace].terse, src
__trace.Trace, [])); |
| 340 } |
| 341 foldFrames(predicate, opts) { |
| 342 let terse = opts && 'terse' in opts ? opts.terse : false; |
| 343 return new src__lazy_trace.LazyTrace(dart.fn(() => this[_trace].foldFrames
(predicate, {terse: terse}), src__trace.Trace, [])); |
| 344 } |
| 345 toString() { |
| 346 return dart.toString(this[_trace]); |
| 347 } |
| 348 set frames(_) { |
| 349 return dart.throw(new core.UnimplementedError()); |
| 350 } |
| 351 }; |
| 352 src__lazy_trace.LazyTrace[dart.implements] = () => [src__trace.Trace]; |
| 353 dart.setSignature(src__lazy_trace.LazyTrace, { |
| 354 constructors: () => ({LazyTrace: [src__lazy_trace.LazyTrace, [src__lazy_trac
e.TraceThunk]]}), |
| 355 methods: () => ({foldFrames: [src__trace.Trace, [dart.functionType(core.bool
, [src__frame.Frame])], {terse: core.bool}]}) |
| 356 }); |
| 357 src__utils.chainGap = '===== asynchronous gap ===========================\n'; |
| 358 src__utils.padRight = function(string, length) { |
| 359 if (dart.notNull(string[dartx.length]) >= dart.notNull(length)) return strin
g; |
| 360 let result = new core.StringBuffer(); |
| 361 result.write(string); |
| 362 for (let i = 0; i < dart.notNull(length) - dart.notNull(string[dartx.length]
); i++) { |
| 363 result.write(' '); |
| 364 } |
| 365 return result.toString(); |
| 366 }; |
| 367 dart.fn(src__utils.padRight, core.String, [core.String, core.int]); |
| 368 dart.defineLazy(src__frame, { |
| 369 get _vmFrame() { |
| 370 return core.RegExp.new('^#\\d+\\s+(\\S.*) \\((.+?)((?::\\d+){0,2})\\)$'); |
| 371 } |
| 372 }); |
| 373 dart.defineLazy(src__frame, { |
| 374 get _v8Frame() { |
| 375 return core.RegExp.new('^\\s*at (?:(\\S.*?)(?: \\[as [^\\]]+\\])? \\((.*)\
\)|(.*))$'); |
| 376 } |
| 377 }); |
| 378 dart.defineLazy(src__frame, { |
| 379 get _v8UrlLocation() { |
| 380 return core.RegExp.new('^(.*):(\\d+):(\\d+)|native$'); |
| 381 } |
| 382 }); |
| 383 dart.defineLazy(src__frame, { |
| 384 get _v8EvalLocation() { |
| 385 return core.RegExp.new('^eval at (?:\\S.*?) \\((.*)\\)(?:, .*?:\\d+:\\d+)?
$'); |
| 386 } |
| 387 }); |
| 388 dart.defineLazy(src__frame, { |
| 389 get _firefoxSafariFrame() { |
| 390 return core.RegExp.new('^' + '(?:' + '([^@(/]*)' + '(?:\\(.*\\))?' + '((?:
/[^/]*)*)' + '(?:\\(.*\\))?' + '@' + ')?' + '(.*?)' + ':' + '(\\d*)' + '(?::(\\d
*))?' + '$'); |
| 391 } |
| 392 }); |
| 393 dart.defineLazy(src__frame, { |
| 394 get _friendlyFrame() { |
| 395 return core.RegExp.new('^(\\S+)(?: (\\d+)(?::(\\d+))?)?\\s+([^\\d]\\S*)$')
; |
| 396 } |
| 397 }); |
| 398 dart.defineLazy(src__frame, { |
| 399 get _asyncBody() { |
| 400 return core.RegExp.new('<(<anonymous closure>|[^>]+)_async_body>'); |
| 401 } |
| 402 }); |
| 403 dart.defineLazy(src__frame, { |
| 404 get _initialDot() { |
| 405 return core.RegExp.new("^\\."); |
| 406 } |
| 407 }); |
| 408 src__frame.Frame = class Frame extends core.Object { |
| 409 get isCore() { |
| 410 return this.uri.scheme == 'dart'; |
| 411 } |
| 412 get library() { |
| 413 if (this.uri.scheme == 'data') return "data:..."; |
| 414 return path$.prettyUri(this.uri); |
| 415 } |
| 416 get package() { |
| 417 if (this.uri.scheme != 'package') return null; |
| 418 return this.uri.path[dartx.split]('/')[dartx.first]; |
| 419 } |
| 420 get location() { |
| 421 if (this.line == null) return this.library; |
| 422 if (this.column == null) return `${this.library} ${this.line}`; |
| 423 return `${this.library} ${this.line}:${this.column}`; |
| 424 } |
| 425 static caller(level) { |
| 426 if (level === void 0) level = 1; |
| 427 if (dart.notNull(level) < 0) { |
| 428 dart.throw(new core.ArgumentError("Argument [level] must be greater than
or equal " + "to 0.")); |
| 429 } |
| 430 return src__trace.Trace.current(dart.notNull(level) + 1).frames[dartx.firs
t]; |
| 431 } |
| 432 static parseVM(frame) { |
| 433 return src__frame.Frame._catchFormatException(frame, dart.fn(() => { |
| 434 if (frame == '...') { |
| 435 return new src__frame.Frame(core.Uri.new(), null, null, '...'); |
| 436 } |
| 437 let match = src__frame._vmFrame.firstMatch(frame); |
| 438 if (match == null) return new src__unparsed_frame.UnparsedFrame(frame); |
| 439 let member = match.get(1)[dartx.replaceAll](src__frame._asyncBody, "<asy
nc>")[dartx.replaceAll]("<anonymous closure>", "<fn>"); |
| 440 let uri = core.Uri.parse(match.get(2)); |
| 441 let lineAndColumn = match.get(3)[dartx.split](':'); |
| 442 let line = dart.notNull(lineAndColumn[dartx.length]) > 1 ? core.int.pars
e(lineAndColumn[dartx.get](1)) : null; |
| 443 let column = dart.notNull(lineAndColumn[dartx.length]) > 2 ? core.int.pa
rse(lineAndColumn[dartx.get](2)) : null; |
| 444 return new src__frame.Frame(uri, line, column, member); |
| 445 }, src__frame.Frame, [])); |
| 446 } |
| 447 static parseV8(frame) { |
| 448 return src__frame.Frame._catchFormatException(frame, dart.fn(() => { |
| 449 let match = src__frame._v8Frame.firstMatch(frame); |
| 450 if (match == null) return new src__unparsed_frame.UnparsedFrame(frame); |
| 451 function parseLocation(location, member) { |
| 452 let evalMatch = src__frame._v8EvalLocation.firstMatch(dart.as(location
, core.String)); |
| 453 while (evalMatch != null) { |
| 454 location = evalMatch.get(1); |
| 455 evalMatch = src__frame._v8EvalLocation.firstMatch(dart.as(location,
core.String)); |
| 456 } |
| 457 if (dart.equals(location, 'native')) { |
| 458 return new src__frame.Frame(core.Uri.parse('native'), null, null, da
rt.as(member, core.String)); |
| 459 } |
| 460 let urlMatch = src__frame._v8UrlLocation.firstMatch(dart.as(location,
core.String)); |
| 461 if (urlMatch == null) return new src__unparsed_frame.UnparsedFrame(fra
me); |
| 462 return new src__frame.Frame(src__frame.Frame._uriOrPathToUri(urlMatch.
get(1)), core.int.parse(urlMatch.get(2)), core.int.parse(urlMatch.get(3)), dart.
as(member, core.String)); |
| 463 } |
| 464 dart.fn(parseLocation); |
| 465 if (match.get(2) != null) { |
| 466 return dart.as(parseLocation(match.get(2), match.get(1)[dartx.replaceA
ll]("<anonymous>", "<fn>")[dartx.replaceAll]("Anonymous function", "<fn>")), src
__frame.Frame); |
| 467 } else { |
| 468 return dart.as(parseLocation(match.get(3), "<fn>"), src__frame.Frame); |
| 469 } |
| 470 }, src__frame.Frame, [])); |
| 471 } |
| 472 static parseJSCore(frame) { |
| 473 return src__frame.Frame.parseV8(frame); |
| 474 } |
| 475 static parseIE(frame) { |
| 476 return src__frame.Frame.parseV8(frame); |
| 477 } |
| 478 static parseFirefox(frame) { |
| 479 return src__frame.Frame._catchFormatException(frame, dart.fn(() => { |
| 480 let match = src__frame._firefoxSafariFrame.firstMatch(frame); |
| 481 if (match == null) return new src__unparsed_frame.UnparsedFrame(frame); |
| 482 let uri = src__frame.Frame._uriOrPathToUri(match.get(3)); |
| 483 let member = null; |
| 484 if (match.get(1) != null) { |
| 485 member = match.get(1); |
| 486 member = dart.dsend(member, '+', core.List.filled('/'[dartx.allMatches
](match.get(2))[dartx.length], ".<fn>")[dartx.join]()); |
| 487 if (dart.equals(member, '')) member = '<fn>'; |
| 488 member = dart.dsend(member, 'replaceFirst', src__frame._initialDot, ''
); |
| 489 } else { |
| 490 member = '<fn>'; |
| 491 } |
| 492 let line = match.get(4) == '' ? null : core.int.parse(match.get(4)); |
| 493 let column = match.get(5) == null || match.get(5) == '' ? null : core.in
t.parse(match.get(5)); |
| 494 return new src__frame.Frame(uri, line, column, dart.as(member, core.Stri
ng)); |
| 495 }, src__frame.Frame, [])); |
| 496 } |
| 497 static parseSafari6_0(frame) { |
| 498 return src__frame.Frame.parseFirefox(frame); |
| 499 } |
| 500 static parseSafari6_1(frame) { |
| 501 return src__frame.Frame.parseFirefox(frame); |
| 502 } |
| 503 static parseSafari(frame) { |
| 504 return src__frame.Frame.parseFirefox(frame); |
| 505 } |
| 506 static parseFriendly(frame) { |
| 507 return src__frame.Frame._catchFormatException(frame, dart.fn(() => { |
| 508 let match = src__frame._friendlyFrame.firstMatch(frame); |
| 509 if (match == null) { |
| 510 dart.throw(new core.FormatException(`Couldn't parse package:stack_trac
e stack trace line '${frame}'.`)); |
| 511 } |
| 512 let uri = core.Uri.parse(match.get(1)); |
| 513 if (uri.scheme == '') { |
| 514 uri = path$.toUri(path$.absolute(path$.fromUri(uri))); |
| 515 } |
| 516 let line = match.get(2) == null ? null : core.int.parse(match.get(2)); |
| 517 let column = match.get(3) == null ? null : core.int.parse(match.get(3)); |
| 518 return new src__frame.Frame(uri, line, column, match.get(4)); |
| 519 }, src__frame.Frame, [])); |
| 520 } |
| 521 static _uriOrPathToUri(uriOrPath) { |
| 522 if (dart.notNull(uriOrPath[dartx.contains](src__frame.Frame._uriRegExp)))
{ |
| 523 return core.Uri.parse(uriOrPath); |
| 524 } else if (dart.notNull(uriOrPath[dartx.contains](src__frame.Frame._window
sRegExp))) { |
| 525 return core.Uri.file(uriOrPath, {windows: true}); |
| 526 } else if (dart.notNull(uriOrPath[dartx.startsWith]('/'))) { |
| 527 return core.Uri.file(uriOrPath, {windows: false}); |
| 528 } |
| 529 if (dart.notNull(uriOrPath[dartx.contains]('\\'))) return path$.windows.to
Uri(uriOrPath); |
| 530 return core.Uri.parse(uriOrPath); |
| 531 } |
| 532 static _catchFormatException(text, body) { |
| 533 try { |
| 534 return body(); |
| 535 } catch (_) { |
| 536 if (dart.is(_, core.FormatException)) { |
| 537 return new src__unparsed_frame.UnparsedFrame(text); |
| 538 } else |
| 539 throw _; |
| 540 } |
| 541 |
| 542 } |
| 543 Frame(uri, line, column, member) { |
| 544 this.uri = uri; |
| 545 this.line = line; |
| 546 this.column = column; |
| 547 this.member = member; |
| 548 } |
| 549 toString() { |
| 550 return `${this.location} in ${this.member}`; |
| 551 } |
| 552 }; |
| 553 dart.setSignature(src__frame.Frame, { |
| 554 constructors: () => ({ |
| 555 caller: [src__frame.Frame, [], [core.int]], |
| 556 parseVM: [src__frame.Frame, [core.String]], |
| 557 parseV8: [src__frame.Frame, [core.String]], |
| 558 parseJSCore: [src__frame.Frame, [core.String]], |
| 559 parseIE: [src__frame.Frame, [core.String]], |
| 560 parseFirefox: [src__frame.Frame, [core.String]], |
| 561 parseSafari6_0: [src__frame.Frame, [core.String]], |
| 562 parseSafari6_1: [src__frame.Frame, [core.String]], |
| 563 parseSafari: [src__frame.Frame, [core.String]], |
| 564 parseFriendly: [src__frame.Frame, [core.String]], |
| 565 Frame: [src__frame.Frame, [core.Uri, core.int, core.int, core.String]] |
| 566 }), |
| 567 statics: () => ({ |
| 568 _uriOrPathToUri: [core.Uri, [core.String]], |
| 569 _catchFormatException: [src__frame.Frame, [core.String, dart.functionType(
src__frame.Frame, [])]] |
| 570 }), |
| 571 names: ['_uriOrPathToUri', '_catchFormatException'] |
| 572 }); |
| 573 dart.defineLazy(src__frame.Frame, { |
| 574 get _uriRegExp() { |
| 575 return core.RegExp.new('^[a-zA-Z][-+.a-zA-Z\\d]*://'); |
| 576 }, |
| 577 get _windowsRegExp() { |
| 578 return core.RegExp.new('^([a-zA-Z]:[\\\\/]|\\\\\\\\)'); |
| 579 } |
| 580 }); |
| 581 src__stack_zone_specification._ChainHandler = dart.typedef('_ChainHandler', ()
=> dart.functionType(dart.void, [dart.dynamic, src__chain.Chain])); |
| 582 const _chains = Symbol('_chains'); |
| 583 const _onError = Symbol('_onError'); |
| 584 const _currentNode = Symbol('_currentNode'); |
| 585 const _createNode = Symbol('_createNode'); |
| 586 const _run = Symbol('_run'); |
| 587 src__stack_zone_specification.StackZoneSpecification = class StackZoneSpecific
ation extends core.Object { |
| 588 StackZoneSpecification(onError) { |
| 589 if (onError === void 0) onError = null; |
| 590 this[_chains] = new (core.Expando$(src__stack_zone_specification._Node))("
stack chains"); |
| 591 this[_onError] = onError; |
| 592 this[_currentNode] = null; |
| 593 } |
| 594 toSpec() { |
| 595 return async.ZoneSpecification.new({handleUncaughtError: dart.bind(this, '
handleUncaughtError'), registerCallback: dart.bind(this, 'registerCallback'), re
gisterUnaryCallback: dart.bind(this, 'registerUnaryCallback'), registerBinaryCal
lback: dart.bind(this, 'registerBinaryCallback'), errorCallback: dart.bind(this,
'errorCallback')}); |
| 596 } |
| 597 currentChain(level) { |
| 598 if (level === void 0) level = 0; |
| 599 return this[_createNode](dart.notNull(level) + 1).toChain(); |
| 600 } |
| 601 chainFor(trace) { |
| 602 if (dart.is(trace, src__chain.Chain)) return trace; |
| 603 let previous = trace == null ? null : this[_chains].get(trace); |
| 604 return new src__stack_zone_specification._Node(trace, previous).toChain(); |
| 605 } |
| 606 trackFuture(future, level) { |
| 607 if (level === void 0) level = 0; |
| 608 let completer = async.Completer.sync(); |
| 609 let node = this[_createNode](dart.notNull(level) + 1); |
| 610 future.then(dart.dynamic)(dart.bind(completer, 'complete')).catchError(dar
t.fn((e, stackTrace) => { |
| 611 if (stackTrace == null) stackTrace = src__trace.Trace.current(); |
| 612 if (!dart.is(stackTrace, src__chain.Chain) && this[_chains].get(stackTra
ce) == null) { |
| 613 this[_chains].set(stackTrace, node); |
| 614 } |
| 615 completer.completeError(e, dart.as(stackTrace, core.StackTrace)); |
| 616 })); |
| 617 return completer.future; |
| 618 } |
| 619 trackStream(stream, level) { |
| 620 if (level === void 0) level = 0; |
| 621 let node = this[_createNode](dart.notNull(level) + 1); |
| 622 return stream.transform(dart.dynamic)(async.StreamTransformer.fromHandlers
({handleError: dart.fn((error, stackTrace, sink) => { |
| 623 if (stackTrace == null) stackTrace = src__trace.Trace.current(); |
| 624 if (!dart.is(stackTrace, src__chain.Chain) && this[_chains].get(stackT
race) == null) { |
| 625 this[_chains].set(stackTrace, node); |
| 626 } |
| 627 sink.addError(error, stackTrace); |
| 628 }, dart.void, [core.Object, core.StackTrace, async.EventSink])})); |
| 629 } |
| 630 registerCallback(self, parent, zone, f) { |
| 631 if (f == null) return parent.registerCallback(dart.dynamic)(zone, null); |
| 632 let node = this[_createNode](1); |
| 633 return parent.registerCallback(dart.dynamic)(zone, dart.fn(() => this[_run
](f, node))); |
| 634 } |
| 635 registerUnaryCallback(self, parent, zone, f) { |
| 636 if (f == null) return parent.registerUnaryCallback(dart.dynamic, dart.dyna
mic)(zone, null); |
| 637 let node = this[_createNode](1); |
| 638 return parent.registerUnaryCallback(dart.dynamic, dart.dynamic)(zone, dart
.fn(arg => this[_run](dart.fn(() => dart.dcall(f, arg)), node))); |
| 639 } |
| 640 registerBinaryCallback(self, parent, zone, f) { |
| 641 if (f == null) return parent.registerBinaryCallback(dart.dynamic, dart.dyn
amic, dart.dynamic)(zone, null); |
| 642 let node = this[_createNode](1); |
| 643 return parent.registerBinaryCallback(dart.dynamic, dart.dynamic, dart.dyna
mic)(zone, dart.fn((arg1, arg2) => this[_run](dart.fn(() => dart.dcall(f, arg1,
arg2)), node))); |
| 644 } |
| 645 handleUncaughtError(self, parent, zone, error, stackTrace) { |
| 646 let stackChain = this.chainFor(stackTrace); |
| 647 if (this[_onError] == null) { |
| 648 return parent.handleUncaughtError(dart.dynamic)(zone, error, stackChain)
; |
| 649 } |
| 650 try { |
| 651 return parent.runBinary(dart.dynamic, dart.dynamic, src__chain.Chain)(zo
ne, this[_onError], error, stackChain); |
| 652 } catch (newError) { |
| 653 let newStackTrace = dart.stackTrace(newError); |
| 654 if (core.identical(newError, error)) { |
| 655 return parent.handleUncaughtError(dart.dynamic)(zone, error, stackChai
n); |
| 656 } else { |
| 657 return parent.handleUncaughtError(dart.dynamic)(zone, newError, newSta
ckTrace); |
| 658 } |
| 659 } |
| 660 |
| 661 } |
| 662 errorCallback(self, parent, zone, error, stackTrace) { |
| 663 if (stackTrace == null) { |
| 664 stackTrace = this[_createNode](2).toChain(); |
| 665 } else { |
| 666 if (this[_chains].get(stackTrace) == null) this[_chains].set(stackTrace,
this[_createNode](2)); |
| 667 } |
| 668 let asyncError = parent.errorCallback(zone, error, stackTrace); |
| 669 return asyncError == null ? new async.AsyncError(error, stackTrace) : asyn
cError; |
| 670 } |
| 671 [_createNode](level) { |
| 672 if (level === void 0) level = 0; |
| 673 return new src__stack_zone_specification._Node(src__trace.Trace.current(da
rt.notNull(level) + 1), this[_currentNode]); |
| 674 } |
| 675 [_run](f, node) { |
| 676 let previousNode = this[_currentNode]; |
| 677 this[_currentNode] = node; |
| 678 try { |
| 679 return dart.dcall(f); |
| 680 } catch (e) { |
| 681 let stackTrace = dart.stackTrace(e); |
| 682 this[_chains].set(stackTrace, node); |
| 683 throw e; |
| 684 } |
| 685 finally { |
| 686 this[_currentNode] = previousNode; |
| 687 } |
| 688 } |
| 689 }; |
| 690 dart.setSignature(src__stack_zone_specification.StackZoneSpecification, { |
| 691 constructors: () => ({StackZoneSpecification: [src__stack_zone_specification
.StackZoneSpecification, [], [src__stack_zone_specification._ChainHandler]]}), |
| 692 methods: () => ({ |
| 693 toSpec: [async.ZoneSpecification, []], |
| 694 currentChain: [src__chain.Chain, [], [core.int]], |
| 695 chainFor: [src__chain.Chain, [core.StackTrace]], |
| 696 trackFuture: [async.Future, [async.Future], [core.int]], |
| 697 trackStream: [async.Stream, [async.Stream], [core.int]], |
| 698 registerCallback: [async.ZoneCallback, [async.Zone, async.ZoneDelegate, as
ync.Zone, core.Function]], |
| 699 registerUnaryCallback: [async.ZoneUnaryCallback, [async.Zone, async.ZoneDe
legate, async.Zone, core.Function]], |
| 700 registerBinaryCallback: [async.ZoneBinaryCallback, [async.Zone, async.Zone
Delegate, async.Zone, core.Function]], |
| 701 handleUncaughtError: [dart.dynamic, [async.Zone, async.ZoneDelegate, async
.Zone, dart.dynamic, core.StackTrace]], |
| 702 errorCallback: [async.AsyncError, [async.Zone, async.ZoneDelegate, async.Z
one, core.Object, core.StackTrace]], |
| 703 [_createNode]: [src__stack_zone_specification._Node, [], [core.int]], |
| 704 [_run]: [dart.dynamic, [core.Function, src__stack_zone_specification._Node
]] |
| 705 }) |
| 706 }); |
| 707 src__stack_zone_specification._Node = class _Node extends core.Object { |
| 708 _Node(trace, previous) { |
| 709 if (previous === void 0) previous = null; |
| 710 this.previous = previous; |
| 711 this.trace = trace == null ? src__trace.Trace.current() : src__trace.Trace
.from(trace); |
| 712 } |
| 713 toChain() { |
| 714 let nodes = dart.list([], src__trace.Trace); |
| 715 let node = this; |
| 716 while (node != null) { |
| 717 nodes[dartx.add](node.trace); |
| 718 node = node.previous; |
| 719 } |
| 720 return new src__chain.Chain(nodes); |
| 721 } |
| 722 }; |
| 723 dart.setSignature(src__stack_zone_specification._Node, { |
| 724 constructors: () => ({_Node: [src__stack_zone_specification._Node, [core.Sta
ckTrace], [src__stack_zone_specification._Node]]}), |
| 725 methods: () => ({toChain: [src__chain.Chain, []]}) |
| 726 }); |
| 727 src__unparsed_frame.UnparsedFrame = class UnparsedFrame extends core.Object { |
| 728 UnparsedFrame(member) { |
| 729 this.uri = core.Uri.new({path: "unparsed"}); |
| 730 this.member = member; |
| 731 this.line = null; |
| 732 this.column = null; |
| 733 this.isCore = false; |
| 734 this.library = "unparsed"; |
| 735 this.package = null; |
| 736 this.location = "unparsed"; |
| 737 } |
| 738 toString() { |
| 739 return this.member; |
| 740 } |
| 741 }; |
| 742 src__unparsed_frame.UnparsedFrame[dart.implements] = () => [src__frame.Frame]; |
| 743 dart.setSignature(src__unparsed_frame.UnparsedFrame, { |
| 744 constructors: () => ({UnparsedFrame: [src__unparsed_frame.UnparsedFrame, [co
re.String]]}) |
| 745 }); |
| 746 stack_trace.ChainHandler = src__chain.ChainHandler; |
| 747 stack_trace.Chain = src__chain.Chain; |
| 748 stack_trace.Frame = src__frame.Frame; |
| 749 stack_trace.Trace = src__trace.Trace; |
| 750 stack_trace.UnparsedFrame = src__unparsed_frame.UnparsedFrame; |
| 751 // Exports: |
| 752 exports.src__trace = src__trace; |
| 753 exports.src__chain = src__chain; |
| 754 exports.src__vm_trace = src__vm_trace; |
| 755 exports.src__lazy_trace = src__lazy_trace; |
| 756 exports.src__utils = src__utils; |
| 757 exports.src__frame = src__frame; |
| 758 exports.src__stack_zone_specification = src__stack_zone_specification; |
| 759 exports.src__unparsed_frame = src__unparsed_frame; |
| 760 exports.stack_trace = stack_trace; |
| 761 }); |
OLD | NEW |