type¶
YanmaJS の埋め込み API (Context / value.md の各関数) が公開する型のリファレンスです。すべて @import("yanmajs") 経由で yanmajs.Xxx としてアクセスできます。
Value¶
JavaScript の値を表す NaN-boxed なオパーク値です。
内部的には IEEE754 double の NaN ビットパターンを利用して、数値以外(整数・真偽値・null・undefined・オブジェクトへのポインタなど)を 1 ワードに埋め込んでいます。フィールドへ直接アクセスしてはならず、必ず value.md に列挙する make* / to* / is* 系関数を介して生成・変換・判定します。オブジェクト系(文字列・配列・関数など)を指す Value は GC 管理下のヒープオブジェクトへの参照であり、ルート(後述の HandleScope / PersistentHandle)されない限り GC で回収され得ます。
HostFn / HostMethod¶
Zig 側で実装し、JavaScript から呼び出せる関数の型です。
pub const HostFn = *const fn (ctx: *Context, args: []const Value) anyerror!Value;
pub const HostMethod = *const fn (ctx: *Context, this: Value, args: []const Value) anyerror!Value;
| 型 | 用途 |
|---|---|
HostFn |
Context.setFunction でグローバル関数として登録する。this を受け取らない |
HostMethod |
Context.makeFunction / makeFunctionWithData で Value 化する。this(レシーバ)を受け取れる |
HostMethod はメソッドとして呼ばれた場合の this をそのまま(プリミティブでもボクシングせず)受け取ります。グローバル関数として呼ばれた場合の this は undefined です。戻り値がエラーを返した場合の扱いは error を参照してください。
EvalError¶
eval / runScript / evalModule / callFunction が返すエラーセットです。
pub const EvalError = error{
OutOfMemory,
StackOverflow,
ArityMismatch,
CallStackOverflow,
TryStackOverflow,
UncaughtException,
JumpTooLarge,
NotCallable,
RuntimeError,
};
各バリアントの発生条件は error を参照してください。
PropertyDescriptor¶
Context.defineProperty に渡すプロパティ記述子です。
pub const PropertyDescriptor = struct {
value: ?Value = null,
getter: ?Value = null,
setter: ?Value = null,
writable: ?bool = null,
enumerable: ?bool = null,
configurable: ?bool = null,
};
| フィールド | 型 | 既定値 | 説明 |
|---|---|---|---|
value |
?Value |
null(→ undefined) |
データプロパティの値。getter/setter と排他 |
getter |
?Value |
null |
アクセサプロパティの getter 関数(Value)。設定するとアクセサ記述子になる |
setter |
?Value |
null |
アクセサプロパティの setter 関数(Value) |
writable |
?bool |
true(データ記述子時) |
書き込み可能フラグ。アクセサ記述子では無視 |
enumerable |
?bool |
データ記述子: true / アクセサ記述子: false |
列挙可能フラグ |
configurable |
?bool |
データ記述子: true / アクセサ記述子: false |
再定義・削除可能フラグ |
getter または setter のいずれかが非 null の場合はアクセサプロパティとして定義され、value/writable は無視されます。それ以外はデータプロパティとして定義されます。
CompiledScript¶
Context.compileScript / deserializeScript が返すコンパイル済みスクリプトです。
内部的にはトップレベル関数オブジェクト(*ObjFunction)を指します。ホストはフィールドを直接参照せず、Context.runScript / Context.serializeScript にそのまま渡します。コンパイル時に内部の永続値テーブルへ登録されるため、CompiledScript は対応する Context が生きている間は GC で回収されません。
HandleScope¶
短命なスコープ内でオブジェクト系 Value を GC からルートするためのヘルパーです。
pub const HandleScope = struct {
pub fn pin(self: *HandleScope, val: Value) void;
pub fn close(self: *HandleScope) void;
};
| メソッド | 説明 |
|---|---|
pin(val) |
val が非オブジェクト値の場合は何もしない。オブジェクト値ならスコープが close されるまで GC ルートに加える |
close() |
Context.handleScope() 呼び出し時点までピン留めを巻き戻す |
Context.handleScope() で生成し、defer scope.close() とセットで使うのが基本パターンです。ネストしたスコープを作ることもできます。
PersistentHandle¶
Context.protect が返す、明示的に解除するまで有効なルートハンドルです。
非オブジェクト値を protect した場合は index = std.math.maxInt(usize) を持つダミーハンドルが返り、unprotect は安全に無視されます。HandleScope と異なりスコープに縛られないため、コールバックを跨いで値を保持する場合(例: 保留中の Promise、非同期処理から後で参照するオブジェクト)に使います。
PromiseHandle¶
Context.makePromise が返す、resolve/reject 操作用のハンドルです。
| フィールド | 型 | 説明 |
|---|---|---|
promise_value |
Value |
対応する Promise オブジェクト |
persistent |
PersistentHandle |
promise_value を保持する内部ルート。resolvePromise/rejectPromise 呼び出し時に自動的に unprotect される |
PromiseState¶
Promise の内部状態を表す列挙です。
value.md の promiseState で取得します。
GCMode¶
GC の起動方式を切り替える列挙です。
| 値 | 説明 |
|---|---|
auto(既定) |
割り当て量がしきい値を超えると自動的に GC を実行する |
manual |
自動 GC を止める。Context.collectGarbage を明示的に呼ぶまで回収されない |
Context.setGCMode で切り替えます。
GCStats¶
GC の統計情報のスナップショットです。
pub const GCStats = struct {
object_count: usize,
threshold: usize,
collection_count: usize,
last_freed_count: usize,
};
| フィールド | 型 | 説明 |
|---|---|---|
object_count |
usize |
現在 GC が追跡しているヒープオブジェクト数 |
threshold |
usize |
次回自動 GC が走るオブジェクト数のしきい値(auto モード時) |
collection_count |
usize |
これまでに実行された GC 回数の累計 |
last_freed_count |
usize |
直近の GC で解放されたオブジェクト数 |
Context.getGCStats で取得します。
GCConfig¶
GC のしきい値・成長係数を設定するための構造体です。
pub const GCConfig = struct {
initial_threshold: usize = 256,
growth_factor: usize = 2,
min_threshold: usize = 256,
};
| フィールド | 型 | 既定値 | 説明 |
|---|---|---|---|
initial_threshold |
usize |
256 |
設定直後のオブジェクト数しきい値(即座に GCStats.threshold に反映される) |
growth_factor |
usize |
2 |
GC 後、生存オブジェクト数に乗じて次のしきい値を決める倍率 |
min_threshold |
usize |
256 |
しきい値の下限。生存オブジェクトが少なくても頻繁に GC が走らないようにする |
Context.setGCConfig で適用します。
ModuleLoader¶
ES Modules の import 解決をホスト側に委譲するためのフックです。
pub const ModuleLoader = struct {
ptr: *anyopaque,
// 省略可。specifier を referrer 基準で解決し、モジュールの正規キーを返す
resolve_fn: ?*const fn (ptr: *anyopaque, specifier: []const u8, referrer: []const u8, allocator: std.mem.Allocator) anyerror!?[]u8 = null,
// 解決済み specifier からソースコードを読み込む
load_fn: *const fn (ptr: *anyopaque, specifier: []const u8) anyerror!?[]const u8,
};
| フィールド | 型 | 説明 |
|---|---|---|
ptr |
*anyopaque |
各コールバックに渡されるユーザーコンテキスト |
resolve_fn |
関数ポインタ(省略可) | specifier(import 文で指定された文字列)を referrer(import 元モジュールの解決済みキー。エントリモジュールは "")基準で解決し、モジュールレジストリの同一性キーとなる正規化文字列を返す。allocator で確保したバッファを返し、所有権はエンジンに移る。未設定の場合は specifier がそのままキーになるため、相対 import や self-import の同一性はホストが specifier の表記を揃えない限り成立しない |
load_fn |
関数ポインタ | 解決済み specifier からソースコードを返す。見つからなければ null |
Context.setModuleLoader で登録します。load_fn が返したソース文字列の所有権はホスト側に残ります(エンジンは内部でコピーします)。
互換性メモ: 以前の
load_fnは第3引数にreferrerを取っていましたが、referrer による解決はresolve_fnに分離されました。load_fnには解決済みの specifier のみが渡されます。
EventLoopHook¶
setTimeout / setInterval / clearTimeout / clearInterval をホストのイベントループへ委譲するためのフックです。
pub const EventLoopHook = struct {
set_timer: *const fn (id: u32, delay_ms: u32, is_repeat: bool, userdata: ?*anyopaque) void,
clear_timer: *const fn (id: u32, userdata: ?*anyopaque) void,
userdata: ?*anyopaque = null,
};
| フィールド | 型 | 説明 |
|---|---|---|
set_timer |
関数ポインタ | setTimeout/setInterval 実行時に呼ばれる。id はタイマー識別子、delay_ms は遅延、is_repeat は setInterval かどうか |
clear_timer |
関数ポインタ | clearTimeout/clearInterval 実行時に呼ばれる |
userdata |
?*anyopaque |
両関数に渡されるユーザーコンテキスト |
Context.setEventLoopHook で登録します。フックが未設定の場合、setTimeout/setInterval は遅延を無視して即座に(同期的に)コールバックを実行します。ホストは set_timer で受け取った id を実際にタイマーが発火したタイミングで Context.fireTimer(id) に渡してコールバックを実行します。
ConsoleLevel / ConsoleHandler¶
console.log などの出力先をホストへリダイレクトするための型です。
pub const ConsoleLevel = enum { log, info, warn, err, debug };
pub const ConsoleHandler = struct {
ptr: ?*anyopaque = null,
write_fn: *const fn (ptr: ?*anyopaque, level: ConsoleLevel, text: []const u8) void,
};
| フィールド | 型 | 説明 |
|---|---|---|
ptr |
?*anyopaque |
write_fn に渡されるユーザーコンテキスト |
write_fn |
関数ポインタ | 呼び出しレベルと結合済みテキストを受け取る |
err は Zig の予約語 error を避けたスペルで、console.error に対応します。text は呼び出し中のみ有効なので、保持する場合は write_fn 内で複製してください。Context.setConsoleHandler で登録し、null を渡すと標準出力へのデフォルト動作に戻ります。
UnhandledRejectionHandler¶
未処理の Promise reject をホストへ通知するための型です(HostPromiseRejectionTracker 相当)。
pub const UnhandledRejectionHandler = struct {
ptr: ?*anyopaque = null,
handler_fn: *const fn (ptr: ?*anyopaque, reason: value.Value) void,
};
drainMicrotasks 完了時点で reject ハンドラ(.then/.catch/.finally のいずれか)が一度も付いていない Promise について、reason(reject 理由の Value)を添えて handler_fn が呼ばれます。Context.setUnhandledRejectionHandler で登録し、null で通知を止めます。
Realm¶
グローバル変数やビルトインのプロトタイプ集合を保持する不透明な構造体です。
フィールドはエンジン内部専用で、ホストからは *Realm を不透明ポインタとして扱います。Context.createRealm / setRealm / getRealm / destroyRealm を介して複数の独立したグローバル環境を切り替える用途に使います(詳細は context の Realms セクションを参照)。