Modicy native functions to have a full type specification
This commit is contained in:
parent
0e7aae79f9
commit
34dca01d85
@ -369,7 +369,7 @@ impl Instruction {
|
|||||||
if matches!(self.operation(), Operation::CallNative) {
|
if matches!(self.operation(), Operation::CallNative) {
|
||||||
let native_function = NativeFunction::from(self.b());
|
let native_function = NativeFunction::from(self.b());
|
||||||
|
|
||||||
return native_function.returns_value();
|
return native_function.r#type().return_type.is_some();
|
||||||
}
|
}
|
||||||
|
|
||||||
false
|
false
|
||||||
@ -599,7 +599,7 @@ impl Instruction {
|
|||||||
let mut output = String::new();
|
let mut output = String::new();
|
||||||
let native_function_name = native_function.as_str();
|
let native_function_name = native_function.as_str();
|
||||||
|
|
||||||
if native_function.returns_value() {
|
if native_function.r#type().return_type.is_some() {
|
||||||
output.push_str(&format!("R{} = {}(", to_register, native_function_name));
|
output.push_str(&format!("R{} = {}(", to_register, native_function_name));
|
||||||
} else {
|
} else {
|
||||||
output.push_str(&format!("{}(", native_function_name));
|
output.push_str(&format!("{}(", native_function_name));
|
||||||
|
@ -6,10 +6,10 @@ use std::{
|
|||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::{AnnotatedError, Instruction, Primitive, Span, Value, Vm, VmError};
|
use crate::{AnnotatedError, FunctionType, Instruction, Primitive, Span, Type, Value, Vm, VmError};
|
||||||
|
|
||||||
macro_rules! impl_from_str_for_native_function {
|
macro_rules! impl_from_str_for_native_function {
|
||||||
($(($name:ident, $byte:literal, $str:expr, $returns_value:expr)),*) => {
|
($(($name:ident, $byte:literal, $str:expr, $type:expr)),*) => {
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)]
|
||||||
pub enum NativeFunction {
|
pub enum NativeFunction {
|
||||||
$(
|
$(
|
||||||
@ -36,10 +36,10 @@ macro_rules! impl_from_str_for_native_function {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn returns_value(&self) -> bool {
|
pub fn r#type(&self) -> FunctionType {
|
||||||
match self {
|
match self {
|
||||||
$(
|
$(
|
||||||
NativeFunction::$name => $returns_value,
|
NativeFunction::$name => $type,
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,80 +76,134 @@ macro_rules! impl_from_str_for_native_function {
|
|||||||
|
|
||||||
impl_from_str_for_native_function! {
|
impl_from_str_for_native_function! {
|
||||||
// Assertion
|
// Assertion
|
||||||
(Assert, 0_u8, "assert", false),
|
(
|
||||||
(AssertEqual, 1_u8, "assert_equal", false),
|
Assert,
|
||||||
(AssertNotEqual, 2_u8, "assert_not_equal", false),
|
0_u8,
|
||||||
(Panic, 3_u8, "panic", true),
|
"assert",
|
||||||
|
FunctionType {
|
||||||
|
type_parameters: None,
|
||||||
|
value_parameters: None,
|
||||||
|
return_type: None
|
||||||
|
}
|
||||||
|
),
|
||||||
|
// (AssertEqual, 1_u8, "assert_equal", false),
|
||||||
|
// (AssertNotEqual, 2_u8, "assert_not_equal", false),
|
||||||
|
(
|
||||||
|
Panic,
|
||||||
|
3_u8,
|
||||||
|
"panic",
|
||||||
|
FunctionType {
|
||||||
|
type_parameters: None,
|
||||||
|
value_parameters: None,
|
||||||
|
return_type: Some(Box::new(Type::Any))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
// Type conversion
|
// // Type conversion
|
||||||
(Parse, 4_u8, "parse", true),
|
// (Parse, 4_u8, "parse", true),
|
||||||
(ToByte, 5_u8, "to_byte", true),
|
// (ToByte, 5_u8, "to_byte", true),
|
||||||
(ToFloat, 6_u8, "to_float", true),
|
// (ToFloat, 6_u8, "to_float", true),
|
||||||
(ToInteger, 7_u8, "to_integer", true),
|
// (ToInteger, 7_u8, "to_integer", true),
|
||||||
(ToString, 8_u8, "to_string", true),
|
(
|
||||||
|
ToString,
|
||||||
|
8_u8,
|
||||||
|
"to_string",
|
||||||
|
FunctionType {
|
||||||
|
type_parameters: None,
|
||||||
|
value_parameters: Some(vec![(0, Type::Any)]),
|
||||||
|
return_type: Some(Box::new(Type::String { length: None }))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
// List and string
|
// // List and string
|
||||||
(All, 9_u8, "all", true),
|
// (All, 9_u8, "all", true),
|
||||||
(Any, 10_u8, "any", true),
|
// (Any, 10_u8, "any", true),
|
||||||
(Append, 11_u8, "append", false),
|
// (Append, 11_u8, "append", false),
|
||||||
(Contains, 12_u8, "contains", true),
|
// (Contains, 12_u8, "contains", true),
|
||||||
(Dedup, 13_u8, "dedup", false),
|
// (Dedup, 13_u8, "dedup", false),
|
||||||
(EndsWith, 14_u8, "ends_with", true),
|
// (EndsWith, 14_u8, "ends_with", true),
|
||||||
(Find, 15_u8, "find", true),
|
// (Find, 15_u8, "find", true),
|
||||||
(Get, 16_u8, "get", true),
|
// (Get, 16_u8, "get", true),
|
||||||
(IndexOf, 17_u8, "index_of", true),
|
// (IndexOf, 17_u8, "index_of", true),
|
||||||
(Length, 18_u8, "length", true),
|
// (Length, 18_u8, "length", true),
|
||||||
(Prepend, 19_u8, "prepend", false),
|
// (Prepend, 19_u8, "prepend", false),
|
||||||
(Replace, 20_u8, "replace", false),
|
// (Replace, 20_u8, "replace", false),
|
||||||
(Set, 21_u8, "set", false),
|
// (Set, 21_u8, "set", false),
|
||||||
(StartsWith, 22_u8, "starts_with", true),
|
// (StartsWith, 22_u8, "starts_with", true),
|
||||||
(Slice, 23_u8, "slice", true),
|
// (Slice, 23_u8, "slice", true),
|
||||||
(Sort, 24_u8, "sort", false),
|
// (Sort, 24_u8, "sort", false),
|
||||||
(Split, 25_u8, "split", true),
|
// (Split, 25_u8, "split", true),
|
||||||
|
|
||||||
// List
|
// // List
|
||||||
(Flatten, 26_u8, "flatten", false),
|
// (Flatten, 26_u8, "flatten", false),
|
||||||
(Join, 27_u8, "join", true),
|
// (Join, 27_u8, "join", true),
|
||||||
(Map, 28_u8, "map", true),
|
// (Map, 28_u8, "map", true),
|
||||||
(Reduce, 29_u8, "reduce", true),
|
// (Reduce, 29_u8, "reduce", true),
|
||||||
(Remove, 30_u8, "remove", false),
|
// (Remove, 30_u8, "remove", false),
|
||||||
(Reverse, 31_u8, "reverse", false),
|
// (Reverse, 31_u8, "reverse", false),
|
||||||
(Unzip, 32_u8, "unzip", true),
|
// (Unzip, 32_u8, "unzip", true),
|
||||||
(Zip, 33_u8, "zip", true),
|
// (Zip, 33_u8, "zip", true),
|
||||||
|
|
||||||
// String
|
// // String
|
||||||
(Bytes, 34_u8, "bytes", true),
|
// (Bytes, 34_u8, "bytes", true),
|
||||||
(CharAt, 35_u8, "char_at", true),
|
// (CharAt, 35_u8, "char_at", true),
|
||||||
(CharCodeAt, 36_u8, "char_code_at", true),
|
// (CharCodeAt, 36_u8, "char_code_at", true),
|
||||||
(Chars, 37_u8, "chars", true),
|
// (Chars, 37_u8, "chars", true),
|
||||||
(Format, 38_u8, "format", true),
|
// (Format, 38_u8, "format", true),
|
||||||
(Repeat, 39_u8, "repeat", true),
|
// (Repeat, 39_u8, "repeat", true),
|
||||||
(SplitAt, 40_u8, "split_at", true),
|
// (SplitAt, 40_u8, "split_at", true),
|
||||||
(SplitLines, 41_u8, "split_lines", true),
|
// (SplitLines, 41_u8, "split_lines", true),
|
||||||
(SplitWhitespace, 42_u8, "split_whitespace", true),
|
// (SplitWhitespace, 42_u8, "split_whitespace", true),
|
||||||
(ToLowerCase, 43_u8, "to_lower_case", true),
|
// (ToLowerCase, 43_u8, "to_lower_case", true),
|
||||||
(ToUpperCase, 44_u8, "to_upper_case", true),
|
// (ToUpperCase, 44_u8, "to_upper_case", true),
|
||||||
(Trim, 45_u8, "trim", true),
|
// (Trim, 45_u8, "trim", true),
|
||||||
(TrimEnd, 46_u8, "trim_end", true),
|
// (TrimEnd, 46_u8, "trim_end", true),
|
||||||
(TrimStart, 47_u8, "trim_start", true),
|
// (TrimStart, 47_u8, "trim_start", true),
|
||||||
|
|
||||||
// I/O
|
// // I/O
|
||||||
// Read
|
// // Read
|
||||||
(Read, 48_u8, "read", true),
|
// (Read, 48_u8, "read", true),
|
||||||
(ReadFile, 49_u8, "read_file", true),
|
// (ReadFile, 49_u8, "read_file", true),
|
||||||
(ReadLine, 50_u8, "read_line", true),
|
(
|
||||||
(ReadTo, 51_u8, "read_to", false),
|
ReadLine,
|
||||||
(ReadUntil, 52_u8, "read_until", true),
|
50_u8,
|
||||||
// Write
|
"read_line",
|
||||||
(AppendFile, 53_u8, "append_file", false),
|
FunctionType {
|
||||||
(PrependFile, 54_u8, "prepend_file", false),
|
type_parameters: None,
|
||||||
(Write, 55_u8, "write", false),
|
value_parameters: None,
|
||||||
(WriteFile, 56_u8, "write_file", false),
|
return_type: Some(Box::new(Type::String { length: None }))
|
||||||
(WriteLine, 57_u8, "write_line", false),
|
}
|
||||||
|
),
|
||||||
|
// (ReadTo, 51_u8, "read_to", false),
|
||||||
|
// (ReadUntil, 52_u8, "read_until", true),
|
||||||
|
// // Write
|
||||||
|
// (AppendFile, 53_u8, "append_file", false),
|
||||||
|
// (PrependFile, 54_u8, "prepend_file", false),
|
||||||
|
(
|
||||||
|
Write,
|
||||||
|
55_u8,
|
||||||
|
"write",
|
||||||
|
FunctionType {
|
||||||
|
type_parameters: None,
|
||||||
|
value_parameters: Some(vec![(0, Type::String { length: None })]),
|
||||||
|
return_type: None
|
||||||
|
}
|
||||||
|
),
|
||||||
|
// (WriteFile, 56_u8, "write_file", false),
|
||||||
|
(
|
||||||
|
WriteLine,
|
||||||
|
57_u8,
|
||||||
|
"write_line",
|
||||||
|
FunctionType {
|
||||||
|
type_parameters: None,
|
||||||
|
value_parameters: Some(vec![(0, Type::String { length: None })]),
|
||||||
|
return_type: None
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// Random
|
// // Random
|
||||||
(Random, 58_u8, "random", true),
|
// (Random, 58_u8, "random", true),
|
||||||
(RandomInRange, 59_u8, "random_in_range", true)
|
// (RandomInRange, 59_u8, "random_in_range", true)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NativeFunction {
|
impl NativeFunction {
|
||||||
@ -189,10 +243,6 @@ impl NativeFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Type conversion
|
// Type conversion
|
||||||
NativeFunction::Parse => todo!(),
|
|
||||||
NativeFunction::ToByte => todo!(),
|
|
||||||
NativeFunction::ToFloat => todo!(),
|
|
||||||
NativeFunction::ToInteger => todo!(),
|
|
||||||
NativeFunction::ToString => {
|
NativeFunction::ToString => {
|
||||||
let mut string = String::new();
|
let mut string = String::new();
|
||||||
|
|
||||||
|
@ -1205,7 +1205,7 @@ impl<'src> Parser<'src> {
|
|||||||
let end = self.previous_position.1;
|
let end = self.previous_position.1;
|
||||||
let to_register = self.next_register();
|
let to_register = self.next_register();
|
||||||
let argument_count = to_register - start_register;
|
let argument_count = to_register - start_register;
|
||||||
self.current_is_expression = native_function.returns_value();
|
self.current_is_expression = native_function.r#type().return_type.is_some();
|
||||||
|
|
||||||
self.emit_instruction(
|
self.emit_instruction(
|
||||||
Instruction::call_native(to_register, native_function, argument_count),
|
Instruction::call_native(to_register, native_function, argument_count),
|
||||||
|
Loading…
Reference in New Issue
Block a user