fix mutable array args
							parent
							
								
									32aae80a64
								
							
						
					
					
						commit
						7ea688aa43
					
				| 
						 | 
					@ -632,7 +632,6 @@ fn (p mut Parser) fn_args(f mut Fn) {
 | 
				
			||||||
				p.error('fn_args: unknown type $typ2')
 | 
									p.error('fn_args: unknown type $typ2')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if is_mut { 
 | 
								if is_mut { 
 | 
				
			||||||
				// && !typ2.starts_with('array_') {
 | 
					 | 
				
			||||||
				typ2 += '*'
 | 
									typ2 += '*'
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			v := Var {
 | 
								v := Var {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1736,11 +1736,12 @@ fn (p mut Parser) dot(str_typ string, method_ph int) string {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (p mut Parser) index_expr(typ string, fn_ph int) string {
 | 
					fn (p mut Parser) index_expr(typ string, fn_ph int) string {
 | 
				
			||||||
	//if p.fileis('main.v') {
 | 
					 | 
				
			||||||
		//println('index expr typ=$typ')
 | 
					 | 
				
			||||||
	//}
 | 
					 | 
				
			||||||
	// a[0]
 | 
						// a[0]
 | 
				
			||||||
	v := p.expr_var
 | 
						v := p.expr_var
 | 
				
			||||||
 | 
						//if p.fileis('fn_test.v') {
 | 
				
			||||||
 | 
							//println('index expr typ=$typ')
 | 
				
			||||||
 | 
							//println(v.name) 
 | 
				
			||||||
 | 
						//}
 | 
				
			||||||
	is_map := typ.starts_with('map_')
 | 
						is_map := typ.starts_with('map_')
 | 
				
			||||||
	is_str := typ == 'string'
 | 
						is_str := typ == 'string'
 | 
				
			||||||
	is_arr0 := typ.starts_with('array_')
 | 
						is_arr0 := typ.starts_with('array_')
 | 
				
			||||||
| 
						 | 
					@ -1912,9 +1913,13 @@ fn (p mut Parser) index_expr(typ string, fn_ph int) string {
 | 
				
			||||||
				p.gen('$index_expr ]')
 | 
									p.gen('$index_expr ]')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else {
 | 
								else {
 | 
				
			||||||
 | 
									if is_ptr { 
 | 
				
			||||||
 | 
										p.gen('( *($typ*) array__get(* $index_expr) )')
 | 
				
			||||||
 | 
									}  else { 
 | 
				
			||||||
					p.gen('( *($typ*) array__get($index_expr) )')
 | 
										p.gen('( *($typ*) array__get($index_expr) )')
 | 
				
			||||||
				} 
 | 
									} 
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		else if is_str && !p.builtin_pkg {
 | 
							else if is_str && !p.builtin_pkg {
 | 
				
			||||||
			p.gen('string_at($index_expr)')
 | 
								p.gen('string_at($index_expr)')
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -2076,13 +2081,13 @@ fn (p mut Parser) expression() string {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (p mut Parser) term() string {
 | 
					fn (p mut Parser) term() string {
 | 
				
			||||||
	line_nr := p.scanner.line_nr
 | 
						line_nr := p.scanner.line_nr
 | 
				
			||||||
	if p.fileis('fn_test') {
 | 
						//if p.fileis('fn_test') {
 | 
				
			||||||
		println('\nterm() $line_nr')
 | 
							//println('\nterm() $line_nr')
 | 
				
			||||||
	}
 | 
						//}
 | 
				
			||||||
	typ := p.unary()
 | 
						typ := p.unary()
 | 
				
			||||||
	if p.fileis('fn_test') {
 | 
						//if p.fileis('fn_test') {
 | 
				
			||||||
		println('2: $line_nr')
 | 
							//println('2: $line_nr')
 | 
				
			||||||
	}
 | 
						//}
 | 
				
			||||||
	// `*` on a newline? Can't be multiplication, only dereference
 | 
						// `*` on a newline? Can't be multiplication, only dereference
 | 
				
			||||||
	if p.tok == .mul && line_nr != p.scanner.line_nr {
 | 
						if p.tok == .mul && line_nr != p.scanner.line_nr {
 | 
				
			||||||
		return typ
 | 
							return typ
 | 
				
			||||||
| 
						 | 
					@ -3117,13 +3122,6 @@ fn (p mut Parser) for_st() {
 | 
				
			||||||
			// TODO don't call map_get() for each key, fetch values while traversing
 | 
								// TODO don't call map_get() for each key, fetch values while traversing
 | 
				
			||||||
			// the tree (replace `map_keys()` above with `map_key_vals()`) 
 | 
								// the tree (replace `map_keys()` above with `map_key_vals()`) 
 | 
				
			||||||
			p.genln('$var_typ $val = $def; map_get($tmp, $i, & $val);') 
 | 
								p.genln('$var_typ $val = $def; map_get($tmp, $i, & $val);') 
 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			/* 
 | 
					 | 
				
			||||||
			p.genln('for (int l = 0; l < $tmp . entries.len; l++) {') 
 | 
					 | 
				
			||||||
			p.genln('Entry entry = *((Entry*) (array__get($tmp .entries, l)));') 
 | 
					 | 
				
			||||||
			p.genln('string $i = entry.key;') 
 | 
					 | 
				
			||||||
			p.genln('$var_typ $val; map_get($tmp, $i, & $val);') 
 | 
					 | 
				
			||||||
			*/ 
 | 
					 | 
				
			||||||
		} 
 | 
							} 
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// `for val in vals`
 | 
						// `for val in vals`
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +63,24 @@ fn myprint(s string, ..) {
 | 
				
			||||||
	println('/* /* comment */ */')
 | 
						println('/* /* comment */ */')
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn modify_array(a mut []int) {
 | 
				
			||||||
 | 
						a[0] = 10 
 | 
				
			||||||
 | 
						for i in 0..a.len {
 | 
				
			||||||
 | 
							a[i] = a[i] * 2
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						a << 888 
 | 
				
			||||||
 | 
					} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_mut() {
 | 
				
			||||||
 | 
						mut nums := [1, 2, 3] 
 | 
				
			||||||
 | 
						modify_array(mut nums) 
 | 
				
			||||||
 | 
						assert nums.len == 4 
 | 
				
			||||||
 | 
						assert nums[0] == 20 
 | 
				
			||||||
 | 
						assert nums[1] == 4
 | 
				
			||||||
 | 
						assert nums[2] == 6 
 | 
				
			||||||
 | 
						assert nums[3] == 888 
 | 
				
			||||||
 | 
					} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn test_fns() {
 | 
					fn test_fns() {
 | 
				
			||||||
	// no asserts for now, just test function declarations above 
 | 
						// no asserts for now, just test function declarations above 
 | 
				
			||||||
} 
 | 
					} 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue