GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — gh-126599: Refactor the `_PyOptimizer` APIs by xuantengh · Pull Request #126853 · python/cpython

Conversation

@xuantengh

@xuantengh xuantengh commented Nov 15, 2024 •
edited by bedevere-app Bot
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

Hi this is my draft to remove the _PyOptimizer_NewCounter and _PyOptimizer_NewUOpOptimizer APIs, where the related tests are removed or skipped.

For the most challenging _PyOptimizer_Optimize, I'm still trying to figure out how to achieve its functionality in generated interpreter. To remove the "artificial boundaries", should we just remove this API call and replace its code in the JUMP_BACKWARD, _EXIT_TRACE and _DYNAMIC_EXIT instruction cases?

  • Issue: Remove the _PyOptimizer APIs #126599

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@xuantengh
xuantengh requested review from ericsnowcurrently and markshannon as code owners November 15, 2024 03:51
@bedevere-app bedevere-app Bot added the awaiting review label Nov 15, 2024
@bedevere-app bedevere-app Bot mentioned this pull request Nov 15, 2024
Remove the _PyOptimizer APIs #126599
Closed
@xuantengh

xuantengh commented Nov 15, 2024

Copy link
Copy Markdown
Contributor Author

cc @brandtbucher @rruuaanng

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@rruuaanng

rruuaanng commented Nov 15, 2024

Copy link
Copy Markdown
Contributor

For the most challenging _PyOptimizer_Optimize, I'm still trying to figure out how to achieve its functionality in generated interpreter. To remove the "artificial boundaries", should we just remove this API call and replace its code in the JUMP_BACKWARD, _EXIT_TRACE and _DYNAMIC_EXIT instruction cases?

Please do not open unfinished PR. (Alternatively, you can convert it to a draft PR.)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@xuantengh
xuantengh marked this pull request as draft November 15, 2024 08:44
@bedevere-app bedevere-app Bot removed the awaiting review label Nov 15, 2024
@Fidget-Spinner

Fidget-Spinner commented Nov 15, 2024

Copy link
Copy Markdown
Member

Please do not open unfinished PR. (Alternatively, you can convert it to a draft PR.)

I disagree. Unfinished PRs are fine as long as they're for discussion. Also they help us lead contributors in the right direction before they put too much effort in.

AlexWaygood, tomasr8, and willingc reacted with thumbs up emoji
All reactions
  • 👍 3 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@rruuaanng

rruuaanng commented Nov 15, 2024

Copy link
Copy Markdown
Contributor

Please do not open unfinished PR. (Alternatively, you can convert it to a draft PR.)

I disagree. Unfinished PRs are fine as long as they're for discussion. Also they help us lead contributors in the right direction before they put too much effort in.

I don't object to this kind of behavior, but it should be opened as a draft before it is completed, which will waste review resources.
We should not open it as a PR that can be officially reviewed.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Fidget-Spinner
Fidget-Spinner reviewed Nov 15, 2024
View reviewed changes

@Fidget-Spinner Fidget-Spinner left a comment

Copy link
Copy Markdown
Member

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.

Thanks for picking this up. I think there might be some confusion of what is the API and what isn't so let me try my best to explain:

  • The API in CPython refers to what people use externally.
  • pycore_* files in general cannot be accessed when including the C API, unless they are included directly.
  • PyAPI_FUNC exports the symbol on Windows and other platforms.

So the thing we need to do is:

  1. Make sure the API now lives in pycore_optimizer.h
  2. Remove PyAPI_FUNC, except for when the JIT compiler needs it (The JIT compiler needs symbols exported for Windows).

So the code in JUMP_BACKWARD and ENTER_EXECUTOR shouldn't change either. We need those code for optimizing the JIT!

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

rruuaanng and xuantengh reacted with thumbs up emoji
All reactions
  • 👍 2 reactions
Comment thread Lib/test/test_capi/test_opt.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_monitoring.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Modules/_testinternalcapi.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Modules/_testinternalcapi.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Python/pylifecycle.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Include/internal/pycore_optimizer.h
Comment on lines -119 to -123
PyAPI_FUNC(PyObject *) _PyOptimizer_NewCounter(void);
PyAPI_FUNC(PyObject *) _PyOptimizer_NewUOpOptimizer(void);

@Fidget-Spinner Fidget-Spinner Nov 15, 2024

Copy link
Copy Markdown
Member

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.

In theory, the only change you need is to remove the PyAPI_FUNC. That will stop the optimizer from being exported as public API.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

rruuaanng reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

@rruuaanng rruuaanng Nov 15, 2024 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

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.

If the header file isn't used elsewhere, we can remove it and keep the signature only in the source file.
(Sorry for the term mobile. I don't look it.)

Edit
I think. A small suggestion.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Fidget-Spinner Fidget-Spinner Nov 15, 2024

Copy link
Copy Markdown
Member

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.

pycore_optimizer.h is used. Please don't remove it.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

rruuaanng reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

@xuantengh xuantengh Nov 15, 2024

Copy link
Copy Markdown
Contributor Author

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.

These 2 APIs are used for _testinternalcapi for testing. It seems like _testinternalcapi fails to be imported due to missing symbols after removing the PyAPI_FUNC.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@picnixz picnixz Nov 15, 2024

Copy link
Copy Markdown
Member

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.

You should likely mark them as extern if they are needed to be exported then.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@xuantengh xuantengh Nov 15, 2024

Copy link
Copy Markdown
Contributor Author

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.

IIUC, the APIs used by _testinternalcapi need to be exported? It seems extern does not help here.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@picnixz picnixz Nov 15, 2024

Copy link
Copy Markdown
Member

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, right, it seems that declaring them as extern is not sufficient. So we should probably keep PyAPI_FUNC. However, you should add a comment "// Export for '_testinternalcapi' shared extension.".

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@picnixz

picnixz commented Nov 15, 2024

Copy link
Copy Markdown
Member

I don't object to this kind of behavior, but it should be opened as a draft before it is completed, which will waste review resources. We should not open it as a PR that can be officially reviewed.

The reason why we advised you to use draft PRs is that you are committing a lot before the code is fine to be reviewed. If a PR is in a state where it should be reviewed (for instance if the CI is green or if there is no code planned to be committed just after), then it's perfectly fine to keep it open.

Fidget-Spinner, diegorusso, ambv, and ZeroIntensity reacted with thumbs up emoji rruuaanng reacted with hooray emoji
All reactions
  • 👍 4 reactions
  • 🎉 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@rruuaanng

rruuaanng commented Nov 15, 2024

Copy link
Copy Markdown
Contributor

I don't object to this kind of behavior, but it should be opened as a draft before it is completed, which will waste review resources. We should not open it as a PR that can be officially reviewed.

The reason why we advised you to use draft PRs is that you are committing a lot before the code is fine to be reviewed. If a PR is in a state where it should be reviewed (for instance if the CI is green or if there is no code planned to be committed just after), then it's perfectly fine to keep it open.

There seems to be a little misunderstanding. I think this comment implies that there is still unfinished work :(

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@xuantengh

xuantengh commented Nov 15, 2024 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

Sorry, I'm still a little confused about the goal of this PR.

  1. Make sure the API now lives in pycore_optimizer.h

Does it mean we should define all JIT related APIs in this file?

  1. Remove PyAPI_FUNC, except for when the JIT compiler needs it (The JIT compiler needs symbols exported for Windows).

It seems that the currently exported APIs in pycore_optimizer.h are either used by testing or JIT, so we cannot make them private. Maybe we want to hide the optimizer related APIs for users, but it seems there is not so much we can do for it?

Reverted to bring the tests back.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@willingc

willingc commented Nov 16, 2024

Copy link
Copy Markdown
Contributor

@xuantengh Thank you for your efforts on this PR. @Fidget-Spinner who has experience with this area of the code should be able to provide guidance as you move this PR forward.

@rruuaanng, Let's try to keep the comments positive and constructive. Please try to encourage other contributors instead of telling them what to do or not do. The goal for PRs are to build understanding during review and iterate to an optimal solution. The solution, as we have discussed before, must consider many factors including backward compatibility, maintainability, security, testing, complexity and code churn.

Sometimes a question lends much better results than telling someone what to do. For example, "Would you appreciate feedback on the PR so far?" instead of "Please do not open unfinished PR.". You can trust that the triagers and core developers are working toward creating a productive and healthy contributor experience for all. Please respect the importance of this goal.

rruuaanng, gpshead, sobolevn, ericsnowcurrently, and xuantengh reacted with heart emoji
All reactions
  • ❤️ 5 reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@brandtbucher

brandtbucher commented Nov 22, 2024

Copy link
Copy Markdown
Member

Sorry this got derailed, @xuantengh. It's also a little trickier than I originally assumed.

Let's start over. For this PR, can you just remove the "counter" optimizer, and any tests that use it? I think that's a fairly self-contained task, and gives us a better idea of what difficulty remains in extracting the other two. I also don't think it will involve deleting any files.

@rruuaanng, I can handle the review from here. I'm not worried about my time spent working with the author to get things in a good state here.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@xuantengh

xuantengh commented Nov 23, 2024 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

can you just remove the "counter" optimizer, and any tests that use it?

Sure, I'll try it.

Update: the _PyOptimizer_NewCounter API and __PyCounterOptimizer_Type type are removed. I simply skip the tests rather than deleting them.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@xuantengh
xuantengh force-pushed the remove-pyopt-api branch 2 times, most recently from b51de05 to 4c0e6c0 Compare November 23, 2024 15:56
@xuantengh
xuantengh marked this pull request as ready for review January 1, 2025 02:58
@bedevere-app bedevere-app Bot added the awaiting review label Jan 1, 2025
@xuantengh
xuantengh force-pushed the remove-pyopt-api branch from f6e0abb to 3f89146 Compare January 1, 2025 03:23
@xuantengh

xuantengh commented Jan 1, 2025

Copy link
Copy Markdown
Contributor Author

I'm sorry for forgetting to remove the "draft" label for this PR.

For this PR, can you just remove the "counter" optimizer, and any tests that use it?

Regarding this goal, I think it's ready for review.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

brandtbucher
brandtbucher requested changes Jan 7, 2025
View reviewed changes

@brandtbucher brandtbucher left a comment

Copy link
Copy Markdown
Member

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.

Thanks for reworking this!

There's a bit more to do, though. Please also remove these:

  • _PyCounterOptimizerObject
  • counter_dealloc
  • _PyCounterExecutor_Type
  • counter_optimize
  • counter_get_counter
  • counter_optimizer_methods
  • Remove the check for "counting_executor" from add_executor_dependency (it isn't needed).

You'll also need to remove the _INTERNAL_INCREMENT_OPT_COUNTER bytecode instruction. It's defined in Python/bytecodes.c. Just remove it there, then run make regen-cases to update all of the generated files.

Let me know if you get stuck.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

rruuaanng and xuantengh reacted with thumbs up emoji
All reactions
  • 👍 2 reactions
Comment thread Include/internal/pycore_optimizer.h Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Misc/NEWS.d/next/C_API/2025-01-01-03-25-38.gh-issue-126599.MRCYlH.rst Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_monitoring.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_capi/test_opt.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_capi/test_opt.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot removed the awaiting review label Jan 7, 2025
@bedevere-app

bedevere-app Bot commented Jan 7, 2025

Copy link
Copy Markdown

A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated.

Once you have made the requested changes, please leave a comment on this pull request containing the phrase I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot added the awaiting changes label Jan 7, 2025
@brandtbucher

brandtbucher commented Jan 13, 2025

Copy link
Copy Markdown
Member

@xuantengh, is this ready for review again? Happy to help if you're stuck, but I'd like to get this change in soon. :)

(Also, looks like you might need to merge in main and run make regen-all.)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

xuantengh added 2 commits January 14, 2025 09:12
@xuantengh
remove _PyOptimizer_NewCounter
a5bd3f1
@xuantengh
remove uop optimize tests
a77915c
xuantengh and others added 10 commits January 14, 2025 09:12
@xuantengh
add export explanation
68dd2b1
@xuantengh
remove _PyCounterOptimizer_Type and _PyOptimizer_NewCounter
f3542b6
@blurb-it @xuantengh
📜🤖 Added by blurb_it.
d763008
@xuantengh
remove _INTERNAL_INCREMENT_OPT_COUNTER
a7f9df3
@xuantengh
remove _PyCounterOptimizerObject
44aa7ab
@xuantengh
remove misc. stuff
0e96ecb
@xuantengh @brandtbucher
Update Misc/NEWS.d/next/C_API/2025-01-01-03-25-38.gh-issue-126599.MRC…
ce188a4
…YlH.rst

Co-authored-by: Brandt Bucher <[email protected]>
@xuantengh
remove unnecessary comments
949352e
@xuantengh
re-gen cases
46f0fa6
@xuantengh
fix capi test failures
f0ffafd
@xuantengh
xuantengh force-pushed the remove-pyopt-api branch from 03555d2 to f0ffafd Compare January 14, 2025 01:32
@xuantengh

xuantengh commented Jan 14, 2025 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor Author

I have made the requested changes; please review again.

Hi @brandtbucher, I've merged in main and rerun make regen-all. BTW, should I avoid pushing commits in the PR branch if it hasn't completed to avoid disturbing reviewers?

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app bedevere-app Bot added awaiting change review and removed awaiting changes labels Jan 14, 2025
@bedevere-app

bedevere-app Bot commented Jan 14, 2025

Copy link
Copy Markdown

Thanks for making the requested changes!

@brandtbucher: please review the changes made to this pull request.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-app
bedevere-app Bot requested a review from brandtbucher January 14, 2025 01:37
@xuantengh
add decorator for required API
85580ca
@brandtbucher

brandtbucher commented Jan 15, 2025

Copy link
Copy Markdown
Member

Hi @brandtbucher, I've merged in main and rerun make regen-all. BTW, should I avoid pushing commits in the PR branch if it hasn't completed to avoid disturbing reviewers?

It's not a problem to push new commits periodically (just don't force-push, please... merge instead of rebasing). I just wasn't sure if it was were ready yet. :)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@brandtbucher

brandtbucher commented Jan 15, 2025

Copy link
Copy Markdown
Member

I'll try to finish reviewing this today, but I might not finish until tomorrow.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

brandtbucher added 2 commits January 16, 2025 15:14
@brandtbucher
Clean up the diff
c3f4c6b
@brandtbucher
Fix some unused code warnings
fcb9d07
brandtbucher
brandtbucher approved these changes Jan 16, 2025
View reviewed changes

@brandtbucher brandtbucher left a comment

Copy link
Copy Markdown
Member

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.

Looks great, thanks! I'm just going to push a couple of changes to address some warnings and clean up the diff.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

xuantengh reacted with hooray emoji
All reactions
  • 🎉 1 reaction
@bedevere-app bedevere-app Bot added awaiting merge and removed awaiting change review labels Jan 16, 2025
@brandtbucher
Catch up with main
f67555f
@brandtbucher
brandtbucher merged commit b44ff6d into python:main Jan 16, 2025
@bedevere-app bedevere-app Bot removed the awaiting merge label Jan 16, 2025
@bedevere-bot

bedevere-bot commented Jan 17, 2025

Copy link
Copy Markdown

⚠️⚠️⚠️ Buildbot failure ⚠️⚠️⚠️

Hi! The buildbot aarch64 Fedora Stable LTO 3.x has failed when building commit b44ff6d.

What do you need to do:

  1. Don't panic.
  2. Check the buildbot page in the devguide if you don't know what the buildbots are or how they work.
  3. Go to the page of the buildbot that failed (https://buildbot.python.org/#/builders/336/builds/6169) and take a look at the build logs.
  4. Check if the failure is related to this commit (b44ff6d) or if it is a false positive.
  5. If the failure is related to this commit, please, reflect that on the issue and make a new Pull Request with a fix.

You can take a look at the buildbot page here:

https://buildbot.python.org/#/builders/336/builds/6169

Summary of the results of the build (if available):

==

Click to see traceback logs
Traceback (most recent call last):
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/threading.py", line 1054, in _bootstrap_inner
    self.run()
    ~~~~~~~~^^
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/threading.py", line 996, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/test/test_interpreters/test_stress.py", line 30, in task
    interp = interpreters.create()
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/test/support/interpreters/__init__.py", line 76, in create
    id = _interpreters.create(reqrefs=True)
interpreters.InterpreterError: interpreter creation failed
k


Traceback (most recent call last):
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/threading.py", line 1054, in _bootstrap_inner
    self.run()
    ~~~~~~~~^^
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/threading.py", line 996, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/test/test_interpreters/test_stress.py", line 47, in run
    interp = interpreters.create()
  File "/home/buildbot/buildarea/3.x.cstratak-fedora-stable-aarch64.lto/build/Lib/test/support/interpreters/__init__.py", line 76, in create
    id = _interpreters.create(reqrefs=True)
interpreters.InterpreterError: interpreter creation failed
k
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@xuantengh
xuantengh deleted the remove-pyopt-api branch January 19, 2025 05:33
@brandtbucher brandtbucher mentioned this pull request Jan 22, 2025
GH-126599: Remove the PyOptimizer API #129194
Merged
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@picnixz picnixz picnixz left review comments
@Fidget-Spinner Fidget-Spinner Fidget-Spinner left review comments
@brandtbucher brandtbucher brandtbucher approved these changes
@ericsnowcurrently ericsnowcurrently Awaiting requested review from ericsnowcurrently ericsnowcurrently is a code owner
@markshannon markshannon Awaiting requested review from markshannon markshannon is a code owner
+1 more reviewer
@rruuaanng rruuaanng rruuaanng left review comments
Reviewers whose approvals may not affect merge requirements

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

7 participants

@xuantengh @rruuaanng @Fidget-Spinner @picnixz @willingc @brandtbucher @bedevere-bot
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.