Like
8f1791c61, this fixes a case of implicitly casting away
const by not treating the result of strrchr() on a const pointer
as const. This was missed at the time because the machines
reporting those warnings weren't building with --with-llvm.
While here, clean up another infelicity: in the probably-
impossible case that the input string contains only one dot,
this function would call pnstrdup() with a length of -1
and thereby emit a module name equal to the function name.
It seems to me we should emit modname = NULL instead.
Also remove a useless Assert and two redundant assignments.
Back-patch, as
8f1791c61 was, so that users of back branches
don't see this warning when building with late-model gcc.
Reported-by: hubert depesz lubaczewski <depesz@depesz.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/aiGNJ89PBqvq2Yyz@depesz.com
Backpatch-through: 14
void
llvm_split_symbol_name(const char *name, char **modname, char **funcname)
{
- *modname = NULL;
- *funcname = NULL;
-
/*
* Module function names are pgextern.$module.$funcname
*/
* Symbol names cannot contain a ., therefore we can split based on
* first and last occurrence of one.
*/
- *funcname = rindex(name, '.');
- (*funcname)++; /* jump over . */
-
- *modname = pnstrdup(name + strlen("pgextern."),
- *funcname - name - strlen("pgextern.") - 1);
- Assert(funcname);
+ const char *lastdot;
- *funcname = pstrdup(*funcname);
+ name += strlen("pgextern.");
+ lastdot = strrchr(name, '.');
+ if (lastdot)
+ {
+ *modname = pnstrdup(name, lastdot - name);
+ *funcname = pstrdup(lastdot + 1);
+ }
+ else
+ {
+ /* hmm, no second dot? */
+ *modname = NULL;
+ *funcname = pstrdup(name);
+ }
}
else
{