table: move Type functions to methods
							parent
							
								
									6248899d25
								
							
						
					
					
						commit
						fbcdffbbc8
					
				|  | @ -24,7 +24,7 @@ pub fn (node &FnDecl) str(t &table.Table) string { | |||
| 		sym := t.get_type_symbol(node.receiver.typ) | ||||
| 		name := sym.name.after('.') | ||||
| 		mut m := if node.rec_mut { 'mut ' } else { '' } | ||||
| 		if !node.rec_mut && table.type_is_ptr(node.receiver.typ) { | ||||
| 		if !node.rec_mut && node.receiver.typ.is_ptr() { | ||||
| 			m = '&' | ||||
| 		} | ||||
| 		receiver = '($node.receiver.name $m$name) ' | ||||
|  |  | |||
|  | @ -258,7 +258,7 @@ pub fn (c mut Checker) struct_init(struct_init mut ast.StructInit) table.Type { | |||
| 				if field.name in inited_fields { | ||||
| 					continue | ||||
| 				} | ||||
| 				if table.type_is_ptr(field.typ) { | ||||
| 				if field.typ.is_ptr() { | ||||
| 					c.warn('reference field `${type_sym.name}.${field.name}` must be initialized', | ||||
| 						struct_init.pos) | ||||
| 				} | ||||
|  | @ -478,7 +478,7 @@ pub fn (c mut Checker) call_method(call_expr mut ast.CallExpr) table.Type { | |||
| 		call_expr.return_type = left_type | ||||
| 		if method_name == 'clone' { | ||||
| 			// in ['clone', 'str'] {
 | ||||
| 			call_expr.receiver_type = table.type_to_ptr(left_type) | ||||
| 			call_expr.receiver_type = left_type.to_ptr() | ||||
| 			// call_expr.return_type = call_expr.receiver_type
 | ||||
| 		} else { | ||||
| 			call_expr.receiver_type = left_type | ||||
|  | @ -520,7 +520,7 @@ pub fn (c mut Checker) call_method(call_expr mut ast.CallExpr) table.Type { | |||
| 			} | ||||
| 			arg_typ := c.expr(arg.expr) | ||||
| 			call_expr.args[i].typ = arg_typ | ||||
| 			if method.is_variadic && table.type_is(arg_typ, .variadic) && call_expr.args.len-1 > i  { | ||||
| 			if method.is_variadic && arg_typ.flag_is(.variadic) && call_expr.args.len-1 > i  { | ||||
| 				c.error('when forwarding a varg variable, it must be the final argument', call_expr.pos) | ||||
| 			} | ||||
| 		} | ||||
|  | @ -646,7 +646,7 @@ pub fn (c mut Checker) call_fn(call_expr mut ast.CallExpr) table.Type { | |||
| 		call_expr.args[i].typ = typ | ||||
| 		typ_sym := c.table.get_type_symbol(typ) | ||||
| 		arg_typ_sym := c.table.get_type_symbol(arg.typ) | ||||
| 		if f.is_variadic && table.type_is(typ, .variadic) && call_expr.args.len-1 > i { | ||||
| 		if f.is_variadic && typ.flag_is(.variadic) && call_expr.args.len-1 > i { | ||||
| 			c.error('when forwarding a varg variable, it must be the final argument', call_expr.pos) | ||||
| 		} | ||||
| 		if !c.table.check(typ, arg.typ) { | ||||
|  | @ -673,7 +673,7 @@ pub fn (c mut Checker) call_fn(call_expr mut ast.CallExpr) table.Type { | |||
| pub fn (c mut Checker) check_expr_opt_call(x ast.Expr, xtype table.Type, is_return_used bool) { | ||||
| 	match x { | ||||
| 		ast.CallExpr { | ||||
| 			if table.type_is(it.return_type, .optional) { | ||||
| 			if it.return_type.flag_is(.optional) { | ||||
| 				c.check_or_block(it, xtype, is_return_used) | ||||
| 			} | ||||
| 		} | ||||
|  | @ -771,7 +771,7 @@ pub fn (c mut Checker) selector_expr(selector_expr mut ast.SelectorExpr) table.T | |||
| 	typ_sym := c.table.get_type_symbol(typ) | ||||
| 	field_name := selector_expr.field | ||||
| 	// variadic
 | ||||
| 	if table.type_is(typ, .variadic) { | ||||
| 	if typ.flag_is(.variadic) { | ||||
| 		if field_name == 'len' { | ||||
| 			return table.int_type | ||||
| 		} | ||||
|  | @ -803,7 +803,7 @@ pub fn (c mut Checker) return_stmt(return_stmt mut ast.Return) { | |||
| 	} | ||||
| 	expected_type := c.fn_return_type | ||||
| 	expected_type_sym := c.table.get_type_symbol(expected_type) | ||||
| 	exp_is_optional := table.type_is(expected_type, .optional) | ||||
| 	exp_is_optional := expected_type.flag_is(.optional) | ||||
| 	mut expected_types := [expected_type] | ||||
| 	if expected_type_sym.kind == .multi_return { | ||||
| 		mr_info := expected_type_sym.info as table.MultiReturn | ||||
|  | @ -816,7 +816,7 @@ pub fn (c mut Checker) return_stmt(return_stmt mut ast.Return) { | |||
| 	} | ||||
| 	return_stmt.types = got_types | ||||
| 	// allow `none` & `error (Option)` return types for function that returns optional
 | ||||
| 	if exp_is_optional && table.type_idx(got_types[0]) in [table.none_type_idx, c.table.type_idxs['Option']] { | ||||
| 	if exp_is_optional && got_types[0].idx() in [table.none_type_idx, c.table.type_idxs['Option']] { | ||||
| 		return | ||||
| 	} | ||||
| 	if expected_types.len > 0 && expected_types.len != got_types.len { | ||||
|  | @ -1144,7 +1144,7 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 		ast.ForStmt { | ||||
| 			c.in_for_count++ | ||||
| 			typ := c.expr(it.cond) | ||||
| 			if !it.is_inf && table.type_idx(typ) != table.bool_type_idx { | ||||
| 			if !it.is_inf && typ.idx() != table.bool_type_idx { | ||||
| 				c.error('non-bool used as for condition', it.pos) | ||||
| 			} | ||||
| 			// TODO: update loop var type
 | ||||
|  | @ -1164,9 +1164,9 @@ fn (c mut Checker) stmt(node ast.Stmt) { | |||
| 		ast.ForInStmt { | ||||
| 			c.in_for_count++ | ||||
| 			typ := c.expr(it.cond) | ||||
| 			typ_idx := table.type_idx(typ) | ||||
| 			typ_idx := typ.idx() | ||||
| 			if it.is_range { | ||||
| 				high_type_idx := table.type_idx(c.expr(it.high)) | ||||
| 				high_type_idx := c.expr(it.high).idx() | ||||
| 				if typ_idx in table.integer_type_idxs && high_type_idx !in table.integer_type_idxs { | ||||
| 					c.error('range types do not match', it.cond.position()) | ||||
| 				} else if typ_idx in table.float_type_idxs || high_type_idx in table.float_type_idxs { | ||||
|  | @ -1342,11 +1342,11 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type { | |||
| 		ast.PrefixExpr { | ||||
| 			right_type := c.expr(it.right) | ||||
| 			// TODO: testing ref/deref strategy
 | ||||
| 			if it.op == .amp && !table.type_is_ptr(right_type) { | ||||
| 				return table.type_to_ptr(right_type) | ||||
| 			if it.op == .amp && !right_type.is_ptr() { | ||||
| 				return right_type.to_ptr() | ||||
| 			} | ||||
| 			if it.op == .mul && table.type_is_ptr(right_type) { | ||||
| 				return table.type_deref(right_type) | ||||
| 			if it.op == .mul && right_type.is_ptr() { | ||||
| 				return right_type.deref() | ||||
| 			} | ||||
| 			if it.op == .not && right_type != table.bool_type_idx { | ||||
| 				c.error('! operator can only be used with bool types', it.pos) | ||||
|  | @ -1442,7 +1442,7 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type { | |||
| 					if typ == 0 { | ||||
| 						typ = c.expr(it.expr) | ||||
| 					} | ||||
| 					is_optional := table.type_is(typ, .optional) | ||||
| 					is_optional := typ.flag_is(.optional) | ||||
| 					ident.kind = .variable | ||||
| 					ident.info = ast.IdentVar{ | ||||
| 						typ: typ | ||||
|  | @ -1451,7 +1451,7 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type { | |||
| 					it.typ = typ | ||||
| 					// unwrap optional (`println(x)`)
 | ||||
| 					if is_optional { | ||||
| 						return table.type_set(typ, .unset) | ||||
| 						return typ.set_flag(.unset) | ||||
| 					} | ||||
| 					return typ | ||||
| 				} | ||||
|  | @ -1646,7 +1646,7 @@ pub fn (c mut Checker) if_expr(node mut ast.IfExpr) table.Type { | |||
| 		if i < node.branches.len - 1 || !node.has_else { | ||||
| 			typ_sym := c.table.get_type_symbol(typ) | ||||
| 			// if typ_sym.kind != .bool {
 | ||||
| 			if table.type_idx(typ) != table.bool_type_idx { | ||||
| 			if typ.idx() != table.bool_type_idx { | ||||
| 				c.error('non-bool (`$typ_sym.name`) used as if condition', node.pos) | ||||
| 			} | ||||
| 		} | ||||
|  | @ -1681,7 +1681,7 @@ pub fn (c mut Checker) postfix_expr(node ast.PostfixExpr) table.Type { | |||
| */ | ||||
| 	typ := c.expr(node.expr) | ||||
| 	typ_sym := c.table.get_type_symbol(typ) | ||||
| 	// if !table.is_number(typ) {
 | ||||
| 	// if !typ.is_number() {
 | ||||
| 	if !typ_sym.is_number() { | ||||
| 		println(typ_sym.kind.str()) | ||||
| 		c.error('invalid operation: $node.op.str() (non-numeric type `$typ_sym.name`)', node.pos) | ||||
|  | @ -1712,11 +1712,11 @@ pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type { | |||
| 		// println('index expr left=$typ_sym.name $node.pos.line_nr')
 | ||||
| 		// if typ_sym.kind == .array && (!(table.type_idx(index_type) in table.number_type_idxs) &&
 | ||||
| 		// index_type_sym.kind != .enum_) {
 | ||||
| 		if typ_sym.kind in [.array, .array_fixed] && !(table.is_number(index_type) || index_type_sym.kind == | ||||
| 		if typ_sym.kind in [.array, .array_fixed] && !(index_type.is_number() || index_type_sym.kind == | ||||
| 			.enum_) { | ||||
| 			c.error('non-integer index `$index_type_sym.name` (array type `$typ_sym.name`)', | ||||
| 				node.pos) | ||||
| 		} else if typ_sym.kind == .map && table.type_idx(index_type) != table.string_type_idx { | ||||
| 		} else if typ_sym.kind == .map && index_type.idx() != table.string_type_idx { | ||||
| 			c.error('non-string map index (map type `$typ_sym.name`)', node.pos) | ||||
| 		} | ||||
| 		value_type := c.table.value_type(typ) | ||||
|  | @ -1740,7 +1740,7 @@ pub fn (c mut Checker) index_expr(node mut ast.IndexExpr) table.Type { | |||
| // with this value.
 | ||||
| pub fn (c mut Checker) enum_val(node mut ast.EnumVal) table.Type { | ||||
| 	typ_idx := if node.enum_name == '' { | ||||
| 		table.type_idx(c.expected_type) | ||||
| 		c.expected_type.idx() | ||||
| 	} else {		//
 | ||||
| 		c.table.find_type_idx(node.enum_name) | ||||
| 	} | ||||
|  |  | |||
|  | @ -237,10 +237,10 @@ pub fn (mut g Gen) write_typeof_functions() { | |||
| // V type to C type
 | ||||
| pub fn (mut g Gen) typ(t table.Type) string { | ||||
| 	mut styp := g.base_typ(t) | ||||
| 	if table.type_is(t, .optional) { | ||||
| 	if t.flag_is(.optional) { | ||||
| 		// Register an optional
 | ||||
| 		styp = 'Option_' + styp | ||||
| 		if table.type_is_ptr(t) { | ||||
| 		if t.is_ptr() { | ||||
| 			styp = styp.replace('*', '_ptr') | ||||
| 		} | ||||
| 		if !(styp in g.optionals) { | ||||
|  | @ -254,7 +254,7 @@ pub fn (mut g Gen) typ(t table.Type) string { | |||
| } | ||||
| 
 | ||||
| pub fn (mut g Gen) base_typ(t table.Type) string { | ||||
| 	nr_muls := table.type_nr_muls(t) | ||||
| 	nr_muls := t.nr_muls() | ||||
| 	sym := g.table.get_type_symbol(t) | ||||
| 	mut styp := sym.name.replace('.', '__') | ||||
| 	if nr_muls > 0 { | ||||
|  | @ -615,7 +615,7 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { | |||
| 		// `for num in nums {`
 | ||||
| 		g.writeln('// FOR IN array') | ||||
| 		styp := g.typ(it.val_type) | ||||
| 		cond_type_is_ptr := table.type_is_ptr(it.cond_type) | ||||
| 		cond_type_is_ptr := it.cond_type.is_ptr() | ||||
| 		atmp := g.new_tmp_var() | ||||
| 		atmp_type := if cond_type_is_ptr { 'array *' } else { 'array' } | ||||
| 		g.write('${atmp_type} ${atmp} = ') | ||||
|  | @ -650,7 +650,7 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { | |||
| 		} | ||||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
| 	} else if table.type_is(it.cond_type, .variadic) { | ||||
| 	} else if it.cond_type.flag_is(.variadic) { | ||||
| 		g.writeln('// FOR IN cond_type/variadic') | ||||
| 		i := if it.key_var in ['', '_'] { g.new_tmp_var() } else { it.key_var } | ||||
| 		styp := g.typ(it.cond_type) | ||||
|  | @ -688,7 +688,7 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type, exp_type table.Type) { | |||
| 				got_sym := g.table.get_type_symbol(got_type) | ||||
| 				got_styp := g.typ(got_type) | ||||
| 				exp_styp := g.typ(exp_type) | ||||
| 				got_idx := table.type_idx(got_type) | ||||
| 				got_idx := got_type.idx() | ||||
| 				g.write('/* sum type cast */ ($exp_styp) {.obj = memdup(&(${got_styp}[]) {') | ||||
| 				g.expr(expr) | ||||
| 				g.write('}, sizeof($got_styp)), .typ = $got_idx /* $got_sym.name */}') | ||||
|  | @ -745,7 +745,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { | |||
| 			or_stmts = it.or_block.stmts | ||||
| 			return_type = it.return_type | ||||
| 		} | ||||
| 		is_optional := table.type_is(return_type, .optional) | ||||
| 		is_optional := return_type.flag_is(.optional) | ||||
| 		mr_var_name := 'mr_$assign_stmt.pos.pos' | ||||
| 		mr_styp := g.typ(return_type) | ||||
| 		g.write('$mr_styp $mr_var_name = ') | ||||
|  | @ -802,7 +802,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) { | |||
| 				} | ||||
| 				else {} | ||||
| 			} | ||||
| 			gen_or := is_call && table.type_is(return_type, .optional) | ||||
| 			gen_or := is_call && return_type.flag_is(.optional) | ||||
| 			g.is_assign_rhs = true | ||||
| 			if ident.kind == .blank_ident { | ||||
| 				if is_call { | ||||
|  | @ -893,7 +893,7 @@ fn (mut g Gen) free_scope_vars(pos int) { | |||
| 				// }
 | ||||
| 				v := *it | ||||
| 				sym := g.table.get_type_symbol(v.typ) | ||||
| 				is_optional := table.type_is(v.typ, .optional) | ||||
| 				is_optional := v.typ.flag_is(.optional) | ||||
| 				if sym.kind == .array && !is_optional { | ||||
| 					g.writeln('array_free($v.name); // autofreed') | ||||
| 				} | ||||
|  | @ -966,7 +966,7 @@ fn (mut g Gen) expr(node ast.Expr) { | |||
| 				g.out.go_back(1) | ||||
| 			} | ||||
| 			sym := g.table.get_type_symbol(it.typ) | ||||
| 			if sym.kind == .string && !table.type_is_ptr(it.typ) { | ||||
| 			if sym.kind == .string && !it.typ.is_ptr() { | ||||
| 				// `string(x)` needs `tos()`, but not `&string(x)
 | ||||
| 				// `tos(str, len)`, `tos2(str)`
 | ||||
| 				if it.has_arg { | ||||
|  | @ -1113,8 +1113,8 @@ fn (mut g Gen) expr(node ast.Expr) { | |||
| 		} | ||||
| 		ast.SelectorExpr { | ||||
| 			g.expr(it.expr) | ||||
| 			// if table.type_nr_muls(it.expr_type) > 0 {
 | ||||
| 			if table.type_is_ptr(it.expr_type) { | ||||
| 			// if it.expr_type.nr_muls() > 0 {
 | ||||
| 			if it.expr_type.is_ptr() { | ||||
| 				g.write('->') | ||||
| 			} else { | ||||
| 				// g.write('. /*typ=  $it.expr_type */') // ${g.typ(it.expr_type)} /')
 | ||||
|  | @ -1128,7 +1128,7 @@ fn (mut g Gen) expr(node ast.Expr) { | |||
| 		ast.Type { | ||||
| 			// match sum Type
 | ||||
| 			// g.write('/* Type */')
 | ||||
| 			type_idx := table.type_idx(it.typ) | ||||
| 			type_idx := it.typ.idx() | ||||
| 			sym := g.table.get_type_symbol(it.typ) | ||||
| 			g.write('$type_idx /* $sym.name */') | ||||
| 		} | ||||
|  | @ -1159,7 +1159,7 @@ fn (mut g Gen) typeof_expr(node ast.TypeOf) { | |||
| 	if sym.kind == .sum_type { | ||||
| 		// When encountering a .sum_type, typeof() should be done at runtime,
 | ||||
| 		// because the subtype of the expression may change:
 | ||||
| 		sum_type_idx := table.type_idx(node.expr_type) | ||||
| 		sum_type_idx := node.expr_type.idx() | ||||
| 		g.write('tos3( /* ${sym.name} */ v_typeof_sumtype_${sum_type_idx}( (') | ||||
| 		g.expr(node.expr) | ||||
| 		g.write(').typ ))') | ||||
|  | @ -1207,7 +1207,7 @@ fn (mut g Gen) assign_expr(node ast.AssignExpr) { | |||
| 		} | ||||
| 		else {} | ||||
| 	} | ||||
| 	gen_or := is_call && table.type_is(return_type, .optional) | ||||
| 	gen_or := is_call && return_type.flag_is(.optional) | ||||
| 	tmp_opt := if gen_or { g.new_tmp_var() } else { '' } | ||||
| 	if gen_or { | ||||
| 		rstyp := g.typ(return_type) | ||||
|  | @ -1225,7 +1225,7 @@ fn (mut g Gen) assign_expr(node ast.AssignExpr) { | |||
| 		} | ||||
| 	} else { | ||||
| 		g.is_assign_lhs = true | ||||
| 		if table.type_is(node.right_type, .optional) { | ||||
| 		if node.right_type.flag_is(.optional) { | ||||
| 			g.right_is_opt = true | ||||
| 		} | ||||
| 		mut str_add := false | ||||
|  | @ -1390,8 +1390,7 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) { | |||
| 			g.expr_with_cast(node.right, node.right_type, info.elem_type) | ||||
| 			g.write(' })') | ||||
| 		} | ||||
| 	} else if (node.left_type == node.right_type) && table.is_float(node.left_type) && node.op in | ||||
| 		[.eq, .ne] { | ||||
| 	} else if (node.left_type == node.right_type) && node.left_type.is_float() && node.op in [.eq, .ne] { | ||||
| 		// floats should be compared with epsilon
 | ||||
| 		if node.left_type == table.f64_type_idx { | ||||
| 			if node.op == .eq { | ||||
|  | @ -1687,8 +1686,8 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) { | |||
| 	} | ||||
| 	if !is_range { | ||||
| 		sym := g.table.get_type_symbol(node.left_type) | ||||
| 		left_is_ptr := table.type_is_ptr(node.left_type) | ||||
| 		if table.type_is(node.left_type, .variadic) { | ||||
| 		left_is_ptr := node.left_type.is_ptr() | ||||
| 		if node.left_type.flag_is(.variadic) { | ||||
| 			g.expr(node.left) | ||||
| 			g.write('.args') | ||||
| 			g.write('[') | ||||
|  | @ -1789,7 +1788,7 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) { | |||
| 				g.expr(node.index) | ||||
| 				g.write(', &($elem_type_str[]){ $zero }))') | ||||
| 			} | ||||
| 		} else if sym.kind == .string && !table.type_is_ptr(node.left_type) { | ||||
| 		} else if sym.kind == .string && !node.left_type.is_ptr() { | ||||
| 			g.write('string_at(') | ||||
| 			g.expr(node.left) | ||||
| 			g.write(', ') | ||||
|  | @ -1810,14 +1809,14 @@ fn (mut g Gen) return_statement(node ast.Return) { | |||
| 		g.writeln(' 0;') | ||||
| 		return | ||||
| 	} | ||||
| 	fn_return_is_optional := table.type_is(g.fn_decl.return_type, .optional) | ||||
| 	fn_return_is_optional := g.fn_decl.return_type.flag_is(.optional) | ||||
| 	// multiple returns
 | ||||
| 	if node.exprs.len > 1 { | ||||
| 		g.write(' ') | ||||
| 		// typ_sym := g.table.get_type_symbol(g.fn_decl.return_type)
 | ||||
| 		// mr_info := typ_sym.info as table.MultiReturn
 | ||||
| 		mut styp := '' | ||||
| 		if fn_return_is_optional { // && !table.type_is(node.types[0], .optional) && node.types[0] !=
 | ||||
| 		if fn_return_is_optional { // && !node.types[0].flag_is(.optional) && node.types[0] !=
 | ||||
| 			styp = g.base_typ(g.fn_decl.return_type) | ||||
| 			g.write('opt_ok(&($styp/*X*/[]) { ') | ||||
| 		} else { | ||||
|  | @ -1840,7 +1839,7 @@ fn (mut g Gen) return_statement(node ast.Return) { | |||
| 		g.write(' ') | ||||
| 		return_sym := g.table.get_type_symbol(node.types[0]) | ||||
| 		// `return opt_ok(expr)` for functions that expect an optional
 | ||||
| 		if fn_return_is_optional && !table.type_is(node.types[0], .optional) && return_sym.name != | ||||
| 		if fn_return_is_optional && !node.types[0].flag_is(.optional) && return_sym.name != | ||||
| 			'Option' { | ||||
| 			mut is_none := false | ||||
| 			mut is_error := false | ||||
|  | @ -1865,7 +1864,7 @@ fn (mut g Gen) return_statement(node ast.Return) { | |||
| 			} | ||||
| 			// g.write('/*OPTIONAL*/')
 | ||||
| 		} | ||||
| 		if !table.type_is_ptr(g.fn_decl.return_type) && table.type_is_ptr(node.types[0]) { | ||||
| 		if !g.fn_decl.return_type.is_ptr() && node.types[0].is_ptr() { | ||||
| 			// Automatic Dereference
 | ||||
| 			g.write('*') | ||||
| 		} | ||||
|  | @ -1978,7 +1977,7 @@ fn (mut g Gen) struct_init(struct_init ast.StructInit) { | |||
| 			if field.name in inited_fields { | ||||
| 				continue | ||||
| 			} | ||||
| 			if table.type_is(field.typ, .optional) { | ||||
| 			if field.typ.flag_is(.optional) { | ||||
| 				// TODO handle/require optionals in inits
 | ||||
| 				continue | ||||
| 			} | ||||
|  | @ -2236,7 +2235,7 @@ fn (g Gen) sort_structs(typesa []table.TypeSymbol) []table.TypeSymbol { | |||
| 				for field in info.fields { | ||||
| 					dep := g.table.get_type_symbol(field.typ).name | ||||
| 					// skip if not in types list or already in deps
 | ||||
| 					if !(dep in type_names) || dep in field_deps || table.type_is_ptr(field.typ) { | ||||
| 					if !(dep in type_names) || dep in field_deps || field.typ.is_ptr() { | ||||
| 						continue | ||||
| 					} | ||||
| 					field_deps << dep | ||||
|  | @ -2664,7 +2663,7 @@ fn (g Gen) type_default(typ table.Type) string { | |||
| 		return 'new_map_1(sizeof($value_type_str))' | ||||
| 	} | ||||
| 	// Always set pointers to 0
 | ||||
| 	if table.type_is_ptr(typ) { | ||||
| 	if typ.is_ptr() { | ||||
| 		return '0' | ||||
| 	} | ||||
| 	// User struct defined in another module.
 | ||||
|  |  | |||
|  | @ -52,7 +52,7 @@ fn (mut g Gen) gen_fn_decl(it ast.FnDecl) { | |||
| 	/* | ||||
| 	if it.is_method { | ||||
| 		mut styp := g.typ(it.receiver.typ) | ||||
| 		// if table.type_nr_muls(it.receiver.typ) > 0 {
 | ||||
| 		// if it.receiver.typ.nr_muls() > 0 {
 | ||||
| 		// if it.rec_mut {
 | ||||
| 		// styp += '*'
 | ||||
| 		// }
 | ||||
|  | @ -153,7 +153,7 @@ fn (mut g Gen) fn_args(args []table.Arg, is_variadic bool) { | |||
| 			g.write(arg_type_name) | ||||
| 			g.definitions.write(arg_type_name) | ||||
| 		} else { | ||||
| 			mut nr_muls := table.type_nr_muls(arg.typ) | ||||
| 			mut nr_muls := arg.typ.nr_muls() | ||||
| 			s := arg_type_name + ' ' + arg.name | ||||
| 			if arg.is_mut { | ||||
| 				// mut arg needs one *
 | ||||
|  | @ -235,17 +235,17 @@ fn (mut g Gen) method_call(node ast.CallExpr) { | |||
| 	// g.write('/*expr_type=${g.typ(node.left_type)} rec type=${g.typ(node.receiver_type)}*/')
 | ||||
| 	// }
 | ||||
| 	g.write('${name}(') | ||||
| 	if table.type_is_ptr(node.receiver_type) && !table.type_is_ptr(node.left_type) { | ||||
| 	if node.receiver_type.is_ptr() && !node.left_type.is_ptr() { | ||||
| 		// The receiver is a reference, but the caller provided a value
 | ||||
| 		// Add `&` automatically.
 | ||||
| 		// TODO same logic in call_args()
 | ||||
| 		g.write('&') | ||||
| 	} else if !table.type_is_ptr(node.receiver_type) && table.type_is_ptr(node.left_type) { | ||||
| 	} else if !node.receiver_type.is_ptr() && node.left_type.is_ptr() { | ||||
| 		g.write('/*rec*/*') | ||||
| 	} | ||||
| 	g.expr(node.left) | ||||
| 	is_variadic := node.expected_arg_types.len > 0 && table.type_is(node.expected_arg_types[node.expected_arg_types.len - | ||||
| 		1], .variadic) | ||||
| 	is_variadic := node.expected_arg_types.len > 0 &&  | ||||
| 		node.expected_arg_types[node.expected_arg_types.len -1].flag_is(.variadic) | ||||
| 	if node.args.len > 0 || is_variadic { | ||||
| 		g.write(', ') | ||||
| 	} | ||||
|  | @ -275,7 +275,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { | |||
| 	// will be `0` for `foo()`
 | ||||
| 	if node.left_type != 0 { | ||||
| 		g.expr(node.left) | ||||
| 		if table.type_is_ptr(node.left_type) { | ||||
| 		if node.left_type.is_ptr() { | ||||
| 			g.write('->') | ||||
| 		} else { | ||||
| 			g.write('.') | ||||
|  | @ -319,12 +319,12 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { | |||
| 		typ := node.args[0].typ | ||||
| 		mut styp := g.typ(typ) | ||||
| 		sym := g.table.get_type_symbol(typ) | ||||
| 		if table.type_is_ptr(typ) { | ||||
| 		if typ.is_ptr() { | ||||
| 			styp = styp.replace('*', '') | ||||
| 		} | ||||
| 		mut str_fn_name := styp_to_str_fn_name(styp) | ||||
| 		g.gen_str_for_type(sym, styp, str_fn_name) | ||||
| 		if g.autofree && !table.type_is(typ, .optional) { | ||||
| 		if g.autofree && !typ.flag_is(.optional) { | ||||
| 			// Create a temporary variable so that the value can be freed
 | ||||
| 			tmp := g.new_tmp_var() | ||||
| 			// tmps << tmp
 | ||||
|  | @ -338,7 +338,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { | |||
| 				ast.Ident { true } | ||||
| 				else { false } | ||||
| 			} | ||||
| 			if table.type_is_ptr(typ) && sym.kind != .struct_ { | ||||
| 			if typ.is_ptr() && sym.kind != .struct_ { | ||||
| 				// ptr_str() for pointers
 | ||||
| 				styp = 'ptr' | ||||
| 				str_fn_name = 'ptr_str' | ||||
|  | @ -350,7 +350,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { | |||
| 					// when no var, print string directly
 | ||||
| 					g.write('${print_method}(tos3("') | ||||
| 				} | ||||
| 				if table.type_is_ptr(typ) { | ||||
| 				if typ.is_ptr() { | ||||
| 					// dereference
 | ||||
| 					g.write('*') | ||||
| 				} | ||||
|  | @ -361,7 +361,7 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { | |||
| 				} | ||||
| 			} else { | ||||
| 				g.write('${print_method}(${str_fn_name}(') | ||||
| 				if table.type_is_ptr(typ) && sym.kind == .struct_ { | ||||
| 				if typ.is_ptr() && sym.kind == .struct_ { | ||||
| 					// dereference
 | ||||
| 					g.write('*') | ||||
| 				} | ||||
|  | @ -388,9 +388,9 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { | |||
| } | ||||
| 
 | ||||
| fn (mut g Gen) call_args(args []ast.CallArg, expected_types []table.Type) { | ||||
| 	is_variadic := expected_types.len > 0 && table.type_is(expected_types[expected_types.len - | ||||
| 		1], .variadic) | ||||
| 	is_forwarding_varg := args.len > 0 && table.type_is(args[args.len - 1].typ, .variadic) | ||||
| 	is_variadic := expected_types.len > 0 && | ||||
| 		expected_types[expected_types.len - 1].flag_is(.variadic) | ||||
| 	is_forwarding_varg := args.len > 0 && args[args.len - 1].typ.flag_is(.variadic) | ||||
| 	gen_vargs := is_variadic && !is_forwarding_varg | ||||
| 	mut arg_no := 0 | ||||
| 	for arg in args { | ||||
|  | @ -434,8 +434,8 @@ fn (mut g Gen) call_args(args []ast.CallArg, expected_types []table.Type) { | |||
| 
 | ||||
| [inline] | ||||
| fn (mut g Gen) ref_or_deref_arg(arg ast.CallArg, expected_type table.Type) { | ||||
| 	arg_is_ptr := table.type_is_ptr(expected_type) || table.type_idx(expected_type) in table.pointer_type_idxs | ||||
| 	expr_is_ptr := table.type_is_ptr(arg.typ) || table.type_idx(arg.typ) in table.pointer_type_idxs | ||||
| 	arg_is_ptr := expected_type.is_ptr() || expected_type.idx() in table.pointer_type_idxs | ||||
| 	expr_is_ptr := arg.typ.is_ptr() || arg.typ.idx() in table.pointer_type_idxs | ||||
| 	if arg.is_mut && !arg_is_ptr { | ||||
| 		g.write('&/*mut*/') | ||||
| 	} else if arg_is_ptr && !expr_is_ptr { | ||||
|  |  | |||
|  | @ -765,7 +765,7 @@ fn (g mut JsGen) gen_for_in_stmt(it ast.ForInStmt) { | |||
| 		g.inside_loop = false | ||||
| 		g.stmts(it.stmts) | ||||
| 		g.writeln('}') | ||||
| 	} else if it.kind == .array || table.type_is(it.cond_type, .variadic) { | ||||
| 	} else if it.kind == .array || it.cond_type.flag_is(.variadic) { | ||||
| 		// `for num in nums {`
 | ||||
| 		i := if it.key_var == '' { g.new_tmp_var() } else { it.key_var } | ||||
| 		// styp := g.typ(it.val_type)
 | ||||
|  |  | |||
|  | @ -304,7 +304,7 @@ fn (mut p Parser) fn_args() ([]table.Arg, bool) { | |||
| 			} | ||||
| 			mut arg_type := p.parse_type() | ||||
| 			if is_variadic { | ||||
| 				arg_type = table.type_set(arg_type, .variadic) | ||||
| 				arg_type = arg_type.set_flag(.variadic) | ||||
| 			} | ||||
| 			if p.tok.kind == .comma { | ||||
| 				if is_variadic { | ||||
|  | @ -337,7 +337,7 @@ fn (mut p Parser) fn_args() ([]table.Arg, bool) { | |||
| 			} | ||||
| 			mut typ := p.parse_type() | ||||
| 			if is_variadic { | ||||
| 				typ = table.type_set(typ, .variadic) | ||||
| 				typ = typ.set_flag(.variadic) | ||||
| 			} | ||||
| 			for arg_name in arg_names { | ||||
| 				args << table.Arg{ | ||||
|  |  | |||
|  | @ -118,7 +118,7 @@ fn (mut p Parser) match_expr() ast.MatchExpr { | |||
| 			exprs << expr | ||||
| 			p.scope.register('it', ast.Var{ | ||||
| 				name: 'it' | ||||
| 				typ: table.type_to_ptr(typ) | ||||
| 				typ: typ.to_ptr() | ||||
| 			}) | ||||
| 			// TODO
 | ||||
| 			if p.tok.kind == .comma { | ||||
|  | @ -142,7 +142,7 @@ fn (mut p Parser) match_expr() ast.MatchExpr { | |||
| 				// TODO doesn't work right now
 | ||||
| 				p.scope.register(var_name, ast.Var{ | ||||
| 					name: var_name | ||||
| 					typ: table.type_to_ptr(typ) | ||||
| 					typ: typ.to_ptr() | ||||
| 				}) | ||||
| 				// println(var_name)
 | ||||
| 			} | ||||
|  |  | |||
|  | @ -38,7 +38,7 @@ pub fn (mut p Parser) parse_map_type() table.Type { | |||
| 	key_type := p.parse_type() | ||||
| 	// key_type_sym := p.get_type_symbol(key_type)
 | ||||
| 	// if key_type_sym.kind != .string {
 | ||||
| 	if table.type_idx(key_type) != table.string_type_idx { | ||||
| 	if key_type.idx() != table.string_type_idx { | ||||
| 		p.error('maps can only have string keys for now') | ||||
| 	} | ||||
| 	p.check(.rsbr) | ||||
|  | @ -121,7 +121,7 @@ pub fn (mut p Parser) parse_type() table.Type { | |||
| 	} | ||||
| 	mut typ := p.parse_any_type(is_c, is_js, nr_muls > 0) | ||||
| 	if is_optional { | ||||
| 		typ = table.type_set(typ, .optional) | ||||
| 		typ = typ.set_flag(.optional) | ||||
| 	} | ||||
| 	if nr_muls > 0 { | ||||
| 		typ = table.type_set_nr_muls(typ, nr_muls) | ||||
|  |  | |||
|  | @ -632,7 +632,7 @@ pub fn (mut p Parser) name_expr() ast.Expr { | |||
| 			mut to_typ := p.parse_type() | ||||
| 			if p.is_amp { | ||||
| 				// Handle `&Foo(0)`
 | ||||
| 				to_typ = table.type_to_ptr(to_typ) | ||||
| 				to_typ = to_typ.to_ptr() | ||||
| 			} | ||||
| 			p.check(.lpar) | ||||
| 			mut expr := ast.Expr{} | ||||
|  | @ -640,7 +640,7 @@ pub fn (mut p Parser) name_expr() ast.Expr { | |||
| 			mut has_arg := false | ||||
| 			expr = p.expr(0) | ||||
| 			// TODO, string(b, len)
 | ||||
| 			if p.tok.kind == .comma && table.type_idx(to_typ) == table.string_type_idx { | ||||
| 			if p.tok.kind == .comma && to_typ.idx() == table.string_type_idx { | ||||
| 				p.check(.comma) | ||||
| 				arg = p.expr(0) // len
 | ||||
| 				has_arg = true | ||||
|  | @ -1192,7 +1192,7 @@ fn (mut p Parser) type_decl() ast.TypeDecl { | |||
| 	} | ||||
| 	// type MyType int
 | ||||
| 	parent_type := first_type | ||||
| 	pid := table.type_idx(parent_type) | ||||
| 	pid := parent_type.idx() | ||||
| 	p.table.register_type_symbol(table.TypeSymbol{ | ||||
| 		kind: .alias | ||||
| 		name: p.prepend_mod(name) | ||||
|  |  | |||
|  | @ -46,19 +46,19 @@ pub fn (types []Type) contains(typ Type) bool { | |||
| 
 | ||||
| // return TypeSymbol idx for `t`
 | ||||
| [inline] | ||||
| pub fn type_idx(t Type) int { | ||||
| pub fn (t Type) idx() int { | ||||
| 	return u16(t) & 0xffff | ||||
| } | ||||
| 
 | ||||
| // return nr_muls for `t`
 | ||||
| [inline] | ||||
| pub fn type_nr_muls(t Type) int { | ||||
| pub fn (t Type) nr_muls() int { | ||||
| 	return (int(t) >> 16) & 0xff | ||||
| } | ||||
| 
 | ||||
| // return true if `t` is a pointer (nr_muls>0)
 | ||||
| [inline] | ||||
| pub fn type_is_ptr(t Type) bool { | ||||
| pub fn (t Type) is_ptr() bool { | ||||
| 	return (int(t) >> 16) & 0xff > 0 | ||||
| } | ||||
| 
 | ||||
|  | @ -73,7 +73,7 @@ pub fn type_set_nr_muls(t Type, nr_muls int) Type { | |||
| 
 | ||||
| // increments nr_nuls on `t` and return it
 | ||||
| [inline] | ||||
| pub fn type_to_ptr(t Type) Type { | ||||
| pub fn (t Type) to_ptr() Type { | ||||
| 	nr_muls := (int(t) >> 16) & 0xff | ||||
| 	if nr_muls == 255 { | ||||
| 		panic('type_to_pre: nr_muls is already at max of 255') | ||||
|  | @ -83,7 +83,7 @@ pub fn type_to_ptr(t Type) Type { | |||
| 
 | ||||
| // decrement nr_muls on `t` and return it
 | ||||
| [inline] | ||||
| pub fn type_deref(t Type) Type { | ||||
| pub fn (t Type) deref() Type { | ||||
| 	nr_muls := (int(t) >> 16) & 0xff | ||||
| 	if nr_muls == 0 { | ||||
| 		panic('deref: type `$t` is not a pointer') | ||||
|  | @ -93,19 +93,19 @@ pub fn type_deref(t Type) Type { | |||
| 
 | ||||
| // return the flag that is set on `t`
 | ||||
| [inline] | ||||
| pub fn type_flag(t Type) TypeFlag { | ||||
| pub fn (t Type) flag() TypeFlag { | ||||
| 	return (int(t) >> 24) & 0xff | ||||
| } | ||||
| 
 | ||||
| // set the flag on `t` to `flag` and return it
 | ||||
| [inline] | ||||
| pub fn type_set(t Type, flag TypeFlag) Type { | ||||
| pub fn (t Type) set_flag(flag TypeFlag) Type { | ||||
| 	return (int(flag) << 24) | (((int(t) >> 16) & 0xff) << 16) | (u16(t) & 0xffff) | ||||
| } | ||||
| 
 | ||||
| // return true if the flag set on `t` is `flag`
 | ||||
| [inline] | ||||
| pub fn type_is(t Type, flag TypeFlag) bool { | ||||
| pub fn (t Type) flag_is(flag TypeFlag) bool { | ||||
| 	return (int(t) >> 24) & 0xff == flag | ||||
| } | ||||
| 
 | ||||
|  | @ -131,18 +131,18 @@ pub fn new_type_ptr(idx, nr_muls int) Type { | |||
| } | ||||
| 
 | ||||
| [inline] | ||||
| pub fn is_float(typ Type) bool { | ||||
| 	return type_idx(typ) in float_type_idxs | ||||
| pub fn (typ Type) is_float() bool { | ||||
| 	return typ.idx() in float_type_idxs | ||||
| } | ||||
| 
 | ||||
| [inline] | ||||
| pub fn is_int(typ Type) bool { | ||||
| 	return type_idx(typ) in integer_type_idxs | ||||
| pub fn (typ Type) is_int() bool { | ||||
| 	return typ.idx() in integer_type_idxs | ||||
| } | ||||
| 
 | ||||
| [inline] | ||||
| pub fn is_number(typ Type) bool { | ||||
| 	return type_idx(typ) in number_type_idxs | ||||
| pub fn (typ Type) is_number() bool { | ||||
| 	return typ.idx() in number_type_idxs | ||||
| } | ||||
| 
 | ||||
| pub const ( | ||||
|  | @ -580,11 +580,11 @@ pub fn (table &Table) type_to_str(t Type) string { | |||
| 			res = '[]' + res | ||||
| 		} | ||||
| 	} | ||||
| 	nr_muls := type_nr_muls(t) | ||||
| 	nr_muls := t.nr_muls() | ||||
| 	if nr_muls > 0 { | ||||
| 		res = strings.repeat(`&`, nr_muls) + res | ||||
| 	} | ||||
| 	if type_is(t, .optional) { | ||||
| 	if t.flag_is(.optional) { | ||||
| 		res = '?' + res | ||||
| 	} | ||||
| 	/* | ||||
|  |  | |||
|  | @ -194,7 +194,7 @@ pub fn (t &Table) find_type(name string) ?TypeSymbol { | |||
| [inline] | ||||
| pub fn (t &Table) get_type_symbol(typ Type) &TypeSymbol { | ||||
| 	// println('get_type_symbol $typ')
 | ||||
| 	idx := type_idx(typ) | ||||
| 	idx := typ.idx() | ||||
| 	if idx > 0 { | ||||
| 		return &t.types[idx] | ||||
| 	} | ||||
|  | @ -272,7 +272,7 @@ pub fn (t &Table) known_type(name string) bool { | |||
| [inline] | ||||
| pub fn (t &Table) array_name(elem_type Type, nr_dims int) string { | ||||
| 	elem_type_sym := t.get_type_symbol(elem_type) | ||||
| 	return 'array_${elem_type_sym.name}' + if type_is_ptr(elem_type) { | ||||
| 	return 'array_${elem_type_sym.name}' + if elem_type.is_ptr() { | ||||
| 		'_ptr' | ||||
| 	} else { | ||||
| 		'' | ||||
|  | @ -286,7 +286,7 @@ pub fn (t &Table) array_name(elem_type Type, nr_dims int) string { | |||
| [inline] | ||||
| pub fn (t &Table) array_fixed_name(elem_type Type, size, nr_dims int) string { | ||||
| 	elem_type_sym := t.get_type_symbol(elem_type) | ||||
| 	return 'array_fixed_${elem_type_sym.name}_${size}' + if type_is_ptr(elem_type) { | ||||
| 	return 'array_fixed_${elem_type_sym.name}_${size}' + if elem_type.is_ptr() { | ||||
| 		'_ptr' | ||||
| 	} else { | ||||
| 		'' | ||||
|  | @ -301,7 +301,7 @@ pub fn (t &Table) array_fixed_name(elem_type Type, size, nr_dims int) string { | |||
| pub fn (t &Table) map_name(key_type, value_type Type) string { | ||||
| 	key_type_sym := t.get_type_symbol(key_type) | ||||
| 	value_type_sym := t.get_type_symbol(value_type) | ||||
| 	suffix := if type_is_ptr(value_type) { '_ptr' } else { '' } | ||||
| 	suffix := if value_type.is_ptr() { '_ptr' } else { '' } | ||||
| 	return 'map_${key_type_sym.name}_${value_type_sym.name}' + suffix | ||||
| 	// return 'map_${value_type_sym.name}' + suffix
 | ||||
| } | ||||
|  | @ -413,9 +413,9 @@ pub fn (mut t Table) add_placeholder_type(name string) int { | |||
| [inline] | ||||
| pub fn (t &Table) value_type(typ Type) Type { | ||||
| 	typ_sym := t.get_type_symbol(typ) | ||||
| 	if type_is(typ, .variadic) { | ||||
| 	if typ.flag_is(.variadic) { | ||||
| 		// ...string => string
 | ||||
| 		return type_set(typ, .unset) | ||||
| 		return typ.set_flag(.unset) | ||||
| 	} | ||||
| 	if typ_sym.kind == .array { | ||||
| 		// Check index type
 | ||||
|  | @ -430,17 +430,17 @@ pub fn (t &Table) value_type(typ Type) Type { | |||
| 		info := typ_sym.info as Map | ||||
| 		return info.value_type | ||||
| 	} | ||||
| 	if typ_sym.kind == .string && type_is_ptr(typ) { | ||||
| 	if typ_sym.kind == .string && typ.is_ptr() { | ||||
| 		// (&string)[i] => string
 | ||||
| 		return string_type | ||||
| 	} | ||||
| 	if typ_sym.kind in [.byteptr, .string] { | ||||
| 		return byte_type | ||||
| 	} | ||||
| 	if type_is_ptr(typ) { | ||||
| 	if typ.is_ptr() { | ||||
| 		// byte* => byte
 | ||||
| 		// bytes[0] is a byte, not byte*
 | ||||
| 		return type_deref(typ) | ||||
| 		return typ.deref() | ||||
| 	} | ||||
| 	// TODO: remove when map_string is removed
 | ||||
| 	if typ_sym.name == 'map_string' { | ||||
|  | @ -450,10 +450,10 @@ pub fn (t &Table) value_type(typ Type) Type { | |||
| } | ||||
| 
 | ||||
| pub fn (t &Table) check(got, expected Type) bool { | ||||
| 	got_idx := type_idx(got) | ||||
| 	exp_idx := type_idx(expected) | ||||
| 	// got_is_ptr := type_is_ptr(got)
 | ||||
| 	exp_is_ptr := type_is_ptr(expected) | ||||
| 	got_idx := got.idx() | ||||
| 	exp_idx := expected.idx() | ||||
| 	// got_is_ptr := got.is_ptr()
 | ||||
| 	exp_is_ptr := expected.is_ptr() | ||||
| 	// println('check: $got_type_sym.name, $exp_type_sym.name')
 | ||||
| 	// # NOTE: use idxs here, and symbols below for perf
 | ||||
| 	if got_idx == none_type_idx { | ||||
|  | @ -504,7 +504,7 @@ pub fn (t &Table) check(got, expected Type) bool { | |||
| 	// }
 | ||||
| 	if got_type_sym.kind == .array_fixed && exp_type_sym.kind == .byteptr { | ||||
| 		info := got_type_sym.info as ArrayFixed | ||||
| 		if type_idx(info.elem_type) == byte_type_idx { | ||||
| 		if info.elem_type.idx() == byte_type_idx { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue