diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ad339c3..00ab34d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,8 +70,6 @@ jobs: if: contains(steps.need-pypi.outputs.pyproject-toml, 'pyproject.toml') run: | pip install --upgrade build twine - for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0+auto.0/1.2.3/" $file; - done; + find -type f -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) -exec sed -i -e "s/0.0.0+auto.0/1.2.3/" {} + python -m build twine check dist/* diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fe458e2..9e18ad7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -81,8 +81,6 @@ jobs: TWINE_USERNAME: ${{ secrets.pypi_username }} TWINE_PASSWORD: ${{ secrets.pypi_password }} run: | - for file in $(find -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) ); do - sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" $file; - done; + find -type f -not -path "./.*" -not -path "./docs*" \( -name "*.py" -o -name "*.toml" \) -exec sed -i -e "s/0.0.0+auto.0/${{github.event.release.tag_name}}/" {} + python -m build twine upload dist/* diff --git a/asyncio/core.py b/asyncio/core.py index 33168e3..dcd4b24 100644 --- a/asyncio/core.py +++ b/asyncio/core.py @@ -69,7 +69,6 @@ def __next__(self): self.exc.__traceback__ = None raise self.exc - # Pause task execution for the given time (integer in milliseconds, uPy extension) # Use a SingletonGenerator to do it without allocating on the heap def sleep_ms(t, sgen=SingletonGenerator()): @@ -93,6 +92,34 @@ def sleep(t): return sleep_ms(int(t * 1000)) +################################################################################ +# "Never schedule" object" +# Don't re-schedule the object that awaits the _never singleton. +# For internal use only. Some constructs, like `await event.wait()`, +# work by NOT re-scheduling the task which calls wait(), but by +# having some other task schedule it later. +class _Never: + def __init__(self): + self.state = None + self.exc = StopIteration() + + def __iter__(self): + return self + + def __await__(self): + return self + + def __next__(self): + if self.state is not None: + self.state = None + return None + else: + self.exc.__traceback__ = None + raise self.exc + +_never = _Never() + + ################################################################################ # Queue and poller for stream IO diff --git a/asyncio/event.py b/asyncio/event.py index 04f6e15..442c5bb 100644 --- a/asyncio/event.py +++ b/asyncio/event.py @@ -62,7 +62,8 @@ async def wait(self): self.waiting.push_head(core.cur_task) # Set calling task's data to the event's queue so it can be removed if needed core.cur_task.data = self.waiting - await core.sleep(0) + core._never.state = False + await core._never return True diff --git a/asyncio/funcs.py b/asyncio/funcs.py index 2289d33..8718118 100644 --- a/asyncio/funcs.py +++ b/asyncio/funcs.py @@ -106,7 +106,7 @@ async def gather(*aws, return_exceptions=False): # # cancel all waiting tasks # raise er ts[i] = await ts[i] - except Exception as er: + except (core.CancelledError, Exception) as er: if return_exceptions: ts[i] = er else: diff --git a/asyncio/lock.py b/asyncio/lock.py index 3b93e6a..b5080a3 100644 --- a/asyncio/lock.py +++ b/asyncio/lock.py @@ -69,7 +69,8 @@ async def acquire(self): # Set calling task's data to the lock's queue so it can be removed if needed core.cur_task.data = self.waiting try: - await core.sleep(0) + core._never.state = False + await core._never except core.CancelledError as er: if self.state == core.cur_task: # Cancelled while pending on resume, schedule next waiting Task