checker,cgen: use faster `sym.idx == ast.error_type_idx` integer comparisons, instead of `sym.name == "IError"`

pull/14006/head
Delyan Angelov 2022-04-12 14:19:10 +03:00
parent 62032c43db
commit 4c7cdd2a2d
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
4 changed files with 10 additions and 7 deletions

View File

@ -87,8 +87,8 @@ pub fn (mut c Checker) check_types(got ast.Type, expected ast.Type) bool {
}
if expected.has_flag(.optional) {
sym := c.table.sym(got)
if (sym.kind == .interface_ && sym.name == 'IError')
|| got in [ast.none_type, ast.error_type] {
if sym.idx == ast.error_type_idx || got in [ast.none_type, ast.error_type] {
// IErorr
return true
} else if !c.check_basic(got, expected.clear_flag(.optional)) {
return false

View File

@ -1375,7 +1375,8 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to
method := c.table.find_method_with_embeds(typ_sym, imethod.name) or {
// >> Hack to allow old style custom error implementations
// TODO: remove once deprecation period for `IError` methods has ended
if inter_sym.name == 'IError' && (imethod.name == 'msg' || imethod.name == 'code') {
if inter_sym.idx == ast.error_type_idx
&& (imethod.name == 'msg' || imethod.name == 'code') {
c.note("`$styp` doesn't implement method `$imethod.name` of interface `$inter_sym.name`. The usage of fields is being deprecated in favor of methods.",
pos)
continue
@ -1421,7 +1422,8 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to
if utyp != ast.voidptr_type {
// >> Hack to allow old style custom error implementations
// TODO: remove once deprecation period for `IError` methods has ended
if inter_sym.name == 'IError' && (ifield.name == 'msg' || ifield.name == 'code') {
if inter_sym.idx == ast.error_type_idx
&& (ifield.name == 'msg' || ifield.name == 'code') {
// do nothing, necessary warnings are already printed
} else {
// <<

View File

@ -2046,7 +2046,7 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
g.write('.msg))')
return
}
if got_sym.kind == .none_ && exp_sym.name == 'IError' {
if got_sym.kind == .none_ && exp_sym.idx == ast.error_type_idx {
g.expr(expr)
return
}
@ -5488,7 +5488,7 @@ static inline __shared__$interface_name ${shared_fn_name}(__shared__$cctype* x)
// >> Hack to allow old style custom error implementations
// TODO: remove once deprecation period for `IError` methods has ended
// fix MSVC not handling empty struct inits
if methods.len == 0 && interface_name == 'IError' {
if methods.len == 0 && isym.idx == ast.error_type_idx {
methods_struct.writeln('\t\t._method_msg = NULL,')
methods_struct.writeln('\t\t._method_code = NULL,')
}

View File

@ -153,7 +153,8 @@ fn (mut g Gen) match_expr_sumtype(node ast.MatchExpr, is_expr bool, cond_var str
typ := branch.exprs[sumtype_index] as ast.TypeNode
branch_sym := g.table.sym(g.unwrap_generic(typ.typ))
g.write('${dot_or_ptr}_typ == _${sym.cname}_${branch_sym.cname}_index')
} else if branch.exprs[sumtype_index] is ast.None && sym.name == 'IError' {
} else if branch.exprs[sumtype_index] is ast.None
&& sym.idx == ast.error_type_idx {
g.write('${dot_or_ptr}_typ == _IError_None___index')
}
}