Skip to content

Commit 85f464c

Browse files
fix(vm): Objects representation.
1 parent be708f7 commit 85f464c

4 files changed

Lines changed: 61 additions & 9 deletions

File tree

compiler/src/modules/parser/literals.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -435,11 +435,22 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
435435

436436
pub(super) fn drain_annotation(&mut self) {
437437
if self.eat_if(TokenType::Colon) {
438-
while !matches!(
439-
self.peek(),
440-
Some(TokenType::Equal | TokenType::Comma | TokenType::Rpar) | None
441-
) {
442-
self.advance();
438+
let mut depth = 0u32;
439+
loop {
440+
match self.peek() {
441+
None => break,
442+
Some(TokenType::Lsqb | TokenType::Lpar | TokenType::Lbrace) => {
443+
depth += 1;
444+
self.advance();
445+
}
446+
Some(TokenType::Rsqb | TokenType::Rpar | TokenType::Rbrace) => {
447+
if depth == 0 { break; }
448+
depth -= 1;
449+
self.advance();
450+
}
451+
Some(TokenType::Equal | TokenType::Comma) if depth == 0 => break,
452+
_ => { self.advance(); }
453+
}
443454
}
444455
}
445456
}

compiler/src/modules/parser/stmt.rs

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
206206
}
207207
Some(TokenType::Return) => {
208208
self.advance();
209-
if matches!(self.peek(), Some(TokenType::Newline | TokenType::Endmarker)) {
209+
if matches!(self.peek(), Some(TokenType::Newline | TokenType::Endmarker | TokenType::Dedent) | None) {
210210
self.chunk.emit(OpCode::LoadNone, 0);
211211
} else {
212212
self.expr();
@@ -361,6 +361,17 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
361361
self.advance();
362362
let t = self.advance();
363363
let (attr_start, attr_end) = (t.start, t.end);
364+
if self.eat_if(TokenType::Colon) {
365+
while !matches!(
366+
self.peek(),
367+
Some(TokenType::Equal | TokenType::Dedent | TokenType::Endmarker) | None
368+
) {
369+
self.advance();
370+
}
371+
if !matches!(self.peek(), Some(TokenType::Equal)) {
372+
return false;
373+
}
374+
}
364375
if matches!(self.peek(), Some(TokenType::Equal)) {
365376
self.emit_load_ssa(name);
366377
self.advance();
@@ -387,6 +398,26 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
387398
let (pos, kw) = self.parse_args();
388399
let encoded = ((kw & 0xFF) << 8) | (pos & 0xFF);
389400
self.chunk.emit(OpCode::Call, encoded);
401+
} else if matches!(self.peek(), Some(TokenType::Lsqb)) {
402+
self.advance();
403+
self.expr();
404+
self.eat(TokenType::Rsqb);
405+
if matches!(self.peek(), Some(TokenType::Equal)) {
406+
self.advance();
407+
self.expr();
408+
self.chunk.emit(OpCode::StoreItem, 0);
409+
return false;
410+
} else if let Some(op) = self.peek().and_then(|t| Self::augmented_op(&t)) {
411+
self.advance();
412+
self.chunk.emit(OpCode::Dup2, 0);
413+
self.chunk.emit(OpCode::GetItem, 0);
414+
self.expr();
415+
self.chunk.emit(op, 0);
416+
self.chunk.emit(OpCode::StoreItem, 0);
417+
return false;
418+
} else {
419+
self.chunk.emit(OpCode::GetItem, 0);
420+
}
390421
}
391422
self.expr_tails();
392423
true

compiler/src/modules/vm/types.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@ impl NativeFnId {
503503
Self::Format => "format", Self::Ascii => "ascii",
504504
Self::GetAttr => "getattr", Self::HasAttr => "hasattr",
505505
Self::Next => "next",
506-
Self::Run => "run", Self::Sleep => "sleep", Self::Receive => "receive",
506+
Self::Run => "run", Self::Sleep => "sleep", Self::Receive => "receive",
507507
}
508508
}
509509
}
@@ -670,7 +670,10 @@ impl HeapPool {
670670
}
671671
Some(HeapObj::Instance(cls, attrs)) => {
672672
if cls.is_heap() { worklist.push(cls.as_heap()); }
673-
for (_, v) in attrs.borrow().iter() { if v.is_heap() { worklist.push(v.as_heap()); } }
673+
for (k, v) in attrs.borrow().iter() {
674+
if k.is_heap() { worklist.push(k.as_heap()); }
675+
if v.is_heap() { worklist.push(v.as_heap()); }
676+
}
674677
}
675678
Some(HeapObj::Coroutine(_, slots, stack, _, _)) => {
676679
for v in slots.iter().flatten() { if v.is_heap() { worklist.push(v.as_heap()); } }

compiler/tests/cases/vm.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,5 +539,12 @@
539539
{"src": "class Foo:\n pass\nf = Foo()\nprint(type(f))", "output": ["<class 'object'>"]},
540540
{"src": "def f(**kw):\n return kw\nprint(f(a=1, b=2))", "output": ["{'a': 1, 'b': 2}"]},
541541
{"src": "def f(x, **kw):\n return (x, kw)\nprint(f(1, y=2, z=3))", "output": ["(1, {'y': 2, 'z': 3})"]},
542-
{"src": "def make():\n x = 10\n f = lambda: x\n x = 20\n return f()\nprint(make())", "output": ["20"]}
542+
{"src": "def make():\n x = 10\n f = lambda: x\n x = 20\n return f()\nprint(make())", "output": ["20"]},
543+
{"src": "class C:\n def __init__(self):\n self.x: int = 5\n self.items: list[int] = [1, 2, 3]\n def get(self):\n return self.x\nc = C()\nprint(c.get())\nprint(c.items[0])", "output": ["5", "1"]},
544+
{"src": "class C:\n def __init__(self):\n self.items = [10, 20, 30]\n def bump(self, i):\n self.items[i] += 5\nc = C()\nc.bump(1)\nprint(c.items[1])", "output": ["25"]},
545+
{"src": "class C:\n def __init__(self):\n self.data = [0, 0]\n def run(self):\n for i in range(len(self.data)):\n self.data[i] += i + 1\nc = C()\nc.run()\nprint(c.data)", "output": ["[1, 2]"]},
546+
{"src": "def f():\n for e in range(5):\n if e == 2:\n return e\n print(e)\nprint(f())", "output": ["0", "1", "2"]},
547+
{"src": "def f(x: list[int], y: int = 10) -> int:\n return x[0] + y\nprint(f([5]))", "output": ["15"]},
548+
{"src": "def f(x: dict[str, int], y: int = 0) -> int:\n return y\nprint(f({'a': 1}, 42))", "output": ["42"]},
549+
{"src": "class C:\n def __init__(self, s: float = 1.0) -> None:\n self.seed: float = s\n self.vals: list[float] = []\n def add(self, v: float) -> None:\n self.vals.append(v)\nc = C(2.5)\nc.add(3.0)\nprint(c.seed)\nprint(c.vals[0])", "output": ["2.5", "3.0"]}
543550
]

0 commit comments

Comments
 (0)