FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

bpo-29816: Shift operation now has less opportunity to raise OverflowError. by serhiy-storchaka · Pull Request #680 · python/cpython · GitHub

Repository navigation

bpo-29816: Shift operation now has less opportunity to raise OverflowError. - #680

Merged
serhiy-storchaka merged 7 commits into
python:masterfrom
serhiy-storchaka:long-shift-overflow
Mar 30, 2017
Merged

serhiy-storchaka merged 7 commits into
python:masterfrom
serhiy-storchaka:long-shift-overflow

Conversation

Copy link
Copy Markdown
Member

ValueError always is raised rather than OverflowError for negative counts.
Shifting zero with non-negative count always returns zero.

…Error.

ValueError always is raised rather than OverflowError for negative counts.
Shifting zero with non-negative count always returns zero.
serhiy-storchaka added the type-feature A feature request or enhancement label Mar 15, 2017

Copy link
Copy Markdown

@serhiy-storchaka, thanks for your PR! By analyzing the history of the files in this pull request, we identified @mdickinson, @tim-one and @brettcannon to be potential reviewers.

Comment thread Objects/longobject.c Outdated
return NULL;
if (shiftby >= 0) {
wordshift = shiftby / PyLong_SHIFT;
loshift = shiftby - wordshift * PyLong_SHIFT;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Why not loshift = shiftby % PyLong_SHIFT;?

serhiy-storchaka Mar 20, 2017 •
edited
Loading

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Left shift uses such code. I suppose this is because multiplication and substraction are faster than the "%" operation. If there is a reason to use it for left shift, there is a reason to use it for right shift.

The new code for left and right shifts are almost exact duplicates (there is additional optimization for right shift, but it is not very important and can be omitted). Is it worth to extract it in the helper function?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

I suppose this is because multiplication and substraction are faster than the "%" operation.

This seems unlikely to me. In particular, I'd expect an optimising compiler to be able to recognise and do a good job of optimising the pair shiftby / PyLong_SHIFT and shiftby % PyLong_SHIFT if they appear next to each other in code. Rewriting the % would likely make it harder for the compiler to recognise.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Is it worth to extract it in the helper function?

That sounds reasonable to me, if you want to do it; if you don't, that also sounds reasonable to me. :-)

mdickinson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Looks okay to me, but if feels a bit convoluted and hard to read / hard to verify. Why not use PyLong arithmetic in the overflow case, for example using divrem1 to extract the number of words / number of bits to shift?

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type-feature A feature request or enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants


Back | FazBrowse Home | New Git URL