|
1 |
| -use crate::{PyObjectRef, VirtualMachine}; |
| 1 | +use crate::{builtins::PyBaseExceptionRef, bytecode::FrozenModule, PyObjectRef, VirtualMachine}; |
2 | 2 |
|
3 | 3 | pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
|
4 | 4 | let module = _imp::make_module(vm);
|
@@ -48,10 +48,40 @@ mod lock {
|
48 | 48 | }
|
49 | 49 | }
|
50 | 50 |
|
| 51 | +#[allow(dead_code)] |
| 52 | +enum FrozenError { |
| 53 | + BadName, // The given module name wasn't valid. |
| 54 | + NotFound, // It wasn't in PyImport_FrozenModules. |
| 55 | + Disabled, // -X frozen_modules=off (and not essential) |
| 56 | + Excluded, // The PyImport_FrozenModules entry has NULL "code" |
| 57 | + // (module is present but marked as unimportable, stops search). |
| 58 | + Invalid, // The PyImport_FrozenModules entry is bogus |
| 59 | + // (eg. does not contain executable code). |
| 60 | +} |
| 61 | + |
| 62 | +impl FrozenError { |
| 63 | + fn to_pyexception(&self, mod_name: &str, vm: &VirtualMachine) -> PyBaseExceptionRef { |
| 64 | + use FrozenError::*; |
| 65 | + let msg = match self { |
| 66 | + BadName | NotFound => format!("No such frozen object named {mod_name}"), |
| 67 | + Disabled => format!("Frozen modules are disabled and the frozen object named {mod_name} is not essential"), |
| 68 | + Excluded => format!("Excluded frozen object named {mod_name}"), |
| 69 | + Invalid => format!("Frozen object named {mod_name} is invalid"), |
| 70 | + }; |
| 71 | + vm.new_import_error(msg, mod_name) |
| 72 | + } |
| 73 | +} |
| 74 | + |
| 75 | +// find_frozen in frozen.c |
| 76 | +fn find_frozen<'a>(name: &str, vm: &'a VirtualMachine) -> Result<&'a FrozenModule, FrozenError> { |
| 77 | + vm.state.frozen.get(name).ok_or(FrozenError::NotFound) |
| 78 | +} |
| 79 | + |
51 | 80 | #[pymodule]
|
52 | 81 | mod _imp {
|
53 | 82 | use crate::{
|
54 |
| - builtins::{PyBytesRef, PyCode, PyModule, PyStrRef}, |
| 83 | + builtins::{PyBytesRef, PyCode, PyMemoryView, PyModule, PyStrRef}, |
| 84 | + function::OptionalArg, |
55 | 85 | import, PyObjectRef, PyRef, PyResult, TryFromObject, VirtualMachine,
|
56 | 86 | };
|
57 | 87 |
|
@@ -126,6 +156,29 @@ mod _imp {
|
126 | 156 | // TODO:
|
127 | 157 | }
|
128 | 158 |
|
| 159 | + #[pyfunction] |
| 160 | + fn find_frozen( |
| 161 | + name: PyStrRef, |
| 162 | + withdata: OptionalArg<bool>, |
| 163 | + vm: &VirtualMachine, |
| 164 | + ) -> PyResult<Option<(Option<PyRef<PyMemoryView>>, bool, PyStrRef)>> { |
| 165 | + use super::FrozenError::*; |
| 166 | + |
| 167 | + if withdata.into_option().is_some() { |
| 168 | + // this is keyword-only argument in CPython |
| 169 | + unimplemented!(); |
| 170 | + } |
| 171 | + |
| 172 | + let info = match super::find_frozen(name.as_str(), vm) { |
| 173 | + Ok(info) => info, |
| 174 | + Err(NotFound | Disabled | BadName) => return Ok(None), |
| 175 | + Err(e) => return Err(e.to_pyexception(name.as_str(), vm)), |
| 176 | + }; |
| 177 | + |
| 178 | + let origname = name; // FIXME: origname != name |
| 179 | + Ok(Some((None, info.package, origname))) |
| 180 | + } |
| 181 | + |
129 | 182 | #[pyfunction]
|
130 | 183 | fn source_hash(key: u64, source: PyBytesRef) -> Vec<u8> {
|
131 | 184 | let hash: u64 = crate::common::hash::keyed_hash(key, source.as_bytes());
|
|
0 commit comments