first issue fixed
This commit is contained in:
parent
8f1320eae7
commit
c63cf3777f
3 changed files with 48 additions and 18 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
54
src/vm.rs
54
src/vm.rs
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -210,7 +246,7 @@ impl <'a> Vm<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
fn binary_op(vm: &mut Vm, op: impl Fn(&Value, &Value) -> Result<Value, ValueError> + Copy) {
|
||||
fn binary_op(vm: &mut Vm, op: impl Fn(&Value, &Value) -> Result<Value, ValueError> + 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<Value, ValueErro
|
|||
}
|
||||
}
|
||||
|
||||
fn unary_op(stack: &mut Vm, op: impl Fn(&Value) -> Result<Value, ValueError> + Copy) {
|
||||
fn unary_op(stack: &mut Vm, op: impl Fn(&Value) -> Result<Value, ValueError> + Copy) {
|
||||
let a = stack.pop();
|
||||
let result = op(&a);
|
||||
match result {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue