[PATCH] D17499: [ELF] - replaced std::function with raw pointers in LinkerScript.cpp
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 22 14:26:01 PST 2016
On Mon, Feb 22, 2016 at 2:08 AM, George Rimar <grimar at accesssoftek.com>
wrote:
> grimar created this revision.
> grimar added reviewers: dblaikie, ruiu, rafael.
> grimar added subscribers: llvm-commits, grimar.
>
> Little change as was proposed by David Blaikie.
>
> Rui, Rafal, what do you think ?
>
>
> http://reviews.llvm.org/D17499
>
> Files:
> ELF/LinkerScript.cpp
>
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -83,21 +83,11 @@
> }
>
> class elf2::ScriptParser {
> + typedef void (ScriptParser::*CmdHandler)();
>
I'd name just Handler.
> +
> public:
> ScriptParser(BumpPtrAllocator *A, StringRef S, bool B)
> - : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {
> - Cmd["ENTRY"] = std::mem_fn(&ScriptParser::readEntry);
> - Cmd["EXTERN"] = std::mem_fn(&ScriptParser::readExtern);
> - Cmd["GROUP"] = std::mem_fn(&ScriptParser::readGroup);
> - Cmd["INCLUDE"] = std::mem_fn(&ScriptParser::readInclude);
> - Cmd["INPUT"] = std::mem_fn(&ScriptParser::readGroup);
> - Cmd["OUTPUT"] = std::mem_fn(&ScriptParser::readOutput);
> - Cmd["OUTPUT_ARCH"] = std::mem_fn(&ScriptParser::readOutputArch);
> - Cmd["OUTPUT_FORMAT"] = std::mem_fn(&ScriptParser::readOutputFormat);
> - Cmd["SEARCH_DIR"] = std::mem_fn(&ScriptParser::readSearchDir);
> - Cmd["SECTIONS"] = std::mem_fn(&ScriptParser::readSections);
> - Cmd[";"] = [](ScriptParser &) {};
> - }
> + : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {}
>
> void run();
>
> @@ -127,7 +117,18 @@
>
> StringSaver Saver;
> std::vector<StringRef> Tokens;
> - llvm::StringMap<std::function<void(ScriptParser &)>> Cmd;
> + llvm::StringMap<CmdHandler> Cmd{
> + {"ENTRY", &ScriptParser::readEntry},
> + {"EXTERN", &ScriptParser::readExtern},
> + {"GROUP", &ScriptParser::readGroup},
> + {"INCLUDE", &ScriptParser::readInclude},
> + {"INPUT", &ScriptParser::readGroup},
> + {"OUTPUT", &ScriptParser::readOutput},
> + {"OUTPUT_ARCH", &ScriptParser::readOutputArch},
> + {"OUTPUT_FORMAT", &ScriptParser::readOutputFormat},
> + {"SEARCH_DIR", &ScriptParser::readSearchDir},
> + {"SECTIONS", &ScriptParser::readSections},
> + {";", nullptr}};
>
I think adding a nullptr is too subtle. Can you define readNothing and use
that as a handler for ';'?
> size_t Pos = 0;
> bool IsUnderSysroot;
> bool Error = false;
> @@ -138,8 +139,9 @@
> StringRef Tok = next();
> auto It = Cmd.find(Tok);
> if (It != Cmd.end()) {
> - std::function<void(ScriptParser &)> &Handler = It->second;
> - Handler(*this);
> + CmdHandler Handler = It->second;
> + if (Handler)
> + (this->*Handler)();
>
Then you can do
if (Handler Fn = Cmd.lookup(Tok))
(this->*Fn)();
else
setError("unknown directive "...);
> } else {
> setError("unknown directive: " + Tok);
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160222/92b1e79b/attachment.html>
More information about the llvm-commits
mailing list