|
1 |
| -usecrate::{PyObjectRef,VirtualMachine}; |
| 1 | +usecrate::{builtins::PyBaseExceptionRef, bytecode::FrozenModule,PyObjectRef,VirtualMachine}; |
2 | 2 |
|
3 | 3 | pubfnmake_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 | +enumFrozenError{ |
| 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 | +implFrozenError{ |
| 63 | +fnto_pyexception(&self,mod_name:&str,vm:&VirtualMachine) ->PyBaseExceptionRef{ |
| 64 | +useFrozenError::*; |
| 65 | +let msg =matchself{ |
| 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 | +fnfind_frozen<'a>(name:&str,vm:&'aVirtualMachine) ->Result<&'aFrozenModule,FrozenError>{ |
| 77 | + vm.state.frozen.get(name).ok_or(FrozenError::NotFound) |
| 78 | +} |
| 79 | + |
51 | 80 | #[pymodule]
|
52 | 81 | mod _imp{
|
53 | 82 | usecrate::{
|
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 | +fnfind_frozen( |
| 161 | +name:PyStrRef, |
| 162 | +withdata:OptionalArg<bool>, |
| 163 | +vm:&VirtualMachine, |
| 164 | +) ->PyResult<Option<(Option<PyRef<PyMemoryView>>,bool,PyStrRef)>>{ |
| 165 | +usesuper::FrozenError::*; |
| 166 | + |
| 167 | +if withdata.into_option().is_some(){ |
| 168 | +// this is keyword-only argument in CPython |
| 169 | +unimplemented!(); |
| 170 | +} |
| 171 | + |
| 172 | +let info =matchsuper::find_frozen(name.as_str(), vm){ |
| 173 | +Ok(info) => info, |
| 174 | +Err(NotFound |Disabled |BadName) =>returnOk(None), |
| 175 | +Err(e) =>returnErr(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 | fnsource_hash(key:u64,source:PyBytesRef) ->Vec<u8>{
|
131 | 184 | let hash:u64 =crate::common::hash::keyed_hash(key, source.as_bytes());
|
|