Left: | ||
Right: |
LEFT | RIGHT |
---|---|
1 // Copyright 2014 The Go Authors. All rights reserved. | 1 // Copyright 2014 The Go Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style | 2 // Use of this source code is governed by a BSD-style |
3 // license that can be found in the LICENSE file. | 3 // license that can be found in the LICENSE file. |
4 | 4 |
5 package runtime | 5 package runtime |
6 | 6 |
7 import "unsafe" | 7 import "unsafe" |
8 | 8 |
9 var indexError = error(errorString("index out of range")) | 9 var indexError = error(errorString("index out of range")) |
10 | 10 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
137 } | 137 } |
138 if m[defersc] != int32(siz) { | 138 if m[defersc] != int32(siz) { |
139 print("bad defer size class: i=", i, " siz=", siz, " def ersc=", defersc, "\n") | 139 print("bad defer size class: i=", i, " siz=", siz, " def ersc=", defersc, "\n") |
140 gothrow("bad defer size class") | 140 gothrow("bad defer size class") |
141 } | 141 } |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 // The arguments associated with a deferred call are stored | 145 // The arguments associated with a deferred call are stored |
146 // immediately after the _defer header in memory. | 146 // immediately after the _defer header in memory. |
147 //go:nosplit | |
147 func deferArgs(d *_defer) unsafe.Pointer { | 148 func deferArgs(d *_defer) unsafe.Pointer { |
khr
2014/09/15 19:23:00
Mark this as nosplit.
rsc
2014/09/16 14:28:37
Done.
| |
148 return add(unsafe.Pointer(d), unsafe.Sizeof(*d)) | 149 return add(unsafe.Pointer(d), unsafe.Sizeof(*d)) |
149 } | 150 } |
150 | 151 |
151 var deferType *_type // type of _defer struct | 152 var deferType *_type // type of _defer struct |
152 | 153 |
153 func init() { | 154 func init() { |
154 var x interface{} | 155 var x interface{} |
155 x = (*_defer)(nil) | 156 x = (*_defer)(nil) |
156 deferType = (*(**ptrtype)(unsafe.Pointer(&x))).elem | 157 deferType = (*(**ptrtype)(unsafe.Pointer(&x))).elem |
157 } | 158 } |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
284 p.link = gp._panic | 285 p.link = gp._panic |
285 gp._panic = (*_panic)(noescape(unsafe.Pointer(&p))) | 286 gp._panic = (*_panic)(noescape(unsafe.Pointer(&p))) |
286 | 287 |
287 for { | 288 for { |
288 d := gp._defer | 289 d := gp._defer |
289 if d == nil { | 290 if d == nil { |
290 break | 291 break |
291 } | 292 } |
292 | 293 |
293 // If defer was started by earlier panic or Goexit (and, since w e're back here, that triggered a new panic), | 294 // If defer was started by earlier panic or Goexit (and, since w e're back here, that triggered a new panic), |
294 » » // take defer off list. The earlier panic or Goeixt will not con tinue running. | 295 » » // take defer off list. The earlier panic or Goexit will not con tinue running. |
khr
2014/09/15 19:23:00
s/Goeixt/Goexit/
rsc
2014/09/16 14:28:37
Done.
| |
295 if d.started { | 296 if d.started { |
296 if d._panic != nil { | 297 if d._panic != nil { |
297 d._panic.aborted = true | 298 d._panic.aborted = true |
298 } | 299 } |
299 gp._defer = d.link | 300 gp._defer = d.link |
300 freedefer(d) | 301 freedefer(d) |
301 continue | 302 continue |
302 } | 303 } |
303 | 304 |
304 // Mark defer as started, but keep on list, so that traceback | 305 // Mark defer as started, but keep on list, so that traceback |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
452 } | 453 } |
453 if gp.m.locks != 0 { | 454 if gp.m.locks != 0 { |
454 print("panic: ", s, "\n") | 455 print("panic: ", s, "\n") |
455 gothrow("panic holding locks") | 456 gothrow("panic holding locks") |
456 } | 457 } |
457 | 458 |
458 var err interface{} | 459 var err interface{} |
459 newErrorCString(unsafe.Pointer(s), &err) | 460 newErrorCString(unsafe.Pointer(s), &err) |
460 gopanic(err) | 461 gopanic(err) |
461 } | 462 } |
LEFT | RIGHT |