Skip to content

type

YanmaJS の埋め込み API (Context / value.md の各関数) が公開する型のリファレンスです。すべて @import("yanmajs") 経由で yanmajs.Xxx としてアクセスできます。


Value

JavaScript の値を表す NaN-boxed なオパーク値です。

pub const Value = u64;

内部的には 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 / makeFunctionWithDataValue 化する。this(レシーバ)を受け取れる

HostMethod はメソッドとして呼ばれた場合の this をそのまま(プリミティブでもボクシングせず)受け取ります。グローバル関数として呼ばれた場合の thisundefined です。戻り値がエラーを返した場合の扱いは 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 が返すコンパイル済みスクリプトです。

pub const CompiledScript = struct {
    function: *ObjFunction,
};

内部的にはトップレベル関数オブジェクト(*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 が返す、明示的に解除するまで有効なルートハンドルです。

pub const PersistentHandle = struct {
    index: usize,
};

非オブジェクト値を protect した場合は index = std.math.maxInt(usize) を持つダミーハンドルが返り、unprotect は安全に無視されます。HandleScope と異なりスコープに縛られないため、コールバックを跨いで値を保持する場合(例: 保留中の Promise、非同期処理から後で参照するオブジェクト)に使います。


PromiseHandle

Context.makePromise が返す、resolve/reject 操作用のハンドルです。

pub const PromiseHandle = struct {
    promise_value: Value,
    persistent: PersistentHandle,
};
フィールド 説明
promise_value Value 対応する Promise オブジェクト
persistent PersistentHandle promise_value を保持する内部ルート。resolvePromise/rejectPromise 呼び出し時に自動的に unprotect される

PromiseState

Promise の内部状態を表す列挙です。

pub const PromiseState = enum {
    pending,
    fulfilled,
    rejected,
};

value.mdpromiseState で取得します。


GCMode

GC の起動方式を切り替える列挙です。

pub const GCMode = enum {
    auto,
    manual,
};
説明
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_repeatsetInterval かどうか
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

グローバル変数やビルトインのプロトタイプ集合を保持する不透明な構造体です。

pub const Realm = vm.Realm;

フィールドはエンジン内部専用で、ホストからは *Realm を不透明ポインタとして扱います。Context.createRealm / setRealm / getRealm / destroyRealm を介して複数の独立したグローバル環境を切り替える用途に使います(詳細は context の Realms セクションを参照)。