repl: add more stats and tests; compiler: tcc fixes

pull/2000/head
Delyan Angelov 2019-09-16 00:41:12 +03:00 committed by Alexander Medvednikov
parent ff4ef337da
commit 854de4e7e0
8 changed files with 79 additions and 10 deletions

View File

@ -30,6 +30,9 @@ fn (v V) get_os_cflags() []CFlag {
// format flag
fn (cf &CFlag) format() string {
mut value := cf.value
if cf.name == '-l' && value.len>0 {
return '${cf.name}${value}'.trim_space()
}
// convert to absolute path
if cf.name == '-I' || cf.name == '-L' || value.ends_with('.o') {
value = '"'+os.realpath(value)+'"'

View File

@ -38,12 +38,8 @@ CommonCHeaders = '
#include <sys/wait.h> // os__wait uses wait on nix
#endif
#define EMPTY_STRUCT_DECLARATION
#ifdef _MSC_VER
#define EMPTY_STRUCT_DECLARATION int:0
#endif
#define EMPTY_STRUCT_INITIALIZATION
#define OPTION_CAST(x) (x)
#ifdef _WIN32
@ -65,9 +61,11 @@ CommonCHeaders = '
// MSVC cannot parse some things properly
#undef EMPTY_STRUCT_DECLARATION
#define EMPTY_STRUCT_DECLARATION void *____dummy_variable
#undef EMPTY_STRUCT_INITIALIZATION
#undef OPTION_CAST
#define EMPTY_STRUCT_DECLARATION int ____dummy_variable
#define EMPTY_STRUCT_INITIALIZATION 0
#define OPTION_CAST(x)
#endif

View File

@ -330,7 +330,7 @@ fn (p mut Parser) gen_struct_init(typ string, t Type) bool {
else {
p.gen('($typ) {')
if t.fields.len == 1 && t.fields[0].name == '' && t.fields[0].typ.starts_with('EMPTY_STRUCT_DECLARATION') {
p.gen(' 0 /* v empty struct initialization */ ')
p.gen(' EMPTY_STRUCT_INITIALIZATION ')
}
}
}

View File

@ -5,10 +5,21 @@
- Write the input to be given to REPL
- Add `===output===`
- Write the output expected
### Notes
Keep in mind, that the way V repl works for now, every non empty line
would cause a new recompilation of the entire repl content that was
collected so far.
*Longer REPL files would cause measurably*
*longer recompilation/testing times.*
Also, longer repl files would be slower to debug when they fail,
*It is better to have several smaller files vs one huge REPL file.*
### Example :
```
a := 1
println(a)
===output===
1
1

View File

@ -0,0 +1,16 @@
struct A { mut: v int } struct B { a A } struct C { mut: b B } struct D { mut: c C } struct E { mut: v []int } struct F { e []E }
mut b := B{} b = B{A{2}}
println('b is: ' + b.a.v.str())
mut c := C{} c.b = B{}
mut d := D{} d.c.b = B{}
f := F{[E{[10,20,30]},E{[100,200,300,400]}]}
println('f.e[0].v.len: ${f.e[0].v.len}')
println('f.e[1].v.len: ${f.e[1].v.len}')
===output===
b is: 2
f.e[0].v.len: 3
f.e[1].v.len: 4

View File

@ -0,0 +1,4 @@
struct Empty{} ee := Empty{}
println('OK')
===output===
OK

View File

@ -0,0 +1,30 @@
mut s := 'hello world'
s.len = 0 // Error (field len immutable)
mut a := []string
a.len = 0 // Error (field len immutable)
mut ints := []int
ints.len = 0 // Error (field len immutable)
println('BYE')
===output===
.vrepl_temp.v:2:5: cannot modify immutable field `len` (type `string`)
declare the field with `mut:`
struct string {
mut:
len int
}
.vrepl_temp.v:3:5: cannot modify immutable field `len` (type `array`)
declare the field with `mut:`
struct array {
mut:
len int
}
.vrepl_temp.v:4:8: cannot modify immutable field `len` (type `array`)
declare the field with `mut:`
struct array {
mut:
len int
}
BYE

View File

@ -20,17 +20,24 @@ fn test_the_v_compiler_can_be_invoked() {
fn test_all_v_repl_files() {
options := runner.new_options()
global_start_time := runner.now()
global_start_time := runner.now()
mut total_tests := 0
mut ok_tests := 0
mut failed_tests := 0
for file in options.files {
total_tests++
sticks := runner.now()
fres := runner.run_repl_file(options.wd, options.vexec, file) or {
failed_tests++
assert false
eprintln( runner.tdiff_in_ms(err, sticks) )
continue
}
assert true
println( runner.tdiff_in_ms(fres, sticks) )
ok_tests++
}
println( runner.tdiff_in_ms('<=== total time spent running REPL files', global_start_time) )
println( ' ok, failed, total : ${ok_tests:5d}, ${failed_tests:5d}, ${total_tests:5d}' )
}