Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Soft-deprecate the use of implicit reliance on NULL-terminated strings. #99806

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

Ivorforce
Copy link
Contributor

@Ivorforce Ivorforce commented Nov 28, 2024

"MVP" of addressing godotengine/godot-proposals#11249. The motivation for this direction are discussed there (and linked issues). This PR does not yet change assumptions about user-supplied strings; NULL termination checks are only avoided for static strings supplied from the codebase.

This change is toggled with the c++-define GODOT_SHOW_STR_DEPRECATIONS (off by default). For unowned string references, StrRange can be used, which avoids allocation overhead. This is already employed in sprintf and operator+ in this PR, because there are a lot of uses of these functions.

This change is as minimal as I could realistically get it to be: ustring has quite a lot of changes, but most other files work exactly as before. This changes when GODOT_SHOW_STR_DEPRECATIONS is toggled: Suddenly, the console explodes into a flurry of warnings, because strlen is used in a place where it may be inappropriate and wastes CPU cycles.

This PR should already slightly improves performance by letting callers pass their string[] as string[] with known lengths, rather than having it recomputed immediately. Every change we will make to get rid of another GODOT_SHOW_STR_DEPRECATIONS deprecation warning will improve the engine speed further. Every function we can make refactor to use StrRange instead of String will reduce allocations and improve engine speed.

Please, participate in lively discussion! I realize merging this is kind of a large ask, especially from a pretty fresh contributor like myself. I tried to make the change as unopinionated as possible, and focused on just improving speed and conditions for future PRs to improve speed further.

Still, I personally think this direction is unavoidable sooner or later, if we want to make the best use of clock cycles for the hard parts elsewhere. Also, i have heard it mentioned a few times that the Godot source code has a side-mission as a learning tool - making computation explicit to avoid accidental promotions and data copies is very important in clean and fast code :)

@Ivorforce Ivorforce requested review from a team as code owners November 28, 2024 19:40
@Ivorforce Ivorforce force-pushed the string-deprecate-null-term branch 15 times, most recently from 1b8e3da to 1cb5c1e Compare November 28, 2024 21:29
@Ivorforce Ivorforce requested a review from a team as a code owner November 28, 2024 21:29
@Mickeon Mickeon added this to the 4.x milestone Nov 28, 2024
@Mickeon
Copy link
Contributor

Mickeon commented Nov 28, 2024

This feels somewhat related to #84680 @Repiteo

@clayjohn
Copy link
Member

Sounds interesting! Can you share the results of your profiling so we have an idea of what kind of performance differential to expect?

@Ivorforce
Copy link
Contributor Author

Sounds interesting! Can you share the results of your profiling so we have an idea of what kind of performance differential to expect?

Will do once I get everything rolling again! It's still stuck between not compiling or causing segfaults, hopefully to resolve soon :)

@clayjohn clayjohn marked this pull request as draft November 28, 2024 22:56
@clayjohn
Copy link
Member

Will do once I get everything rolling again! It's still stuck between not compiling or causing segfaults, hopefully to resolve soon :)

In that case, I've marked this as draft so maintainers aren't poked every time this is updated. Please mark it as ready for review once it's functioning and you are ready for a review

@Ivorforce
Copy link
Contributor Author

I'm putting implementation of this PR on ice.

It was looking very promising, but at the very end implicit conversions to String and StringName prevented the completion of the feature. I've opened godotengine/godot-proposals#11257 and godotengine/godot-proposals#11258 to address the specific issues I was running into.

When some preliminary work has been done, i hope to be able to continue work on this PR.

@Ivorforce Ivorforce force-pushed the string-deprecate-null-term branch 12 times, most recently from 5e802c3 to 691af48 Compare November 29, 2024 17:32
…icitly parse the given string to find its end. Add known-length constructors and explicit from_c_str static methods.
@adamscott
Copy link
Member

Hello @Ivorforce ! I hope you're doing well.

The release team found out that you were updating your PR a lot lately. Could you add a tag in your commit message when CI checks are not needed? (see https://docs.github.com/en/actions/managing-workflow-runs-and-deployments/managing-workflow-runs/skipping-workflow-runs)

It's because each time you push an update, even a tiny one, it triggers full CI checks. 😅

@Ivorforce
Copy link
Contributor Author

Yep, sorry, will do!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants