ocean
6 months agoOceani - Cataract Creek version master
NeilBrown [Tue, 28 Dec 2021 00:44:56 +0000 (11:44 +1100)]
Oceani - Cataract Creek version

Clean up text, rearrange code a little and provide new name.
Change for this version include:
 - functions
 - references
 - better test coverage
 - .name for labels
 - "and then" and "if else" gone
 - "?" and "??"
 - better handling of indents in parser
 - "program" no longer exists

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: remove to_int to_float to_mpq
NeilBrown [Mon, 27 Dec 2021 23:10:04 +0000 (10:10 +1100)]
oceani: remove to_int to_float to_mpq

These aren't used.  Remove them.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: move comment printing from print_exec() to where later
NeilBrown [Mon, 27 Dec 2021 21:13:35 +0000 (08:13 +1100)]
oceani: move comment printing from print_exec() to where later

The code for printing comments about variable usage that come after some
execs is now presented with other code for managing those variables.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: introduce List an ExpressionList as early as possible.
NeilBrown [Mon, 27 Dec 2021 20:57:08 +0000 (07:57 +1100)]
oceani: introduce List an ExpressionList as early as possible.

ExpressionList is currently used before it is introduced - bad.

List is infrastructure rather than a particular entity, so introduce it
with the other infrastructure, and then introduce ExpressionList where
Expression and Term are first mentioned.

Also move the printing of a List - which is only used for the "print"
statement - into the code for "print".

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: don't let error in one statement hides errors in next.
NeilBrown [Wed, 22 Dec 2021 06:12:20 +0000 (17:12 +1100)]
oceani: don't let error in one statement hides errors in next.

The error state from one statement is still visible in the next, which
can upset the reporting of errors.
So provide a clean error state for each new statement.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: remove "and then" and "or else"
NeilBrown [Mon, 20 Dec 2021 20:34:06 +0000 (07:34 +1100)]
oceani: remove "and then" and "or else"

I can't think of any reason that "and" and "or" shouldn't be
short-circuit operators, so change them to do what "and then" and "or
else" currently do, and discard the latter.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani-tests: Add testing for --bracket printing.
NeilBrown [Sun, 19 Dec 2021 00:52:25 +0000 (11:52 +1100)]
oceani-tests: Add testing for --bracket printing.

Make sure that printing with --bracket is still parseable, and
double-printing doesn't change from single.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: discard AssignRef and DeclareRef
NeilBrown [Sat, 18 Dec 2021 21:43:35 +0000 (08:43 +1100)]
oceani: discard AssignRef and DeclareRef

Use the new take_addr() instead of using AssignRef

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: last fixes for UNTESTED for now.
NeilBrown [Sat, 18 Dec 2021 11:00:48 +0000 (22:00 +1100)]
oceani: last fixes for UNTESTED for now.

I still don't get 100% due to some case labels which gcov think are not
tested, but I don't understand why.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: exercise more parsing options for blocks.
NeilBrown [Sat, 18 Dec 2021 10:46:14 +0000 (21:46 +1100)]
oceani: exercise more parsing options for blocks.

This tests some untested code.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: test UNTESTED parsing of structures
NeilBrown [Sat, 18 Dec 2021 10:36:41 +0000 (21:36 +1100)]
oceani: test UNTESTED parsing of structures

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: mark some more UNTESTED code
NeilBrown [Sat, 18 Dec 2021 10:24:32 +0000 (21:24 +1100)]
oceani: mark some more UNTESTED code

When I first wrote this script I had some issues that cause false
positives and I filtered too many of them.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: remove all UNTESTED again.
NeilBrown [Sat, 18 Dec 2021 10:22:56 +0000 (21:22 +1100)]
oceani: remove all UNTESTED again.

Maybe there are still more to find - we don't have 100% yet..

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: handle some more untested code.
NeilBrown [Sat, 18 Dec 2021 10:07:54 +0000 (21:07 +1100)]
oceani: handle some more untested code.

The mark-untested filter was removing some annotations that are valid...

I'm not sure of this 'switch' syntax ... need to think about that one day.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: remove the last of the UNTESTED - for now.
NeilBrown [Sat, 18 Dec 2021 09:46:27 +0000 (20:46 +1100)]
oceani: remove the last of the UNTESTED - for now.

I think there are more lines that aren't being tested though...

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: fix parsing of error in struct field.
NeilBrown [Sat, 18 Dec 2021 09:29:30 +0000 (20:29 +1100)]
oceani: fix parsing of error in struct field.

If there is an error - we violated our segments.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: more test coverage
NeilBrown [Sat, 18 Dec 2021 09:26:13 +0000 (20:26 +1100)]
oceani: more test coverage

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: more test coverage.
NeilBrown [Sat, 18 Dec 2021 07:28:10 +0000 (18:28 +1100)]
oceani: more test coverage.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: improve test coverage
NeilBrown [Sat, 18 Dec 2021 07:10:34 +0000 (18:10 +1100)]
oceani: improve test coverage

Various little changes to reduce number of lines that aren't tested.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: use new slice syntax for argv argument.
NeilBrown [Sat, 18 Dec 2021 03:34:16 +0000 (14:34 +1100)]
oceani: use new slice syntax for argv argument.

Rather than "argv:[argc::]string", the argv parameter is now
  "argv:[]string"
This will be the syntax for general array references.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: add a 'length' operator
NeilBrown [Sat, 18 Dec 2021 03:07:39 +0000 (14:07 +1100)]
oceani: add a 'length' operator

array[] will now return the length of the array.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: add transparent AddressOf operator for function parameters.
NeilBrown [Sat, 18 Dec 2021 02:47:45 +0000 (13:47 +1100)]
oceani: add transparent AddressOf operator for function parameters.

If a function parameters is a declared as an reference, and the passed
argument is not, then we insert the new AddressOf operator so that
the correct value is passed.
This allow "var" parameters much like Pascal - though with completely
different syntax.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: assignment to a pointer can take an address.
NeilBrown [Fri, 17 Dec 2021 05:04:01 +0000 (16:04 +1100)]
oceani: assignment to a pointer can take an address.

If the non-pointer is assigned to a pointer, and the non-pointer is
provided as an lval, the address is now assigned - rather than causing
an error.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: add type entry for new structs early.
NeilBrown [Fri, 17 Dec 2021 05:01:11 +0000 (16:01 +1100)]
oceani: add type entry for new structs early.

When a 'struct foo' declaration is found, add the type when 'foo' is
seen rather than when the whole declaration is seen.
This keeps the order of types stable

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: move the 'info:' report for assignments.
NeilBrown [Fri, 17 Dec 2021 04:55:43 +0000 (15:55 +1100)]
oceani: move the 'info:' report for assignments.

When we provide info about where the type of the assigned variable was
set, make sure that happens *after* any error was reported.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: propagate_type should return the found type, not what it was compatible with
NeilBrown [Fri, 17 Dec 2021 04:20:54 +0000 (15:20 +1100)]
oceani: propagate_type should return the found type, not what it was compatible with

If the type we have is different from the type expected, but they are
compatible, propagate_type() should return the type that we have.
Otherwise we lose information - which may later be useful.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: pass 'rules' into the 'compat' type function.
NeilBrown [Fri, 17 Dec 2021 04:09:11 +0000 (15:09 +1100)]
oceani: pass 'rules' into the 'compat' type function.

A future 'compat' will want to know about rules.
Also identify as 'enum val_rules', not 'int'.
And remove some trailing spaces.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: add tracking of rval vs lval
NeilBrown [Wed, 15 Dec 2021 10:02:48 +0000 (21:02 +1100)]
oceani: add tracking of rval vs lval

We need to know when a value is an rval or an lval.
So add an 'Erval' flag.  If not an rval, it must be an lval.

Also fix tracking of whether the lval is for a constant.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: rename Enoconst to Eruntime
NeilBrown [Wed, 15 Dec 2021 09:20:26 +0000 (20:20 +1100)]
oceani: rename Enoconst to Eruntime

I think Eruntime is clearer - it can only be evaluated at runtime.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: discard Rnolabel
NeilBrown [Tue, 14 Dec 2021 10:24:14 +0000 (21:24 +1100)]
oceani: discard Rnolabel

With the new approach to labels, this flag does make any sense.
Labels are more clearly typed now.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: change labels to look like enum values, not variables.
NeilBrown [Mon, 13 Dec 2021 22:34:25 +0000 (09:34 +1100)]
oceani: change labels to look like enum values, not variables.

A label now looks like ".foo".  This makes it a completely separate
namespace from variables.

When we introduce enums, the values will also look like ".foo" an we
know which enum is intended based on context.
Each switch/while will potentially create a local enum type for the
labels.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: allow field references on references.
NeilBrown [Sat, 11 Dec 2021 23:42:48 +0000 (10:42 +1100)]
oceani: allow field references on references.

If a ref (pointer) is asked for a field, pass the request on to the
thing that is pointed to.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: factor out field reference into per-type handler
NeilBrown [Sat, 11 Dec 2021 23:33:39 +0000 (10:33 +1100)]
oceani: factor out field reference into per-type handler

knowledge about how field references for strutures is now in
structure-specific code.  This will allow other types to
behave differently.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: replace some magic numbers with an enum.
NeilBrown [Sat, 11 Dec 2021 22:43:41 +0000 (09:43 +1100)]
oceani: replace some magic numbers with an enum.

I'm growing to dislike magic numbers

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: add reference type
NeilBrown [Mon, 6 Dec 2021 05:54:07 +0000 (16:54 +1100)]
oceani: add reference type

 @foo  is a type which is a reference to type 'foo'.
 If var is an @foo, then var@ is the foo.
 @new() returns an appropriate new object
 @free= thing will free thing
 @nil is an invalid reference of any type.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: don't add extra indent for Declare and Assign
NeilBrown [Mon, 6 Dec 2021 06:37:09 +0000 (17:37 +1100)]
oceani: don't add extra indent for Declare and Assign

when printing a declaration or assignment we indent the whole statement,
but NOT the individual parts.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: improve content in some error messages.
NeilBrown [Mon, 6 Dec 2021 06:29:32 +0000 (17:29 +1100)]
oceani: improve content in some error messages.

In particular:
  use new_pos() instead of new() where appropriate
  set where_set where necessary
  set type name properly in anon types

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: introduce 'test' and 'choose' operators
NeilBrown [Sun, 5 Dec 2021 21:04:31 +0000 (08:04 +1100)]
oceani: introduce 'test' and 'choose' operators

If a type supports testing (only Boolean currently),
   ? expr
converts to Boolean, and
   expra ?? exprb

will return expra if it tests as true, and exprb otherwise.
exprb isn't computed if not needed.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: remove the HACK concerning type names starting with space
NeilBrown [Sun, 5 Dec 2021 00:09:57 +0000 (11:09 +1100)]
oceani: remove the HACK concerning type names starting with space

structures returned inline from a function call can be copied.
Other structures - in general - cannot.

This patch introduces a (slightly) better way to tell the difference
than the 'space' hack that was previously used.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: allow types to be used before declaration
NeilBrown [Sat, 4 Dec 2021 23:34:58 +0000 (10:34 +1100)]
oceani: allow types to be used before declaration

As we prepare all types after parsing, we can now use a type before it
is declared.
We need to be careful of mutually recursive structures, and
we need to retry prepare_type if it fails because a needed
member hasn't been prepared yet.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: allow global constants to be used before declared.
NeilBrown [Sat, 4 Dec 2021 22:37:00 +0000 (09:37 +1100)]
oceani: allow global constants to be used before declared.

When an undeclared name is used, it gets allocated a Tnone variable.
If one of these is found in a 'use' statement, it is assumed to be
a label (that will change later).
If it gets declared as a constant, its type gets set appropriately.

When evaluating global constants, if a value cannot be determined, we
continue with other constants, then, retry.  If the failure was because
some constant was not yet declared, this will eventually resolved.
If resolution is not possible, an error is produced.

Currently, non-global variables and functions cannot resolve.
This is tracking in the new Enoconst prop_err flag.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agoocean: propagate_types: only set Efail on local err.
NeilBrown [Sat, 4 Dec 2021 22:29:23 +0000 (09:29 +1100)]
ocean: propagate_types: only set Efail on local err.

propagate_types() currently sets Efail if there has been any parse error
at all.  This is wrong.
Instead, keep a count of errors, and only set Efail if that count has increased.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: change the 'ok' flag to 'perr' with well defined bits.
NeilBrown [Sat, 4 Dec 2021 22:13:51 +0000 (09:13 +1100)]
oceani: change the 'ok' flag to 'perr' with well defined bits.

I'll want to extend the information gathered by propagate_types() to
report if a value can be computed immediately.  So generalize
'ok' (which contains a magic value) to a set of flags that can be
reported.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: use more precision when printing numbers
NeilBrown [Fri, 3 Dec 2021 07:58:43 +0000 (18:58 +1100)]
oceani: use more precision when printing numbers

I really want constants to be reproduced accurately when printing a
program.
Maybe I should detect and store the precision used, but for now, just
use a larger precision.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani - delay processing of global constants
NeilBrown [Thu, 2 Dec 2021 02:43:27 +0000 (13:43 +1100)]
oceani - delay processing of global constants

Rather than setting up the value of a constant as it is parsed, collect
the declarations and process them all at the end.

This is a step towards allowing constants to refer to constants that are
declared later.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: move prepare_type handling to after the parse.
NeilBrown [Tue, 30 Nov 2021 23:09:34 +0000 (10:09 +1100)]
oceani: move prepare_type handling to after the parse.

This will allow global constants to be used before they are declared.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: move struct field processing into ->prepare_type
NeilBrown [Tue, 30 Nov 2021 23:05:27 +0000 (10:05 +1100)]
oceani: move struct field processing into ->prepare_type

This will allow the preparation of the type to be moved later, possibly
after necessary constants and other types have been declared.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: move all array size calculation to prepare_type
NeilBrown [Tue, 30 Nov 2021 22:52:47 +0000 (09:52 +1100)]
oceani: move all array size calculation to prepare_type

This makes the code more uniform - array size and alignment is
only set in one place.

Signed-off-by: NeilBrown <neil@brown.name>
6 months agooceani: indent grammar more consistently.
NeilBrown [Mon, 29 Nov 2021 08:39:06 +0000 (19:39 +1100)]
oceani: indent grammar more consistently.

- all products are not indented, whether they start with a non-term or a
  '|'.
- Code is indented once - plus internal indents.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: make anon types more formal
NeilBrown [Tue, 23 Nov 2021 22:31:49 +0000 (09:31 +1100)]
oceani: make anon types more formal

As we need anon types - make it explicit and allow a name to be constructed.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: rearrange everything and introduce "Term"
NeilBrown [Tue, 23 Nov 2021 09:52:32 +0000 (20:52 +1100)]
oceani: rearrange everything and introduce "Term"

All non-operator expressions (e.g.  array access, struct access) are now
'Term's.
Also, lots of rearrangement to try to get better ordering.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: change SimpleStatement to be $*exec, not $*binode
NeilBrown [Sat, 20 Nov 2021 05:37:04 +0000 (16:37 +1100)]
oceani: change SimpleStatement to be $*exec, not $*binode

All current SimpleStatements are binode, but future ones may not be.
So change to $*exec.
Declare a binode '*b' in 'reduce' header so the variable is
always available.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: remove "expr precedence" section
NeilBrown [Sat, 20 Nov 2021 03:25:06 +0000 (14:25 +1100)]
oceani: remove "expr precedence" section

Use "declare terminals" for declaring all terminals, whether for
precedence or otherwise.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: support functions returning multiple values.
NeilBrown [Sat, 20 Nov 2021 00:54:49 +0000 (11:54 +1100)]
oceani: support functions returning multiple values.

A function can now return a list of parameters.
These can be assigned to a variable which acts as a struct
containing all those parameters.

There is some HACKy code in here that will need to be sorted later.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: record if a variable declaration was given an explicit type
NeilBrown [Sat, 20 Nov 2021 00:50:55 +0000 (11:50 +1100)]
oceani: record if a variable declaration was given an explicit type

The type may be determined at the same place as the declaration, yet
still not be explicit.  To ensure correct output when printing code,
record what was found.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: pass a file to print_value() and related functions.
NeilBrown [Sat, 20 Nov 2021 00:46:14 +0000 (11:46 +1100)]
oceani: pass a file to print_value() and related functions.

print_type receives a file, and a type can contain values, so
print_value() should take a file too.

Ideally print_exec() would as well, as the value of a function is an
exec.  Maybe another day.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agoparsergen: avoid creating extra line in code blocks.
NeilBrown [Sat, 20 Nov 2021 00:37:52 +0000 (11:37 +1100)]
parsergen: avoid creating extra line in code blocks.

When performing coverage analysis, it is important that the line numbers
seen in the .c file are fairly accurate.
Currently we a lines to the end of a code block, and they appear to have
line numbers that correspond to whatever appears after the code block.
This is confusing.

So put all that extra code on the last line (matching the }$).
Also switch back to "gen_reduce" immediately after the code block.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: improve construction of per-function stack frame
NeilBrown [Fri, 19 Nov 2021 22:10:36 +0000 (09:10 +1100)]
oceani: improve construction of per-function stack frame

The stack-frame management was confused - not properly transitioned from
a single function to multiple functions.
Now we pass in the function to be processed, and it has a known list of
variables that were in-scope in that function.

We track when each variable went into or out-of scope, sort them, and
re-use frame space for variables which have already gone out-of-scope.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: pass a destination buffer into interp_exec to receive large result.
NeilBrown [Mon, 15 Nov 2021 21:23:06 +0000 (08:23 +1100)]
oceani: pass a destination buffer into interp_exec to receive large result.

To handle assignment from large objects - particularly a structure
returned by a function - we cannot just pass back a 'struct value'.
Instead we need to pass in a sufficiently large buffer, and have
the value producer copy into it.

This patch passes in a 'dest' and 'dtype' for this purpose.  It is not
yet used to full potential.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: mark structure return from functions as not supported.
NeilBrown [Mon, 15 Nov 2021 21:14:27 +0000 (08:14 +1100)]
oceani: mark structure return from functions as not supported.

Functions can currently only return types that support ->dup.
So disallow anything that doesn't.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agoparsergen: add action tables when needed.
NeilBrown [Sun, 14 Nov 2021 05:07:15 +0000 (16:07 +1100)]
parsergen: add action tables when needed.

In most cases there is at most one reducible production per state, and
that is all we previously handled.
However occasionally it can be useful to have more than one, triggered
by different look-ahead symbols.

With this patch, we add entries to the go_to table in that case.  The
go_to table now has a flag to indicate if the symbol maps to a state (in
which case it can be SHIFTed if a terminal), or to a production (in
which case it triggers a reduction).

If the in-state production has the special value MANY_REDUCIBLE, when
the parser performs a lookup to see which production, if any, should be
reduced.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agoparsergen: move EOL handling out of shift()
NeilBrown [Sat, 13 Nov 2021 22:47:21 +0000 (09:47 +1100)]
parsergen: move EOL handling out of shift()

shift() is called in several places, and in only one of those is there a
need to make NEWLINE to EOL.

Move the code out of shift() and instead make a second call to shift()
if shifting NEWLINE failed.  I think this make the code clearer.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agoparsergen: rearrange 'struct state' to reduce wastage.
NeilBrown [Sat, 13 Nov 2021 08:32:42 +0000 (19:32 +1100)]
parsergen: rearrange 'struct state' to reduce wastage.

Having a pointer between two shorts results in a lot of empty space
in the struct.  Remove this wastage.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agoparsergen: store reduction information separate from states.
NeilBrown [Sat, 13 Nov 2021 08:25:23 +0000 (19:25 +1100)]
parsergen: store reduction information separate from states.

There are more states than reductions (aka productions) so storing the
reduction data in the state table results in a lot of duplication - and
wasted space as some states have no reduction.

So create a separate table of reduction information.  This will also
make it easier to allow a state to have multiple reductions with LALR
and canonical-LR grammars.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agoboot-strap: update bootstrap code.
NeilBrown [Sat, 13 Nov 2021 08:04:02 +0000 (19:04 +1100)]
boot-strap: update bootstrap code.

Run
  ../md2c ../mdcode.mdc
in boot-strap to get the latest code there.  Just because.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani-tests: add valgrind testing for 'special' tests
NeilBrown [Sat, 13 Nov 2021 00:40:33 +0000 (11:40 +1100)]
oceani-tests: add valgrind testing for 'special' tests

Make sure we clean up properly, even after a fatal error - just because.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani-tests: include failing test in valgrind testing
NeilBrown [Sat, 13 Nov 2021 00:24:23 +0000 (11:24 +1100)]
oceani-tests: include failing test in valgrind testing

We want memory error caught in failing tests too.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani-tests: perform coverage test last.
NeilBrown [Fri, 12 Nov 2021 23:14:09 +0000 (10:14 +1100)]
oceani-tests: perform coverage test last.

I want to see valgrind test results even when I don't have full coverage
yet.  So move the coverage test last.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: add simple return type
NeilBrown [Fri, 12 Nov 2021 23:10:44 +0000 (10:10 +1100)]
oceani: add simple return type

This allow a simple typed value to be returned from a function using the
'use' statement.
It probably doesn't work for structs - don't try it.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: remove some stray white-space
NeilBrown [Fri, 12 Nov 2021 23:04:16 +0000 (10:04 +1100)]
oceani: remove some stray white-space

Don't want no extra white space.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: Improve Rboolok handling.
NeilBrown [Fri, 12 Nov 2021 23:00:47 +0000 (10:00 +1100)]
oceani: Improve Rboolok handling.

When Rboolok, Tnone is also allowed.
When not Rboolok, and type is not Tnone, it is only the final
statement of a block that *must* return a value.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: fix parsing for function declaration parameters
NeilBrown [Fri, 12 Nov 2021 22:02:19 +0000 (09:02 +1100)]
oceani: fix parsing for function declaration parameters

Multiple lines of declarations weren't handle properly.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: factor our common code in DeclareFunction
NeilBrown [Fri, 12 Nov 2021 10:29:46 +0000 (21:29 +1100)]
oceani: factor our common code in DeclareFunction

Rather than writing the same thing three times, use a function.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: remove the need for 'then' in function declarations.
NeilBrown [Wed, 10 Nov 2021 10:27:50 +0000 (21:27 +1100)]
oceani: remove the need for 'then' in function declarations.

Previously an IN had to follow a terminal because it would never for a
reduce.
This made is a problem for
    func FuncName
          arguments
    do
          code

as the IN follows FuncName - a non-terminal.

Fix this by allowing an IN to force a reduce if nothing at all can be
shifted.
After "func IDENTIFIER", nothing can be shifted.  The IDENTIFIER must be
reduced to FuncName.  At that point, the IN is expected, so it won't be
ignored.

This allows the 'then' to be dropped.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: Add functions
NeilBrown [Sun, 7 Nov 2021 21:21:30 +0000 (08:21 +1100)]
oceani: Add functions

As yet, functions cannot return a value, but they can be passed
parameters.
They are declared a bit like consts, but there isn't a common
header for multiple constants.

A pointer to the body of the function is stored in the 'global' area,
like the vale of any other constant.

Functions can be called as a statement - providing they don't return
anything - or as an expression, which will currently be a type error as
they cannot return the correct type.

We allocate a new 'local' frame for each function call, and free it when
the function completes.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: change variable name in "free global variables"
NeilBrown [Tue, 9 Nov 2021 05:16:31 +0000 (16:16 +1100)]
oceani: change variable name in "free global variables"

I'm using 't' as the name for a pointer to a variable.
Using 'v' makes more sense.  (t was short for 'temp').

Signed-off-by: NeilBrown <neil@brown.name>
7 months agomark-tested: don't fail if coverage is too low
NeilBrown [Tue, 9 Nov 2021 05:05:50 +0000 (16:05 +1100)]
mark-tested: don't fail if coverage is too low

As the whole point of mark-tested is to help improve coverage, it is
silly to rail if coverage is too low.
So make it possible to easily skip that test in the Makefile.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: improve reporting of variables being freed at end of block.
NeilBrown [Tue, 9 Nov 2021 04:58:50 +0000 (15:58 +1100)]
oceani: improve reporting of variables being freed at end of block.

1/ if frame_pos hasn't been set, possibly because type propagation hit
   an error, don't report the offset.
2/ Don't report G or L for global/local, and this will always be a a
   local variable.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: guard against code section being empty.
NeilBrown [Tue, 9 Nov 2021 04:52:14 +0000 (15:52 +1100)]
oceani: guard against code section being empty.

If ->code is empty, we want an error message, not a crash.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: Make 'List' separate from Print
NeilBrown [Tue, 9 Nov 2021 02:44:27 +0000 (13:44 +1100)]
oceani: Make 'List' separate from Print

Create a stand-alone ExpressionList which uses the List binode rather
than the Print binode.

The Print statement no longer uses a NULL entry on the end of the list
to denode a trailing comma.  Rather ->left is used for a normal print
list and ->right is used for a print list that has a trailing comma.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: free variables as soon as they go out of scope.
NeilBrown [Sat, 6 Nov 2021 04:54:52 +0000 (15:54 +1100)]
oceani: free variables as soon as they go out of scope.

Each 'exec' now keeps track of the variables that go out-of-scope when
the exec completes.
CondScope variables need to be re-linked when they get merged.

We now poison a variable when it is freed to ensure it doesn't get used
again by mistake.

The final cleanup now only needs to handle global variables

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: CloseParallel must mark anything not Pending as OutScope
NeilBrown [Mon, 8 Nov 2021 09:46:44 +0000 (20:46 +1100)]
oceani: CloseParallel must mark anything not Pending as OutScope

Testing doesn't trip on this yet, but will in a future patch.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: add comments to var_block_close() and remove dead code.
NeilBrown [Mon, 8 Nov 2021 09:19:29 +0000 (20:19 +1100)]
oceani: add comments to var_block_close() and remove dead code.

This function is subtle and deserves good documentation for various
cases.
Some of the cases were dead, so remove them.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: update min_depth promptly.
NeilBrown [Mon, 8 Nov 2021 08:35:25 +0000 (19:35 +1100)]
oceani: update min_depth promptly.

As the loop in var_block_close() continues until min_depth is too low,
we need to set it promptly to stop the same variable being processed
again before it has been merged.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: perform analysis before printing
NeilBrown [Sun, 7 Nov 2021 00:28:04 +0000 (11:28 +1100)]
oceani: perform analysis before printing

This will allow information attached during analysis to
be printed out as comments.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: add an 'interp' case for Func
NeilBrown [Sun, 7 Nov 2021 00:04:34 +0000 (11:04 +1100)]
oceani: add an 'interp' case for Func

For Func we jut call interp_exec on b->right.
This ensures that interp_exec() gets called on each exec, so
it can do cleanup (in future patch).

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: create separate scope for do part of while
NeilBrown [Sat, 6 Nov 2021 23:59:23 +0000 (10:59 +1100)]
oceani: create separate scope for do part of while

Any variables created in the do part won't be created in the final
iteration, so we want them to be constrained to the do part, not seen as
part of the whole loop body.
This makes while/do match if/then better.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: create a separate 'exec' for the while/do part
NeilBrown [Sat, 6 Nov 2021 22:20:05 +0000 (09:20 +1100)]
oceani: create a separate 'exec' for the while/do part

As while/do is a sub-scope within a cond-statement, create a separate
'struct exec' for it (a binode/Loop) so there is an exec for each scope.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: move var_block_close() calls to the code sections that close the block
NeilBrown [Sat, 6 Nov 2021 02:04:54 +0000 (13:04 +1100)]
oceani: move var_block_close() calls to the code sections that close the block

Rather than calling var_block_close() from common non-terminals, move
the calls into the body of the parent non-terminal.  This places them
after the 'struct exec' which represents the scope has been created.

This is needed to attach the variables to the point where their scope is
closed, so they can be freed.

This change helped me focus on some untested - and broken - code.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: fix up the while/do scope
NeilBrown [Sat, 6 Nov 2021 23:00:29 +0000 (10:00 +1100)]
oceani: fix up the while/do scope

The scope created for while/do does NOT extend into the case/else part.
This is because it is a repeating scope and needs to close and re-open.

We *could* include case/else in the final instance of that scope, but
I'm not at all sure that I want to.  Maybe later.

So close the scope properly and fix up the test code which depends on
the scope being extended.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: change variable.merged to never be NULL
NeilBrown [Sat, 6 Nov 2021 01:17:13 +0000 (12:17 +1100)]
oceani: change variable.merged to never be NULL

variable.merged is now always the primary variable, so it is initialised
to the address of the variable itself.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: simplify loop in var_block_close()
NeilBrown [Fri, 5 Nov 2021 23:55:01 +0000 (10:55 +1100)]
oceani: simplify loop in var_block_close()

The 'step' was not in the 'for' header, which makes it harder to follow
how the loop works.
Also add a comment to explain where is happening when ->name->var != v.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: simplify test in var_block_close.
NeilBrown [Fri, 5 Nov 2021 23:30:34 +0000 (10:30 +1100)]
oceani: simplify test in var_block_close.

v->depth is never less than v->min_depth, so checking that
both exceed ->scope_depth is pointless, only test ->min_depth.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: add lots of UNTESTED markers.
NeilBrown [Wed, 3 Nov 2021 02:08:45 +0000 (13:08 +1100)]
oceani: add lots of UNTESTED markers.

These serve to remind me what needs testing (or marking NOTEST), and
will make it easier to notice when new untested code is added.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: var storage needs to be free last
NeilBrown [Wed, 3 Nov 2021 01:52:08 +0000 (12:52 +1100)]
oceani: var storage needs to be free last

As type may store initializers in storage, but these might not get into
the var list in an error, we need to free that storage last.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani-tests: continue to improve test coverage
NeilBrown [Wed, 3 Nov 2021 01:29:34 +0000 (12:29 +1100)]
oceani-tests: continue to improve test coverage

Add a couple of error tests, and mark some code as NOTEST

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani-tests: add some NOTEST markings.
NeilBrown [Wed, 3 Nov 2021 01:05:51 +0000 (12:05 +1100)]
oceani-tests: add some NOTEST markings.

These lines don't need to be tested.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agomark-untested: improve filter
NeilBrown [Wed, 3 Nov 2021 01:01:17 +0000 (12:01 +1100)]
mark-untested: improve filter

Don't add the mark for any section lines.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: add test for duplicate main functions
NeilBrown [Wed, 3 Nov 2021 00:57:01 +0000 (11:57 +1100)]
oceani: add test for duplicate main functions

Add a test so the check for duplicate main functions gets exercised.

Signed-off-by: NeilBrown <neil@brown.name>
7 months agooceani: drop "program" in favour of "func"
NeilBrown [Wed, 3 Nov 2021 00:46:54 +0000 (11:46 +1100)]
oceani: drop "program" in favour of "func"

Being to introduce functions.  Currently only the 'main' function which
receives an array of strings.
This array has a variable size.

Signed-off-by: NeilBrown <neil@brown.name>