pub struct PadName(/* private fields */);Expand description
Non-null pointer to a Perl PADNAME — one lexical’s name slot.
Non-owning, like the other newtypes.
Implementations§
Source§impl PadName
impl PadName
Sourcepub fn from_raw(p: *const PADNAME) -> Option<Self>
pub fn from_raw(p: *const PADNAME) -> Option<Self>
Wrap a raw PADNAME pointer, returning None on null input.
Sourcepub fn pv(&self) -> Option<String>
pub fn pv(&self) -> Option<String>
The lexical’s name including sigil ("$x", "@args", …),
or None for unnamed slots (targets, sub-op temporaries).
Examples found in repository?
examples/walker_subs.rs (line 47)
19fn main() {
20 let mut perl = Perl::new();
21 perl.parse_env_args(env::args(), env::vars());
22
23 let sv0 = perl.get_sv("0", 0).expect("$0 is always set");
24 let main_file = String::from_utf8_lossy(sv0.pv(&perl)).into_owned();
25 println!("$0 = {main_file:?}");
26
27 let mut walker = StashWalker::new(&perl);
28 walker.walk("main", &mut |e| {
29 if e.cv.file().as_deref() != Some(main_file.as_str()) {
30 return;
31 }
32 let qual = e
33 .cv
34 .names(&perl)
35 .map(|(full, _)| full)
36 .unwrap_or_else(|| format!("{}::{}", e.package, e.name));
37 let line = e.cv.first_cop(&perl).map(|c| c.line());
38 println!("sub {qual} (first statement at line {line:?})");
39
40 let lexicals: Vec<String> = e
41 .cv
42 .pad_names()
43 .flatten() // skip unnamed slots
44 .filter_map(|pn| {
45 // Target/temporary slots have a non-null but empty PV;
46 // only real `my`/`our` names are interesting here.
47 let pv = pn.pv().filter(|s| !s.is_empty())?;
48 Some(match pn.type_stash_name() {
49 Some(t) => format!("{pv}: {t}"),
50 None => pv,
51 })
52 })
53 .collect();
54 println!(" lexicals: {lexicals:?}");
55
56 let ops: Vec<&str> = e
57 .cv
58 .start_op()
59 .into_iter()
60 .flat_map(|s| s.next_iter())
61 .take(20)
62 .map(|o| o.name().unwrap_or("<custom>"))
63 .collect();
64 println!(" ops (execution order, first 20): {}", ops.join(" "));
65 });
66}Sourcepub fn type_stash_name(&self) -> Option<String>
pub fn type_stash_name(&self) -> Option<String>
For my Foo $x-style typed lexicals: the type stash’s name
("Foo"). None for untyped lexicals.
Examples found in repository?
examples/walker_subs.rs (line 48)
19fn main() {
20 let mut perl = Perl::new();
21 perl.parse_env_args(env::args(), env::vars());
22
23 let sv0 = perl.get_sv("0", 0).expect("$0 is always set");
24 let main_file = String::from_utf8_lossy(sv0.pv(&perl)).into_owned();
25 println!("$0 = {main_file:?}");
26
27 let mut walker = StashWalker::new(&perl);
28 walker.walk("main", &mut |e| {
29 if e.cv.file().as_deref() != Some(main_file.as_str()) {
30 return;
31 }
32 let qual = e
33 .cv
34 .names(&perl)
35 .map(|(full, _)| full)
36 .unwrap_or_else(|| format!("{}::{}", e.package, e.name));
37 let line = e.cv.first_cop(&perl).map(|c| c.line());
38 println!("sub {qual} (first statement at line {line:?})");
39
40 let lexicals: Vec<String> = e
41 .cv
42 .pad_names()
43 .flatten() // skip unnamed slots
44 .filter_map(|pn| {
45 // Target/temporary slots have a non-null but empty PV;
46 // only real `my`/`our` names are interesting here.
47 let pv = pn.pv().filter(|s| !s.is_empty())?;
48 Some(match pn.type_stash_name() {
49 Some(t) => format!("{pv}: {t}"),
50 None => pv,
51 })
52 })
53 .collect();
54 println!(" lexicals: {lexicals:?}");
55
56 let ops: Vec<&str> = e
57 .cv
58 .start_op()
59 .into_iter()
60 .flat_map(|s| s.next_iter())
61 .take(20)
62 .map(|o| o.name().unwrap_or("<custom>"))
63 .collect();
64 println!(" ops (execution order, first 20): {}", ops.join(" "));
65 });
66}Trait Implementations§
Auto Trait Implementations§
impl !Send for PadName
impl !Sync for PadName
impl Freeze for PadName
impl RefUnwindSafe for PadName
impl Unpin for PadName
impl UnsafeUnpin for PadName
impl UnwindSafe for PadName
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more