- Fix some doc comments.
- Inline comparing two ObjStrings, since it's only used in one place.
Also, this avoids a redundant identity check.
- Move the forward declarations of the object types out of
wren_common.h. Instead, I just added the one needed forward
declaration of ObjString in wren_utils.h. It's a little inelegant,
but it feels weird to me to expose all of the object types in
wren_common.h when they logically belong to wren_value.h and most of
the types aren't problematic.
- Fix a bug where field symbol tables weren't being marked. If a GC
happened while compiling a class, field strings got freed.
A statement like:
for (i in 1..2)
When run in the REPL declares a local variable ("i"), but not inside
a function or method body. This hit a corner case in the compiler
where it didn't have the correct slot indexes set up.
That corner case is because sometimes when you compile a chunk, local
slot zero is pre-allocated -- either to refer to "this" or to hold the
closure for a function so that it doesn't get GCed while running. But
if you're compiling top-level code, that slot isn't allocated. But top
level code for the REPL *should* be, because that gets invoked like a
function.
To simplify things, *every* compiled chunk now pre-allocates slot zero.
That way, there are fewer cases to keep in mind.
Also fixed an issue where a GC during an import could collected the
imported module body's closure.
Fix#456.
This is simpler and marginally faster. We don't need the overhead of
fibers since you can't have long or recursive import chains anyway.
More importantly, this makes the behavior more well-defined when you do
things like yield from an imported module. (Not that you should do that,
but if you do, it shouldn't do weird things.)
If the function the fiber is created from takes a parameter, the value
passed to the first call() or transfer() gets bound to that parameter.
Also, this now correctly handles fibers with functions that take
parameters. It used to leave the stack in a busted state. Now, it's a
runtime error to create a fiber with a function that takes any more
than one parameter.
- Not sure what was going on, but fix#456. It makes more sense for the
REPL to invoke the compiled code as a fiber than a function anyway.
- Flush stdout before reading from stdin since System.print() no longer
does that automatically.
It's handy because it ensures writes are flushed to the terminal before
any calls to read from stdin, but it's also gratuitously slow.
Instead, added a Stdout class with an explicit flush() method that can
be called by the user.
Fix#445.