compiler, runtime: move defer notes to the runtime file
This seems like the more appropriate place to describe the implementation of defer.
Этот коммит содержится в:
родитель
c7cf6f0e82
коммит
d7844ce124
2 изменённых файлов: 12 добавлений и 13 удалений
|
@ -8,19 +8,6 @@ import (
|
||||||
// For a description of the calling convention in prose, see docs/internals.rst
|
// For a description of the calling convention in prose, see docs/internals.rst
|
||||||
// or the online version of this document:
|
// or the online version of this document:
|
||||||
// https://tinygo.readthedocs.io/en/latest/internals.html#calling-convention
|
// https://tinygo.readthedocs.io/en/latest/internals.html#calling-convention
|
||||||
//
|
|
||||||
// Some further notes:
|
|
||||||
// * Defer statements are implemented by transforming the function in the
|
|
||||||
// following way:
|
|
||||||
// * Creating an alloca in the entry block that contains a pointer
|
|
||||||
// (initially null) to the linked list of defer frames.
|
|
||||||
// * Every time a defer statement is executed, a new defer frame is
|
|
||||||
// created using alloca with a pointer to the previous defer frame, and
|
|
||||||
// the head pointer in the entry block is replaced with a pointer to
|
|
||||||
// this defer frame.
|
|
||||||
// * On return, runtime.rundefers is called which calls all deferred
|
|
||||||
// functions from the head of the linked list until it has gone through
|
|
||||||
// all defer frames.
|
|
||||||
|
|
||||||
// The maximum number of arguments that can be expanded from a single struct. If
|
// The maximum number of arguments that can be expanded from a single struct. If
|
||||||
// a struct contains more fields, it is passed as a struct without expanding.
|
// a struct contains more fields, it is passed as a struct without expanding.
|
||||||
|
|
|
@ -1,5 +1,17 @@
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
|
// Defer statements are implemented by transforming the function in the
|
||||||
|
// following way:
|
||||||
|
// * Creating an alloca in the entry block that contains a pointer (initially
|
||||||
|
// null) to the linked list of defer frames.
|
||||||
|
// * Every time a defer statement is executed, a new defer frame is created
|
||||||
|
// using alloca with a pointer to the previous defer frame, and the head
|
||||||
|
// pointer in the entry block is replaced with a pointer to this defer
|
||||||
|
// frame.
|
||||||
|
// * On return, runtime.rundefers is called which calls all deferred functions
|
||||||
|
// from the head of the linked list until it has gone through all defer
|
||||||
|
// frames.
|
||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
type deferContext unsafe.Pointer
|
type deferContext unsafe.Pointer
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче