blob: 6a7717151ede7dc2ded9189501c6df11e922bb9f [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/* <GEN_DOC> */
import 'dart:convert';
import 'dart:ffi';
import 'dart:typed_data';
// wasm_valkind_enum
const int WasmerValKindI32 = 0;
const int WasmerValKindI64 = 1;
const int WasmerValKindF32 = 2;
const int WasmerValKindF64 = 3;
// The void tag is not part of the C API. It's used to represent the return type
// of a void function.
const int WasmerValKindVoid = -1;
// wasm_externkind_enum
const int WasmerExternKindFunction = 0;
const int WasmerExternKindGlobal = 1;
const int WasmerExternKindTable = 2;
const int WasmerExternKindMemory = 3;
String wasmerExternKindName(int kind) {
switch (kind) {
case WasmerExternKindFunction:
return "function";
case WasmerExternKindGlobal:
return "global";
case WasmerExternKindTable:
return "table";
case WasmerExternKindMemory:
return "memory";
default:
return "unknown";
}
}
String wasmerValKindName(int kind) {
switch (kind) {
case WasmerValKindI32:
return "int32";
case WasmerValKindI64:
return "int64";
case WasmerValKindF32:
return "float32";
case WasmerValKindF64:
return "float64";
case WasmerValKindVoid:
return "void";
default:
return "unknown";
}
}
// wasm_val_t
class WasmerVal extends Struct {
// wasm_valkind_t
@Uint8()
external int kind;
// This is a union of int32_t, int64_t, float, and double. The kind determines
// which type it is. It's declared as an int64_t because that's large enough
// to hold all the types. We use ByteData to get the other types.
@Int64()
external int value;
int get _off32 => Endian.host == Endian.little ? 0 : 4;
int get i64 => value;
ByteData get _getterBytes => ByteData(8)..setInt64(0, value, Endian.host);
int get i32 => _getterBytes.getInt32(_off32, Endian.host);
double get f32 => _getterBytes.getFloat32(_off32, Endian.host);
double get f64 => _getterBytes.getFloat64(0, Endian.host);
set i64(int val) => value = val;
set _val(ByteData bytes) => value = bytes.getInt64(0, Endian.host);
set i32(int val) => _val = ByteData(8)..setInt32(_off32, val, Endian.host);
set f32(num val) =>
_val = ByteData(8)..setFloat32(_off32, val as double, Endian.host);
set f64(num val) =>
_val = ByteData(8)..setFloat64(0, val as double, Endian.host);
bool get isI32 => kind == WasmerValKindI32;
bool get isI64 => kind == WasmerValKindI64;
bool get isF32 => kind == WasmerValKindF32;
bool get isF64 => kind == WasmerValKindF64;
}
// wasmer_limits_t
class WasmerLimits extends Struct {
@Uint32()
external int min;
@Uint32()
external int max;
}
// Default maximum, which indicates no upper limit.
const int wasm_limits_max_default = 0xffffffff;
/* <WASMER_API> */