move array filter codegen to comptime.v
							parent
							
								
									d501dc4c11
								
							
						
					
					
						commit
						c355e967ad
					
				| 
						 | 
				
			
			@ -318,3 +318,43 @@ fn (p mut Parser) gen_struct_str(typ Type) {
 | 
			
		|||
	// This function will get parsee by V after the main pass.
 | 
			
		||||
	p.cgen.fns << 'string ${typ.name}_str();'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn (p mut Parser) gen_array_filter(str_typ string, method_ph int) {
 | 
			
		||||
	/*
 | 
			
		||||
		// V
 | 
			
		||||
		a := [1,2,3,4]
 | 
			
		||||
		b := a.filter(it % 2 == 0)
 | 
			
		||||
		
 | 
			
		||||
		// C
 | 
			
		||||
		array_int a = ...;
 | 
			
		||||
		array_int tmp2 = new_array(0, 4, 4);
 | 
			
		||||
		for (int i = 0; i < a.len; i++) {
 | 
			
		||||
			int it = ((int*)a.data)[i];
 | 
			
		||||
			if (it % 2 == 0) array_push(&tmp2, &it);
 | 
			
		||||
		}
 | 
			
		||||
		array_int b = tmp2;
 | 
			
		||||
	*/
 | 
			
		||||
	val_type:=str_typ.right(6)
 | 
			
		||||
	p.open_scope()
 | 
			
		||||
	p.register_var(Var{
 | 
			
		||||
		name: 'it'
 | 
			
		||||
		typ: val_type
 | 
			
		||||
	})
 | 
			
		||||
	p.next()
 | 
			
		||||
	p.check(.lpar)
 | 
			
		||||
	p.cgen.resetln('')
 | 
			
		||||
	tmp := p.get_tmp()
 | 
			
		||||
	a := p.expr_var.name
 | 
			
		||||
	p.cgen.set_placeholder(method_ph,'\n$str_typ $tmp = new_array(0, $a .len,sizeof($val_type));\n')
 | 
			
		||||
	p.genln('for (int i = 0; i < ${a}.len; i++) {')
 | 
			
		||||
	p.genln('$val_type it = (($val_type*)${a}.data)[i];')
 | 
			
		||||
	p.gen('if (')
 | 
			
		||||
	p.bool_expression()
 | 
			
		||||
	p.genln(') array_push(&$tmp, &it);')
 | 
			
		||||
	//p.genln(') array_push(&$tmp, &((($val_type*)${a}.data)[i]));')
 | 
			
		||||
	//p.genln(') array_push(&$tmp, ${a}.data + i * ${a}.element_size);')
 | 
			
		||||
	p.genln('}')
 | 
			
		||||
	p.gen(tmp) // TODO why does this `gen()` work?
 | 
			
		||||
	p.check(.rpar)
 | 
			
		||||
	p.close_scope()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2105,43 +2105,7 @@ fn (p mut Parser) dot(str_typ_ string, method_ph int) string {
 | 
			
		|||
	}
 | 
			
		||||
	field_name := p.lit
 | 
			
		||||
	if field_name == 'filter' && str_typ.starts_with('array_') {
 | 
			
		||||
		/*
 | 
			
		||||
			// V
 | 
			
		||||
			a := [1,2,3,4]
 | 
			
		||||
			b := a.filter(it % 2 == 0)
 | 
			
		||||
			
 | 
			
		||||
			// C
 | 
			
		||||
			array_int a = ...;
 | 
			
		||||
			array_int tmp2 = new_array(0, 4, 4);
 | 
			
		||||
			for (int i = 0; i < a.len; i++) {
 | 
			
		||||
				int it = ((int*)a.data)[i];
 | 
			
		||||
				if (it % 2 == 0) array_push(&tmp2, &it);
 | 
			
		||||
			}
 | 
			
		||||
			array_int b = tmp2;
 | 
			
		||||
		*/
 | 
			
		||||
		val_type:=str_typ.right(6)
 | 
			
		||||
		p.open_scope()
 | 
			
		||||
		p.register_var(Var{
 | 
			
		||||
			name: 'it'
 | 
			
		||||
			typ: val_type
 | 
			
		||||
		})
 | 
			
		||||
		p.next()
 | 
			
		||||
		p.check(.lpar)
 | 
			
		||||
		p.cgen.resetln('')
 | 
			
		||||
		tmp := p.get_tmp()
 | 
			
		||||
		a := p.expr_var.name
 | 
			
		||||
		p.cgen.set_placeholder(method_ph,'\n$str_typ $tmp = new_array(0, $a .len,sizeof($val_type));\n')
 | 
			
		||||
		p.genln('for (int i = 0; i < ${a}.len; i++) {')
 | 
			
		||||
		p.genln('$val_type it = (($val_type*)${a}.data)[i];')
 | 
			
		||||
		p.gen('if (')
 | 
			
		||||
		p.bool_expression()
 | 
			
		||||
		p.genln(') array_push(&$tmp, &it);')
 | 
			
		||||
		//p.genln(') array_push(&$tmp, &((($val_type*)${a}.data)[i]));')
 | 
			
		||||
		//p.genln(') array_push(&$tmp, ${a}.data + i * ${a}.element_size);')
 | 
			
		||||
		p.genln('}')
 | 
			
		||||
		p.gen(tmp) // TODO why does this `gen()` work?
 | 
			
		||||
		p.check(.rpar)
 | 
			
		||||
		p.close_scope()
 | 
			
		||||
		p.gen_array_filter(str_typ, method_ph)
 | 
			
		||||
		return str_typ
 | 
			
		||||
	}	
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue