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')
 | 
			
		||||
			}
 | 
			
		||||
			if is_mut { 
 | 
			
		||||
				// && !typ2.starts_with('array_') {
 | 
			
		||||
				typ2 += '*'
 | 
			
		||||
			}
 | 
			
		||||
			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 {
 | 
			
		||||
	//if p.fileis('main.v') {
 | 
			
		||||
		//println('index expr typ=$typ')
 | 
			
		||||
	//}
 | 
			
		||||
	// a[0]
 | 
			
		||||
	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_str := typ == 'string'
 | 
			
		||||
	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 ]')
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				if is_ptr { 
 | 
			
		||||
					p.gen('( *($typ*) array__get(* $index_expr) )')
 | 
			
		||||
				}  else { 
 | 
			
		||||
					p.gen('( *($typ*) array__get($index_expr) )')
 | 
			
		||||
				} 
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else if is_str && !p.builtin_pkg {
 | 
			
		||||
			p.gen('string_at($index_expr)')
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -2076,13 +2081,13 @@ fn (p mut Parser) expression() string {
 | 
			
		|||
 | 
			
		||||
fn (p mut Parser) term() string {
 | 
			
		||||
	line_nr := p.scanner.line_nr
 | 
			
		||||
	if p.fileis('fn_test') {
 | 
			
		||||
		println('\nterm() $line_nr')
 | 
			
		||||
	}
 | 
			
		||||
	//if p.fileis('fn_test') {
 | 
			
		||||
		//println('\nterm() $line_nr')
 | 
			
		||||
	//}
 | 
			
		||||
	typ := p.unary()
 | 
			
		||||
	if p.fileis('fn_test') {
 | 
			
		||||
		println('2: $line_nr')
 | 
			
		||||
	}
 | 
			
		||||
	//if p.fileis('fn_test') {
 | 
			
		||||
		//println('2: $line_nr')
 | 
			
		||||
	//}
 | 
			
		||||
	// `*` on a newline? Can't be multiplication, only dereference
 | 
			
		||||
	if p.tok == .mul && line_nr != p.scanner.line_nr {
 | 
			
		||||
		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
 | 
			
		||||
			// the tree (replace `map_keys()` above with `map_key_vals()`) 
 | 
			
		||||
			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`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,24 @@ fn myprint(s string, ..) {
 | 
			
		|||
	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() {
 | 
			
		||||
	// no asserts for now, just test function declarations above 
 | 
			
		||||
} 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue