Skip to content

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

Merged
merged 2 commits into from
Jul 29, 2019
Merged

Implement dictionary indexing by trait. #1187

merged 2 commits into from
Jul 29, 2019

Conversation

windelbouwman
Copy link
Contributor

@windelbouwman windelbouwman commented Jul 28, 2019

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.


/// Implement trait for the str type, so that we can use strings
/// to index dictionaries.
impl DictKey for String {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
impl DictKey for String {
impl DictKey for str {

Copy link
Contributor Author

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

Copy link
Member

@coolreader18 coolreader18 Jul 28, 2019

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.

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)
Copy link
Member

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.

Copy link
Contributor Author

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.

@coolreader18 coolreader18 merged commit c8ce3bd into master Jul 29, 2019
@windelbouwman windelbouwman deleted the dict-keying branch September 1, 2019 09:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants