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

Fix ks-opaque-types: true and duplicate warnings if imports are used #267

Merged
merged 1 commit into from
Mar 7, 2024

Conversation

generalmimon
Copy link
Member

@generalmimon generalmimon commented Mar 4, 2024

Fixes kaitai-io/kaitai_struct#295

Fixes duplication of warnings and non-fatal errors as shown in kaitai-io/kaitai_struct#1063

The existing code structure hinted that the precompile(classSpecs: ClassSpecs, topClass: ClassSpec) overload should precompile only the topClass specified, but its actual implementation for the most part didn't use topClass at all and only passed classSpecs to all precompilation steps, which processed all types in the given ClassSpecs. Given that the precompile(classSpecs: ClassSpecs, topClass: ClassSpec) overload is called from the precompile(specs: ClassSpecs) overload for each type in ClassSpecs, this resulted in unnecessary repeated precompilation of all types when imports are used (because then there is more than 1 type in ClassSpecs).

If there are N top-level types in ClassSpecs, instead of running the precompile phase only once for each top-level type, it was run N times per each top-level type, resulting in N**2 total precompilations of top-level types. This is not only unnecessary, but it also had some observable negative effects, e.g. a single warning being reported to the console N times (and N >= 2 any time you use imports) instead of just once (see kaitai-io/kaitai_struct#1063).

Another problem was caused by the only actual use of topClass in the precompile(classSpecs: ClassSpecs, topClass: ClassSpec) overload, namely for checking if opaque types are enabled or not (according to the /meta/ks-opaque-types key) and passing the setting to the ResolveTypes precompile step. This meant that if one spec had opaque types enabled and the other disabled, they would be rejected even in the spec where they should be enabled (because ResolveTypes processed all specs first with opaque types enabled and then once more with them disabled), as reported in kaitai-io/kaitai_struct#295.

This commit ensures that each ClassSpec of ClassSpecs is precompiled only once, eliminating both of the problems mentioned.

@generalmimon generalmimon force-pushed the fix-ks-opaque-types-incompat-with-imports branch from 869f551 to 143adc9 Compare March 4, 2024 22:17
Copy link
Member

@GreyCat GreyCat left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, thanks for clear explanation!

Fixes kaitai-io/kaitai_struct#295

Fixes duplication of warnings and non-fatal errors as shown in
kaitai-io/kaitai_struct#1063

The existing code structure hinted that the `precompile(classSpecs:
ClassSpecs, topClass: ClassSpec)` overload should precompile only the
`topClass` specified, but its actual implementation for the most part
didn't use `topClass` at all and only passed `classSpecs` to all
precompilation steps, which processed all types in the given
`ClassSpecs`. Given that the `precompile(classSpecs: ClassSpecs,
topClass: ClassSpec)` overload is called from the `precompile(specs:
ClassSpecs)` overload for each type in `ClassSpecs`, this resulted in
unnecessary repeated precompilation of all types when imports are used
(because then there is more than 1 type in `ClassSpecs`).

If there are `N` top-level types in `ClassSpecs`, instead of running the
precompile phase only once for each top-level type, it was run `N` times
per each top-level type, resulting in `N**2` total precompilations of
top-level types. This is not only unnecessary, but it also had some
observable negative effects, e.g. a single warning being reported to the
console `N` times (and `N >= 2` any time you use imports) instead of
just once (see kaitai-io/kaitai_struct#1063).

Another problem was caused by the only actual use of `topClass` in the
`precompile(classSpecs: ClassSpecs, topClass: ClassSpec)` overload,
namely for checking if opaque types are enabled or not (according to the
`/meta/ks-opaque-types` key) and passing the setting to the
`ResolveTypes` precompile step. This meant that if one spec had opaque
types enabled and the other disabled, they would be rejected even in the
spec where they should be enabled (because `ResolveTypes` processed all
specs first with opaque types enabled and then once more with them
disabled), as reported in
kaitai-io/kaitai_struct#295.

This commit ensures that each `ClassSpec` of `ClassSpecs` is precompiled
only once, eliminating both of the problems mentioned.
@generalmimon generalmimon force-pushed the fix-ks-opaque-types-incompat-with-imports branch from 143adc9 to e2dc7f5 Compare March 7, 2024 09:43
@generalmimon generalmimon merged commit c24196b into master Mar 7, 2024
3 of 6 checks passed
@generalmimon generalmimon deleted the fix-ks-opaque-types-incompat-with-imports branch March 7, 2024 09:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ks-opaque-types not working with imports
2 participants