796 lines
27 KiB
Rust
796 lines
27 KiB
Rust
use crate::{diag::Diagnostic, token::Span, types::Type};
|
|
|
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
|
pub enum RuntimeType {
|
|
I32,
|
|
I64,
|
|
U32,
|
|
U64,
|
|
F64,
|
|
Bool,
|
|
String,
|
|
ResultI32I32,
|
|
ResultI64I32,
|
|
ResultU32I32,
|
|
ResultU64I32,
|
|
ResultF64I32,
|
|
ResultBoolI32,
|
|
ResultStringI32,
|
|
VecI32,
|
|
VecI64,
|
|
VecF64,
|
|
VecBool,
|
|
VecString,
|
|
Unit,
|
|
}
|
|
|
|
impl RuntimeType {
|
|
pub fn to_type(self) -> Type {
|
|
match self {
|
|
Self::I32 => Type::I32,
|
|
Self::I64 => Type::I64,
|
|
Self::U32 => Type::U32,
|
|
Self::U64 => Type::U64,
|
|
Self::F64 => Type::F64,
|
|
Self::Bool => Type::Bool,
|
|
Self::String => Type::String,
|
|
Self::ResultI32I32 => Type::Result(Box::new(Type::I32), Box::new(Type::I32)),
|
|
Self::ResultI64I32 => Type::Result(Box::new(Type::I64), Box::new(Type::I32)),
|
|
Self::ResultU32I32 => Type::Result(Box::new(Type::U32), Box::new(Type::I32)),
|
|
Self::ResultU64I32 => Type::Result(Box::new(Type::U64), Box::new(Type::I32)),
|
|
Self::ResultF64I32 => Type::Result(Box::new(Type::F64), Box::new(Type::I32)),
|
|
Self::ResultBoolI32 => Type::Result(Box::new(Type::Bool), Box::new(Type::I32)),
|
|
Self::ResultStringI32 => Type::Result(Box::new(Type::String), Box::new(Type::I32)),
|
|
Self::VecI32 => Type::Vec(Box::new(Type::I32)),
|
|
Self::VecI64 => Type::Vec(Box::new(Type::I64)),
|
|
Self::VecF64 => Type::Vec(Box::new(Type::F64)),
|
|
Self::VecBool => Type::Vec(Box::new(Type::Bool)),
|
|
Self::VecString => Type::Vec(Box::new(Type::String)),
|
|
Self::Unit => Type::Unit,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub struct RuntimeFunction {
|
|
pub source_name: &'static str,
|
|
pub runtime_symbol: &'static str,
|
|
pub params: &'static [RuntimeType],
|
|
pub return_type: RuntimeType,
|
|
pub promoted: bool,
|
|
}
|
|
|
|
const I32_PARAM: &[RuntimeType] = &[RuntimeType::I32];
|
|
const I64_PARAM: &[RuntimeType] = &[RuntimeType::I64];
|
|
const U32_PARAM: &[RuntimeType] = &[RuntimeType::U32];
|
|
const U64_PARAM: &[RuntimeType] = &[RuntimeType::U64];
|
|
const F64_PARAM: &[RuntimeType] = &[RuntimeType::F64];
|
|
const BOOL_PARAM: &[RuntimeType] = &[RuntimeType::Bool];
|
|
const STRING_PARAM: &[RuntimeType] = &[RuntimeType::String];
|
|
const STRING_STRING_PARAMS: &[RuntimeType] = &[RuntimeType::String, RuntimeType::String];
|
|
const I32_STRING_PARAMS: &[RuntimeType] = &[RuntimeType::I32, RuntimeType::String];
|
|
const VEC_I32_PARAM: &[RuntimeType] = &[RuntimeType::VecI32];
|
|
const VEC_I32_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecI32, RuntimeType::I32];
|
|
const VEC_I64_PARAM: &[RuntimeType] = &[RuntimeType::VecI64];
|
|
const VEC_I64_I64_PARAMS: &[RuntimeType] = &[RuntimeType::VecI64, RuntimeType::I64];
|
|
const VEC_I64_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecI64, RuntimeType::I32];
|
|
const VEC_F64_PARAM: &[RuntimeType] = &[RuntimeType::VecF64];
|
|
const VEC_F64_F64_PARAMS: &[RuntimeType] = &[RuntimeType::VecF64, RuntimeType::F64];
|
|
const VEC_F64_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecF64, RuntimeType::I32];
|
|
const VEC_BOOL_PARAM: &[RuntimeType] = &[RuntimeType::VecBool];
|
|
const VEC_BOOL_BOOL_PARAMS: &[RuntimeType] = &[RuntimeType::VecBool, RuntimeType::Bool];
|
|
const VEC_BOOL_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecBool, RuntimeType::I32];
|
|
const VEC_STRING_PARAM: &[RuntimeType] = &[RuntimeType::VecString];
|
|
const VEC_STRING_STRING_PARAMS: &[RuntimeType] = &[RuntimeType::VecString, RuntimeType::String];
|
|
const VEC_STRING_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecString, RuntimeType::I32];
|
|
|
|
pub const FUNCTIONS: &[RuntimeFunction] = &[
|
|
RuntimeFunction {
|
|
source_name: "print_i32",
|
|
runtime_symbol: "print_i32",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: false,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "print_string",
|
|
runtime_symbol: "print_string",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: false,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "print_bool",
|
|
runtime_symbol: "print_bool",
|
|
params: BOOL_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: false,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "string_len",
|
|
runtime_symbol: "string_len",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: false,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_i32",
|
|
runtime_symbol: "print_i32",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_f64",
|
|
runtime_symbol: "print_f64",
|
|
params: F64_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_i64",
|
|
runtime_symbol: "print_i64",
|
|
params: I64_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_u32",
|
|
runtime_symbol: "print_u32",
|
|
params: U32_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_u64",
|
|
runtime_symbol: "print_u64",
|
|
params: U64_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_string",
|
|
runtime_symbol: "print_string",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.print_bool",
|
|
runtime_symbol: "print_bool",
|
|
params: BOOL_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.len",
|
|
runtime_symbol: "string_len",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.concat",
|
|
runtime_symbol: "__glagol_string_concat",
|
|
params: STRING_STRING_PARAMS,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.parse_i32_result",
|
|
runtime_symbol: "__glagol_string_parse_i32_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.parse_i64_result",
|
|
runtime_symbol: "__glagol_string_parse_i64_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultI64I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.parse_u32_result",
|
|
runtime_symbol: "__glagol_string_parse_u32_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultU32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.parse_u64_result",
|
|
runtime_symbol: "__glagol_string_parse_u64_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultU64I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.parse_f64_result",
|
|
runtime_symbol: "__glagol_string_parse_f64_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultF64I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.string.parse_bool_result",
|
|
runtime_symbol: "__glagol_string_parse_bool_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultBoolI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.json.quote_string",
|
|
runtime_symbol: "__glagol_json_quote_string",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.eprint",
|
|
runtime_symbol: "__glagol_io_eprint",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.io.read_stdin_result",
|
|
runtime_symbol: "__glagol_io_read_stdin_result",
|
|
params: &[],
|
|
return_type: RuntimeType::ResultStringI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.process.argc",
|
|
runtime_symbol: "__glagol_process_argc",
|
|
params: &[],
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.process.arg",
|
|
runtime_symbol: "__glagol_process_arg",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.process.arg_result",
|
|
runtime_symbol: "__glagol_process_arg_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultStringI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.env.get",
|
|
runtime_symbol: "__glagol_env_get",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.env.get_result",
|
|
runtime_symbol: "__glagol_env_get_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultStringI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.read_text",
|
|
runtime_symbol: "__glagol_fs_read_text",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.read_text_result",
|
|
runtime_symbol: "__glagol_fs_read_text_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultStringI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.write_text",
|
|
runtime_symbol: "__glagol_fs_write_text",
|
|
params: STRING_STRING_PARAMS,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.write_text_result",
|
|
runtime_symbol: "__glagol_fs_write_text_result",
|
|
params: STRING_STRING_PARAMS,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.exists",
|
|
runtime_symbol: "__glagol_fs_exists",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::Bool,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.is_file",
|
|
runtime_symbol: "__glagol_fs_is_file",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::Bool,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.is_dir",
|
|
runtime_symbol: "__glagol_fs_is_dir",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::Bool,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.remove_file_result",
|
|
runtime_symbol: "__glagol_fs_remove_file_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.create_dir_result",
|
|
runtime_symbol: "__glagol_fs_create_dir_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.open_text_read_result",
|
|
runtime_symbol: "__glagol_fs_open_text_read_result",
|
|
params: STRING_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.read_open_text_result",
|
|
runtime_symbol: "__glagol_fs_read_open_text_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultStringI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.fs.close_result",
|
|
runtime_symbol: "__glagol_fs_close_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_connect_loopback_result",
|
|
runtime_symbol: "__glagol_net_tcp_connect_loopback_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_listen_loopback_result",
|
|
runtime_symbol: "__glagol_net_tcp_listen_loopback_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_bound_port_result",
|
|
runtime_symbol: "__glagol_net_tcp_bound_port_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_accept_result",
|
|
runtime_symbol: "__glagol_net_tcp_accept_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_read_all_result",
|
|
runtime_symbol: "__glagol_net_tcp_read_all_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultStringI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_write_text_result",
|
|
runtime_symbol: "__glagol_net_tcp_write_text_result",
|
|
params: I32_STRING_PARAMS,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.net.tcp_close_result",
|
|
runtime_symbol: "__glagol_net_tcp_close_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i32.empty",
|
|
runtime_symbol: "__glagol_vec_i32_empty",
|
|
params: &[],
|
|
return_type: RuntimeType::VecI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i32.append",
|
|
runtime_symbol: "__glagol_vec_i32_append",
|
|
params: VEC_I32_I32_PARAMS,
|
|
return_type: RuntimeType::VecI32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i32.len",
|
|
runtime_symbol: "__glagol_vec_i32_len",
|
|
params: VEC_I32_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i32.index",
|
|
runtime_symbol: "__glagol_vec_i32_index",
|
|
params: VEC_I32_I32_PARAMS,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i64.empty",
|
|
runtime_symbol: "__glagol_vec_i64_empty",
|
|
params: &[],
|
|
return_type: RuntimeType::VecI64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i64.append",
|
|
runtime_symbol: "__glagol_vec_i64_append",
|
|
params: VEC_I64_I64_PARAMS,
|
|
return_type: RuntimeType::VecI64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i64.len",
|
|
runtime_symbol: "__glagol_vec_i64_len",
|
|
params: VEC_I64_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.i64.index",
|
|
runtime_symbol: "__glagol_vec_i64_index",
|
|
params: VEC_I64_I32_PARAMS,
|
|
return_type: RuntimeType::I64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.f64.empty",
|
|
runtime_symbol: "__glagol_vec_f64_empty",
|
|
params: &[],
|
|
return_type: RuntimeType::VecF64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.f64.append",
|
|
runtime_symbol: "__glagol_vec_f64_append",
|
|
params: VEC_F64_F64_PARAMS,
|
|
return_type: RuntimeType::VecF64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.f64.len",
|
|
runtime_symbol: "__glagol_vec_f64_len",
|
|
params: VEC_F64_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.f64.index",
|
|
runtime_symbol: "__glagol_vec_f64_index",
|
|
params: VEC_F64_I32_PARAMS,
|
|
return_type: RuntimeType::F64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.bool.empty",
|
|
runtime_symbol: "__glagol_vec_bool_empty",
|
|
params: &[],
|
|
return_type: RuntimeType::VecBool,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.bool.append",
|
|
runtime_symbol: "__glagol_vec_bool_append",
|
|
params: VEC_BOOL_BOOL_PARAMS,
|
|
return_type: RuntimeType::VecBool,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.bool.len",
|
|
runtime_symbol: "__glagol_vec_bool_len",
|
|
params: VEC_BOOL_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.bool.index",
|
|
runtime_symbol: "__glagol_vec_bool_index",
|
|
params: VEC_BOOL_I32_PARAMS,
|
|
return_type: RuntimeType::Bool,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.string.empty",
|
|
runtime_symbol: "__glagol_vec_string_empty",
|
|
params: &[],
|
|
return_type: RuntimeType::VecString,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.string.append",
|
|
runtime_symbol: "__glagol_vec_string_append",
|
|
params: VEC_STRING_STRING_PARAMS,
|
|
return_type: RuntimeType::VecString,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.string.len",
|
|
runtime_symbol: "__glagol_vec_string_len",
|
|
params: VEC_STRING_PARAM,
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.vec.string.index",
|
|
runtime_symbol: "__glagol_vec_string_index",
|
|
params: VEC_STRING_I32_PARAMS,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.time.monotonic_ms",
|
|
runtime_symbol: "__glagol_time_monotonic_ms",
|
|
params: &[],
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.time.sleep_ms",
|
|
runtime_symbol: "__glagol_time_sleep_ms",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::Unit,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.random.i32",
|
|
runtime_symbol: "__glagol_random_i32",
|
|
params: &[],
|
|
return_type: RuntimeType::I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i32_to_i64",
|
|
runtime_symbol: "std.num.i32_to_i64",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::I64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i32_to_f64",
|
|
runtime_symbol: "std.num.i32_to_f64",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::F64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i64_to_f64",
|
|
runtime_symbol: "std.num.i64_to_f64",
|
|
params: I64_PARAM,
|
|
return_type: RuntimeType::F64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u32_to_u64",
|
|
runtime_symbol: "std.num.u32_to_u64",
|
|
params: U32_PARAM,
|
|
return_type: RuntimeType::U64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u32_to_i64",
|
|
runtime_symbol: "std.num.u32_to_i64",
|
|
params: U32_PARAM,
|
|
return_type: RuntimeType::I64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u32_to_f64",
|
|
runtime_symbol: "std.num.u32_to_f64",
|
|
params: U32_PARAM,
|
|
return_type: RuntimeType::F64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u64_to_f64",
|
|
runtime_symbol: "std.num.u64_to_f64",
|
|
params: U64_PARAM,
|
|
return_type: RuntimeType::F64,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i64_to_i32_result",
|
|
runtime_symbol: "std.num.i64_to_i32_result",
|
|
params: I64_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i32_to_u32_result",
|
|
runtime_symbol: "std.num.i32_to_u32_result",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::ResultU32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i64_to_u64_result",
|
|
runtime_symbol: "std.num.i64_to_u64_result",
|
|
params: I64_PARAM,
|
|
return_type: RuntimeType::ResultU64I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u64_to_i64_result",
|
|
runtime_symbol: "std.num.u64_to_i64_result",
|
|
params: U64_PARAM,
|
|
return_type: RuntimeType::ResultI64I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.f64_to_i32_result",
|
|
runtime_symbol: "std.num.f64_to_i32_result",
|
|
params: F64_PARAM,
|
|
return_type: RuntimeType::ResultI32I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.f64_to_i64_result",
|
|
runtime_symbol: "std.num.f64_to_i64_result",
|
|
params: F64_PARAM,
|
|
return_type: RuntimeType::ResultI64I32,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i32_to_string",
|
|
runtime_symbol: "__glagol_num_i32_to_string",
|
|
params: I32_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.i64_to_string",
|
|
runtime_symbol: "__glagol_num_i64_to_string",
|
|
params: I64_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u32_to_string",
|
|
runtime_symbol: "__glagol_num_u32_to_string",
|
|
params: U32_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.u64_to_string",
|
|
runtime_symbol: "__glagol_num_u64_to_string",
|
|
params: U64_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
RuntimeFunction {
|
|
source_name: "std.num.f64_to_string",
|
|
runtime_symbol: "__glagol_num_f64_to_string",
|
|
params: F64_PARAM,
|
|
return_type: RuntimeType::String,
|
|
promoted: true,
|
|
},
|
|
];
|
|
|
|
const RESERVED_HELPER_SYMBOLS: &[&str] = &[
|
|
"std.result.is_ok",
|
|
"std.result.is_err",
|
|
"std.result.unwrap_ok",
|
|
"std.result.unwrap_err",
|
|
"__glagol_string_eq",
|
|
"__glagol_array_bounds_trap",
|
|
"__glagol_unwrap_some_trap",
|
|
"__glagol_unwrap_ok_trap",
|
|
"__glagol_unwrap_err_trap",
|
|
"__glagol_process_init",
|
|
"__glagol_io_read_stdin_result",
|
|
"__glagol_process_arg_trap",
|
|
"__glagol_process_arg_result",
|
|
"__glagol_env_get_result",
|
|
"__glagol_fs_read_trap",
|
|
"__glagol_fs_read_text_result",
|
|
"__glagol_fs_write_text_result",
|
|
"__glagol_fs_exists",
|
|
"__glagol_fs_is_file",
|
|
"__glagol_fs_is_dir",
|
|
"__glagol_fs_remove_file_result",
|
|
"__glagol_fs_create_dir_result",
|
|
"__glagol_fs_open_text_read_result",
|
|
"__glagol_fs_read_open_text_result",
|
|
"__glagol_fs_close_result",
|
|
"__glagol_net_tcp_connect_loopback_result",
|
|
"__glagol_net_tcp_listen_loopback_result",
|
|
"__glagol_net_tcp_bound_port_result",
|
|
"__glagol_net_tcp_accept_result",
|
|
"__glagol_net_tcp_read_all_result",
|
|
"__glagol_net_tcp_write_text_result",
|
|
"__glagol_net_tcp_close_result",
|
|
"__glagol_vec_i32_eq",
|
|
"__glagol_vec_i32_allocation_trap",
|
|
"__glagol_vec_i32_index_trap",
|
|
"__glagol_vec_i64_eq",
|
|
"__glagol_vec_i64_allocation_trap",
|
|
"__glagol_vec_i64_index_trap",
|
|
"__glagol_vec_string_eq",
|
|
"__glagol_vec_string_allocation_trap",
|
|
"__glagol_vec_string_index_trap",
|
|
"__glagol_time_monotonic_unavailable_trap",
|
|
"__glagol_time_sleep_negative_trap",
|
|
"__glagol_time_sleep_failed_trap",
|
|
"__glagol_string_parse_i32_result",
|
|
"__glagol_string_parse_i64_result",
|
|
"__glagol_string_parse_u32_result",
|
|
"__glagol_string_parse_u64_result",
|
|
"__glagol_string_parse_f64_result",
|
|
"__glagol_string_parse_bool_result",
|
|
"__glagol_json_quote_string",
|
|
"__glagol_num_u32_to_string",
|
|
"__glagol_num_u64_to_string",
|
|
"__glagol_num_f64_to_string",
|
|
"print_f64",
|
|
"print_u32",
|
|
"print_u64",
|
|
"print_i64",
|
|
];
|
|
|
|
pub fn function(source_name: &str) -> Option<&'static RuntimeFunction> {
|
|
FUNCTIONS
|
|
.iter()
|
|
.find(|function| function.source_name == source_name)
|
|
}
|
|
|
|
pub fn is_promoted_source_name(source_name: &str) -> bool {
|
|
function(source_name).is_some_and(|function| function.promoted)
|
|
}
|
|
|
|
pub fn is_reserved_name(name: &str) -> bool {
|
|
FUNCTIONS
|
|
.iter()
|
|
.any(|function| function.source_name == name || function.runtime_symbol == name)
|
|
|| RESERVED_HELPER_SYMBOLS.contains(&name)
|
|
}
|
|
|
|
pub fn is_standard_path(source_name: &str) -> bool {
|
|
source_name.starts_with("std.")
|
|
}
|
|
|
|
pub fn runtime_symbol(source_name: &str) -> Option<&'static str> {
|
|
function(source_name).map(|function| function.runtime_symbol)
|
|
}
|
|
|
|
pub fn unsupported_standard_library_call(file: &str, span: Span, source_name: &str) -> Diagnostic {
|
|
Diagnostic::new(
|
|
file,
|
|
"UnsupportedStandardLibraryCall",
|
|
format!("standard library call `{}` is not supported", source_name),
|
|
)
|
|
.with_span(span)
|
|
.expected("std.io.print_i32, std.io.print_u32, std.io.print_i64, std.io.print_u64, std.io.print_f64, std.io.print_string, std.io.print_bool, std.io.eprint, std.io.read_stdin_result, std.string.len, std.string.concat, std.string.parse_i32_result, std.string.parse_u32_result, std.string.parse_i64_result, std.string.parse_u64_result, std.string.parse_f64_result, std.string.parse_bool_result, std.json.quote_string, std.process.argc, std.process.arg, std.process.arg_result, std.env.get, std.env.get_result, std.fs.read_text, std.fs.read_text_result, std.fs.write_text, std.fs.write_text_result, std.fs.exists, std.fs.is_file, std.fs.is_dir, std.fs.remove_file_result, std.fs.create_dir_result, std.fs.open_text_read_result, std.fs.read_open_text_result, std.fs.close_result, std.vec.i32.empty, std.vec.i32.append, std.vec.i32.len, std.vec.i32.index, std.vec.i64.empty, std.vec.i64.append, std.vec.i64.len, std.vec.i64.index, std.vec.f64.empty, std.vec.f64.append, std.vec.f64.len, std.vec.f64.index, std.vec.bool.empty, std.vec.bool.append, std.vec.bool.len, std.vec.bool.index, std.vec.string.empty, std.vec.string.append, std.vec.string.len, std.vec.string.index, std.time.monotonic_ms, std.time.sleep_ms, std.random.i32, std.num.i32_to_i64, std.num.i32_to_f64, std.num.i64_to_f64, std.num.i64_to_i32_result, std.num.f64_to_i32_result, std.num.f64_to_i64_result, std.num.i32_to_string, std.num.u32_to_string, std.num.i64_to_string, std.num.u64_to_string, std.num.f64_to_string, std.result.is_ok, std.result.is_err, std.result.unwrap_ok, or std.result.unwrap_err")
|
|
.found(source_name)
|
|
.hint("use a promoted standard-runtime name or a legacy intrinsic alias")
|
|
}
|