Skip to main contentModule text_clone
Source - crypto_get_random_values 🔒
crypto.getRandomValues(typedArray)。以前は種別を無視して全要素を無条件に
& 0xff(0-255)で埋めており、Int16Array/Int32Array/Uint32Array 等
8bit より広い型に対しては本来の値域のごく一部(下位8bitのみ、常に非負)しか
埋められない、実質的にランダム性が大幅に弱まるバグだった。_ta_kind タグから
種別を復元し、コンストラクタ/set/索引代入と同じ TaKind::convert() で
型ごとの正しい値域に変換する。- crypto_random_uuid 🔒
- decode_utf16_bytes 🔒
- UTF-16(LE/BE)のバイト列を Rust
String へデコードする。不正な
サロゲートは仕様どおり置換文字(U+FFFD)に置き換える。 - deep_clone_value 🔒
structuredClone は仕様上、循環参照(var a={}; a.self=a;)や同一オブジェクトへの
複数参照(構造の共有)を正しく扱う必要がある。以前はそのための「複製済みオブジェクトの
記録」を一切持たず単純な再帰だけだったため、循環参照ではスタックオーバーフロー
(この no_std カーネル環境ではクラッシュ/ハングになり得る)に陥っていた。
seen に (元オブジェクト, 複製先オブジェクト) を積みながら辿ることで、複製先の
入れ物を先に作ってから中身を埋める(=自己参照が現れた時点で既に登録済みにする)。- deep_clone_value_depth 🔒
- normalize_text_encoding_label 🔒
TextDecoder のラベル正規化(WHATWG Encoding の簡易サブセット)。未知の
ラベルは寛容に utf-8 へフォールバックする(この処理系の他のパース系と
同水準の簡略化)。- structured_clone 🔒
structuredClone(value, {transfer: [...]}) の第2引数 transfer が丸ごと
無視されていた。実際のメモリ移動は行わない簡略実装だが、転送対象の
ArrayBuffer の .detached を true にし内部バイト列を破棄することで
ArrayBuffer.prototype.transfer() 自身の「二重 transfer はエラー」という
既存チェック(arraybuffer_transfer_impl)とは整合する状態にする
(slice()/byteLength 自体が detached を見ない、という既存の簡略化は
そのまま踏襲する)。- text_decode 🔒
TextDecoder.prototype.decode()。以前はコンストラクタに渡した encoding
ラベル(new TextDecoder('utf-16le') 等)を完全に無視し、常に UTF-8 として
デコードしていたバグだった(utf-16 系データを渡しても静かに文字化けする)。
重要: decode(chunk, {stream: true})(ストリーミングデコード。丸ごと
未対応だった。チャンク境界でマルチバイト文字が分断された場合に文字化け
させず次回呼び出しへ持ち越す定番パターン)にも対応。this._pending
(隠しプロパティ)に前回分の未完了バイトを保持する。UTF-16 系は2バイト
単位のため奇数バイト余りを同様に持ち越す。- text_decoder_ctor 🔒
new TextDecoder(label) が丸ごと引数を無視し常に utf-8 決め打ちだった
バグ(詳細は text_decode/normalize_text_encoding_label のコメント参照)。- text_encode 🔒
- text_encode_into 🔒
TextEncoder.prototype.encodeInto(source, destination) が丸ごと未対応
だった(encode() は既に対応済みだったが、既存の Uint8Array バッファへ
直接書き込むこちらの性能向けバリアントが欠けていた)。仕様どおり UTF-8
コードポイント境界で打ち切り(マルチバイト文字を途中で分割しない)、
{read, written}(read は消費した UTF-16 コード単位数、written は
書き込んだバイト数)を返す。- text_encoder_ctor 🔒
- url_create_object_url 🔒
URL.createObjectURL(blob)(Blob/File を一意な blob: URL 文字列へ
変換する定番パターン。<img src=URL.createObjectURL(blob)>/ダウンロード
リンク生成等で広く使われる)が丸ごと未対応だった。実際の URL 解決
(画像読み込みパイプラインへの配線)までは行わない発行のみの簡略実装だが、
呼び出し自体が TypeError になる致命的な欠落は解消する。既存の
crypto.randomUUID() と同じ乱数源で一意な ID を生成する。- url_revoke_object_url 🔒
URL.revokeObjectURL(url)。createObjectURL が実際の登録簿を持たない
簡略実装のため、対になる解放側も無害な no-op とする。- utf8_incomplete_trailing_len 🔒
- UTF-8 バイト列の末尾が「まだ継続バイトが足りない不完全なマルチバイト
シーケンスの途中」かどうかを判定し、その未完了分のバイト数(0なら
末尾は完結している)を返す。
TextDecoder.decode(chunk, {stream:true})
が末尾のバイトを次回呼び出しへ持ち越すために使う。