Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf532742

Browse files
committed
Add basic _imp.find_frozen
1 parentf53c686 commitf532742

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

‎.cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"PYTHONWARNINGS",
6666
"basicsize",
6767
"itemsize",
68+
"origname",
6869
"getattro",
6970
"setattro",
7071
"iternext",

‎vm/src/stdlib/imp.rs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
usecrate::{PyObjectRef,VirtualMachine};
1+
usecrate::{builtins::PyBaseExceptionRef, bytecode::FrozenModule,PyObjectRef,VirtualMachine};
22

33
pubfnmake_module(vm:&VirtualMachine) ->PyObjectRef{
44
let module = _imp::make_module(vm);
@@ -48,10 +48,40 @@ mod lock {
4848
}
4949
}
5050

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+
5180
#[pymodule]
5281
mod _imp{
5382
usecrate::{
54-
builtins::{PyBytesRef,PyCode,PyModule,PyStrRef},
83+
builtins::{PyBytesRef,PyCode,PyMemoryView,PyModule,PyStrRef},
84+
function::OptionalArg,
5585
import,PyObjectRef,PyRef,PyResult,TryFromObject,VirtualMachine,
5686
};
5787

@@ -126,6 +156,29 @@ mod _imp {
126156
// TODO:
127157
}
128158

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+
129182
#[pyfunction]
130183
fnsource_hash(key:u64,source:PyBytesRef) ->Vec<u8>{
131184
let hash:u64 =crate::common::hash::keyed_hash(key, source.as_bytes());

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp