Skip to content

Commit ad009e0

Browse files
authored
Merge pull request #122 from WebAssembly/merge-upstream2
2 parents 9ad83c3 + 244c841 commit ad009e0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2077
-754
lines changed

.travis.yml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,21 @@ dist: bionic
66
addons:
77
apt:
88
sources:
9+
- sourceline: 'ppa:avsm/ppa'
910
- sourceline: 'deb https://dl.yarnpkg.com/debian/ stable main'
1011
key_url: 'https://dl.yarnpkg.com/debian/pubkey.gpg'
12+
update: true
1113
packages:
12-
- ocaml
13-
- ocamlbuild
14+
- opam
1415
- texlive-full
1516
- yarn
1617

1718
install:
19+
- opam init --auto-setup --compiler=4.07.1
20+
- eval $(opam env)
21+
- opam --version
22+
- ocaml --version
23+
- opam install --yes ocamlbuild.0.14.0
1824
- pip install Sphinx==2.4.4
1925
- git clone https://github.com/tabatkins/bikeshed.git
2026
- pip install --editable $PWD/bikeshed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,7 @@ should take place in
3434
[the WebAssembly design repository](https://github.com/WebAssembly/design)
3535
first, so that this spec repository can remain focused. And please follow the
3636
[guidelines for contributing](Contributing.md).
37+
38+
# citing
39+
40+
For citing WebAssembly in LaTeX, use [this bibtex file](wasm-specs.bib).

document/README.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,98 @@ To build everything and update [webassembly.github.io/spec](https://webassembly.
2121
make publish
2222
```
2323
Please make sure to only use that once a change has approval.
24+
25+
## Step by step guide to building the spec
26+
27+
### Prerequisites
28+
29+
You will need `python3.7`, and `pip`. `pip` should come with Python, if not follow [these installation instructions for `pip`](https://pip.pypa.io/en/stable/installing/), or check your system package manager for `pip3`.
30+
31+
> Important: you will need the version of pip that works with `python3.7`.
32+
33+
34+
Use something like [`pipenv`](https://pipenv.pypa.io/) to keep your system installation of Python clean.
35+
36+
```
37+
pip install pipenv
38+
pipenv --python 3.7
39+
pipenv shell
40+
```
41+
42+
Install Python dependencies:
43+
44+
```
45+
pip install Sphinx==2.4.4
46+
```
47+
48+
### Checking out the repository
49+
50+
Make sure this repository was cloned with `--recursive`:
51+
52+
```
53+
git clone --recursive https://github.com/WebAssembly/spec
54+
```
55+
56+
If you have already cloned but without `--recursive`, you can delete and re-clone, or `cd` into `spec` and run:
57+
58+
```
59+
git submodule update --init --recursive
60+
```
61+
62+
The rest of these instructions assume you are in the directory where is README is:
63+
64+
```
65+
cd spec/document
66+
```
67+
68+
### Building the multi-page HTML document
69+
70+
You can now build the [multi-page html document](https://webassembly.github.io/spec/core/):
71+
72+
```
73+
make -C core html
74+
```
75+
76+
### Building the single-page HTML document
77+
78+
To build the [single-page W3C version](https://webassembly.github.io/spec/core/bikeshed/), there are more dependencies to install. First, get [Bikeshed](https://github.com/tabatkins/bikeshed):
79+
80+
```
81+
# cd back to root of git directory
82+
git clone https://github.com/tabatkins/bikeshed.git
83+
pip install --editable bikeshed
84+
bikeshed update
85+
```
86+
87+
You will also need `npm` and `yarn` for all the LaTeX goodness. `npm` might already be available on your system, you can also use something like [`nvm`](https://github.com/nvm-sh/nvm) to prevent messing with system packages:
88+
89+
```
90+
npm install -g yarn
91+
cd document/core
92+
make -C core bikeshed
93+
```
94+
95+
### Building the PDF
96+
97+
To build the [PDF](https://webassembly.github.io/spec/core/_download/WebAssembly.pdf), you will need `texlive-full`, install it using your system package manager:
98+
99+
```
100+
apt install texlive-full
101+
make -C core pdf
102+
```
103+
104+
### Building the JavaScript Embedding API
105+
106+
To build the [JavaScript Embedding API](https://webassembly.github.io/spec/js-api/index.html), you will need `bikeshed` as describe in the section [Building the single-page HTML document](#building-the-single-page-html-document):
107+
108+
```
109+
make -C js-api
110+
```
111+
112+
### Building the Web Embedding API
113+
114+
To build the [Web Embedding API](https://webassembly.github.io/spec/web-api/index.html), you will need `bikeshed` as describe in the section [Building the single-page HTML document](#building-the-single-page-html-document):
115+
116+
```
117+
make -C web-api
118+
```

document/core/Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,12 @@ bikeshed-keep:
8989
echo Downloaded Bikeshed.
9090

9191

92+
.PHONY: index
93+
index:
94+
(cd appendix; ./gen-index-instructions.py)
95+
9296
.PHONY: pdf
93-
pdf: latexpdf
97+
pdf: index latexpdf
9498
mkdir -p $(BUILDDIR)/html/$(DOWNLOADDIR)
9599
ln -f $(BUILDDIR)/latex/$(NAME).pdf $(BUILDDIR)/html/$(DOWNLOADDIR)/$(NAME).pdf
96100

@@ -101,7 +105,7 @@ clean:
101105
rm -rf $(STATICDIR)
102106

103107
.PHONY: html
104-
html:
108+
html: index
105109
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
106110
for file in `ls $(BUILDDIR)/html/*.html`; \
107111
do \

document/core/appendix/gen-index-instructions.py

Lines changed: 356 additions & 0 deletions
Large diffs are not rendered by default.

document/core/appendix/index-instructions.rst

Lines changed: 276 additions & 266 deletions
Large diffs are not rendered by default.

document/core/binary/instructions.rst

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,12 @@ Table Instructions
168168
\production{instruction} & \Binstr &::=& \dots \\ &&|&
169169
\hex{25}~~x{:}\Btableidx &\Rightarrow& \TABLEGET~x \\ &&|&
170170
\hex{26}~~x{:}\Btableidx &\Rightarrow& \TABLESET~x \\ &&|&
171-
\hex{FC}~\hex{0F}~~x{:}\Btableidx &\Rightarrow& \TABLEGROW~x \\ &&|&
172-
\hex{FC}~\hex{10}~~x{:}\Btableidx &\Rightarrow& \TABLESIZE~x \\ &&|&
173-
\hex{FC}~\hex{11}~~x{:}\Btableidx &\Rightarrow& \TABLEFILL~x \\
174-
\hex{FC}~\hex{0C}~~y{:}\Belemidx~~x{:}\Btableidx &\Rightarrow& \TABLEINIT~x~y \\ &&|&
175-
\hex{FC}~\hex{0D}~~x{:}\Belemidx &\Rightarrow& \ELEMDROP~x \\ &&|&
176-
\hex{FC}~\hex{0E}~~x{:}\Btableidx~~y{:}\Btableidx &\Rightarrow& \TABLECOPY~x~y \\
171+
\hex{FC}~~12{:}\Bu32~~y{:}\Belemidx~~x{:}\Btableidx &\Rightarrow& \TABLEINIT~x~y \\ &&|&
172+
\hex{FC}~~13{:}\Bu32~~x{:}\Belemidx &\Rightarrow& \ELEMDROP~x \\ &&|&
173+
\hex{FC}~~14{:}\Bu32~~x{:}\Btableidx~~y{:}\Btableidx &\Rightarrow& \TABLECOPY~x~y \\
174+
\hex{FC}~~15{:}\Bu32~~x{:}\Btableidx &\Rightarrow& \TABLEGROW~x \\ &&|&
175+
\hex{FC}~~16{:}\Bu32~~x{:}\Btableidx &\Rightarrow& \TABLESIZE~x \\ &&|&
176+
\hex{FC}~~17{:}\Bu32~~x{:}\Btableidx &\Rightarrow& \TABLEFILL~x \\
177177
\end{array}
178178
179179
@@ -228,10 +228,10 @@ Each variant of :ref:`memory instruction <syntax-instr-memory>` is encoded with
228228
\hex{3E}~~m{:}\Bmemarg &\Rightarrow& \I64.\STORE\K{32}~m \\ &&|&
229229
\hex{3F}~~\hex{00} &\Rightarrow& \MEMORYSIZE \\ &&|&
230230
\hex{40}~~\hex{00} &\Rightarrow& \MEMORYGROW \\ &&|&
231-
\hex{FC}~\hex{08}~~x{:}\Bdataidx~~\hex{00} &\Rightarrow& \MEMORYINIT~x \\ &&|&
232-
\hex{FC}~\hex{09}~~x{:}\Bdataidx &\Rightarrow& \DATADROP~x \\ &&|&
233-
\hex{FC}~\hex{0A}~~\hex{00}~~\hex{00} &\Rightarrow& \MEMORYCOPY \\ &&|&
234-
\hex{FC}~\hex{0B}~~\hex{00} &\Rightarrow& \MEMORYFILL \\
231+
\hex{FC}~~8{:}\Bu32~~x{:}\Bdataidx~\hex{00} &\Rightarrow& \MEMORYINIT~x \\ &&|&
232+
\hex{FC}~~9{:}\Bu32~~x{:}\Bdataidx &\Rightarrow& \DATADROP~x \\ &&|&
233+
\hex{FC}~~10{:}\Bu32~~\hex{00}~~\hex{00} &\Rightarrow& \MEMORYCOPY \\ &&|&
234+
\hex{FC}~~11{:}\Bu32~~\hex{00} &\Rightarrow& \MEMORYFILL \\
235235
\end{array}
236236
237237
.. note::
@@ -438,24 +438,6 @@ All other numeric instructions are plain opcodes without any immediates.
438438
\hex{BF} &\Rightarrow& \F64.\REINTERPRET\K{\_}\I64 \\
439439
\end{array}
440440
441-
.. _binary-cvtop-trunc-sat:
442-
443-
The saturating truncation instructions all have a one byte prefix.
444-
445-
.. math::
446-
\begin{array}{llclll}
447-
\production{instruction} & \Binstr &::=& \dots && \phantom{thisshouldbeenough} \\&&|&
448-
\hex{FC}~\hex{00} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
449-
\hex{FC}~\hex{01} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
450-
\hex{FC}~\hex{02} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
451-
\hex{FC}~\hex{03} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_u} \\ &&|&
452-
\hex{FC}~\hex{04} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
453-
\hex{FC}~\hex{05} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
454-
\hex{FC}~\hex{06} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
455-
\hex{FC}~\hex{07} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_u} \\
456-
\end{array}
457-
458-
459441
.. math::
460442
\begin{array}{llclll}
461443
\phantom{\production{instruction}} & \phantom{\Binstr} &\phantom{::=}& \phantom{\dots} && \phantom{thisshouldbeenough} \\[-2ex] &&|&
@@ -466,6 +448,24 @@ The saturating truncation instructions all have a one byte prefix.
466448
\hex{C4} &\Rightarrow& \I64.\EXTEND\K{32\_s} \\
467449
\end{array}
468450
451+
.. _binary-cvtop-trunc-sat:
452+
453+
The saturating truncation instructions all have a one byte prefix,
454+
whereas the actual opcode is encoded by a variable-length :ref:`unsigned integer <binary-uint>`.
455+
456+
.. math::
457+
\begin{array}{llclll}
458+
\production{instruction} & \Binstr &::=& \dots && \phantom{thisshouldbeenough} \\&&|&
459+
\hex{FC}~~0{:}\Bu32 &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
460+
\hex{FC}~~1{:}\Bu32 &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
461+
\hex{FC}~~2{:}\Bu32 &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
462+
\hex{FC}~~3{:}\Bu32 &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_u} \\ &&|&
463+
\hex{FC}~~4{:}\Bu32 &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
464+
\hex{FC}~~5{:}\Bu32 &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
465+
\hex{FC}~~6{:}\Bu32 &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
466+
\hex{FC}~~7{:}\Bu32 &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_u} \\
467+
\end{array}
468+
469469
470470
.. index:: expression
471471
pair: binary format; expression

document/core/exec/numerics.rst

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,12 +1058,14 @@ This non-deterministic result is expressed by the following auxiliary function p
10581058

10591059
* If :math:`z` is a NaN, then return an element of :math:`\nans_N\{z\}`.
10601060

1061-
* Else if :math:`z` has a negative sign, then return an element of :math:`\nans_N\{\}`.
1061+
* Else if :math:`z` is negative infinity, then return an element of :math:`\nans_N\{\}`.
10621062

10631063
* Else if :math:`z` is positive infinity, then return positive infinity.
10641064

10651065
* Else if :math:`z` is a zero, then return that zero.
10661066

1067+
* Else if :math:`z` has a negative sign, then return an element of :math:`\nans_N\{\}`.
1068+
10671069
* Else return the square root of :math:`z`.
10681070

10691071
.. math::
@@ -1601,7 +1603,7 @@ Conversions
16011603

16021604
.. math::
16031605
\begin{array}{lll@{\qquad}l}
1604-
\convertu_{M,N}(i) &=& \ieee_N(\signed_M(i)) \\
1606+
\converts_{M,N}(i) &=& \ieee_N(\signed_M(i)) \\
16051607
\end{array}
16061608
16071609

document/core/exec/runtime.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,8 @@ and a reference to the function's own :ref:`module instance <syntax-moduleinst>`
494494
The values of the locals are mutated by respective :ref:`variable instructions <syntax-instr-variable>`.
495495

496496

497+
.. _exec-expand:
498+
497499
Conventions
498500
...........
499501

document/core/index.bs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ TR: https://www.w3.org/TR/wasm-core-1/
88
ED: https://webassembly.github.io/spec/core/bikeshed/
99
Editor: Andreas Rossberg (Dfinity Stiftung)
1010
Repository: WebAssembly/spec
11-
Markup Shorthands: css no, markdown yes, algorithm no, idl no
11+
Markup Shorthands: css no, markdown no, algorithm no, idl no
1212
Abstract: This document describes version 1.0 of the core WebAssembly standard, a safe, portable, low-level code format designed for efficient execution and compact representation.
1313
Prepare For TR: true
1414
</pre>

document/core/syntax/instructions.rst

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,6 @@ The following sections group instructions into a number of different categories.
2222
pair: abstract syntax; instruction
2323
.. _syntax-sx:
2424
.. _syntax-const:
25-
.. _syntax-unop:
26-
.. _syntax-binop:
27-
.. _syntax-testop:
28-
.. _syntax-relop:
29-
.. _syntax-cvtop:
3025
.. _syntax-iunop:
3126
.. _syntax-ibinop:
3227
.. _syntax-itestop:
@@ -144,6 +139,12 @@ where a signedness annotation |sx| distinguishes whether the operands are to be
144139
For the other integer instructions, the use of two's complement for the signed interpretation means that they behave the same regardless of signedness.
145140

146141

142+
.. _syntax-unop:
143+
.. _syntax-binop:
144+
.. _syntax-testop:
145+
.. _syntax-relop:
146+
.. _syntax-cvtop:
147+
147148
Conventions
148149
...........
149150

document/core/text/instructions.rst

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -492,20 +492,20 @@ Numeric Instructions
492492
\text{i32.trunc\_f32\_u} &\Rightarrow& \I32.\TRUNC\K{\_}\F32\K{\_u} \\ &&|&
493493
\text{i32.trunc\_f64\_s} &\Rightarrow& \I32.\TRUNC\K{\_}\F64\K{\_s} \\ &&|&
494494
\text{i32.trunc\_f64\_u} &\Rightarrow& \I32.\TRUNC\K{\_}\F64\K{\_u} \\ &&|&
495-
\text{i32.trunc\_sat_f32\_s} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
496-
\text{i32.trunc\_sat_f32\_u} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
497-
\text{i32.trunc\_sat_f64\_s} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
498-
\text{i32.trunc\_sat_f64\_u} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_u} \\ &&|&
495+
\text{i32.trunc\_sat\_f32\_s} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
496+
\text{i32.trunc\_sat\_f32\_u} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
497+
\text{i32.trunc\_sat\_f64\_s} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
498+
\text{i32.trunc\_sat\_f64\_u} &\Rightarrow& \I32.\TRUNC\K{\_sat\_}\F64\K{\_u} \\ &&|&
499499
\text{i64.extend\_i32\_s} &\Rightarrow& \I64.\EXTEND\K{\_}\I32\K{\_s} \\ &&|&
500500
\text{i64.extend\_i32\_u} &\Rightarrow& \I64.\EXTEND\K{\_}\I32\K{\_u} \\ &&|&
501501
\text{i64.trunc\_f32\_s} &\Rightarrow& \I64.\TRUNC\K{\_}\F32\K{\_s} \\ &&|&
502502
\text{i64.trunc\_f32\_u} &\Rightarrow& \I64.\TRUNC\K{\_}\F32\K{\_u} \\ &&|&
503503
\text{i64.trunc\_f64\_s} &\Rightarrow& \I64.\TRUNC\K{\_}\F64\K{\_s} \\ &&|&
504504
\text{i64.trunc\_f64\_u} &\Rightarrow& \I64.\TRUNC\K{\_}\F64\K{\_u} \\ &&|&
505-
\text{i64.trunc\_sat_f32\_s} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
506-
\text{i64.trunc\_sat_f32\_u} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
507-
\text{i64.trunc\_sat_f64\_s} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
508-
\text{i64.trunc\_sat_f64\_u} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_u} \\ &&|&
505+
\text{i64.trunc\_sat\_f32\_s} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_s} \\ &&|&
506+
\text{i64.trunc\_sat\_f32\_u} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F32\K{\_u} \\ &&|&
507+
\text{i64.trunc\_sat\_f64\_s} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_s} \\ &&|&
508+
\text{i64.trunc\_sat\_f64\_u} &\Rightarrow& \I64.\TRUNC\K{\_sat\_}\F64\K{\_u} \\ &&|&
509509
\text{f32.convert\_i32\_s} &\Rightarrow& \F32.\CONVERT\K{\_}\I32\K{\_s} \\ &&|&
510510
\text{f32.convert\_i32\_u} &\Rightarrow& \F32.\CONVERT\K{\_}\I32\K{\_u} \\ &&|&
511511
\text{f32.convert\_i64\_s} &\Rightarrow& \F32.\CONVERT\K{\_}\I64\K{\_s} \\ &&|&

document/core/util/macros.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,7 @@
954954

955955
.. Stack, meta functions
956956

957-
.. |expand| mathdef:: \xref{exec/runtime}{syntax-frame}{\F{expand}}
957+
.. |expand| mathdef:: \xref{exec/runtime}{exec-expand}{\F{expand}}
958958

959959

960960
.. Administrative Instructions, terminals

document/core/util/mathjax2katex.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ def ReplaceMath(cache, data):
112112
if p.returncode != 0:
113113
sys.stderr.write('BEFORE:\n' + old + '\n')
114114
sys.stderr.write('AFTER:\n' + data + '\n')
115-
return ''
115+
raise Exception()
116116
ret = ret.strip()
117117
ret = ret[ret.find('<span class="katex-html"'):]
118118
ret = '<span class="katex-display"><span class="katex">' + ret
@@ -225,22 +225,24 @@ def ExtractMath(match):
225225
sys.stderr.write('Processing %d fragments.\n' % len(fixups))
226226

227227
done_fixups = []
228+
success = True
228229

229230
def Worker():
231+
nonlocal success
230232
while True:
231233
cls_before, cls_after, spans, mth, start, end = q.get()
232234
try:
233235
fixed = ('class="' + cls_before + ' ' + cls_after + '">' +
234236
spans + ReplaceMath(cache, mth) + '<')
235237
done_fixups.append((start, end, fixed))
236238
except Exception:
237-
sys.stderr.write('!!! Error processing fragment')
239+
success = False
238240

239241
q.task_done()
240242
sys.stderr.write('.')
241243

242244
q = queue.Queue()
243-
for i in range(40):
245+
for i in range(len(os.sched_getaffinity(0))):
244246
t = threading.Thread(target=Worker)
245247
t.daemon = True
246248
t.start()
@@ -249,6 +251,11 @@ def Worker():
249251
q.put(item)
250252
q.join()
251253

254+
if not success:
255+
sys.stderr.write('\n!!! Error processing fragments\n')
256+
cache.close()
257+
sys.exit(1)
258+
252259
result = []
253260
last = 0
254261
for start, end, value in sorted(done_fixups):

0 commit comments

Comments
 (0)