first issue fixed

This commit is contained in:
Shautvast 2025-11-01 18:02:58 +01:00
parent 8f1320eae7
commit c63cf3777f
3 changed files with 48 additions and 18 deletions

View file

@ -585,7 +585,7 @@ fn calculate_type(
match (declared_type, inferred_type) {
(I32, I64) => I32, //need this?
(I32, Integer) => I32,
(U32, U64) => U32,
(U32, I64) => U32,
(U32, Integer) => U32,
(F32, F64) => F32,
(F32, FloatingPoint) => F32,

View file

@ -2,13 +2,7 @@ use crate::ast_compiler::{Expression, Function, Statement};
use crate::chunk::Chunk;
use crate::tokens::TokenType;
use crate::value::Value;
use crate::vm::{
OP_ADD, OP_AND, OP_BITAND, OP_BITOR, OP_BITXOR, OP_CALL, OP_CONSTANT, OP_DEF_BOOL, OP_DEF_CHAR,
OP_DEF_DATE, OP_DEF_F32, OP_DEF_F64, OP_DEF_I32, OP_DEF_I64, OP_DEF_LIST, OP_DEF_MAP,
OP_DEF_STRING, OP_DEF_STRUCT, OP_DEFINE, OP_DIVIDE, OP_EQUAL, OP_GET, OP_GREATER,
OP_GREATER_EQUAL, OP_LESS, OP_LESS_EQUAL, OP_MULTIPLY, OP_NEGATE, OP_NOT, OP_OR, OP_PRINT,
OP_RETURN, OP_SHL, OP_SHR, OP_SUBTRACT,
};
use crate::vm::{OP_ADD, OP_AND, OP_BITAND, OP_BITOR, OP_BITXOR, OP_CALL, OP_CONSTANT, OP_DEF_BOOL, OP_DEF_CHAR, OP_DEF_DATE, OP_DEF_F32, OP_DEF_F64, OP_DEF_I32, OP_DEF_I64, OP_DEF_LIST, OP_DEF_MAP, OP_DEF_STRING, OP_DEF_STRUCT, OP_DEFINE, OP_DIVIDE, OP_EQUAL, OP_GET, OP_GREATER, OP_GREATER_EQUAL, OP_LESS, OP_LESS_EQUAL, OP_MULTIPLY, OP_NEGATE, OP_NOT, OP_OR, OP_PRINT, OP_RETURN, OP_SHL, OP_SHR, OP_SUBTRACT, OP_DEF_U32};
use std::collections::HashMap;
use crate::errors::CompilerError;
@ -234,7 +228,7 @@ impl Compiler {
let def_op = match var_type {
TokenType::I32 => OP_DEF_I32,
TokenType::I64 => OP_DEF_I64,
TokenType::U32 => OP_DEF_I64,
TokenType::U32 => OP_DEF_U32,
TokenType::U64 => OP_DEF_I64,
TokenType::F32 => OP_DEF_F32,
TokenType::F64 => OP_DEF_F64,

View file

@ -66,7 +66,7 @@ pub fn interpret_function(chunk: &Chunk, args: Vec<Value>) -> Result<Value, Runt
vm.run(chunk, args)
}
impl <'a> Vm<'a> {
impl<'a> Vm<'a> {
fn run(&mut self, chunk: &Chunk, args: Vec<Value>) -> Result<Value, RuntimeError> {
for arg in args {
self.push(arg);
@ -131,11 +131,47 @@ impl <'a> Vm<'a> {
let value = self.pop();
self.local_vars.insert(name, value);
}
OP_DEF_I32 => define_var!(self, I32, chunk),
OP_DEF_I32 => {
let name = self.read_name(chunk);
let value = self.pop();
let value = match value{
Value::I32(v) => Value::I32(v),
Value::I64(v) => Value::I32(v as i32),
_ => unreachable!(),
};
self.local_vars.insert(name, value);
}
OP_DEF_I64 => define_var!(self, I64, chunk),
OP_DEF_U32 => define_var!(self, U32, chunk),
OP_DEF_U64 => define_var!(self, U64, chunk),
OP_DEF_F32 => define_var!(self, F32, chunk),
OP_DEF_U32 => {
let name = self.read_name(chunk);
let value = self.pop();
let value = match value{
Value::U32(v) => Value::U32(v),
Value::I64(v) => Value::U32(v as u32),
_ => unreachable!(),
};
self.local_vars.insert(name, value);
}
OP_DEF_U64 => {
let name = self.read_name(chunk);
let value = self.pop();
let value = match value{
Value::U64(v) => Value::U64(v),
Value::I64(v) => Value::U64(v as u64),
_ => unreachable!(),
};
self.local_vars.insert(name, value);
}
OP_DEF_F32 => {
let name = self.read_name(chunk);
let value = self.pop();
let value = match value{
Value::F32(v) => Value::F32(v),
Value::F64(v) => Value::F32(v as f32),
_ => unreachable!(),
};
self.local_vars.insert(name, value);
}
OP_DEF_F64 => define_var!(self, F64, chunk),
OP_DEF_STRING => define_var!(self, String, chunk),
OP_DEF_CHAR => define_var!(self, Char, chunk),
@ -158,13 +194,13 @@ impl <'a> Vm<'a> {
for _ in 0..len {
let value = self.pop();
let key = self.pop();
map.insert(key,value);
map.insert(key, value);
}
self.local_vars.insert(name, Value::Map(map));
}
OP_GET => {
let name = self.read_name(chunk);
let value = self.local_vars.get(&name). unwrap();
let value = self.local_vars.get(&name).unwrap();
self.push(value.clone()); // not happy
debug!("after get {:?}", self.stack);
}