Make incognito a CodeFlag bit

This commit is contained in:
Noah
2020-02-08 23:23:03 -06:00
parent 5b2cfb442d
commit be565d30ae
5 changed files with 12 additions and 8 deletions

View File

@@ -46,18 +46,18 @@ pub struct CodeObject {
pub source_path: String,
pub first_line_number: usize,
pub obj_name: String, // Name of the object that created this code object
pub incognito: bool,
}
bitflags! {
#[derive(Serialize, Deserialize)]
pub struct CodeFlags: u8 {
pub struct CodeFlags: u16 {
const HAS_DEFAULTS = 0x01;
const HAS_KW_ONLY_DEFAULTS = 0x02;
const HAS_ANNOTATIONS = 0x04;
const NEW_LOCALS = 0x08;
const IS_GENERATOR = 0x10;
const IS_COROUTINE = 0x20;
const INCOGNITO = 1 << 15;
}
}
@@ -394,7 +394,6 @@ impl CodeObject {
source_path,
first_line_number,
obj_name,
incognito: false,
}
}
@@ -451,6 +450,10 @@ impl CodeObject {
}
Display(self)
}
pub fn incognito(&self) -> bool {
self.flags.contains(CodeFlags::INCOGNITO)
}
}
impl fmt::Display for CodeObject {

View File

@@ -189,7 +189,8 @@ impl<O: OutputStream> Compiler<O> {
}
fn push_output(&mut self, mut code: CodeObject) {
code.incognito = self.opts.incognito;
code.flags
.set(bytecode::CodeFlags::INCOGNITO, self.opts.incognito);
self.output_stack.push(code.into());
}

View File

@@ -103,7 +103,7 @@ impl PyCodeRef {
}
#[pyproperty]
fn co_flags(self) -> u8 {
fn co_flags(self) -> u16 {
self.code.flags.bits()
}
}

View File

@@ -31,7 +31,7 @@ impl FrameRef {
#[pyproperty]
fn f_globals(self, vm: &VirtualMachine) -> PyResult<PyDictRef> {
if self.code.incognito {
if self.code.incognito() {
Err(vm.new_type_error("Can't get f_globals on an incognito frame".to_owned()))
} else {
Ok(self.scope.globals.clone())
@@ -40,7 +40,7 @@ impl FrameRef {
#[pyproperty]
fn f_locals(self, vm: &VirtualMachine) -> PyResult<PyDictRef> {
if self.code.incognito {
if self.code.incognito() {
Err(vm.new_type_error("Can't get f_locals on an incognito frame".to_owned()))
} else {
Ok(self.scope.get_locals())

View File

@@ -281,7 +281,7 @@ impl PyFunction {
#[pyproperty(magic)]
fn globals(&self, vm: &VirtualMachine) -> PyResult<PyDictRef> {
if self.code.incognito {
if self.code.incognito() {
Err(vm.new_type_error("Can't get __globals__ on an incognito function".to_owned()))
} else {
Ok(self.scope.globals.clone())