From c63cf3777ff6652c81efb7fe253b44b08c1171bd Mon Sep 17 00:00:00 2001 From: Shautvast Date: Sat, 1 Nov 2025 18:02:58 +0100 Subject: [PATCH] first issue fixed --- src/ast_compiler.rs | 2 +- src/bytecode_compiler.rs | 10 ++------ src/vm.rs | 54 +++++++++++++++++++++++++++++++++------- 3 files changed, 48 insertions(+), 18 deletions(-) diff --git a/src/ast_compiler.rs b/src/ast_compiler.rs index f1526ea..c09c038 100644 --- a/src/ast_compiler.rs +++ b/src/ast_compiler.rs @@ -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, diff --git a/src/bytecode_compiler.rs b/src/bytecode_compiler.rs index 8e708ef..2556be0 100644 --- a/src/bytecode_compiler.rs +++ b/src/bytecode_compiler.rs @@ -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, diff --git a/src/vm.rs b/src/vm.rs index 8e42177..6f7a1d3 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -66,7 +66,7 @@ pub fn interpret_function(chunk: &Chunk, args: Vec) -> Result Vm<'a> { +impl<'a> Vm<'a> { fn run(&mut self, chunk: &Chunk, args: Vec) -> Result { 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); } @@ -210,7 +246,7 @@ impl <'a> Vm<'a> { } } -fn binary_op(vm: &mut Vm, op: impl Fn(&Value, &Value) -> Result + Copy) { +fn binary_op(vm: &mut Vm, op: impl Fn(&Value, &Value) -> Result + Copy) { let b = vm.pop(); let a = vm.pop(); @@ -224,7 +260,7 @@ fn binary_op(vm: &mut Vm, op: impl Fn(&Value, &Value) -> Result Result + Copy) { +fn unary_op(stack: &mut Vm, op: impl Fn(&Value) -> Result + Copy) { let a = stack.pop(); let result = op(&a); match result {