Skip to content

Commit 33bffc4

Browse files
Docs: Integers prootion to float documented.
1 parent 4e5d550 commit 33bffc4

File tree

4 files changed

+17
-2
lines changed

4 files changed

+17
-2
lines changed

compiler/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ print(counter)
7474

7575
### Value Representation
7676

77-
NaN-boxed 64-bit: integers are 48-bit signed ($\pm 2^{47}$), overflow promotes to float. Heap index is 28-bit ($2^{28}$ objects max, returns `MemoryError` beyond).
77+
NaN-boxed 64-bit: integers are 48-bit signed ($\pm 2^{47}$), overflow promotes to float (Gudeman, 1993). Results exceeding 48-bit range lose integer precision, consistent with Lua 5.3 and PHP 8. Heap index is 28-bit ($2^{28}$ objects max, returns `MemoryError` beyond).
7878

7979
### Building for WebAssembly
8080

compiler/src/modules/parser/stmt.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,15 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
318318
self.expr();
319319
self.chunk.emit(OpCode::StoreItem, 0);
320320
false
321+
} else if self.peek().and_then(|tok| Self::augmented_op(&tok)).is_some() {
322+
let op = Self::augmented_op(&self.peek().unwrap()).unwrap();
323+
self.advance();
324+
self.chunk.emit(OpCode::Dup2, 0);
325+
self.chunk.emit(OpCode::GetItem, 0);
326+
self.expr();
327+
self.chunk.emit(op, 0);
328+
self.chunk.emit(OpCode::StoreItem, 0);
329+
false
321330
} else {
322331
self.chunk.emit(OpCode::GetItem, 0);
323332
self.expr_tails();

compiler/src/modules/parser/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub enum OpCode {
2222
BuildSlice, MakeClass, SetupExcept, PopExcept, Raise, Import, ImportFrom, BitAnd, BitOr, BitXor,
2323
BitNot, Shl, Shr, In, NotIn, Is, IsNot, UnpackSequence, BuildTuple, SetupWith, ExitWith, Yield,
2424
Del, Assert, Global, Nonlocal, UnpackArgs, ListComp, SetComp, DictComp, BuildSet, RaiseFrom,
25-
UnpackEx, LoadEllipsis, GenExpr, Await, MakeCoroutine, YieldFrom, TypeAlias, StoreItem
25+
UnpackEx, LoadEllipsis, GenExpr, Await, MakeCoroutine, YieldFrom, TypeAlias, StoreItem, Dup2
2626
}
2727

2828
/*

compiler/src/modules/vm/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,12 @@ impl<'a> VM<'a> {
375375
ip = target;
376376
}
377377
OpCode::PopTop => { self.pop()?; }
378+
OpCode::Dup2 => {
379+
let b = self.pop()?;
380+
let a = self.pop()?;
381+
self.push(a); self.push(b);
382+
self.push(a); self.push(b);
383+
}
378384
OpCode::ReturnValue => {
379385
let result = if self.stack.is_empty() { Val::none() } else { self.pop()? };
380386
self.live_slots.truncate(slots_base);

0 commit comments

Comments
 (0)