Skip to content

Commit 8cb65f4

Browse files
authored
refactor: Split plotnik-lib into bytecode, vm, compiler crates (#346)
1 parent 67380b4 commit 8cb65f4

347 files changed

Lines changed: 3717 additions & 1739 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 49 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
[workspace]
22
resolver = "2"
3-
members = ["crates/plotnik-cli", "crates/plotnik-lib", "crates/plotnik-langs", "crates/plotnik-core"]
3+
members = [
4+
"crates/plotnik-bytecode",
5+
"crates/plotnik-cli",
6+
"crates/plotnik-compiler",
7+
"crates/plotnik-core",
8+
"crates/plotnik-langs",
9+
"crates/plotnik-lib",
10+
"crates/plotnik-vm",
11+
]
412

513
[workspace.package]
614
version = "0.2.2"
@@ -9,6 +17,9 @@ repository = "https://github.com/plotnik-lang/plotnik"
917
edition = "2024"
1018

1119
[workspace.dependencies]
20+
plotnik-bytecode = { path = "crates/plotnik-bytecode", version = "0.2.2" }
21+
plotnik-compiler = { path = "crates/plotnik-compiler", version = "0.2.2" }
1222
plotnik-core = { path = "crates/plotnik-core", version = "0.2.2" }
1323
plotnik-langs = { path = "crates/plotnik-langs", version = "0.2.2" }
1424
plotnik-lib = { path = "crates/plotnik-lib", version = "0.2.2" }
25+
plotnik-vm = { path = "crates/plotnik-vm", version = "0.2.2" }

crates/plotnik-bytecode/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "plotnik-bytecode"
3+
version.workspace = true
4+
edition.workspace = true
5+
license.workspace = true
6+
repository.workspace = true
7+
description = "Bytecode format and runtime types for Plotnik"
8+
9+
[lints.rust]
10+
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(coverage_nightly)'] }
11+
12+
[dependencies]
13+
plotnik-core.workspace = true
14+
regex-automata = { version = "0.4", features = ["dfa-search"] }
15+
thiserror = "2.0.17"
16+
17+
[dev-dependencies]
18+
insta = { version = "=1.46.0", features = ["yaml"] }
File renamed without changes.

crates/plotnik-lib/src/bytecode/aligned_vec_tests.rs renamed to crates/plotnik-bytecode/src/bytecode/aligned_vec_tests.rs

File renamed without changes.
File renamed without changes.

crates/plotnik-lib/src/bytecode/dump.rs renamed to crates/plotnik-bytecode/src/bytecode/dump.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@
55
use std::collections::BTreeMap;
66
use std::fmt::Write as _;
77

8-
use crate::colors::Colors;
9-
10-
use crate::parser::PredicateOp;
8+
use plotnik_core::Colors;
9+
use crate::predicate_op::PredicateOp;
1110

1211
use super::format::{LineBuilder, Symbol, format_effect, nav_symbol, width_for_count};
1312
use super::ids::TypeId;
1413
use super::instructions::StepId;
15-
use super::ir::NodeTypeIR;
1614
use super::module::{Instruction, Module};
15+
use super::node_type_ir::NodeTypeIR;
1716
use super::nav::Nav;
1817
use super::type_meta::{TypeData, TypeKind};
1918
use super::{Call, Match, Return, Trampoline};
@@ -78,13 +77,13 @@ impl DumpContext {
7877
let mut node_type_names = BTreeMap::new();
7978
for i in 0..node_types.len() {
8079
let t = node_types.get(i);
81-
node_type_names.insert(t.id(), strings.get(t.name()).to_string());
80+
node_type_names.insert(t.id, strings.get(t.name).to_string());
8281
}
8382

8483
let mut node_field_names = BTreeMap::new();
8584
for i in 0..node_fields.len() {
8685
let f = node_fields.get(i);
87-
node_field_names.insert(f.id(), strings.get(f.name()).to_string());
86+
node_field_names.insert(f.id, strings.get(f.name).to_string());
8887
}
8988

9089
// Collect all strings for unlinked mode lookups
@@ -210,14 +209,14 @@ fn dump_types_defs(out: &mut String, module: &Module, ctx: &DumpContext) {
210209
TypeKind::Struct => {
211210
let fields: Vec<_> = types
212211
.members_of(&def)
213-
.map(|m| strings.get(m.name()).to_string())
212+
.map(|m| strings.get(m.name).to_string())
214213
.collect();
215214
format!("{} ; {{ {} }}{}", c.dim, fields.join(", "), c.reset)
216215
}
217216
TypeKind::Enum => {
218217
let variants: Vec<_> = types
219218
.members_of(&def)
220-
.map(|m| strings.get(m.name()).to_string())
219+
.map(|m| strings.get(m.name).to_string())
221220
.collect();
222221
format!("{} ; {}{}", c.dim, variants.join(" | "), c.reset)
223222
}
@@ -293,8 +292,8 @@ fn format_type_name(type_id: TypeId, module: &Module, ctx: &DumpContext) -> Stri
293292
// Try to find a name in types.names
294293
for i in 0..types.names_count() {
295294
let entry = types.get_name(i);
296-
if entry.type_id() == type_id {
297-
return strings.get(entry.name()).to_string();
295+
if entry.type_id == type_id {
296+
return strings.get(entry.name).to_string();
298297
}
299298
}
300299

crates/plotnik-lib/src/bytecode/effects.rs renamed to crates/plotnik-bytecode/src/bytecode/effects.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ impl EffectOpcode {
4343

4444
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
4545
pub struct EffectOp {
46-
pub(crate) opcode: EffectOpcode,
47-
pub(crate) payload: usize,
46+
pub opcode: EffectOpcode,
47+
pub payload: usize,
4848
}
4949

5050
impl EffectOp {
@@ -69,11 +69,4 @@ impl EffectOp {
6969
let raw = ((self.opcode as u16) << 10) | ((self.payload as u16) & 0x3FF);
7070
raw.to_le_bytes()
7171
}
72-
73-
pub fn opcode(&self) -> EffectOpcode {
74-
self.opcode
75-
}
76-
pub fn payload(&self) -> usize {
77-
self.payload
78-
}
7972
}

crates/plotnik-lib/src/bytecode/effects_tests.rs renamed to crates/plotnik-bytecode/src/bytecode/effects_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,25 @@ fn roundtrip_with_payload() {
55
let op = EffectOp::new(EffectOpcode::Set, 42);
66
let bytes = op.to_bytes();
77
let decoded = EffectOp::from_bytes(bytes);
8-
assert_eq!(decoded.opcode(), EffectOpcode::Set);
9-
assert_eq!(decoded.payload(), 42);
8+
assert_eq!(decoded.opcode, EffectOpcode::Set);
9+
assert_eq!(decoded.payload, 42);
1010
}
1111

1212
#[test]
1313
fn roundtrip_no_payload() {
1414
let op = EffectOp::new(EffectOpcode::Node, 0);
1515
let bytes = op.to_bytes();
1616
let decoded = EffectOp::from_bytes(bytes);
17-
assert_eq!(decoded.opcode(), EffectOpcode::Node);
18-
assert_eq!(decoded.payload(), 0);
17+
assert_eq!(decoded.opcode, EffectOpcode::Node);
18+
assert_eq!(decoded.payload, 0);
1919
}
2020

2121
#[test]
2222
fn max_payload() {
2323
let op = EffectOp::new(EffectOpcode::Enum, 1023);
2424
let bytes = op.to_bytes();
2525
let decoded = EffectOp::from_bytes(bytes);
26-
assert_eq!(decoded.payload(), 1023);
26+
assert_eq!(decoded.payload, 1023);
2727
}
2828

2929
#[test]

crates/plotnik-lib/src/bytecode/entrypoint.rs renamed to crates/plotnik-bytecode/src/bytecode/entrypoint.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ use super::{StringId, TypeId};
88
#[repr(C)]
99
pub struct Entrypoint {
1010
/// Definition name.
11-
pub(crate) name: StringId,
11+
pub name: StringId,
1212
/// Starting instruction address.
13-
pub(crate) target: StepAddr,
13+
pub target: StepAddr,
1414
/// Result type.
15-
pub(crate) result_type: TypeId,
16-
pub(crate) _pad: u16,
15+
pub result_type: TypeId,
16+
_pad: u16,
1717
}
1818

1919
const _: () = assert!(std::mem::size_of::<Entrypoint>() == 8);

0 commit comments

Comments
 (0)