22use crate :: domain:: Source ;
33use crate :: {
44 bytecode_vm:: {
5- compiler:: CodeObject , runtime:: types:: Exception , Compiler , CompilerError , Runtime ,
6- VirtualMachine , VmResult , VmValue ,
5+ compiler:: CodeObject , Compiler , CompilerError , Runtime , VirtualMachine , VmResult , VmValue ,
76 } ,
87 core:: { Container , Interpreter } ,
98 domain:: { MemphisResult , MemphisValue , ModuleName , ModuleOrigin , Text } ,
@@ -15,6 +14,7 @@ use crate::{
1514pub struct VmContext {
1615 lexer : Lexer ,
1716 module_name : ModuleName ,
17+ package : ModuleName ,
1818 path_str : String ,
1919 vm : VirtualMachine ,
2020}
@@ -23,12 +23,19 @@ impl VmContext {
2323 pub fn new ( text : Text , origin : ModuleOrigin ) -> Self {
2424 let state = Container :: new ( MemphisState :: init ( origin. clone ( ) ) ) ;
2525 let runtime = Container :: new ( Runtime :: new ( ) ) ;
26- Self :: from_state ( ModuleName :: main ( ) , text, origin, state, runtime)
26+ Self :: from_state (
27+ ModuleName :: main ( ) ,
28+ ModuleName :: empty ( ) ,
29+ text,
30+ origin,
31+ state,
32+ runtime,
33+ )
2734 }
2835
29- /// Initialize a context from a [`Source`] and existing treewalk state.
3036 pub fn from_state (
3137 module_name : ModuleName ,
38+ package : ModuleName ,
3239 text : Text ,
3340 origin : ModuleOrigin ,
3441 state : Container < MemphisState > ,
@@ -37,16 +44,17 @@ impl VmContext {
3744 Self {
3845 lexer : Lexer :: new ( & text) ,
3946 module_name,
47+ package,
4048 path_str : origin. path_str ( ) ,
4149 vm : VirtualMachine :: new ( state, runtime) ,
4250 }
4351 }
4452
4553 pub fn run_inner ( & mut self ) -> VmResult < VmValue > {
46- // TODO use a real syntax error here
47- let code = self
48- . compile ( )
49- . map_err ( |_e| self . vm . raise ( Exception :: syntax_error ( ) ) ) ?;
54+ let code = self . compile ( ) . map_err ( |e| {
55+ let exc = e . into_exception ( & mut self . vm ) ;
56+ self . vm . raise ( exc )
57+ } ) ?;
5058 self . vm . execute ( code)
5159 }
5260
@@ -57,7 +65,7 @@ impl VmContext {
5765 . map_err ( |e| CompilerError :: SyntaxError ( e. to_string ( ) ) ) ?;
5866 ast. rewrite_last_expr_to_return ( ) ;
5967
60- let mut compiler = Compiler :: new ( & self . module_name , & self . path_str ) ;
68+ let mut compiler = Compiler :: new ( & self . module_name , & self . package , & self . path_str ) ;
6169 compiler. compile ( & ast)
6270 }
6371
@@ -75,10 +83,15 @@ impl VmContext {
7583 }
7684
7785 #[ cfg( test) ]
78- pub fn set_module_name ( & mut self , name : ModuleName ) {
86+ pub fn set_module ( & mut self , name : ModuleName ) {
7987 self . module_name = name;
8088 }
8189
90+ #[ cfg( test) ]
91+ pub fn set_pkg ( & mut self , name : ModuleName ) {
92+ self . package = name;
93+ }
94+
8295 #[ cfg( any( test, feature = "wasm" ) ) ]
8396 pub fn from_text ( text : Text ) -> Self {
8497 Self :: new ( text, ModuleOrigin :: Stdin )
0 commit comments