Commit Graph

1232 Commits

Author SHA1 Message Date
0dedef95e9 Non local returns.
"return" statements inside a function which is inside a method will
return from the surrounding method.

The implementation is surprisingly clean. It turns out using an upvalue
for "this", which we already do, give us all the state we need to find
the enclosing method on the stack.
2016-01-23 21:25:58 -08:00
71e2458a6c Add API for accessing command-line arguments.
- Add process module with Process class.
- Add "arguments" and "allArguments" methods.
- Docs for same.
- Support passing additional arguments to command line.
- Add "--help" support to command line.
2016-01-22 07:57:26 -08:00
860220869a Oops. Completely disable lto. 2016-01-22 07:01:56 -08:00
f19888d328 Merge branch 'master' of https://github.com/munificent/wren 2016-01-22 06:42:16 -08:00
7e8bc2a89a Disable link-time-optimization for now.
It's failing when building with clang on Travis. The underlying problem
seems to be something broken with how LLVM is looking for the gold
linker, and working around that is outside of my skillset.

To learn more, Google: "LLVMgold.so: error loading plugin" lto
2016-01-22 06:42:01 -08:00
056ae61493 Tweak some docs. 2016-01-21 21:38:27 -08:00
46a03e3a2d Merge pull request #318 from pra85/patch-1
Update license year range to 2016
2016-01-21 15:20:58 -08:00
39b29ee07a Enable link time optimization in the CLI.
One little compiler flag makes a surprisingly large difference:

api_call - wren            0.05s 0.0017 130.52% relative to baseline
api_foreign_method - wren  0.24s 0.0017 144.54% relative to baseline
binary_trees - wren        0.21s 0.0032 112.27% relative to baseline
binary_trees_gc - wren     0.75s 0.0288 115.02% relative to baseline
delta_blue - wren          0.13s 0.0031 103.24% relative to baseline
fib - wren                 0.20s 0.0036 120.56% relative to baseline
fibers - wren              0.04s 0.0007 108.52% relative to baseline
for - wren                 0.07s 0.0009 124.45% relative to baseline
method_call - wren         0.12s 0.0010  95.58% relative to baseline
map_numeric - wren         0.30s 0.0031 110.11% relative to baseline
map_string - wren          0.11s 0.0098 111.38% relative to baseline
string_equals - wren       0.19s 0.0064 115.49% relative to baseline
2016-01-20 07:47:00 -08:00
205661713a Update license year range to 2016 2016-01-17 23:28:25 +05:30
f9d1e9954a Make File.stat() directory test less file system sensitive. 2016-01-05 07:32:51 -08:00
94208647ab Test File.stat() on a directory. 2016-01-01 10:05:31 -08:00
5cd8a06fa0 File.stat(). 2016-01-01 09:58:44 -08:00
b054526df8 Add an optional offset to File.readBytes(). 2015-12-30 08:13:19 -08:00
6e2ec92e0d Fix parameter format in docs. 2015-12-29 22:35:14 -08:00
452cc88082 Fix a few typos in the docs. 2015-12-29 22:29:13 -08:00
8854dfb07e Docs for the io module! 2015-12-29 21:56:44 -08:00
678251a00c Fix type for fileFinalizer(). 2015-12-29 21:07:26 -08:00
2c31985e54 Make Directory.list() create and return a list from C. 2015-12-29 08:37:47 -08:00
e0ac88c22a Revamp wrenCall to work with slots.
Now, you call wrenEnsureSlots() and then wrenSetSlot___() to set up the
receiver and arguments before the call. Then wrenCall() is passed a
handle to the stub function that makes the call. After that, you can
get the result using wrenGetSlot___().

This is a little more verbose to use, but it's more flexible, simpler,
and much faster in the VM. The call benchmark is 185% of the previous
speed.
2015-12-29 07:58:47 -08:00
ed6fad6153 Get rid of fiber for finalizers.
Instead, finalizers just get access to the foreign object's raw bytes.
This is deliberately limiting, since it discourages the user from
interacting with the VM in the middle of a GC.
2015-12-28 08:06:29 -08:00
a447b66380 Make slots available to the API outside of foreign methods.
At any point in time, the user can call wrenEnsureSlots() which will
implicitly create a fiber and point to its stack if needed.
2015-12-28 07:49:47 -08:00
a09892de32 Use a fiber for a finalizer's foreign stack. 2015-12-27 21:43:08 -08:00
9512ce74c3 Merge branch 'master' into api
# Conflicts:
#	src/module/io.c
2015-12-26 20:42:53 -08:00
fbc76cdc05 Fix C++ compile error in Directory.list(). 2015-12-26 20:26:05 -08:00
5b90896fa8 Print object type for unknown object error.
Thanks, Michel!
2015-12-26 20:15:00 -08:00
a5dc5e8390 Sort cases alphabetically.
Thanks, Michel!
2015-12-26 20:13:39 -08:00
4ad4953196 Fix typo.
Thanks, Michel!
2015-12-26 20:12:35 -08:00
8ab329ff91 Make wren.mk log wren_to_c_string.
Thanks, Michel!
2015-12-26 20:11:48 -08:00
8203baf7bd Initialize match in the test script.
Thanks, Michel!
2015-12-26 20:08:20 -08:00
1d16e85a85 Add an API to load a top-level variable into a slot. 2015-12-26 10:53:14 -08:00
0ac793d4f8 Add Directory.list() to io. 2015-12-24 10:12:12 -08:00
15043b897f Add a benchmark for wrenCall(). 2015-12-23 17:29:53 -08:00
b7e62926ab Merge branch 'master' into api 2015-12-23 09:22:49 -08:00
1ebc711c30 Allow call and unary expressions as map keys. 2015-12-22 16:00:50 -08:00
6f3077d582 Fix off by one error in initial stack capacity. 2015-12-16 20:55:18 -08:00
910049cd19 Update the docs around slots. 2015-12-16 16:39:27 -08:00
6f37d379f4 Add C API functions for working with lists:
- wrenEnsureSlots()
  Lets you go the foreign slot stack to make room for a temporary work
  area.

- wrenSetSlotNewList()
  Creates a new empty list and stores it in a slot.

- wrenInsertInList()
  Takes a value from one slot and inserts it into the list in another.

Still need more functions like getting elements from a list, removing,
etc. but this at least lets you create, populate, and return lists from
foreign methods.
2015-12-16 16:28:26 -08:00
7fcdcf2f1a wrenReturn___() -> wrenSlotSet___().
This turns those functions into general-purpose functions for writing
raw C values into slots on the foreign call stack.

Writing a return just means writing a value to slot 0.
2015-12-16 13:00:13 -08:00
4b3c818ec5 Start moving embedding API towards "slot" register-API.
- wrenGetArgumentCount() -> wrenGetSlotCount()
- wrenGetArgument___() -> wrenGetSlot___()

Also, the get functions assert that the value is the right type instead
of checking at runtime. This puts the onus on the caller to be safe,
but maximizes performance.
2015-12-16 10:22:42 -08:00
55beda3ea9 Simplify the foreign call preamble a bit.
We don't need to store the number of arguments since we can calculate
it from the start and top of the stack.
2015-12-15 17:10:02 -08:00
01e8f9053e Add a benchmark to test the Wren C API.
I've got some ideas on how to tweak the embedding API, but I want to
see what performance impact they have first, so this adds a little
benchmark that just calls a foreign method a ton of times.
2015-12-15 16:02:13 -08:00
873926915f Don't allow fibers as map keys.
I hacked in support for it for a misguided reason (trying to fake
"thread-local storage") and ended up not using it for that anyway.
2015-12-15 10:42:21 -08:00
8d9feb4bc9 Fix typo in benchmark. 2015-12-15 10:37:53 -08:00
bcc40ab66a Clean up a few little things:
- Fix the instruction output when debug dumping code.
- Don't pass around the classCompiler since Compiler stores it.
2015-12-14 17:10:10 -08:00
e7d10218db Grow the stack as needed.
This is untuned for performance, but seems to be doing the right thing.
2015-12-14 08:00:22 -08:00
c7cd1fb1ac Track the maximum number of slots each function may use.
This is the first step towards dynamically grown stacks. We don't want
to check for stack overflow on every single push, so we store the max
number of slots a function might need and (in later patches) ensure
at function call time that that many slots are available.
2015-12-13 22:57:40 -08:00
2df5362ab2 Handle compile errors in imported modules. 2015-12-08 07:49:37 -08:00
bfa86b259a Ignore newlines in imports. 2015-12-07 19:41:10 -08:00
6ff5fb9ff2 Allow empty ranges at the end of a sequence. 2015-12-06 10:37:58 -08:00
10ece995f7 Add some Dart benchmarks running on fletch. 2015-12-05 11:09:30 -08:00