mirror of
https://github.com/RustPython/Parser.git
synced 2025-08-31 23:57:57 +00:00
Make bytecode::Label its own struct
This commit is contained in:
parent
e37f117035
commit
e0a52c15f6
3 changed files with 36 additions and 20 deletions
|
@ -12,7 +12,7 @@ use crate::symboltable::{
|
||||||
make_symbol_table, statements_to_symbol_table, Symbol, SymbolScope, SymbolTable,
|
make_symbol_table, statements_to_symbol_table, Symbol, SymbolScope, SymbolTable,
|
||||||
};
|
};
|
||||||
use num_complex::Complex64;
|
use num_complex::Complex64;
|
||||||
use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Varargs};
|
use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Label, Varargs};
|
||||||
use rustpython_parser::{ast, parser};
|
use rustpython_parser::{ast, parser};
|
||||||
|
|
||||||
type BasicOutputStream = PeepholeOptimizer<CodeObjectStream>;
|
type BasicOutputStream = PeepholeOptimizer<CodeObjectStream>;
|
||||||
|
@ -134,8 +134,6 @@ impl std::fmt::Display for ModeParseError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) type Label = usize;
|
|
||||||
|
|
||||||
impl<O> Default for Compiler<O>
|
impl<O> Default for Compiler<O>
|
||||||
where
|
where
|
||||||
O: OutputStream,
|
O: OutputStream,
|
||||||
|
@ -2004,7 +2002,7 @@ impl<O: OutputStream> Compiler<O> {
|
||||||
|
|
||||||
// Generate a new label
|
// Generate a new label
|
||||||
fn new_label(&mut self) -> Label {
|
fn new_label(&mut self) -> Label {
|
||||||
let l = self.nxt_label;
|
let l = Label::new(self.nxt_label);
|
||||||
self.nxt_label += 1;
|
self.nxt_label += 1;
|
||||||
l
|
l
|
||||||
}
|
}
|
||||||
|
@ -2093,9 +2091,9 @@ fn compile_conversion_flag(conversion_flag: ast::ConversionFlag) -> bytecode::Co
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::Compiler;
|
use super::Compiler;
|
||||||
use crate::symboltable::make_symbol_table;
|
use crate::symboltable::make_symbol_table;
|
||||||
use rustpython_bytecode::bytecode::CodeObject;
|
|
||||||
use rustpython_bytecode::bytecode::Constant::*;
|
use rustpython_bytecode::bytecode::Constant::*;
|
||||||
use rustpython_bytecode::bytecode::Instruction::*;
|
use rustpython_bytecode::bytecode::Instruction::*;
|
||||||
|
use rustpython_bytecode::bytecode::{CodeObject, Label};
|
||||||
use rustpython_parser::parser;
|
use rustpython_parser::parser;
|
||||||
|
|
||||||
fn compile_exec(source: &str) -> CodeObject {
|
fn compile_exec(source: &str) -> CodeObject {
|
||||||
|
@ -2116,15 +2114,21 @@ mod tests {
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: true }
|
value: Boolean { value: true }
|
||||||
},
|
},
|
||||||
JumpIfTrue { target: 1 },
|
JumpIfTrue {
|
||||||
|
target: Label::new(1)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: false }
|
value: Boolean { value: false }
|
||||||
},
|
},
|
||||||
JumpIfTrue { target: 1 },
|
JumpIfTrue {
|
||||||
|
target: Label::new(1)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: false }
|
value: Boolean { value: false }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 0 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(0)
|
||||||
|
},
|
||||||
Pass,
|
Pass,
|
||||||
LoadConst { value: None },
|
LoadConst { value: None },
|
||||||
ReturnValue
|
ReturnValue
|
||||||
|
@ -2141,15 +2145,21 @@ mod tests {
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: true }
|
value: Boolean { value: true }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 0 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(0)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: false }
|
value: Boolean { value: false }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 0 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(0)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: false }
|
value: Boolean { value: false }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 0 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(0)
|
||||||
|
},
|
||||||
Pass,
|
Pass,
|
||||||
LoadConst { value: None },
|
LoadConst { value: None },
|
||||||
ReturnValue
|
ReturnValue
|
||||||
|
@ -2166,19 +2176,27 @@ mod tests {
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: true }
|
value: Boolean { value: true }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 2 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(2)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: false }
|
value: Boolean { value: false }
|
||||||
},
|
},
|
||||||
JumpIfTrue { target: 1 },
|
JumpIfTrue {
|
||||||
|
target: Label::new(1)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: false }
|
value: Boolean { value: false }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 0 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(0)
|
||||||
|
},
|
||||||
LoadConst {
|
LoadConst {
|
||||||
value: Boolean { value: true }
|
value: Boolean { value: true }
|
||||||
},
|
},
|
||||||
JumpIfFalse { target: 0 },
|
JumpIfFalse {
|
||||||
|
target: Label::new(0)
|
||||||
|
},
|
||||||
Pass,
|
Pass,
|
||||||
LoadConst { value: None },
|
LoadConst { value: None },
|
||||||
ReturnValue
|
ReturnValue
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
use crate::compile::Label;
|
use rustpython_bytecode::bytecode::{CodeObject, Instruction, Label, Location};
|
||||||
use rustpython_bytecode::bytecode::{CodeObject, Instruction, Location};
|
|
||||||
|
|
||||||
pub trait OutputStream: From<CodeObject> + Into<CodeObject> {
|
pub trait OutputStream: From<CodeObject> + Into<CodeObject> {
|
||||||
/// Output an instruction
|
/// Output an instruction
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
use crate::compile::Label;
|
|
||||||
use crate::output_stream::OutputStream;
|
use crate::output_stream::OutputStream;
|
||||||
use arrayvec::ArrayVec;
|
use arrayvec::ArrayVec;
|
||||||
use rustpython_bytecode::bytecode::{self, CodeObject, Instruction, Location};
|
use rustpython_bytecode::bytecode::{self, CodeObject, Instruction, Label, Location};
|
||||||
|
|
||||||
const PEEPHOLE_BUFFER_SIZE: usize = 20;
|
const PEEPHOLE_BUFFER_SIZE: usize = 20;
|
||||||
|
|
||||||
|
@ -92,7 +91,7 @@ where
|
||||||
self.push(instruction, loc.into());
|
self.push(instruction, loc.into());
|
||||||
optimize(self);
|
optimize(self);
|
||||||
}
|
}
|
||||||
fn set_label(&mut self, label: crate::compile::Label) {
|
fn set_label(&mut self, label: Label) {
|
||||||
if let Some(instr) = self.buffer.last_mut() {
|
if let Some(instr) = self.buffer.last_mut() {
|
||||||
instr.1.labels.push(label)
|
instr.1.labels.push(label)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue