Tags give the ability to mark specific points in history as being important
-
v0.2.3
7283d1ca · ·OctoGo v0.2.3 `ogo fmt` only. The compiler, checker, and backend are unchanged from v0.2.2. The formatter had eight token-spacing bugs, several of which rewrote already correct code into something gofmt would never emit -- running `ogo fmt` could make a file worse. All eight are fixed, each now gofmt-faithful and pinned by a regression test: - a struct or interface brace is spaced only for a multi-line body; an empty or one-line body binds tight ("struct{}", "struct{ v int }"); - "*" binds tight as a pointer in a type or parameter ("[]*int", "func() *int"), where it had been read as multiplication; - a unary operator at the start of a statement binds to its operand ("*p = x"), and there is always a space after an assignment operator ("x = *p"); - a call binds tight after an index or slice suffix ("h[0]()"); - "func" is spaced off a method receiver ("func (r T) m()") but tight for a type or literal ("func()"); - binary operators inside an index or slice subscript render tight ("xs[a+b*c]", "xs[a&b]"); - a dot-import spaces its "." on both sides (import . "p2"); - a slice colon is spaced when a bound is a binary expression ("xs[i+1 : j-1]"). Anyone who ran `ogo fmt` on correct code and saw it disturbed is affected. One cosmetic gap remains: a run of trailing comments on consecutive statements is not aligned to a common column the way struct fields are. The comments are correct, one space out; only the alignment is missing. -
v0.2.2
f4acd901 · ·OctoGo v0.2.2 A livelock in the channel rendezvous is fixed. Programs with a few channels and a few goroutines could hang on hardware at a rendezvous, with both sides live and neither progressing: the polling loops asked for the hub lock every turn, which re-takes it faster than the cog on the other side can win it. Anyone writing concurrent code on v0.2.1 or earlier is affected, so this is worth taking. Each poll now reads the volatile flag it is waiting on before asking for the lock, and asks only when there is plausibly something to do. The check inside the lock is still the authoritative one. Builds no longer pass --fcache=0. The flag had been there since the hang was first seen, on the belief that flexspin's FCACHE was miscompiling the rendezvous. It was not: FCACHE only made the loop fast enough to expose the livelock, and disabling it turned off loop caching for every program to hide a bug in three loops. Both halves of that are now undone, so compiled programs get loop caching back. What settles the diagnosis is that varying only the backoff moves the hang -- one cycle stops after two exchanges of four, eight after three, sixty-four completes -- which a stale read could not do. Thanks are owed to Wuerfel_21 on the Parallax forum for saying it was a bug in the logic exposed by faster timings. doc/rendezvous-livelock.c, which used to claim this was a compiler bug, now demonstrates the fix and reproduces the hang under -DLIVELOCK. Verified on a P2-EDGE: all 37 test programs built with the real backend, loaded onto the board and checked against their serial output, with FCACHE on. A new case covers sustained traffic -- three pipelines, seven cogs polling at once -- and hangs outright without the fix.
-
v0.2.1
f1d91e4e · ·OctoGo v0.2.1 Documentation only; the compiler is unchanged from v0.2.0. The specification's header and TODO list were checked against the implementation rather than against memory, which found the list claiming work that was done and work that had in fact been decided against. Package-level channels work, and both the specification and the README said they did not. The initialization pass they were waiting for exists; two package-level channels rendezvous with two goroutines on real hardware. Maps and floating point are no longer listed as pending. The specification's own body omits both deliberately and the README lists them as not planned, so a TODO entry for each read as work owed rather than as a decision taken. Gaps confirmed by trying them are now written down: the indexed form of an array literal, an array as a function result, slicing a multi-dimensional array, and importing your own packages.
-
v0.2.0
e07a57d6 · ·OctoGo v0.2.0 Composite literals grew up. A struct's fields may now be given by name -- "P{y: 2}", any subset in any order, the rest zeroed -- and arrays and slices have literals of their own: "[4]int{10, 20}", "[]int{1, 2, 3}". Both are a variable's initializer and nothing else, since C cannot assign an array and a slice literal's backing storage belongs beside the declaration it initializes. Several miscompiles were found and fixed underneath them. A struct holding an array was emitted in forms the target's C compiler cannot lower: it is initialized as an aggregate now and copied with memcpy, and the two cases no lowering can reach -- passing or returning one by value -- are refused where the signature is written rather than left to fail as backend noise. A field of a package-scope struct had no type at all, which printed strings as integers and refused len() on a slice field. Those were found because the emitted test programs are now compiled with the real backend on every run, not only when a board happens to be attached. The host C compiler and the target's disagree about what they accept, and that gap was invisible until it was tested. The C backend moves to flexprop v7.7.0. It fixes nothing this compiler works around: every one of those bugs was re-measured against it on real hardware and reproduces identically, so the workarounds stay. ogo fmt no longer mangles what it formats -- composite literals came out as "P { Q { 1 } }" and increments as "i ++". Still preview quality, and the README's status section is still the honest inventory. Everything in it is verified on real hardware: all 36 test programs are built with the real backend, loaded onto a P2, and checked against their serial output. linux/amd64 only for now. -
v0.1.0
672403d7 · ·OctoGo v0.1.0 -- first public preview A Go-like language for the Parallax Propeller 2, compiled to C and on to a P2 binary by an embedded copy of the flexspin backend. Goroutines are Cogs and channels are Hub cells guarded by hardware locks: no scheduler, no allocator, no garbage collector. Preview quality. The language is a subset and the checker is partial; the README's status section is the honest inventory of what works and what does not. linux/amd64 only for now. Everything in that inventory is verified on real hardware -- each test program is built with the real backend, loaded onto a P2, and checked against its serial output.