-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Implement dictionary indexing by trait. #1187
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
||
/// Implement trait for the str type, so that we can use strings | ||
/// to index dictionaries. | ||
impl DictKey for String { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
impl DictKey for String { | |
impl DictKey for str { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I tried this, without success. I get this compilation error:
--> vm/src/dictdatatype.rs:363:24
|
363 | let val = dict.get(&vm, "x").unwrap().unwrap();
| ^^^ doesn't have a size known at compile-time
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, I think it's because it's trying to make a double-fat pointer, with both a vtable and a slice length, and it doesn't like that.
vm/src/dictdatatype.rs
Outdated
fn do_eq(&self, vm: &VirtualMachine, other_key: &PyObjectRef) -> PyResult<bool> { | ||
// Fall back to PyString implementation. | ||
let s = vm.new_str(self.to_string()); | ||
s.do_eq(vm, other_key) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel like we could have a more efficient eq implementation here than reallocating the string.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Absolutely, this involves checking the specific python type to be of PyStringRef
, and then doing a string compare. I suspect this happens only in a couple of cases, after the first hash compare is a success. I will implement this though, since I think it is a good idea.
f2a70bb
to
42dca44
Compare
This add support for indexing the dictionary by string. So instead of creating a PyStringRef, we now can use rust's String type to index a dict.