core.demangle: refactor errMsg assignment to a function (#16132)

This commit is contained in:
Dennis 2024-02-01 17:55:24 +01:00 committed by GitHub
parent 1a28bc9a50
commit c5c4def18f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -507,17 +507,20 @@ pure @safe:
if (r) return; if (r) return;
} }
void error(string msg)
{
errMsg = msg;
}
if ( front == 'Q' ) if ( front == 'Q' )
{ {
// back reference to LName // back reference to LName
auto refPos = pos; auto refPos = pos;
popFront(); popFront();
size_t n = decodeBackref(); size_t n = decodeBackref();
if ( !n || n > refPos ) if (!n || n > refPos)
{ return error("Invalid LName back reference");
errMsg = "Invalid LName back reference";
return;
}
if ( !mute ) if ( !mute )
{ {
auto savePos = pos; auto savePos = pos;
@ -531,10 +534,7 @@ pure @safe:
bool err_flag; bool err_flag;
auto n = decodeNumber(err_flag); auto n = decodeNumber(err_flag);
if (err_flag) if (err_flag)
{ return error("Number overflow");
errMsg = "Number overflow";
return;
}
if ( n == 0 ) if ( n == 0 )
{ {
@ -542,22 +542,15 @@ pure @safe:
return; return;
} }
if ( n > buf.length || n > buf.length - pos ) if ( n > buf.length || n > buf.length - pos )
{ return error("LName must be at least 1 character");
errMsg = "LName must be at least 1 character";
return;
}
if ( '_' != front && !isAlpha( front ) ) if ( '_' != front && !isAlpha( front ) )
{ return error("Invalid character in LName");
errMsg = "Invalid character in LName";
return;
}
foreach (char e; buf[pos + 1 .. pos + n] ) foreach (char e; buf[pos + 1 .. pos + n] )
{ {
if ( '_' != e && !isAlpha( e ) && !isDigit( e ) ) if ( '_' != e && !isAlpha( e ) && !isDigit( e ) )
{ return error("Invalid character in LName");
errMsg = "Invalid character in LName";
return;
}
} }
put( buf[pos .. pos + n] ); put( buf[pos .. pos + n] );
@ -2321,6 +2314,11 @@ char[] reencodeMangled(return scope const(char)[] mangled) nothrow pure @safe
bool parseLName(out string errMsg, scope ref Remangle d) scope @trusted nothrow bool parseLName(out string errMsg, scope ref Remangle d) scope @trusted nothrow
{ {
bool error(string msg)
{
errMsg = msg;
return false;
}
flushPosition(d); flushPosition(d);
auto reslen = result.length; auto reslen = result.length;
@ -2334,10 +2332,8 @@ char[] reencodeMangled(return scope const(char)[] mangled) nothrow pure @safe
d.popFront(); d.popFront();
size_t n = d.decodeBackref(); size_t n = d.decodeBackref();
if (!n || n > refpos) if (!n || n > refpos)
{ return error("invalid back reference");
errMsg = "invalid back reference";
return false;
}
auto savepos = d.pos; auto savepos = d.pos;
scope(exit) d.pos = savepos; scope(exit) d.pos = savepos;
size_t srcpos = refpos - n; size_t srcpos = refpos - n;
@ -2345,23 +2341,16 @@ char[] reencodeMangled(return scope const(char)[] mangled) nothrow pure @safe
bool errStatus; bool errStatus;
auto idlen = d.decodeNumber(errStatus); auto idlen = d.decodeNumber(errStatus);
if (errStatus) if (errStatus)
{ return error("invalid number");
errMsg = "invalid number";
return false;
}
if (d.pos + idlen > d.buf.length) if (d.pos + idlen > d.buf.length)
{ return error("invalid back reference");
errMsg = "invalid back reference";
return false;
}
auto id = d.buf[d.pos .. d.pos + idlen]; auto id = d.buf[d.pos .. d.pos + idlen];
auto pid = id in idpos; auto pid = id in idpos;
if (!pid) if (!pid)
{ return error("invalid back reference");
errMsg = "invalid back reference";
return false;
}
npos = positionInResult(*pid); npos = positionInResult(*pid);
} }
encodeBackref(reslen - npos); encodeBackref(reslen - npos);
@ -2373,16 +2362,11 @@ char[] reencodeMangled(return scope const(char)[] mangled) nothrow pure @safe
bool errStatus; bool errStatus;
auto n = d.decodeNumber(errStatus); auto n = d.decodeNumber(errStatus);
if (errStatus) if (errStatus)
{ return error("invalid number");
errMsg = "invalid number";
return false;
}
if (!n || n > d.buf.length || n > d.buf.length - d.pos) if (!n || n > d.buf.length || n > d.buf.length - d.pos)
{ return error("LName too short or too long");
errMsg = "LName too shot or too long";
return false;
}
auto id = d.buf[d.pos .. d.pos + n]; auto id = d.buf[d.pos .. d.pos + n];
d.pos += n; d.pos += n;
if (auto pid = id in idpos) if (auto pid = id in idpos)