From e09a4fc2d440c654db9020e37a3a63eec2e67abf Mon Sep 17 00:00:00 2001 From: afonya Date: Wed, 18 Jun 2025 15:13:50 +0200 Subject: [PATCH] begin coroutine --- src/enviroment.rs | 51 ++++++++++++++++++++++++++++++++++++++++++- src/virtualmachine.rs | 7 +++++- test.asl | 9 +++++++- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/enviroment.rs b/src/enviroment.rs index c33fff6..29af7e2 100644 --- a/src/enviroment.rs +++ b/src/enviroment.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, fs, io::{stdin, BufReader, Read, Write}, net::{self, TcpListener, TcpStream}, process, thread::sleep, time::{Duration, UNIX_EPOCH}, vec}; -use crate::{decompiler::DecompiledOperation, errors::{create_error, print_error, ErrorSubType, ErrorType}, virtualmachine::{Machine, TableValue, VMMemory, VMMemoryBoolean, VMMemoryNativeFunction, VMMemoryNull, VMMemoryNumber, VMMemoryString, VMMemoryTable}}; +use crate::{decompiler::{DecompiledFunction, DecompiledOperation}, errors::{create_error, print_error, ErrorSubType, ErrorType}, virtualmachine::{Machine, TableValue, VMMemory, VMMemoryBoolean, VMMemoryNativeFunction, VMMemoryNull, VMMemoryNumber, VMMemoryString, VMMemoryTable, VMState}, Context}; fn get_string_from_vmmem(mem: &VMMemory) -> String { let mut out = String::new(); @@ -967,6 +967,43 @@ fn intezo_irj(machine: &mut Machine, op: &DecompiledOperation, args: Vec) -> VMMemory { + machine.state = VMState::Paused; + return VMMemory::Null(VMMemoryNull { variable_id: 0 }); +} +fn add_func(n_funcs: &mut Vec, n_ctx: &mut Vec, machine: &mut Machine, func: usize, pos: &mut usize) { + let mut exe_func = machine.functions[func].clone(); + let func_clone = machine.functions.clone(); + n_ctx.push(machine.ctx[func].clone()); + for (fid, fpos) in &func_clone[func].functions { + *pos += 1; + add_func(n_funcs, n_ctx, machine, *fpos as usize, pos); + exe_func.functions.insert(*fid, *pos as u32); + } + n_funcs.push(exe_func); +} +fn krumpli_letrehoz(machine: &mut Machine, op: &DecompiledOperation, args: Vec) -> VMMemory { + arg_expect(&args, 0, "function", machine, op); + let func = match &args[0] { + VMMemory::Function(func) => func.clone(), + _ => { + error(String::from("Expected a function"), machine, op); + return VMMemory::Null(VMMemoryNull { variable_id: 0 }); + } + }; + let mut n_funcs: Vec = vec![]; + let mut n_ctx: Vec = vec![]; + add_func(&mut n_funcs, &mut n_ctx, machine, func.id, &mut 0); + println!("{:?}", n_funcs); + println!("{:?}", n_ctx); + let mut vm = Machine::new(n_ctx); + vm.load_functions(n_funcs); + vm.memory = machine.memory.clone(); + let cor_id = machine.storage.len(); + machine.storage.push(Box::new(vm)); + return VMMemory::Number(VMMemoryNumber { value: cor_id as f64, variable_id: 0 }); +} + pub fn generate() -> HashMap { let mut mem: HashMap = HashMap::new(); @@ -1134,5 +1171,17 @@ pub fn generate() -> HashMap { ]; mem.insert(String::from("intéző"), VMMemory::Table(VMMemoryTable { values: intezo, variable_id: 0 })); + let krumpli: Vec = vec![ + TableValue { + key: VMMemory::String(VMMemoryString { value: String::from("várj"), variable_id: 0 }), + value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: krumpli_varj, variable_id: 0 }), + }, + TableValue { + key: VMMemory::String(VMMemoryString { value: String::from("létrehoz"), variable_id: 0 }), + value: VMMemory::NativeFunction(VMMemoryNativeFunction { func: krumpli_letrehoz, variable_id: 0 }), + }, + ]; + mem.insert(String::from("krumpli"), VMMemory::Table(VMMemoryTable { values: krumpli, variable_id: 0 })); + return mem; } \ No newline at end of file diff --git a/src/virtualmachine.rs b/src/virtualmachine.rs index efbb4aa..d49a882 100644 --- a/src/virtualmachine.rs +++ b/src/virtualmachine.rs @@ -74,7 +74,7 @@ pub enum VMState { pub struct Machine { pub memory: Vec, - functions: Vec, + pub functions: Vec, pub stack: Vec, pub registers: Vec, pub call_stack: Vec, @@ -445,6 +445,11 @@ impl Machine { self.state = VMState::Paused } + pub fn load_functions(&mut self, functions: Vec) { + self.functions = functions; + self.state = VMState::Paused; + } + pub fn resume(&mut self) { match self.state { VMState::Paused => {}, diff --git a/test.asl b/test.asl index dfffe62..8dfd253 100644 --- a/test.asl +++ b/test.asl @@ -1 +1,8 @@ -gethelj test = szaft"a"szaft \ No newline at end of file +lőcsve test() { + lőcsve toast() { + ugass(2) + } + toast() + ugass(1) +} +krumpli.létrehoz(test) \ No newline at end of file