Skip to main contentModule props_methods
Source - NFD_TABLE 🔒
String.prototype.normalize(form)(ES2015)。丸ごと欠落しており、呼び出すと
「メソッドが存在しない」TypeError になっていた。本来は Unicode 正規化(NFC/NFD/NFKC/NFKD)
を行うが、この no_std 環境には正規化用の Unicode 分解/合成テーブルが無いため、form 引数の
妥当性検証(無効な値は仕様どおり RangeError)だけ行い、内容は元の文字列をそのまま返す
簡略実装(合成済み文字のみで構成された通常の文字列であれば実質的に無害)。
西欧言語の合成済みラテン文字 ⇔ (基底文字, 結合分音符) の対応表。
フル Unicode Character Database(分解表・結合クラス・正規順序付け・合成除外
リスト)を持たない no_std 環境では完全な NFC/NFD/NFKC/NFKD 実装は非現実的な
ため、実用頻度の高いラテン語圏の分音符付き文字(フランス語・スペイン語・
ドイツ語・ポルトガル語等)に限定した部分実装とする。- RADIX_DIGITS 🔒
- arr_concat 🔒
- arr_copy_within 🔒
- arr_every 🔒
- arr_fill 🔒
Array.prototype.fill(value, start, end)。以前は start/end(第2/第3引数)を
完全に無視して常に配列全体を上書きしており、[1,2,3,4,5].fill(0,1,3) のような
部分埋めの定番パターンが機能していなかった。- arr_filter 🔒
- arr_find 🔒
- arr_find_index 🔒
- arr_flat 🔒
Array.prototype.flat(depth = 1)。以前は depth 引数を完全に無視して常に1段だけ
展開する実装になっており、arr.flat(2) や、深いネスト解除の定番イディオムである
arr.flat(Infinity) が仕様どおりに動かない(1段しか展開されない)バグだった。- arr_for_each 🔒
Array.prototype.forEach は仕様上ジェネリックメソッドだが、以前は this_items
(ObjKind::Array 以外は無条件で空 Vec)を直接使っていたため、.call(arrayLikeObj, fn)(arguments/NodeList 等への定番イディオム)が何も反復しない静かな破壊
バグだった(join/slice/concat で修正済みの同型バグ)。- arr_from_index 🔒
fromIndex(第2引数)を正規化する。負の値は末尾からのオフセット、範囲外は
len(=以降の探索が即座に空になる)に丸める(indexOf/includes 共通)。- arr_includes 🔒
Array.prototype.includes は仕様上 SameValueZero で比較する必要がある
(=== と違って NaN 同士は等しいと判定される)。以前は strict_eq(===)を
使っており、[NaN].includes(NaN) が false になるバグだった(indexOf が === を
使うのは仕様どおり正しいので、そちらは変更していない)。- arr_index_of 🔒
Array.prototype.indexOf(searchElement, fromIndex)。以前は fromIndex
(第2引数)を完全に無視し、常に先頭から探索していた。
indexOf/includes/forEach/map/filter 等は仕様上ジェネリックメソッドだが、
以前は this_items を直接使っていたため array-like への .call() が常に
「何も見つからない/反復しない」結果になる同型のバグが複数箇所にあった
(join/slice/concat/forEach で修正済みの続き)。- arr_join 🔒
Array.prototype.join は仕様上ジェネリックメソッド(this の内部 [[Class]] を
見ず length + 添字プロパティだけを見る)だが、以前は this_items(ObjKind::Array
以外は無条件で空 Vec)を直接使っていたため、
Array.prototype.join.call({0:'a',1:'b',length:2}, '-') のような array-like への
適用が常に "" を返す静かな破壊バグだった。- arr_last_index_of 🔒
Array.prototype.lastIndexOf(searchElement, fromIndex)。同じ fromIndex 無視バグが
こちらにもあった(indexOf/includes と同じ調査で発見)。既定は末尾(length-1)から、
負の値は末尾からのオフセットとして解釈し、その位置から先頭へ向かって探索する。
Array.prototype.lastIndexOf(target, fromIndex)。仕様の ToIntegerOrInfinity は
NaN を 0 として扱うため、fromIndex に NaN を渡した場合は「index 0 のみを見る」
(fromIndex=0 と同じ)挙動になるはずだが、以前は NaN を検知すると無条件に -1 を
返しており、[5,1,2].lastIndexOf(5, NaN) が本来の 0 ではなく -1 になっていた。- arr_map 🔒
- 高階配列メソッドのコールバックは第2引数
thisArg を受け付ける(map/filter/
forEach/find 系すべてに共通の仕様だが、以前はどれも Value::Undefined を
決め打ちしており thisArg が完全に無視されていた)。 - arr_pop 🔒
- arr_push 🔒
push/pop/shift/unshift は仕様上ジェネリックメソッドで、length +
添字プロパティを持つだけの非配列 array-like オブジェクトへの .call() でも
機能すべきだが、以前は this_objref で得た ObjRef が ObjKind::Array で
なければ何もせず 0/undefined を返す静かな破壊バグだった(slice/join
等の読み取り専用メソッドで修正済みの同型バグの、書き込み系での見落とし)。
実配列は高速パス(Vec 直接操作)、それ以外は length+添字プロパティの
読み書きにフォールバックする。- arr_reduce 🔒
reduce/find/findIndex/some/every にも forEach/map/filter/indexOf/
includes と同型のジェネリックメソッド未対応バグがあった(this_items を直接
使っており array-like への .call() が常に「何もしない/見つからない」になっていた)。- arr_reverse 🔒
- arr_shift 🔒
- arr_slice 🔒
Array.prototype.slice は仕様上ジェネリックメソッドだが、以前は this_items
(ObjKind::Array 以外は無条件で空 Vec)を直接使っていたため、
[].slice.call(arrayLikeObj, ...) のような array-like への適用が常に [] を
返す静かな破壊バグだった(join/concat で修正済みの同型バグ)。- arr_some 🔒
- arr_sort 🔒
- arr_splice 🔒
- arr_to_locale_string 🔒
Array.prototype.toLocaleString()(ES3)が丸ごと欠落していた。各要素の
toLocaleString() を呼び出し , で連結する(Intl 非搭載のためロケール依存の書式化は
行わず、要素が toLocaleString を持たなければ通常の文字列化にフォールバックする簡略実装。
Date.prototype.toLocaleString 等、要素側の実装があればそちらが優先される)。- arr_to_reversed 🔒
- arr_to_sorted 🔒
- arr_to_spliced 🔒
- arr_to_string 🔒
- arr_unshift 🔒
- arr_with 🔒
Array.prototype.with(index, value)(ES2023)。範囲外 index は仕様上 RangeError だが、
以前は黙って無視して元と同じ配列を返していた(呼び出し側が範囲外に気づけないバグ)。- array_like_items 🔒
- 配列でない array-like オブジェクト(
length + 添字プロパティ)を Vec<Value> に
展開する。Array.prototype.concat が Symbol.isConcatSpreadable で true を明示した
非配列オブジェクトを展開する際に使う。 - array_like_length 🔒
this の length を読む(array-like 汎用経路用。array_like_items と同じ丸め)。- bigint_arg 🔒
- 引数2を BigInt として取り出す。
- bigint_as_int_n 🔒
- BigInt.asIntN(bits, bigint)
- bigint_as_uint_n 🔒
- BigInt.asUintN(bits, bigint)
- bigint_ctor 🔒
- BigInt(value): Number / String / Boolean / BigInt から BigInt を生成する。
new BigInt() は不可だが、ここでは関数呼び出しのみ対応。 - bigint_get
- BigInt レシーバのメソッド(toString / valueOf)。
- bigint_to_string 🔒
- bigint_value_of 🔒
- bits_arg 🔒
- 引数から「ビット幅」を取り出す(非負整数へ丸め)。
- bool_to_string 🔒
- bool_value_of 🔒
- boolean_get
Boolean.prototype.toString/valueOf。以前は Value::Bool へのプロパティアクセスが
get_property() で一律 Value::Undefined を返しており、true.toString()/
false.valueOf() のような基本的な呼出しが「関数ではない」TypeError になっていた
(プリミティブ中 Boolean だけがメソッドを一切持たない状態だった)。NativeFn は環境を
捕獲できない生の関数ポインタのため、値は(他のプリミティブ同様)呼出時の this から
読み取る。- clamp_idx 🔒
- concat_push 🔒
Array.prototype.concat は仕様上 Symbol.isConcatSpreadable を尊重すべきだが、
以前は単に ObjKind::Array かどうかだけで展開の有無を決めており、
arr[Symbol.isConcatSpreadable] = false な配列も無条件に展開され、逆に
Symbol.isConcatSpreadable = true を明示した非配列 array-like オブジェクトは
展開されず単一要素として push されてしまっていた。
concat の各オペランド(this 含む)を isConcatSpreadable 判定に従って
items に展開/push する共通ロジック。以前は this(第一引数の呼び出し対象)
にはこのロジックが適用されておらず this_items を直接使っていたため、
[].concat.call(arrayLikeObj, x) のような非配列 this が結果から丸ごと
消えてしまう(本来は spreadable でなければ this 自体が単一要素として
含まれるべき)静かな破壊バグだった。- flatten_depth 🔒
- 再帰的に
depth 段だけネスト配列を展開する(arr_flat のヘルパ)。
depth=Infinity(arr.flat(Infinity))は定番イディオムだが、depth - 1.0
は Infinity のままなので、循環参照する配列(a.push(a))に対しては
祖先追跡ガードが無いと無限再帰になり、この no_std 環境ではスタック
オーバーフロー(クラッシュ/ハング)に直結し得る(Value::to_js_string
で修正済みの「循環参照でスタックオーバーフロー」系と同種のバグ。
2026-07-13 の横断監査で発見)。既に祖先に現れた配列を再訪した時点で、
それ以上展開せずそのまま(配列のまま)結果へ積んで打ち切る。 - fn_apply 🔒
- fn_bind 🔒
- fn_call 🔒
- format_fixed 🔒
- format_radix 🔒
- function_ctor 🔒
new Function(arg1, ..., argN, body)(ES1)。動的にソースからコードを生成する定番
イディオム。(function anonymous(arg1,...,argN){ body }) という即時式へ組み立て直し、
既存の eval_source(常にグローバルスコープで実行する簡略実装)へ委譲する。- function_method
- generic_array_items 🔒
this_items と array_like_items を上記の判定で使い分ける便宜関数。- global_eval 🔒
eval(source)(ES1)。文字列以外の引数は仕様どおり無変換でそのまま返す。- global_is_finite 🔒
- global_is_nan 🔒
- global_parse_float 🔒
- global_parse_int 🔒
parseInt(string, radix)。以前は radix 省略時に常に10進として扱い、また
radix を明示していても "0x"/"0X" 接頭辞を読み飛ばさなかった。仕様上は
radix 省略(または 0)かつ文字列が(符号の後)0x/0X で始まる場合は自動的に
16進として解釈し、明示的に radix=16 の場合も同接頭辞を読み飛ばす必要がある。
例: parseInt("0xFF") は仕様どおりなら 255 だが、以前は 0(“0” の直後の “x” が
数字でないため即座に打ち切られていた)になっていた。- has_own_property 🔒
hasOwnProperty/Object.hasOwn の実体。以前は props.contains_key だけを見ており、
(1) accessors(getter/setter 限定プロパティ)専用マップに存在するプロパティ
({get x(){}}.hasOwnProperty('x'))と (2) 配列の数値インデックス/length
(ObjKind::Array 側にあり props には無い。[1,2].hasOwnProperty(0))の
2種類を「自身にあるのに無い」と誤判定するバグだった(in/for...in 等と同種)。- html_wrap_attr 🔒
- Annex B.2.3
CreateHTML。属性値の " は " へエスケープする(仕様どおり)。 - html_wrap_tag 🔒
- Annex B.2.3
CreateHTML の属性なし版(<tag>this</tag>)。 - insertion_sort_excluding_undefined 🔒
- 仕様上
sort/toSorted は undefined 要素を比較関数に一切渡さず、常に配列末尾に
送る特別扱いが必要(ECMA-262 SortCompare)。以前はこの特別扱いが無く undefined も
通常の要素として文字列比較/比較関数に渡していたため、例えば
[undefined, 5].sort((a,b)=>a-b) は a-b が NaN になり順序が保証されない
(常に末尾に来るはずが来ない)バグがあった。 - intl_number_format_ctor 🔒
new Intl.NumberFormat(locale?, options?)。ロケール/オプション引数は無視し、
.format(n) は Number.prototype.toLocaleString と同じ既定グループ区切りに
委譲する最小実装(Intl 節参照)。- intl_number_format_format 🔒
- is_real_array 🔒
this が実配列(ObjKind::Array)かどうか。join/slice/concat に続き、
forEach/map/filter/indexOf/includes 等の仕様上ジェネリックなメソッドで
this_items(非配列は無条件で空 Vec)から array_like_items
(length+添字プロパティを読む汎用フォールバック)への切り替え判定に使う共通ヘルパ。- japanese_voiced_sound_compose 🔒
- japanese_voiced_sound_decompose 🔒
- nfc_compose 🔒
- nfd_decompose 🔒
- norm_index 🔒
- normalize_mantissa 🔒
- 仮数部を
[1,10) の範囲に正規化した (仮数, 指数) を返す(0 は (0, 0))。
浮動小数点誤差で log10/pow の往復が範囲をわずかに外れることがあるので補正する。 - num_to_exponential 🔒
Number.prototype.toExponential(fractionDigits)(ES3)。丸ごと欠落しており、
n.toExponential(2)("1.50e+2" 等)を呼ぶと「メソッドが存在しない」TypeError に
なっていた。- num_to_fixed 🔒
Number.prototype.toFixed(fractionDigits)。仕様上 fractionDigits が 0〜100
の範囲外(負値や 101 以上)なら RangeError を投げる必要があるが、以前は範囲外/
非有限値を黙って 0 にクランプするだけで上限チェックが無く、(1).toFixed(500) の
ような呼び出しが 10^500(Infinity)を経由して壊れた出力になり得た
(toPrecision には同種のチェックが既にあったが toFixed だけ欠けていた)。- num_to_locale_string 🔒
Number.prototype.toLocaleString() が toString() の別名に過ぎず、実際のブラウザなら
Intl 非搭載でも必ず入る3桁区切りのカンマ((1234567).toLocaleString() → "1,234,567")
が丸ごと欠落していた(常に "1234567" になっていた)バグ。Intl/ロケール引数自体は
非対応(Array.prototype.toLocaleString/normalize/localeCompare と同種の割り切り)
だが、既定のグループ区切り(整数部のみ、小数部・NaN・Infinity・負号は対象外)だけは行う。- num_to_precision 🔒
Number.prototype.toPrecision(precision)(ES3)。丸ごと欠落していた。precision
省略時は toString() と同じ、指定時は有効桁数がその値になるよう固定小数/指数表記を
自動選択する(仕様どおり、指数が -6 未満または precision 以上なら指数表記)。- num_to_string 🔒
Number.prototype.toString(radix)。以前は radix(第1引数。2進/16進表示等の定番
イディオム n.toString(16))を完全に無視し常に10進表示だった。- num_value_of 🔒
- number_get
- 数値レシーバのメソッド。
- obj_define_getter 🔒
- obj_define_setter 🔒
- obj_has_own 🔒
- obj_is_prototype_of 🔒
Object.prototype.isPrototypeOf(obj): this が obj のプロトタイプ連鎖上に
存在するか(instanceof の r.prototype 版に相当。こちらは呼び出し元自身と比較する)。- obj_lookup_getter 🔒
- obj_lookup_setter 🔒
- obj_property_is_enumerable 🔒
Object.prototype.propertyIsEnumerable(key): この処理系は独自プロパティに enumerable
フラグを持たないため、「自身の直接プロパティかどうか」で近似する(hasOwnProperty と
同じ判定だが、プロトタイプ継承プロパティに対しては仕様通り false になる点は共通)。- obj_to_string 🔒
Object.prototype.toString.call(x)({}.toString() 含む)。以前は this の
実際の種別を一切見ず常に "[object Object]" を返しており、lodash 等の
ライブラリで広く使われる型判定イディオム(Object.prototype.toString.call(x) === '[object Array]' 等)が配列/Map/Set/Date/RegExp/関数のいずれに対しても
常に "[object Object]" になってしまう、実用上かなり影響の大きいバグだった。- object_get
- オブジェクトレシーバのメソッド(配列メソッド含む)。
- pad_str 🔒
- reject_regexp_arg 🔒
includes/startsWith/endsWith は仕様上、第1引数に RegExp を渡すと
TypeError を投げる必要がある(str.includes(/x/) のような「うっかり正規表現を
渡した」誤用に対する意図的なガード。match/replace 等と違いこれらのメソッドは
正規表現マッチングを一切サポートしないため、無警告でリテラル文字列
"/x/" として検索してしまうと気づきにくいバグの温床になる)。以前はこの
チェックが丸ごと欠落しており、常に無言でリテラル文字列比較にフォールバックして
いた。- same_kind_as 🔒
Array.prototype.toSorted/toReversed/toSpliced/with(ES2023)は %TypedArray%
にも同名メソッドが仕様化されているが、この処理系ではどれも this が TypedArray
(ObjKind::Array を流用し _ta_kind タグで区別)かどうかを見ずに常に素の
Obj::array(items) を返しており、new Int8Array([3,1,2]).toSorted() が
Int8Array ではなく普通の配列に化けるバグだった(structuredClone(TypedArray)
と同種)。this の _ta_kind を引き継いで返す共通ヘルパーで対応する。- str_anchor 🔒
- str_big 🔒
- str_blink 🔒
- str_bold 🔒
- str_char_at 🔒
- str_char_code_at 🔒
- str_code_point_at 🔒
String.prototype.codePointAt()(ES2015)が丸ごと未実装だった(charCodeAt はあった)。
この処理系の文字列は Rust の String(既に UTF-8 のコードポイント単位)で保持されており
サロゲートペアの概念自体が無いため、charCodeAt と等価な実装で足りる
(範囲外は NaN ではなく仕様どおり undefined を返す点だけが異なる)。- str_concat 🔒
- str_ends_with 🔒
- str_fixed 🔒
- str_fontcolor 🔒
- str_fontsize 🔒
- str_identity 🔒
- str_includes 🔒
- str_index_of 🔒
- str_is_well_formed 🔒
String.prototype.isWellFormed()(ES2024)。内部表現が Rust の String(常に有効な UTF-8)
であるため、単独サロゲート(lone surrogate)は構造上存在し得ず常に true を返す簡略実装。- str_italics 🔒
- str_iterator 🔒
String.prototype[Symbol.iterator]()(ES2015)が丸ごと欠落していた。呼び出すと
「メソッドが存在しない」TypeError になっていた(for...of 自体は文字列を直接
走査する内部高速経路で動くため気づかれなかった)。コードポイント単位(サロゲート
ペアを1文字として扱う。Rust の char が既にスカラー値単位のため自然に対応できる)で
走査する Iterator オブジェクトを、Array.prototype[Symbol.iterator] 等と同じ
make_iterator() を再利用して返す。- str_link 🔒
- str_locale_compare 🔒
String.prototype.localeCompare()(ES3)も未実装だった。この環境には Intl/ロケール
データが無いため、ロケール依存の照合順序ではなく通常の(コードポイント順)比較で近似する。- str_normalize 🔒
- str_pad_end 🔒
- str_pad_start 🔒
- str_repeat 🔒
String.prototype.repeat(count)(ES2015)。仕様上 count が負値または +Infinity の
場合は RangeError を投げる必要があるが、以前は範囲外を空文字列へ黙って丸めていた
("x".repeat(-1) が例外にならず "" を返す、呼び出し側が引数ミスに気づけないバグ。
Array.prototype.with の範囲外 index と同種の「RangeError 相当箇所で it.error() の
汎用 Error を投げる」という既存の簡略方針に合わせる)。- str_replace 🔒
- str_replace_all 🔒
String.prototype.replaceAll(pattern, replacement)。以前は pattern が RegExp
でも常に to_js_string()("/pat/flags" という文字列表現)として扱われ、
正規表現として機能していなかった("aaa".replaceAll(/a/g, 'b') が無変換になっていた)。
また関数リプレーサ(str_replace は対応済み)も未対応だった。- str_slice 🔒
- str_small 🔒
- str_split 🔒
String.prototype.split(separator, limit)。以前は limit(第2引数。結果配列の
最大要素数)を完全に無視しており、"a,b,c".split(",", 2) が仕様の ["a","b"] ではなく
全要素 ["a","b","c"] を返していた。- str_starts_with 🔒
- str_strike 🔒
- str_sub 🔒
- str_substr 🔒
String.prototype.substr(start, length)。ES3 由来の非推奨(Annex B)メソッドだが、
古いコードで依然として広く使われるため実装する。slice/substring はあったが
substr だけが欠落していた。- str_substring 🔒
- str_sup 🔒
- str_to_lower 🔒
- str_to_upper 🔒
- str_to_well_formed 🔒
String.prototype.toWellFormed()(ES2024)。上記と同じ理由により常に元の文字列をそのまま返す。- str_trim 🔒
- str_trim_end 🔒
- str_trim_start 🔒
- string_get
- 文字列レシーバのプロパティ/メソッド。
- this_items 🔒
- 配列プロトタイプメソッドのほぼ全てがこのヘルパ経由で
this の要素を読む。以前は
Proxy を素通しできず(ObjKind::Array に一致しない)、Array.prototype.map.call( new Proxy([1,2,3],{}), f) のように Proxy をラップした配列へ直接メソッド呼出しすると
常に空配列扱いになるバグだった(for...of/スプレッドは別経路で既に対応済みだったが、
メソッド呼出し経由はこのヘルパ止まりで漏れていた)。 - this_objref 🔒
this_items と同じ Proxy 透過性が必要(配列を直接変更するメソッド
push/pop/sort/splice 等が内部で使う実オブジェクト参照)。- this_str 🔒