预编接口。豫
yuyan · 219 行 · 13953 字节 · 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 212 213 214 215 216 217 218 219
寻观「底层库」之书。
寻观「客体二号」之「布局」之书。
寻观「客体二号」之「基础」之书。
寻观「客体二号」之「实例」之书。
寻观「客体二号」之「堆」之书。
寻观「客体二号」之「对象」之书。
寻观「客体二号」之「运算」之书。
寻观「客体二号」之「访存」之书。
寻观「客体二号」之「解释」之书。
寻观「客体二号」之「异常」之书。
寻观「客体二号」之「主机」之书。
「:文言:预编之接口:客体之 WasmGC 函数预编为整数之函数,并入执行器而同降为机器码;彼等以此诸导出之函数为运行时(名以“预编_”冠之)。值皆居值栈(与解释同布:每槽八字节,引用与三十二位整数居低字),故保守之回收如常见之。预编之函数形如(帧)→无:参数与局部自帧起,操作数其上;调用者置参数于栈顶,被调者之帧即其起处,毕则诸结果自帧起。复杂之指令径呼解释器之处理函数,携其立即数于模块中之址。汉语:预编(路二乙档的第一版)接口:客体 WasmGC 模块的每个函数被转译成一个整数 Wasm 函数,并入执行器模块后一起降级为机器码;转译出的代码把这里这些导出函数(名字以“预编_”开头)当作运行时。所有值都放在值栈上(布局与解释器相同:每槽 8 字节,引用与 32 位整数在低字、高字为零),所以保守回收照常能看到它们。转译函数的形状是(帧)→ 无:参数与局部变量从帧起依次存放,操作数栈在其上;调用者把参数放在栈顶,被调用者的帧就从这些参数处开始,返回时各结果从帧起存放。结构、数组、类型转换、宽整数、浮点、访存、表与杂项指令直接调用解释器的处理函数,并把该指令立即数在模块字节中的地址传给它们。异常用标志传播:抛出时记下载荷并置 状态_预编异常,转译代码在每次调用之后检查它。预编派发 与 预编可用 的函数体在这里只是占位,转译器会换成真正的派发(按函数号调用转译函数)与常量 1。:」
「:文言:异常之标:非零则有异常正在传播。汉语:预编异常标志:非零表示有异常正在向外传播(载荷在 状态_例外载荷,个数与标签在 状态_例外数、状态_例外标签)。:」
「状态_预编异常」者「三八二四」也。
「:文言:占位:转译器换其体。汉语:占位函数:转译器把函数体换成真正的派发与常量 1。:」
「导出:预编派发」乃化「整数」而化「整数」而「有」也。
「导出:预编派发」者会「帧」而会「号」而
「致命退出」于「一三八」于(「静态串」于『没有预编代码』)
也。
「导出:预编可用」乃化「有」而「整数」也。
「导出:预编可用」者会「无」而
「加」于(「读四」于「状态_预编异常」)于(「减」于「零」于(「读四」于「状态_预编异常」))
也。
「导出:预编_调用导入」乃化「整数」而化「整数」而「整数」也。
「导出:预编_调用导入」者会「号」而会「栈针」而
虑「新栈」者「调用导入」于「号」于「栈针」而
虑「无」者
(「若则致命」
于(「不等于」于(「读四」于「状态_请求」)于「零」)
于「一三八」
于(「静态串」于『预编模式不支持加载模块与调用导出』))
而
「新栈」
也。
「导出:预编_GC」乃化「整数」而化「整数」而化「整数」而「整数」也。
「导出:预编_GC」者会「子」而会「址」而会「栈针」而
「执行GC」于「子」于「址」于「栈针」
也。
「导出:预编_宽浮」乃化「整数」而化「整数」而「整数」也。
「导出:预编_宽浮」者会「操作码」而会「栈针」而
「执行宽或浮点」于「操作码」于「栈针」
也。
「导出:预编_访存」乃化「整数」而化「整数」而化「整数」而「整数」也。
「导出:预编_访存」者会「操作码」而会「址」而会「栈针」而
「执行访存」于「操作码」于「址」于「栈针」
也。
「导出:预编_杂项」乃化「整数」而化「整数」而化「整数」而「整数」也。
「导出:预编_杂项」者会「子」而会「址」而会「栈针」而
「执行杂项」于「子」于「址」于「栈针」
也。
「:文言:间接之调:自表取函数号而验其签名。汉语:间接调用的目标:从表里按栈顶的元素号取函数号并检查签名(新栈 指向该元素号所在的槽)。:」
「导出:预编_间接」乃化「整数」而化「整数」而化「整数」而「整数」也。
「导出:预编_间接」者会「类型号」而会「表号」而会「新栈」而
「间接目标」于「类型号」于「表号」于「新栈」
也。
「导出:预编_表取」乃化「整数」而化「整数」而「整数」也。
「导出:预编_表取」者会「序」而会「栈针」而
虑「无」者「表获取」于「序」于「栈针」而
「栈针」
也。
「导出:预编_表设」乃化「整数」而化「整数」而「整数」也。
「导出:预编_表设」者会「序」而会「栈针」而
「表设置」于「序」于「栈针」
也。
「:文言:陷阱:一二八不可达,一二九空引用,一二四间接之调不合,一三五转换失败,一二七越界。汉语:致命陷阱:128 unreachable、129 空引用、124 空函数引用、135 类型转换失败、127 数组索引越界,其余为一般陷阱。:」
「导出:预编_致命」乃化「整数」而「有」也。
「导出:预编_致命」者会「码」而
鉴「码」而
有「一二八」则
「致命退出」于「一二八」于(「静态串」于『unreachable』)
或有「一二九」则
「致命退出」于「一二九」于(「静态串」于『空引用』)
或有「一二四」则
「致命退出」于「一二四」于(「静态串」于『空函数引用』)
或有「一三五」则
「致命退出」于「一三五」于(「静态串」于『类型转换失败』)
或有「一二七」则
「致命退出」于「一二七」于(「静态串」于『数组索引越界』)
或有「其他」则
「致命退出」于「码」于(「静态串」于『预编陷阱』)
也。
「导出:预编_栈溢出」乃化「有」而「有」也。
「导出:预编_栈溢出」者会「无」而
「致命退出」于「一二二」于(「静态串」于『值栈溢出』)
也。
「导出:预编_i32除」乃化「整数」而化「整数」而化「整数」而「整数」也。
「导出:预编_i32除」者会「操作码」而会「甲」而会「乙」而
「i32除法」于「操作码」于「甲」于「乙」
也。
「:文言:一元之术:一〇三前导零,一〇四尾随零,一〇五一计数。汉语:i32 一元运算:0x67 clz、0x68 ctz、0x69 popcnt。:」
「导出:预编_一元」乃化「整数」而化「整数」而「整数」也。
「导出:预编_一元」者会「操作码」而会「值」而
鉴「操作码」而
有「一零三」则「前导零」于「值」
或有「一零四」则「尾随零」于「值」
或有「其他」则「一计数」于「值」
也。
「:文言:引用属于某堆类型否,为 br_on_cast 与 ref.test 之用。汉语:引用是否属于某堆类型(br_on_cast 系列用):可空为 1 时 null 也算属于。:」
「导出:预编_属于」乃化「整数」而化「整数」而化「整数」而「整数」也。
「导出:预编_属于」者会「字」而会「堆类型」而会「可空」而
「爻整」于(「引用属于」于「字」于「堆类型」于(「不等于」于「可空」于「零」))
也。
「导出:预编_客页数」乃化「有」而「整数」也。
「导出:预编_客页数」者会「无」而
「读四」于「状态_客页数」
也。
「导出:预编_客增长」乃化「整数」而「有」也。
「导出:预编_客增长」者会「栈针」而
「客内存增长」于「栈针」
也。
「:文言:抛:自栈顶取载荷,记标签与个数,置异常之标。汉语:throw:从栈顶取该标签的参数个数个载荷槽拷进 状态_例外载荷,记下标签与个数,置 状态_预编异常。:」
「导出:预编_抛出」乃化「整数」而化「整数」而「有」也。
「导出:预编_抛出」者会「标签」而会「栈针」而
虑「个数」者
「读字段」于(「加」于(「读四」于「状态_标签表」)于(「乘」于「标签」于「标签条长」))于「标签条_参数数」
而
虑「无」者
(「若则致命」于(「大于」于「个数」于「例外载荷槽」)于「一三七」于(「静态串」于『异常载荷过大』))
而
虑「无」者
「拷贝」于「状态_例外载荷」于(「减」于「栈针」于(「乘」于「个数」于「八」))
于(「乘」于「个数」于「八」)
而
虑「无」者「写四」于「状态_例外数」于「个数」而
虑「无」者「写四」于「状态_例外标签」于「标签」而
「写四」于「状态_预编异常」于「一」
也。
「:文言:再抛:自栈顶之异常对象取载荷。汉语:throw_ref:从栈顶的异常对象取出标签与载荷,置 状态_预编异常。:」
「导出:预编_再抛」乃化「整数」而「有」也。
「导出:预编_再抛」者会「栈针」而
虑「引用」者「栈槽字」于「栈针」于「一」而
虑「无」者(「空引用检」于「引用」)而
虑「个数」者「读字段」于「引用」于「一二」而
虑「无」者「写四」于「状态_例外数」于「个数」而
虑「无」者
「写四」于「状态_例外标签」于(「读字段」于「引用」于「八」)而
虑「无」者
「拷贝」于「状态_例外载荷」于(「加」于「引用」于「一六」)
于(「乘」于「个数」于「八」)
而
「写四」于「状态_预编异常」于「一」
也。
「导出:预编_例外标签」乃化「有」而「整数」也。
「导出:预编_例外标签」者会「无」而
「读四」于「状态_例外标签」
也。
「:文言:捕:载荷拷至目址,清异常之标,返个数。汉语:catch:把载荷拷到目标地址,清除 状态_预编异常,返回个数。:」
「导出:预编_取载荷」乃化「整数」而「整数」也。
「导出:预编_取载荷」者会「目」而
虑「个数」者「读四」于「状态_例外数」而
虑「无」者
「拷贝」于「目」于「状态_例外载荷」于(「乘」于「个数」于「八」)而
虑「无」者「写四」于「状态_预编异常」于「零」而
「个数」
也。
「:文言:捕之引用:以载荷造异常之对象,书于栈针处。汉语:catch_ref / catch_all_ref:用当前载荷造异常对象(exnref),写到 栈针 处的槽,清除 状态_预编异常。分配前把 栈针 之后一槽记为回收的栈顶。:」
「导出:预编_例外引用」乃化「整数」而「有」也。
「导出:预编_例外引用」者会「栈针」而
虑「无」者「写四」于「状态_栈针」于「栈针」而
虑「对象」者「新异常对象」于「元」而
虑「无」者「写四」于「栈针」于「对象」而
虑「无」者「写字段」于「栈针」于「四」于「零」而
「写四」于「状态_预编异常」于「零」
也。
「导出:预编_清异常」乃化「有」而「有」也。
「导出:预编_清异常」者会「无」而
「写四」于「状态_预编异常」于「零」
也。
「:文言:以预编之码行一函数:帧即参数之起;毕而验异常。汉语:用预编代码运行一个函数(取代解释执行):参数已压在值栈上,帧 = 栈针 − 8×参数个数;调用派发后若仍有异常在传播,按未捕获异常以 137 退出;返回结果之后的新栈针。:」
「预编运行函数」乃化「整数」而化「整数」而「整数」也。
「预编运行函数」者会「函数号」而会「栈针」而
虑「条」者「函数条」于「函数号」而
虑「帧」者
「减」于「栈针」于(「乘」于(「读字段」于「条」于「函数条_参数数」)于「八」)而
虑「无」者「写四」于「状态_预编异常」于「零」而
虑「无」者「导出:预编派发」于「帧」于「函数号」而
虑「无」者
(「若则致命」
于(「不等于」于(「读四」于「状态_预编异常」)于「零」)
于「一三七」
于(「静态串」于『未捕获的异常』))
而
「加」于「帧」于(「乘」于(「读字段」于「条」于「函数条_结果数」)于「八」)
也。
「:文言:择途:有预编之码则行之,否则解释之。汉语:有预编代码就用它运行,否则解释执行。:」
「运行或预编」乃化「整数」而化「整数」而「整数」也。
「运行或预编」者会「函数号」而会「栈针」而
若「等」于(「导出:预编可用」于「元」)于「一」则
「预编运行函数」于「函数号」于「栈针」
否则
「运行函数」于「函数号」于「栈针」
也。