On Mon, 29 Jul 2024 09:39:07 GMT, Kevin Walls <kev...@openjdk.org> wrote:
>>> One more thing that's troubling me. (Apologies it's now and not last week.) >>> >>> I was looking at the _filename.value().get() usage and finding it >>> uncomfortable, compared to the previous simple _filename.value() 8-) Harder >>> to remember and to read and understand. Maybe we can avoid the two >>> accessors, it really is just a char*. >>> >>> These additional argument types look like part of the framework which never >>> found an audience: MemorySizeArgument has one usage in >>> CompilationMemoryStatisticDCmd, NanoTimeArgument looks unused -- so the >>> two-accessor usage is only in once place until now? >>> >>> Adding FileArgument as another of these might be the wrong direction, as >>> these classes are so almost redundant. >>> >>> What if we didn't add FileArgument, and kept using <char*> for _filename >>> args/opts: >>> >>> Then in DCmdArgument<char*>::parse_value(), recognise a "FILE" argument >>> type and call Arguments::copy_expand_pid there, to set _value. >>> >>> Just seeing if we can cut down some of the complexity here, as Thomas >>> mentioned, it is already very complex for what it is! >>> >>> (There is also the to_string method which seemed like it would be useful >>> here, but it needs a buffer so is more complex than calling two >>> accessors... Another thing that seems to part of the framework that was >>> never much adopted.) >> >> IMHO for a functional addition we should follow the established pattern. >> Reworking the framework is certainly useful, but I would like it if we could >> get this done first (I intend to use it in other DCmds). >> >> And if we simplify this coding, we should think first about how to do this >> and what to solve. Things that come to mind: >> >> - overuse of template >> - The argument-type-by-template-division and the runtime "type" string >> argument (the third argument to DCmdArgument) seem redundant >> - the fact that we keep command metadata (which should be constant) together >> with command invocation data (values for arguments that are scoped to a >> single command invocation) in a single global structure, and then rewrite >> the latter every time we invoke a command. That is a strange concept and >> makes cleaning up temporary memory non-trivial >> - the fact that each new command takes a ton of boilerplate coding (Just see >> the many many repetitions in diagnosticCommand.cpp) >> - the fact that we use runtime-polymorphy, which is completely fine, but >> then all metadata information are "static". So in order to e.g. know how >> many arguments a command takes, you need to know the command c... > > Thanks Thomas @tstuefe - > > We're agreeing that some of this framework is overly complex, and that we > aren't going to simplify the framework in this change. > > But the more we adopt the obscure parts of the framework, the the harder it > will be to move away from it, so that's the reason for suggesting not > creating the FileArgument class. Use the simpler parts of this machine, with > some special cases where necessary, like a char* argument which happens to be > used for a FILEname (an input filename which gets %p substitution). > > The logic I don't follow is: > Using this complex mechanism because it exists, when it only has one? actual > usage. This seems to contradict the earlier max path len notes where it's > suggested not to use a pattern established by about 140 other usages. > > Apologies Sonia for dragging this out, still really pleased to get this > change happening. Hi @kevinjwalls, I reverted back to `char*` and modified parsing based on the type `FILE`. Really hope this reaches a consensus! ------------- PR Comment: https://git.openjdk.org/jdk/pull/20198#issuecomment-2256698014