表指令。豫
yuyan · 211 行 · 12925 字节 · UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
寻观「底层库」之书。
寻观「客体二号」之「布局」之书。
寻观「客体二号」之「基础」之书。
寻观「客体二号」之「模块」之书。
寻观「客体二号」之「对象」之书。
「:文言:表之批量指令:table.init、elem.drop、table.copy、table.grow、table.fill,及表与元素段之助手。汉语:表指令:表描述与元素段条的访问助手,元素段的逐项填表(实例化时初始化主动段与运行期 table.init 共用),以及 0xFC 前缀的 table.init/elem.drop/table.copy/table.grow/table.fill(子操作码 12、13、14、15、17)。表的存储在解析时按“上限”(没有声明就是最小加 1024)一次分配好,所以 table.grow 只在这个容量之内增长,超出则返回 -1。范围一律按无符号数检查并防加法溢出,越界以退出码 124 陷入;操作数是 i32 或引用(低字);引用值是 (函数号 << 3) | 2,空引用为 0。:」
「表描述址」乃化「整数」而「整数」也。
「表描述址」者会「表号」而
「加」于(「读四」于「状态_表描述」)于(「乘」于「表号」于「表描述长」)
也。
「表项检查」乃化「整数」而化「整数」而「有」也。
「表项检查」者会「描述」而会「序」而
「若则致命」
于(「无符号大等」于「序」于(「读字段」于「描述」于「表描述_大小」))于「一二四」
于(「静态串」于『表索引越界』)
也。
「元素段条」乃化「整数」而「整数」也。
「元素段条」者会「号」而
「加」于(「读四」于「状态_元素段表」)于(「乘」于「号」于「元素段条长」)
也。
「:文言:填元素:自元素段之向量游标起,逐项写入表(标志小于四者为函数号之变长整数,否则为常量式,以指定之基为工作栈)。汉语:把元素段里从 游 开始的 个数 个元素依次写到 数据 起的表里(偏 是表内起始下标):标志小于 4 的段是函数号的 LEB128,写成 (函数号 << 3) | 2;否则每项是常量表达式,用以 基 为起点的工作栈求值(实例化时用值栈基,运行期 table.init 用当前栈针以上的空闲区)。:」
「填元素逐个」乃
化「整数」而
化「整数」而
化「整数」而
化「整数」而
化「整数」而
化「整数」而
化「整数」而
「有」
也。
「填元素逐个」者会「标志」而会「数据」而会「偏」而会「个数」而会「位」而会「游」而会「基」而
若「小于」于「位」于「个数」
则
虑「格」者
「加」于「数据」于(「乘」于(「加」于「偏」于「位」)于「四」)而
若「小于」于「标志」于「四」
则
虑「值」者「读无符号变长」于「游」而
虑「新游」者「读四」于「状态_读址」而
虑「无」者
(「写四」于「格」于(「位或」于(「左移」于「值」于「三」)于「二」))
而
「填元素逐个」于「标志」于「数据」于「偏」于「个数」于(「加」于「位」于「一」)于「新游」于「基」
否则
虑「新游」者「求值常量式于」于「游」于「状态_临时」于「基」
而
虑「无」者(「写四」于「格」于(「读四」于「状态_临时」))而
「填元素逐个」于「标志」于「数据」于「偏」于「个数」于(「加」于「位」于「一」)于「新游」于「基」
否则
「元」
也。
「:文言:元素段之可用长:已弃者与声明式者为零。汉语:元素段当前可用的元素个数:已被丢弃的段、声明式的段(标志 3 与 7)都是 0,其余是个数。:」
「元素可用长」乃化「整数」而「整数」也。
「元素可用长」者会「条」而
虑「标志」者「读字段」于「条」于「元素段_标志」而
若「或者」
于(「不等于」于(「读字段」于「条」于「元素段_已弃」)于「零」)
于(「或者」于(「等」于「标志」于「三」)于(「等」于「标志」于「七」))
则
「零」
否则
「读字段」于「条」于「元素段_个数」
也。
「元素游标」乃化「整数」而化「整数」而「整数」也。
「元素游标」者会「条」而会「跳」而
虑「起」者「读字段」于「条」于「元素段_向量起」而
若「小于」于(「读字段」于「条」于「元素段_标志」)于「四」
则
「变长们后」于「起」于「跳」
否则
「跳过常量式们」于「起」于「跳」
也。
「:文言:table.init:自元素段取若干项入表;操作数自底至顶为目起、源起、个数。汉语:table.init 元素段号 表号:栈上依次是目标起始下标、源起始下标、个数(各 i32);源范围必须在段的可用长之内,目标范围必须在表的当前大小之内,否则陷入 124;成功后弹出三个操作数。:」
「表初始化」乃化「整数」而化「整数」而「整数」也。
「表初始化」者会「址」而会「栈针」而
虑「段」者「读无符号变长」于「址」而
虑「址二」者「读四」于「状态_读址」而
虑「表」者「读无符号变长」于「址二」而
虑「无」者(「写四」于「状态_新指令针」于(「读四」于「状态_读址」))而
虑「个数」者「栈槽字」于「栈针」于「一」而
虑「源起」者「栈槽字」于「栈针」于「二」而
虑「目起」者「栈槽字」于「栈针」于「三」而
虑「条」者「元素段条」于「段」而
虑「描述」者「表描述址」于「表」而
虑「无」者
(「若则致命」
于(「或者」
于(「区间越界」于「源起」于「个数」于(「元素可用长」于「条」))
于(「区间越界」于「目起」于「个数」于(「读字段」于「描述」于「表描述_大小」)))
于「一二四」
于(「静态串」于『table.init 越界』))而
虑「无」者
(「填元素逐个」
于(「读字段」于「条」于「元素段_标志」)
于(「读字段」于「描述」于「表描述_数据」)
于「目起」
于「个数」于「零」
于(「元素游标」于「条」于「源起」)于「栈针」)
而
「栈槽址」于「栈针」于「三」
也。
「:文言:elem.drop:丢弃元素段。汉语:elem.drop 元素段号:把该段标为已弃,此后可用长为 0;重复丢弃合法;不动操作数。:」
「丢弃元素段」乃化「整数」而化「整数」而「整数」也。
「丢弃元素段」者会「址」而会「栈针」而
虑「段」者「读无符号变长」于「址」而
虑「无」者(「写四」于「状态_新指令针」于(「读四」于「状态_读址」))而
虑「无」者
(「写字段」于(「元素段条」于「段」)于「元素段_已弃」于「一」)
而
「栈针」
也。
「:文言:table.copy:表间或表内复制,可重叠。汉语:table.copy 目表 源表:栈上依次是目标起始下标、源起始下标、个数;两个范围都必须在各自表的当前大小之内,否则陷入 124;用内存复制(允许重叠,语义同 memmove);成功后弹出三个操作数。:」
「表复制」乃化「整数」而化「整数」而「整数」也。
「表复制」者会「址」而会「栈针」而
虑「目表」者「读无符号变长」于「址」而
虑「址二」者「读四」于「状态_读址」而
虑「源表」者「读无符号变长」于「址二」而
虑「无」者(「写四」于「状态_新指令针」于(「读四」于「状态_读址」))而
虑「个数」者「栈槽字」于「栈针」于「一」而
虑「源起」者「栈槽字」于「栈针」于「二」而
虑「目起」者「栈槽字」于「栈针」于「三」而
虑「源描述」者「表描述址」于「源表」而
虑「目描述」者「表描述址」于「目表」而
虑「无」者
(「若则致命」
于(「或者」
于(「区间越界」于「源起」于「个数」于(「读字段」于「源描述」于「表描述_大小」))
于(「区间越界」于「目起」于「个数」于(「读字段」于「目描述」于「表描述_大小」)))
于「一二四」
于(「静态串」于『table.copy 越界』))而
虑「无」者
(「拷贝」
于(「加」于(「读字段」于「目描述」于「表描述_数据」)于(「乘」于「目起」于「四」))
于(「加」于(「读字段」于「源描述」于「表描述_数据」)于(「乘」于「源起」于「四」))
于(「乘」于「个数」于「四」))
而
「栈槽址」于「栈针」于「三」
也。
「填表逐个」乃化「整数」而化「整数」而化「整数」而「有」也。
「填表逐个」者会「格」而会「个数」而会「值」而
若「大于」于「个数」于「零」
则
((「写四」于「格」于「值」);
(「填表逐个」于(「加」于「格」于「四」)于(「减」于「个数」于「一」)于「值」))
否则
「元」
也。
「:文言:table.grow:增长表,新项以给定引用填之,返旧大小,失败返负一。汉语:table.grow 表号:栈上是初值引用与增长的项数(i32,栈顶);新大小超过上限(解析时分配的容量)或加法溢出则返回 -1、表不变;否则把新增的项填成初值,返回旧大小。弹出一个槽,结果覆盖原来的初值槽。:」
「表增长」乃化「整数」而化「整数」而「整数」也。
「表增长」者会「址」而会「栈针」而
虑「表」者「读无符号变长」于「址」而
虑「无」者(「写四」于「状态_新指令针」于(「读四」于「状态_读址」))而
虑「个数」者「栈槽字」于「栈针」于「一」而
虑「值」者「栈槽字」于「栈针」于「二」而
虑「描述」者「表描述址」于「表」而
虑「旧」者「读字段」于「描述」于「表描述_大小」而
虑「新」者「加」于「旧」于「个数」而
虑「失败」者
「或者」于(「无符号小于」于「新」于「旧」)于(「无符号大于」于「新」于(「读字段」于「描述」于「表描述_上限」))
而
虑「无」者
(
若「失败」
则
「元」
否则
((「填表逐个」
于(「加」于(「读字段」于「描述」于「表描述_数据」)于(「乘」于「旧」于「四」))
于「个数」于「值」);
(「写字段」于「描述」于「表描述_大小」于「新」))
)
而
虑「无」者
(「置栈槽」于「栈针」于「二」于(「选择」于「失败」于「负一」于「旧」)于「零」)
而
「减」于「栈针」于「八」
也。
「:文言:table.fill:以引用填表之一段。汉语:table.fill 表号:栈上依次是起始下标、引用值、项数;范围必须在表的当前大小之内,否则陷入 124;弹出三个操作数。:」
「表填充」乃化「整数」而化「整数」而「整数」也。
「表填充」者会「址」而会「栈针」而
虑「表」者「读无符号变长」于「址」而
虑「无」者(「写四」于「状态_新指令针」于(「读四」于「状态_读址」))而
虑「个数」者「栈槽字」于「栈针」于「一」而
虑「值」者「栈槽字」于「栈针」于「二」而
虑「起」者「栈槽字」于「栈针」于「三」而
虑「描述」者「表描述址」于「表」而
虑「无」者
(「若则致命」
于(「区间越界」于「起」于「个数」于(「读字段」于「描述」于「表描述_大小」))
于「一二四」
于(「静态串」于『table.fill 越界』))而
虑「无」者
(「填表逐个」
于(「加」于(「读字段」于「描述」于「表描述_数据」)于(「乘」于「起」于「四」))
于「个数」于「值」)
而
「栈槽址」于「栈针」于「三」
也。