nit.git
9 years agoversion 0.7.3 v0.7.3
Jean Privat [Tue, 31 Mar 2015 06:00:24 +0000 (13:00 +0700)]
version 0.7.3

9 years agoMerge: lib/std/union_find: make DisjointSet Cloneable
Jean Privat [Tue, 31 Mar 2015 03:22:05 +0000 (10:22 +0700)]
Merge: lib/std/union_find: make DisjointSet Cloneable

Just because I need it.

I'm still not sure about what is the best way to deal with the various copy-constructors and clone methods. I think the following make sense:

A copy constructor named `from` that takes, if possible a general classifier (like an interface). This named constructor may use `nosuper` to avoid the automatic invocation of the standard init method if this cause a useless complex initialization that will be throw away by the copy.
A direct copy `clone` than can just return `new SELFTYPE.from(self)`

The advantage is that for simple clone, the `clone` method do the job.
If one want to change the class but keep the data, then the `from` constructor can be used. Like `new HashSet.from([1,2,3])`

Pull-Request: #1226
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: Rewrite the coloration for properties and types.
Jean Privat [Tue, 31 Mar 2015 03:21:57 +0000 (10:21 +0700)]
Merge: Rewrite the coloration for properties and types.

This introduce a new colorer, `POSetGroupColorer` that colors elements introduced by the classes in a class-hierarchy.
The advantage of this new colorer is that it uses conflict graphs of classes to colorize elements.
By comparison, the previously used colorers work with conflict graphs of elements; that are therefore much larger.

An other advantage is that only the introductions of elements are needed by the colorer, so filling the information from the model is far more easier.

The construction of the poset of types is also removed.
Instead, subtyping tables are computed with a more standard way:

* target cast types are grouped by classes: a map class->types is created
* the map is colored: a table layout by class is computed
* for each live type, the table layout of the associated class is used to build the type table

Results are so good that most of the time of the coloring is removed.

For nitc/nitc/nit

Before:

user: 0m6.044s
total: 15096 MIr
do_property_coloring: 1420 MIr
do_type_coloring: 2600 MIr

After:

user: 0m5.608s (-7%)
total: 12800 MIr (-15%)
do_property_coloring: 452 MIr (-68%)
do_type_coloring: 895 MIr (-65%)

note that in the previous numbers, most of the time is done in the model to inherit or resolve things.
Pure coloring algorithm is now negligible:

conflict_graph: 34 MIr (<1% of the total Ir)
coloring: 60 MIr (<1% of the total Ir)

Unfortunately, with types the coloring can degenerate and produce big tables. If this is an issue, the options `--type-poset` use the previous coloring method for types

Pull-Request: #1215
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: Misc for lib
Jean Privat [Tue, 31 Mar 2015 00:44:48 +0000 (07:44 +0700)]
Merge: Misc for lib

Litttle features and warning-fixes for the libs

Pull-Request: #1228
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: iOS support
Jean Privat [Tue, 31 Mar 2015 00:44:42 +0000 (07:44 +0700)]
Merge: iOS support

Adds a target platform in the compiler which generates an XCode project for iOS applications.

Intro the `ios` projet to group services for iOS. It implements the callbacks expected by the iOS system for a basic graphical application. It also triggers compilation for the iOS platform.

Adds one example of a graphical application `hello_ios` and a very minimal test for the iOS platform.

This is still very much a work in progress, you will notice many TODO in the code. Here are some of the next features to implement:
* Extend support to all iOS devices, not only the iPhone in the simulator.
* Reorganize annotations for app.nit: app_name, package_name, and maybe organization_name.
* Add more services of the Cocoa touch library and rewrite the `hello_ios` app in Nit.
* Support assets and other game related features.
* Some cleanup of the generated XCode project files could be a good thing.

Pull-Request: #1227
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>

9 years agoMerge: sepcomp: fixup trampoline with tagged primitive values
Jean Privat [Tue, 31 Mar 2015 00:44:35 +0000 (07:44 +0700)]
Merge: sepcomp: fixup trampoline with tagged primitive values

Thus fix --trampoline-call (and --link-boost)

Pull-Request: #1225
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>

9 years agoMerge: Fix escape to c
Jean Privat [Tue, 31 Mar 2015 00:44:30 +0000 (07:44 +0700)]
Merge: Fix escape to c

close #1223

Pull-Request: #1224
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>

9 years agoMerge: Fix warnings from clang on OS X
Jean Privat [Tue, 31 Mar 2015 00:44:23 +0000 (07:44 +0700)]
Merge: Fix warnings from clang on OS X

Pull-Request: #1222
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>

9 years agolib/template: migrate the example to new constructors
Jean Privat [Mon, 30 Mar 2015 13:01:05 +0000 (20:01 +0700)]
lib/template: migrate the example to new constructors

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/geometry: document ILine
Jean Privat [Mon, 30 Mar 2015 13:00:40 +0000 (20:00 +0700)]
lib/geometry: document ILine

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib: move privileges.nit to its subdirectory
Jean Privat [Mon, 30 Mar 2015 12:51:15 +0000 (19:51 +0700)]
lib: move privileges.nit to its subdirectory

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/standard: document FileReader::from_fd
Jean Privat [Mon, 30 Mar 2015 12:48:34 +0000 (19:48 +0700)]
lib/standard: document FileReader::from_fd

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/standard: factorize File*::close
Jean Privat [Mon, 30 Mar 2015 12:46:44 +0000 (19:46 +0700)]
lib/standard: factorize File*::close

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/standard: add Collection::not_empty
Jean Privat [Mon, 30 Mar 2015 12:37:44 +0000 (19:37 +0700)]
lib/standard: add Collection::not_empty

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/sorter: add `MapRead::keys_sorted_by_values` and the related comparator
Jean Privat [Mon, 30 Mar 2015 12:33:51 +0000 (19:33 +0700)]
lib/sorter: add `MapRead::keys_sorted_by_values` and the related comparator

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agotests: skip iOS tests on GNU/Linux
Alexis Laferrière [Sun, 29 Mar 2015 19:55:33 +0000 (15:55 -0400)]
tests: skip iOS tests on GNU/Linux

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib/ios: add the simple hello_ios app
Alexis Laferrière [Sun, 29 Mar 2015 15:01:44 +0000 (11:01 -0400)]
lib/ios: add the simple hello_ios app

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agotests: add a very minimal test for the iOS platform
Alexis Laferrière [Fri, 27 Mar 2015 22:41:28 +0000 (18:41 -0400)]
tests: add a very minimal test for the iOS platform

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib: intro the iOS library
Alexis Laferrière [Thu, 15 Jan 2015 16:03:52 +0000 (11:03 -0500)]
lib: intro the iOS library

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agonitc: support compiling for the iOS platform
Alexis Laferrière [Fri, 27 Mar 2015 16:39:25 +0000 (12:39 -0400)]
nitc: support compiling for the iOS platform

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agonitc: `Toolchain` keeps the compiler as an attribute
Alexis Laferrière [Sat, 28 Mar 2015 17:58:27 +0000 (13:58 -0400)]
nitc: `Toolchain` keeps the compiler as an attribute

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib/sorter: add `MapRead::values_sorted_by_key`
Jean Privat [Mon, 30 Mar 2015 12:25:05 +0000 (19:25 +0700)]
lib/sorter: add `MapRead::values_sorted_by_key`

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/std/union_find: make DisjointSet Cloneable
Jean Privat [Sun, 29 Mar 2015 14:39:02 +0000 (21:39 +0700)]
lib/std/union_find: make DisjointSet Cloneable

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: fixup trampoline with tagged primitive values
Jean Privat [Sun, 29 Mar 2015 09:10:30 +0000 (16:10 +0700)]
sepcomp: fixup trampoline with tagged primitive values

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agotests: update sav/test_parser_args1.res for escape_to_c changes
Jean Privat [Sun, 29 Mar 2015 03:05:15 +0000 (10:05 +0700)]
tests: update sav/test_parser_args1.res for escape_to_c changes

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/string: escape_to_c uses 3 digits in the octal form \nn to avoid misinterpretation
Jean Privat [Sun, 29 Mar 2015 01:59:01 +0000 (08:59 +0700)]
lib/string: escape_to_c uses 3 digits in the octal form \nn to avoid misinterpretation

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/string: escape_to_c transforms `"\t"` to `"\\t"`
Jean Privat [Sun, 29 Mar 2015 01:58:11 +0000 (08:58 +0700)]
lib/string: escape_to_c transforms `"\t"` to `"\\t"`

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: do not generate class tables for dead classes
Jean Privat [Mon, 23 Mar 2015 08:33:19 +0000 (15:33 +0700)]
sepcomp: do not generate class tables for dead classes

exceptions are pimitive types and classes that have a `new` factory

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: use the new `POSetGroupColorer` to color types for tests
Jean Privat [Sat, 28 Mar 2015 02:12:28 +0000 (09:12 +0700)]
sepcomp: use the new `POSetGroupColorer` to color types for tests

The previous coloring with a poset of types is still available trough `--type-poset`

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agoMerge: Fast benches
Jean Privat [Sat, 28 Mar 2015 01:39:53 +0000 (08:39 +0700)]
Merge: Fast benches

Last week benches shows some failures on some options due to recent commits.

This PR add a `--fast --fast` option that test only `hello_world` so it could be used in continuous integration to test the various meaningful combination of compiling options.

Moreover, the script is simplified to be more simple to use and extends with new options or combination of options,

Pull-Request: #1217
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: Fast super strings
Jean Privat [Sat, 28 Mar 2015 01:34:45 +0000 (08:34 +0700)]
Merge: Fast super strings

Superstrings, like "a{b}c", are managed in the AST as a special group of sub-expression nodes that are either literal string parts or standard expressions.
The previous example is basically `["a", b, "c"]`

Previously, the compilation of super-strings was direct: the values are grouped in an array and `to_s` is called on it.

So in fact `"a{b}c"` was compiled as `["a", b, "c"].to_s`.

This basic implementation is simple and correct. But it has some drawbacks:

* a new Array[Object] (and a NativeArray[Object]) is allocated each time the super-string is evaluated.
* all elements are to_s-ized in `Array::to_s`, even the literal parts.
* an additional NativeArray[String] is allocated in `Array:to_s` to do the fast concatenation.

Because of the numerous allocations, superstrings caused a lot of work to the GC.

This PR provides a better, but more complex implementation:

* instead of an Array[Object], a NativeArray[String] is directly build and a fast concatenation `native_to_s` is invoked.
* the allocated NativeArray is cached in a static variable so it can be reused in next evaluation.
* the literal string parts are stored in the native array as is, and only once just after the allocation of the native array.

Results for nitc/nitc/nitc:
before: 0m6.076s
after: 0m5.512s (-9% not bad!)

Pull-Request: #1219
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>

9 years agoMerge: lib/std/file: do not flush on each write
Jean Privat [Sat, 28 Mar 2015 01:29:12 +0000 (08:29 +0700)]
Merge: lib/std/file: do not flush on each write

Flushing for each small element of an output made things too slow.

real (not user) time for nitc/nitc/nitc:
before: 0m7.373s
after: 0m5.901s (-20%)

Pull-Request: #1216
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: Some cleaning in vm files
Jean Privat [Sat, 28 Mar 2015 01:26:29 +0000 (08:26 +0700)]
Merge: Some cleaning in vm files

This small PR creates a directory for all vm files and a unique entry point.

Signed-off-by: Julien Pagès <julien.projet@gmail.com>

Pull-Request: #1221
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Jean Privat <jean@pryen.org>

9 years agoMerge: nitc: fix closing manifest writer, should fix bug on #1216
Jean Privat [Sat, 28 Mar 2015 01:23:37 +0000 (08:23 +0700)]
Merge: nitc: fix closing manifest writer, should fix bug on #1216

Pull-Request: #1220
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>

9 years agotests: remove sav/nitg-e/error_needed_method_alt4.res since behavior is fixed
Jean Privat [Sat, 28 Mar 2015 01:16:36 +0000 (08:16 +0700)]
tests: remove sav/nitg-e/error_needed_method_alt4.res since behavior is fixed

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agonitc: fix missing includes for getpid
Alexis Laferrière [Sat, 28 Mar 2015 00:29:20 +0000 (20:29 -0400)]
nitc: fix missing includes for getpid

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib: fix return value of the system method
Alexis Laferrière [Sat, 28 Mar 2015 00:28:59 +0000 (20:28 -0400)]
lib: fix return value of the system method

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: Fix --no-union-attributes
Jean Privat [Tue, 24 Mar 2015 00:24:12 +0000 (07:24 +0700)]
Merge: Fix --no-union-attributes

--no-union-attributes was broken since the tagging of primitive. This PR fix it.

Pull-Request: #1218
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>

9 years agocompiler: prefill the native array with the literal string parts
Jean Privat [Sat, 21 Mar 2015 15:41:06 +0000 (22:41 +0700)]
compiler: prefill the native array with the literal string parts

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: `ASuperstringExpr` store the native array in a static variable
Jean Privat [Sat, 21 Mar 2015 15:40:01 +0000 (22:40 +0700)]
compiler: `ASuperstringExpr` store the native array in a static variable

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: compile ASuperstringExpr using `native_to_s`
Jean Privat [Sat, 21 Mar 2015 15:38:19 +0000 (22:38 +0700)]
compiler: compile ASuperstringExpr using `native_to_s`

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib: introduce `NativeArray::native_to_s`
Jean Privat [Sat, 21 Mar 2015 15:35:50 +0000 (22:35 +0700)]
lib: introduce `NativeArray::native_to_s`

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agonitc: fix closing manifest writer when done for #1216
Alexis Laferrière [Mon, 23 Mar 2015 18:03:12 +0000 (14:03 -0400)]
nitc: fix closing manifest writer when done for #1216

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agonitvm: Creation of a directory vm/ for the vm files
Julien Pagès [Mon, 16 Mar 2015 12:23:03 +0000 (13:23 +0100)]
nitvm: Creation of a directory vm/ for the vm files

Signed-off-by: Julien Pagès <julien.projet@gmail.com>

9 years agocompiler: add native_array_get and native_array_set
Jean Privat [Sat, 21 Mar 2015 15:35:11 +0000 (22:35 +0700)]
compiler: add native_array_get and native_array_set

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/string_exp: initialize an uninitialized attribute
Jean Privat [Mon, 23 Mar 2015 14:17:30 +0000 (21:17 +0700)]
lib/string_exp: initialize an uninitialized attribute

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: initialize lazy guards to 'false' if opt_no_union_attribute.
Jean Privat [Mon, 23 Mar 2015 14:16:26 +0000 (21:16 +0700)]
sepcomp: initialize lazy guards to 'false' if opt_no_union_attribute.

Otherwise the guard is let at `NULL` (aka uninitialized) and will
ironically fail at runtime because the lazy guard is not initialized.

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: isset is implemented on tagged attributes
Jean Privat [Mon, 23 Mar 2015 14:00:24 +0000 (21:00 +0700)]
sepcomp: isset is implemented on tagged attributes

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: tag values when storing it with opt_no_union_attribute
Jean Privat [Mon, 23 Mar 2015 13:58:55 +0000 (20:58 +0700)]
sepcomp: tag values when storing it with opt_no_union_attribute

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agoMerge: compiler: introduce and use `MType::is_c_primitive`
Jean Privat [Mon, 23 Mar 2015 15:16:18 +0000 (22:16 +0700)]
Merge: compiler: introduce and use `MType::is_c_primitive`

Thus remove all comparaison to "val*" in the code, this is cleaner.

Pull-Request: #1214
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: Simplify management of primitive types
Jean Privat [Mon, 23 Mar 2015 15:16:10 +0000 (22:16 +0700)]
Merge: Simplify management of primitive types

Add direct methods to access primitive types

Simplify and improve the generation of primitive values in the compiler.

More (and improved) `*_instance` methods are now available in AbstractCompilerVisitor.
One of the point is the simplification of the generated C so that less local variables are generated, maybe this will also help the C compiler to work faster.

Pull-Request: #1213
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agobench_engines: put all at the end
Jean Privat [Mon, 23 Mar 2015 10:34:36 +0000 (17:34 +0700)]
bench_engines: put all at the end

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agobench_engine: refactor most tests in a single function
Jean Privat [Mon, 23 Mar 2015 10:29:47 +0000 (17:29 +0700)]
bench_engine: refactor most tests in a single function

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: use the new `POSetGroupColorer` to color properties
Jean Privat [Mon, 23 Mar 2015 06:28:26 +0000 (13:28 +0700)]
sepcomp: use the new `POSetGroupColorer` to color properties

The diff is ugly. basically it is a complete change of the code

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocoloring: new class `POSetGroupColorer` to colorize bucklets of things
Jean Privat [Mon, 23 Mar 2015 06:23:14 +0000 (13:23 +0700)]
coloring: new class `POSetGroupColorer` to colorize bucklets of things

The difference with `POSetBucketsColorer` is that the new one is faster
but the constraint is that an element is introduced by a single holder.

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: introduce and use `MType::is_c_primitive`
Jean Privat [Mon, 23 Mar 2015 14:30:34 +0000 (21:30 +0700)]
compiler: introduce and use `MType::is_c_primitive`

Thus remove all comparison to "val*" in the code, this is cleaner.

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/std/exec: remove write buffon on pipes
Jean Privat [Mon, 23 Mar 2015 13:01:03 +0000 (20:01 +0700)]
lib/std/exec: remove write buffon on pipes

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agobench_engines: add --fast --fast to just check the compiler
Jean Privat [Mon, 23 Mar 2015 09:55:42 +0000 (16:55 +0700)]
bench_engines: add --fast --fast to just check the compiler

It will be included in CI tests to prevent breaking benches.

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agobench_engine: silent clean
Jean Privat [Mon, 23 Mar 2015 09:54:16 +0000 (16:54 +0700)]
bench_engine: silent clean

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocoloring: add `POSet::to_conflict_graph` for lazy peoples
Jean Privat [Mon, 23 Mar 2015 06:19:52 +0000 (13:19 +0700)]
coloring: add `POSet::to_conflict_graph` for lazy peoples

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocoloring: add `POSetConflictGraph:order`
Jean Privat [Mon, 23 Mar 2015 06:18:44 +0000 (13:18 +0700)]
coloring: add `POSetConflictGraph:order`

to factorize the linearization

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: `compute_resolution_tables` group by classes
Jean Privat [Mon, 23 Mar 2015 06:16:27 +0000 (13:16 +0700)]
sepcomp: `compute_resolution_tables` group by classes

Inspired by #1212

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/std/file: no not flush on each write
Jean Privat [Mon, 23 Mar 2015 07:43:13 +0000 (14:43 +0700)]
lib/std/file: no not flush on each write

Flushing for each small element of an output made things too slow.

real (not user) time for nitc/nitc/nitc:
before: 0m7.373s
after: 0m5.901s (-20%)

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: `compile_class_to_c` protect access to null vtf/attrs
Jean Privat [Mon, 23 Mar 2015 06:13:57 +0000 (13:13 +0700)]
sepcomp: `compile_class_to_c` protect access to null vtf/attrs

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: import counter for better stats
Jean Privat [Mon, 23 Mar 2015 06:11:42 +0000 (13:11 +0700)]
compiler: import counter for better stats

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: introduce and use char_instance, float_instance and null_instance
Jean Privat [Sat, 21 Mar 2015 05:21:03 +0000 (12:21 +0700)]
compiler: introduce and use char_instance, float_instance and null_instance

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: `int_instance` and `bool_instance` return a inlined runtimevariable
Jean Privat [Sat, 21 Mar 2015 05:04:47 +0000 (12:04 +0700)]
compiler: `int_instance` and `bool_instance` return a inlined runtimevariable

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: use `bool_instance` and `int_instance` when possible
Jean Privat [Sat, 21 Mar 2015 05:02:13 +0000 (12:02 +0700)]
compiler: use `bool_instance` and `int_instance` when possible

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agomodel: provide direct methods to access primitive types
Jean Privat [Sat, 21 Mar 2015 14:25:25 +0000 (21:25 +0700)]
model: provide direct methods to access primitive types

This avoid that each module re-search class by their names

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agoMerge: compiler: improve `poset_from_mtypes` used for type coloring.
Jean Privat [Sat, 21 Mar 2015 06:13:27 +0000 (13:13 +0700)]
Merge: compiler: improve `poset_from_mtypes` used for type coloring.

Instead of doing the full matrix mtypes X cast_types, a grouping is done by the base classes of the types so that we compare only types whose base classes are in inheritance.

For nitc/nitc/nitc the result is not that bad:

before:
0m6.584s
17.605 GIr
time passed in poset_from_mtypes: 26.01% (4.579 GIr)

now:
0m5.880s (-10%)
15.088 GIr (-14%)
time passed in poset_from_mtypes: 11.72% (1.768 GIr)

In the best condition, I can now expect to compile in less than 6s.

Note that coloring is still a MAJOR issue in term of compile time since 1/4 of the Ir are used to compute coloration.

 * type_coloring: 17.23%
 * property_coloring: 9.35%

Pull-Request: #1212
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>

9 years agoMerge: Handle signal
Jean Privat [Sat, 21 Mar 2015 06:13:05 +0000 (13:13 +0700)]
Merge: Handle signal

This PR improves slightly the handling of signal by providing better defaults.

A side effect is that this close #754

Pull-Request: #1211
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: contrib/header_keeper: a cog in the toolchains to generate FFI wrapper for...
Jean Privat [Sat, 21 Mar 2015 06:12:59 +0000 (13:12 +0700)]
Merge: contrib/header_keeper: a cog in the toolchains to generate FFI wrapper for C-like languages

This is needed by @Tagachi for the Objective-C wrapper.

Once again, everything is in the doc:

### Filters preprocessed C-like header files to remove included files

This tool is used in the process of parsing header files to extract
information on the declared services (the functions and structures).
This information is then used to generate bindings for Nit code
to access these services.

The C preprocessor extends macros, inline files marked with `#include`,
and more. This tool acts after the C preprocessor, in a way to keep
everything but the included files. It searches for line pragmas
to identify the source of each line. The result is printed to stdout.

Typical usage on the output of `gcc -E` (it would be the same with `clang`):

~~~
gcc -E /usr/include/SDL/SDL_image.h | header_keeper SDL_image.h > preprocessed_header.h
~~~

This module can also be used as a library. The main service is the method `header_keeper`.

Pull-Request: #1210
Reviewed-by: ArthurDelamare <>
Reviewed-by: Romain Chanoir <chanoir.romain@courrier.uqam.ca>
Reviewed-by: Ait younes Mehdi Adel <overpex@gmail.com>

9 years agosepcomp: rename `compile_resolution_tables` as `compute_resolution_tables`
Jean Privat [Fri, 20 Mar 2015 06:56:15 +0000 (13:56 +0700)]
sepcomp: rename `compile_resolution_tables` as `compute_resolution_tables`

because there is no C generation, only abstract data-structures.

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: `do_type_coloring` can work directly with RTA results
Jean Privat [Fri, 20 Mar 2015 06:48:22 +0000 (13:48 +0700)]
sepcomp: `do_type_coloring` can work directly with RTA results

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agosepcomp: add a missing undead type
Jean Privat [Fri, 20 Mar 2015 06:13:33 +0000 (13:13 +0700)]
sepcomp: add a missing undead type

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: improve `poset_from_mtypes` used for type coloring.
Jean Privat [Fri, 20 Mar 2015 05:14:30 +0000 (12:14 +0700)]
compiler: improve `poset_from_mtypes` used for type coloring.

Instead of doing the full matrix mtypes X cast_types, a grouping is done by the base classes of the types so that we compare only types whose base classes are in inheritance.

For nitc/nitc/nitc the result is not that bad:

before:
0m6.584s
17.605 GIr
time passed in poset_from_mtypes: 26.01% (4.579 GIr)

now:
0m5.880s (-10%)
15.088 GIr (-14%)
time passed in poset_from_mtypes: 11.72% (1.768 GIr)

In the best condition, I can now expect to compile in less than 6s.

Note that coloring is still a MAJOR issue in term of compile time since 1/4 of the Ir are used to compute coloration.

 * type_coloring: 17.23%
 * property_coloring: 9.35%

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agolib/std/exec: `signal` will forward ^C (SIGINT) to the main program
Jean Privat [Fri, 20 Mar 2015 02:01:49 +0000 (09:01 +0700)]
lib/std/exec: `signal` will forward ^C (SIGINT) to the main program

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocomp: forward signals instead of exiting
Jean Privat [Fri, 20 Mar 2015 01:55:58 +0000 (08:55 +0700)]
comp: forward signals instead of exiting

Exit status of process distinguishes normal termination `WIFEXITED`
and signal-caused termination `WIFSIGNALED`.
Shells and other commands use this information to handle sub-commands.

Therefore, compiled programs should not, by default, terminate
their signal handler by an `exit` but should rethrow the original signal.

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocompiler: rename `show_backtrace` as `fatal_exit`
Jean Privat [Sat, 21 Mar 2015 03:05:37 +0000 (10:05 +0700)]
compiler: rename `show_backtrace` as `fatal_exit`

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocontrib: intro header_keeper, a cog in the toolchains to generate FFI bindings
Alexis Laferrière [Thu, 19 Mar 2015 15:04:12 +0000 (11:04 -0400)]
contrib: intro header_keeper, a cog in the toolchains to generate FFI bindings

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: lib: add `meta` as a user-level empty shell for meta-classes
Jean Privat [Thu, 19 Mar 2015 05:42:38 +0000 (12:42 +0700)]
Merge: lib: add `meta` as a user-level empty shell for meta-classes

Cleaning from old branches: a small useless meta-level.

The lib define meta-objects as some kind of multiton so you have a specific object to represent each class in the runtime-system (in fact each types because of genericity).

You can even define complex meta-deep hierarchy of meta-classes (with meta-loops).

The only issue is that these meta-objects are empty so basically useless (and meta-useless).

Pull-Request: #1205
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>

9 years agoMerge: contrib/opportunity: prevent null receiver error
Jean Privat [Thu, 19 Mar 2015 05:42:25 +0000 (12:42 +0700)]
Merge: contrib/opportunity: prevent null receiver error

This error crashed the server 52 times in the last month.

Opportunity on xymus.net has already been updated.

Thanks to @isra17 and @ageei exec members for forging broken requests and revealing this problem.

Pull-Request: #1209
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>

9 years agoMerge: Intro NitActivity an Android entry point in pure Nit, Java, and C (almost...
Jean Privat [Thu, 19 Mar 2015 05:42:17 +0000 (12:42 +0700)]
Merge: Intro NitActivity an Android entry point in pure Nit, Java, and C (almost no NDK)

This PR could be described in 3 steps.

* Clean up lib/android and move up `dalvik` in the module hierarchy.
* Intro NitActivity.java (the most important commit)
* Update calculator (only) to use the new NitActivity with all its perks.

See the doc of the nit_activity module for the details on the polyglot implementation, copied hre for your convenience:

This module is implemented in 3 languages:

* The Java code, in `NitActivity.java` acts as the entry point registered
   to the Android OS. It relays most of the Android callbacks to C.
   In theory, there may be more than one instance of `NitActivity` alive at
   a given time. They hold a reference to the corresponding Nit `Activity`
   in the attribute `nitActivity`.

* The C code is defined in the top part of this source file. It acts as a
   glue between Java and Nit by relaying calls between both languages.
   It keeps a global variables reference to the Java VM and the Nit `App`.

* The Nit code defines the `Activity` class with the callbacks from Android.
   The callback methods should be redefined by user modules.

Pull-Request: #1208
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>

9 years agolib: add `meta` as a user-level empty shell for meta-classes
Jean Privat [Thu, 19 Mar 2015 05:40:42 +0000 (12:40 +0700)]
lib: add `meta` as a user-level empty shell for meta-classes

Signed-off-by: Jean Privat <jean@pryen.org>

9 years agocontrib/opportunity: prevent null receiver error
Alexis Laferrière [Wed, 18 Mar 2015 18:57:24 +0000 (14:57 -0400)]
contrib/opportunity: prevent null receiver error

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib/jvm: fix missing import
Alexis Laferrière [Tue, 17 Mar 2015 21:11:54 +0000 (17:11 -0400)]
lib/jvm: fix missing import

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoexamples/calculator: save and load state on request
Alexis Laferrière [Tue, 17 Mar 2015 18:25:41 +0000 (14:25 -0400)]
examples/calculator: save and load state on request

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoexamples/calculator: add services to save and load from Json
Alexis Laferrière [Mon, 26 Jan 2015 01:36:43 +0000 (20:36 -0500)]
examples/calculator: add services to save and load from Json

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoexamples/calculator: update Android UI to latest API
Alexis Laferrière [Mon, 26 Jan 2015 11:58:56 +0000 (06:58 -0500)]
examples/calculator: update Android UI to latest API

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoexamples/calculator: use the new nit_activity
Alexis Laferrière [Tue, 17 Mar 2015 17:01:16 +0000 (13:01 -0400)]
examples/calculator: use the new nit_activity

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoexamples/calculator: Makefile defines the `android-install` rule
Alexis Laferrière [Mon, 16 Mar 2015 18:30:02 +0000 (14:30 -0400)]
examples/calculator: Makefile defines the `android-install` rule

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib/android: update `ui` to use NitActivity and be on the UI thread
Alexis Laferrière [Tue, 27 Jan 2015 22:32:12 +0000 (17:32 -0500)]
lib/android: update `ui` to use NitActivity and be on the UI thread

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib/android: remove popup hack in `ui`
Alexis Laferrière [Mon, 26 Jan 2015 11:04:10 +0000 (06:04 -0500)]
lib/android: remove popup hack in `ui`

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agolib/android: intro our very own NitActivity
Alexis Laferrière [Sun, 3 Aug 2014 00:09:47 +0000 (20:09 -0400)]
lib/android: intro our very own NitActivity

Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

9 years agoMerge: Optimize variable access in the nitvm
Jean Privat [Wed, 18 Mar 2015 09:21:09 +0000 (16:21 +0700)]
Merge: Optimize variable access in the nitvm

The first commit change the way variables are accessed in the vm.

For each method or attribute block (to init them), we recursively go into the AST to find each variable declaration in order to give them a fixed position (in the environment).
This is a small recursion since we only need to go deeper for block constructions.

During execution, the access are made by using this position instead of using the old ```HashMap[Variable, Instance]``` of the interpreter.

The second commit completely replace the frames of the interpreter to avoid allocation of these hashmaps in the virtual machine, the commit is pretty verbose but this is mainly code from the interpreter.

The overall gain is good since the vm is now faster than the interpreter :)

For the small benchmark ```nitvm src/nit.nit tests/base_simple3.nit```, we have 2.9 seconds with nitvm before.
Now, nitvm take 2.67 seconds, 2.83 for niti: 8% better.
The overall gain on a few benchmarks I made are between 5% and little more than 10% but always positive.

Pro: faster
Con: work will be required to maintain the two engines...

Pull-Request: #1184
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: lib/string: `Int::to_s` shortcuts 0 and 1
Jean Privat [Wed, 18 Mar 2015 05:41:48 +0000 (12:41 +0700)]
Merge: lib/string: `Int::to_s` shortcuts 0 and 1

Valgrid said it is used a lot.

So I mixed (`-m`) nitc with the following module

~~~nit
import counter

redef class Int
redef fun to_s
do
sys.itos_cpt.inc(self)
return super
end
end

redef class Sys
var itos_cpt = new Counter[Int]
redef fun run
do
super
itos_cpt.print_summary
itos_cpt.print_elements(10)
end
end
~~~

The result shows that `0` and `1` are the top `to_s`-ized numbers.

~~~
  0: 13554 (9.29%)
  1: 10012 (6.86%)
  2: 5671 (3.88%)
~~~

So I just shortcut-them to reduce allocations.

With nitc/nitc/nitc:
before: 0m6.756s
after: 0m6.632s (-2%)

Pull-Request: #1207
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: Enable tagging of primitive types
Jean Privat [Wed, 18 Mar 2015 05:41:34 +0000 (12:41 +0700)]
Merge: Enable tagging of primitive types

Another old optimization since it was present in PRM, the Australopithecus compiler.

This PR bring back tagging of the primitives types Int, Bool and Char.

Previously, all primitive types where boxed.
It means that when a Bool, or any primitive object, must be manipulated in a polymorphic way (i.e. as an Object in a `val*`), a small box is allocated that contain the value and the reference (the `val*`) points to the box.
The boxes use the layout of real objects (with a pointer to the class table and everything) so that boxes are compatible with the various implementation of OO mechanism, eg `obj->class->vtf[METHODID]` to implement a method invocation.

Basically boxes work like Java auxiliary classes (eg. `Integer`) except that they are fully transparent for the user and, more important, a implementation detail unrelated to the specification of the language.
Therefore, one can provide a different implementation, like tagging, without worrying about breaking the specification and existing programs.

The principle of tagging is that `val*` values are overloaded to store primitive value in addition to genuine pointers to allocated object.
The two low bits of the `val*` (so 4 combinations) is used to distinguish if the value is a real pointer (in this case, bits are 00) or one of the masqueraded common type (Int, Bool and Char).
If it is a pointer there is nothing to do and the value can be used as is.
If it is a primitive value, then the real value is stored in the remaining bits (but shifted).
The trick works because allocated objects are aligned so that pointer of genuine allocated object have always their last two bits at 00.

The advantage of tagging is that this reduces the cost of manipulating primitive values in a polymorphic way, especially this reduce the numerous allocations of short lived boxes that is slow to do and increase the workload of the GC.
By comparison, with tagging, masquerading a Bool as a `val*` is easily done with few bit-to-bit operations.

Unfortunately, tagging is not a panacea since `val*` is not always a real pointer and require specific and additional protection to avoid doing `obj->class` in the case of `obj` is in fact a tagged value.
Therefore tagging add a minimal but systematic overhead to OO mechanisms like calls, type tests and equality tests.

After quick tests, the numbers are encouraging.

For nitc/nitc/nitc:
before: 0m6.796s
after: 0m6.452s (-5%, not that bad)

Benches where run and tagging was either comparable or better than systematic boxing:

![](https://cloud.githubusercontent.com/assets/135828/6656784/b5a38698-cb67-11e4-96a4-c46f7df2331f.png)

Especially `lib/ai/examples/queens.nit` get the best of it with a -20% improvement.
That make sense because it use arrays of integers to model the states of the n-queen problem. And unfortunately arrays are implemented in a homogeneous way where elements are always polymorphic `val*` values.
Once generics and collections are implemented in an heterogeneous way for primitive types, the benefit of tagging should be reevaluated.

Note: funnily, the main commit of the series, the one that implements tagging, is only made of insertions of lines (no deletion or changes) and it only modifies a single file.

Pull-Request: #1206
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: Derive all the things
Jean Privat [Wed, 18 Mar 2015 05:41:23 +0000 (12:41 +0700)]
Merge: Derive all the things

This PR is crazy and inspired by https://github.com/privat/nit/pull/1202#discussion_r26359435
Basically, you will find here some hackish user-level pseudo meta-programming with optional unsafe support from the execution engines trough injection of code in the AST.

The idea is a generalization (and a basic simplification) of the approach or @xymus for serialization.
If fact, there is 2 level of generalizations.

In the compiler, a new phase `deriving` offers a static deriving mechanism. For instance, the annotation `auto_inspect` will implements the `inspect` method with a simple recursive inspection of attributes.

In the standard library, a new module `deriving` offers a general mechanism with a new standard `derive_to_map` method that is expected to dump attributes in a simple HashMap.

This basic low-level method is used to provide user-defined deriving methods.
For instance, the module provide basic derived implementation of `==`, `to_s` and `hash` in pure Nit at the user-level.

Moreover, the compiler phase `deriving` is extended to provide `auto_derive` that statically implements `derive_to_map`

Here an example from the code:

~~~nit
class A
   auto_derive
   super DeriveToS
   var an_int: Int
   var a_string: String
end

var a = new A(5, "five")
assert a.to_s == "an_int:5; a_string:five"
~~~

Pull-Request: #1204
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: Nitunit works with groups and markdown files
Jean Privat [Wed, 18 Mar 2015 05:41:01 +0000 (12:41 +0700)]
Merge: Nitunit works with groups and markdown files

A lot of work but quite straightforward. Nit can be a really nice language when doing maintenance of old code.

The first part ot the PR updates the nitdoc to test documentation of groups (as requested by #1201)
The second part of the PR (I planned to do 2 PR but the second was more easy to do than expected) makes that nitunit can also process sand-alone markdown files (documentation, wiki pages, etc.).

Example:

~~~
-- foo/
   |-- README.md
   `-- foo.nit
~~~

~~~sh
# to test all entities of a module (classes, methods, etc.)
$ nitunit foo/foo.nit
# to test all entities of a group (the group and all its modules)
$ nitunit foo
# to test a given markdown file
$ nitunit foo/README.md
~~~

Close: #1201

Pull-Request: #1203
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

9 years agoMerge: Document Nit Serialization
Jean Privat [Wed, 18 Mar 2015 05:40:51 +0000 (12:40 +0700)]
Merge: Document Nit Serialization

The Nit serialization system did not have any documentation. This is the base to a better documentation.

In a next PR I may make more services of the serializers private. Implementations, such as json_serialization, will need to intrude import serialization. However, the end-user will only see the basic services.

Pull-Request: #1202
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>
Reviewed-by: Philippe Pépos Petitclerc <>
Reviewed-by: Frédéric Vachon <fredvac@gmail.com>