Skip to content
This repository was archived by the owner on Sep 5, 2025. It is now read-only.

Commit f8604e8

Browse files
author
Brian Pfretzschner
committed
Upgrade vm module to new models
1 parent f992a23 commit f8604e8

File tree

15 files changed

+104
-98
lines changed

15 files changed

+104
-98
lines changed

cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2021"
77
model = { path = "../model" }
88
parser = { path = "../parser" }
99
loader = { path = "../loader" }
10-
# vm = { path = "../vm" }
10+
vm = { path = "../vm" }
1111
rt = { path = "../rt" }
1212

1313
clap = { version = "3.1.2", features = ["derive"] }

cli/src/execute.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
use std::path::PathBuf;
22

3+
use loader::CompositeLoader;
4+
use vm::Vm;
5+
36
const MAIN_METHOD_NAME: &str = "main";
47
const MAIN_METHOD_SIGNATURE: &str = "([Ljava/lang/String;)V";
58

69
pub fn run(main_class: String, class_paths: Vec<PathBuf>) {
7-
unimplemented!()
8-
// let parser = parser::ClassfileParser {};
10+
let parser = parser::ClassfileParser {};
911

10-
// let classloader = loader::classloader_for_paths(class_paths, &parser).unwrap();
11-
// let runtime_classloader = rt::make_classloader();
12+
let classloader = loader::classloader_for_paths(class_paths, &parser).unwrap();
13+
let runtime_classloader = rt::make_classloader(&parser);
1214

13-
// let classloader = CompositeLoader::open(vec![Box::new(runtime_classloader), Box::new(classloader)]);
15+
let classloader =
16+
CompositeLoader::open(vec![Box::new(runtime_classloader), Box::new(classloader)]);
1417

15-
// let vm = Vm::new(classloader);
16-
// vm.spawn_thread("Thread-0".to_string()).invoke_method(
17-
// &main_class,
18-
// &MAIN_METHOD_NAME.to_string(),
19-
// &MAIN_METHOD_SIGNATURE.to_string(),
20-
// false,
21-
// );
18+
let vm = Vm::new(classloader);
19+
vm.spawn_thread("Thread-0".to_string()).invoke_method(
20+
&main_class,
21+
&MAIN_METHOD_NAME.to_string(),
22+
&MAIN_METHOD_SIGNATURE.to_string(),
23+
false,
24+
);
2225
}

cli/src/runtime_options.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
use std::str::FromStr;
2+
3+
pub enum RuntimeOptions {
4+
Native,
5+
Java,
6+
}
7+
impl FromStr for RuntimeOptions {
8+
type Err = String;
9+
10+
fn from_str(s: &str) -> Result<Self, Self::Err> {
11+
match s {
12+
"native" => Ok(RuntimeOptions::Native),
13+
"java" => Ok(RuntimeOptions::Java),
14+
_ => Err(format!("{} is not a valid runtime", s)),
15+
}
16+
}
17+
}

parser/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ use anyhow::{bail, Result};
22
use model::class::{ClassVersion, JvmClass};
33
use std::io::Read;
44

5-
mod method_signature;
6-
mod type_signature;
5+
pub mod method_signature;
6+
pub mod type_signature;
77

88
mod attributes;
99
mod class_info;

rt/src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use model::api::{Classloader, Parser};
44
pub fn make_classloader(parser: &impl Parser) -> impl Classloader {
55
let rt_path = std::env::current_dir()
66
.unwrap()
7-
.join("..")
8-
.join("rt/jmods/java.base/classes");
9-
println!("### {:?}", rt_path);
7+
.join("jmods/java.base/classes");
8+
109
ClassfileLoader::open(rt_path, parser).unwrap()
1110
}

vm/src/class_hierarchy.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::iter::Iterator;
22

33
use crate::VmThread;
4-
use model::class::{ClassConstant, JvmClass};
4+
use model::class::JvmClass;
55

66
pub type HierarchyClassInfo = (JvmClass, String, Vec<String>);
77

@@ -47,25 +47,12 @@ impl<'a, 'b> Iterator for HierarchyIterator<'a, 'b> {
4747

4848
fn make_hierarchy_class_info(class: &JvmClass) -> Option<HierarchyClassInfo> {
4949
// Find super class
50-
let super_class_path = match class.class_info.super_class {
50+
let super_class_path = match class.super_class {
5151
Some(ref path) => path.clone(),
5252
None => return None,
5353
};
5454

55-
// Also get all interfaces
56-
let interface_paths = class
57-
.class_info
58-
.interfaces
59-
.iter()
60-
.map(
61-
|interface_index| match class.constants.get(*interface_index as usize).unwrap() {
62-
&ClassConstant::Class(ref path) => path.clone(),
63-
it => panic!("Unexpected constant value: {:?}", it),
64-
},
65-
)
66-
.collect();
67-
68-
Some((class.clone(), super_class_path, interface_paths))
55+
Some((class.clone(), super_class_path, class.interfaces.clone()))
6956
}
7057

7158
// #[derive(Debug)]

vm/src/eval/getstatic.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn eval(
99
pc: u16,
1010
) -> Option<u16> {
1111
let index = utils::read_u16_code(code, pc);
12-
match jvm_class.constants.get(index as usize).unwrap() {
12+
match jvm_class.constants.0.get(index as usize).unwrap() {
1313
&ClassConstant::Fieldref(ref class_path, ref field_name, ref type_name) => {
1414
let value = find_static_value(vm_thread, class_path, field_name);
1515
trace!(
@@ -36,7 +36,7 @@ fn find_static_value(
3636
let class_paths: Vec<String> = {
3737
let hierarchy_iter = HierarchyIterator::hierarchy_iter(vm_thread, root_class_path);
3838
hierarchy_iter
39-
.map(|(jvm_class, _, _)| jvm_class.class_info.this_class)
39+
.map(|(jvm_class, _, _)| jvm_class.this_class)
4040
.collect()
4141
};
4242

vm/src/eval/invokevirtual.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub fn eval(
1111

1212
// First, find Methodref and extract values
1313
let (class_path, method_name, method_signature) =
14-
match jvm_class.constants.get(index as usize).unwrap() {
14+
match jvm_class.constants.0.get(index as usize).unwrap() {
1515
&ClassConstant::Methodref(ref class_path, ref method_name, ref method_signature) => (
1616
class_path.clone(),
1717
method_name.clone(),

vm/src/eval/ldc2_w.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub fn eval(
1010
let frame = vm_thread.frame_stack.last_mut().unwrap();
1111

1212
let index = utils::read_u16_code(code, pc);
13-
match jvm_class.constants.get(index as usize).unwrap() {
13+
match jvm_class.constants.0.get(index as usize).unwrap() {
1414
&ClassConstant::Long(ref value) => {
1515
trace!("ldc2_w: Pushing Long {} to stack", value);
1616
frame.stack_push(Primitive::Long(value.clone()));

vm/src/eval/ldc_x.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub fn eval(
1616
i => panic!("Unexpected invocation of this instruction, found: {}", i),
1717
};
1818

19-
match jvm_class.constants.get(index as usize).unwrap() {
19+
match jvm_class.constants.0.get(index as usize).unwrap() {
2020
&ClassConstant::String(ref value) => {
2121
trace!("{}: Pushing String \"{}\" to stack", instr_name, value);
2222

0 commit comments

Comments
 (0)