Skip to content

Commit 55316ae

Browse files
committed
Implement RSScript v0.5 lowering groundwork
1 parent 7c42065 commit 55316ae

51 files changed

Lines changed: 3580 additions & 125 deletions

Some content is hidden

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

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
/target/
2+
tests/generated/**/target/
3+
tests/generated/**/Cargo.lock
24
.DS_Store

Cargo.lock

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

Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@
22
name = "rsscript"
33
version = "0.1.0"
44
edition = "2024"
5-
description = "RSScript v0.4.1 front-end checker"
5+
description = "RSScript v0.5 review-first front-end checker and Rust lowering prototype"
66
license = "MIT"
77

8+
[workspace]
9+
members = ["runtime"]
10+
811
[[bin]]
912
name = "rss"
1013
path = "src/main.rs"

README.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,7 @@ The intended workflow is:
556556
rss check
557557
rss fmt
558558
rss review
559+
rss lower --rust
559560
rss test
560561
```
561562

@@ -590,12 +591,12 @@ Planned stages:
590591
2. Real AST parser
591592
3. HIR and symbol table
592593
4. Semantic checker
593-
5. Managed interpreter
594-
6. Resource runtime
595-
7. Local / fresh / manage runtime
596-
8. Core library MVP
597-
9. Semantic review tooling
598-
10. Runnable MVP
594+
5. Rust lowering shape contract
595+
6. Runtime crate type surface
596+
7. Rust source generation with source maps
597+
8. rustc diagnostic mapping
598+
9. Core library signatures
599+
10. Runnable MVP through rustc
599600
```
600601

601602
The project will grow by testing the language against real scenarios:

runtime/Cargo.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "rsscript-runtime"
3+
version = "0.1.0"
4+
edition = "2024"
5+
description = "Runtime hooks for RSScript Rust lowering"
6+
license = "MIT"
7+
8+
[lib]
9+
name = "rsscript_runtime"
10+
path = "src/lib.rs"
11+
12+
[dependencies]

runtime/src/lib.rs

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
use std::cell::{RefCell, RefMut};
2+
use std::fmt;
3+
use std::ops::{Deref, DerefMut};
4+
use std::rc::Rc;
5+
6+
pub trait Managed {}
7+
8+
impl<T: 'static> Managed for T {}
9+
10+
pub trait Resource {}
11+
12+
#[derive(Clone)]
13+
pub struct Gc<T> {
14+
inner: Rc<T>,
15+
}
16+
17+
impl<T> Gc<T> {
18+
pub fn new(value: T) -> Self {
19+
Self {
20+
inner: Rc::new(value),
21+
}
22+
}
23+
24+
pub fn get(&self) -> &T {
25+
&self.inner
26+
}
27+
28+
pub fn ptr_eq(left: &Self, right: &Self) -> bool {
29+
Rc::ptr_eq(&left.inner, &right.inner)
30+
}
31+
}
32+
33+
impl<T> Deref for Gc<T> {
34+
type Target = T;
35+
36+
fn deref(&self) -> &Self::Target {
37+
self.get()
38+
}
39+
}
40+
41+
impl<T: fmt::Debug> fmt::Debug for Gc<T> {
42+
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
43+
formatter.debug_tuple("Gc").field(&self.inner).finish()
44+
}
45+
}
46+
47+
pub fn manage<T>(value: T) -> Gc<T> {
48+
Gc::new(value)
49+
}
50+
51+
#[derive(Debug)]
52+
pub struct ResourcePool<T: Resource> {
53+
values: RefCell<Vec<T>>,
54+
}
55+
56+
impl<T: Resource> ResourcePool<T> {
57+
pub fn new(values: Vec<T>) -> Self {
58+
Self {
59+
values: RefCell::new(values),
60+
}
61+
}
62+
63+
pub fn empty() -> Self {
64+
Self::new(Vec::new())
65+
}
66+
67+
pub fn push(&self, value: T) {
68+
self.values.borrow_mut().push(value);
69+
}
70+
71+
pub fn borrow(&self) -> ResourceLease<'_, T> {
72+
ResourceLease {
73+
values: self.values.borrow_mut(),
74+
index: 0,
75+
}
76+
}
77+
}
78+
79+
pub struct ResourceLease<'a, T: Resource> {
80+
values: RefMut<'a, Vec<T>>,
81+
index: usize,
82+
}
83+
84+
impl<T: Resource> Deref for ResourceLease<'_, T> {
85+
type Target = T;
86+
87+
fn deref(&self) -> &Self::Target {
88+
&self.values[self.index]
89+
}
90+
}
91+
92+
impl<T: Resource> DerefMut for ResourceLease<'_, T> {
93+
fn deref_mut(&mut self) -> &mut Self::Target {
94+
&mut self.values[self.index]
95+
}
96+
}
97+
98+
impl<T: Resource> fmt::Debug for ResourceLease<'_, T>
99+
where
100+
T: fmt::Debug,
101+
{
102+
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
103+
formatter
104+
.debug_tuple("ResourceLease")
105+
.field(&self.values[self.index])
106+
.finish()
107+
}
108+
}
109+
110+
#[cfg(test)]
111+
mod tests {
112+
use super::{Resource, ResourcePool, manage};
113+
114+
#[derive(Debug)]
115+
struct FileHandle(i32);
116+
117+
impl Resource for FileHandle {}
118+
119+
#[test]
120+
fn manage_wraps_value_in_gc_handle() {
121+
let value = manage(String::from("cached"));
122+
123+
assert_eq!(value.get(), "cached");
124+
}
125+
126+
#[test]
127+
fn resource_pool_borrows_scoped_resource() {
128+
let pool = ResourcePool::new(vec![FileHandle(7)]);
129+
let lease = pool.borrow();
130+
131+
assert_eq!(lease.0, 7);
132+
}
133+
}

0 commit comments

Comments
 (0)