Skip to main content

luaur_common/
lib.rs

1extern crate alloc;
2
3#[cfg(test)]
4mod dense_hash_tests;
5pub mod enums;
6pub mod functions;
7#[cfg(test)]
8mod insertion_ordered_map_tests;
9pub mod macros;
10pub mod methods;
11pub mod records;
12#[cfg(test)]
13mod string_utils_tests;
14pub mod type_aliases;
15#[cfg(test)]
16mod vec_deque_tests;
17
18/// Minimal libc surface for wasm. On `wasm32-unknown-unknown` (no libc) every
19/// shim is needed; on libc-bearing wasm (e.g. `wasm32-wasip1`, used to run the
20/// suite on a 32-bit-pointer platform) the allocator shims are gated off inside
21/// the module so they don't clash with wasi-libc's, while the functions wasi
22/// lacks (mmap stubs, etc.) are still provided.
23#[cfg(target_arch = "wasm32")]
24pub mod wasm_libc;
25
26/// Pure-Rust `strtod` shim for wasm (no libc on `wasm32-unknown-unknown`). The
27/// scanning core is unit-tested natively, so the module is also compiled under
28/// `test`; only the `#[no_mangle]` C entry point is wasm-gated.
29#[cfg(any(target_arch = "wasm32", test))]
30pub mod strtod_shim;
31
32// C++ exposes this at namespace scope; codegen_assert! and friends reference
33// `luaur_common::assert_call_handler` directly.
34pub use functions::assert_call_handler::assert_call_handler;
35pub use records::f_value::set_luau_bool_flags;
36
37/// C++ CLI `setLuauFlagsDefault(value)` analog: set every non-Debug FFlag.
38/// (Rust statics cannot self-register, so the list is generated explicitly.)
39#[allow(non_snake_case)]
40pub fn set_all_flags(value: bool) {
41    FFlag::DesugaredArrayTypeReferenceIsEmpty.set(value);
42    FFlag::FixMathNoisePrecision.set(value);
43    FFlag::LuauAddRecursionCounterToNonStrictTypeChecker.set(value);
44    FFlag::LuauAllowGlobalDeclarationToBeCalledClass.set(value);
45    FFlag::LuauAlsoInstantiateInferredArguments.set(value);
46    FFlag::LuauAutocompleteConst.set(value);
47    FFlag::LuauAutocompleteExport.set(value);
48    FFlag::LuauAutocompleteStringSingletonIntersection.set(value);
49    FFlag::LuauBidirectionalInferenceBetterUnionHandling.set(value);
50    FFlag::LuauCallFeedback.set(value);
51    FFlag::LuauCheckFunctionStatementTypes.set(value);
52    FFlag::LuauClosureUsageCounter.set(value);
53    FFlag::LuauCodeGenCallWrapperEmitInst.set(value);
54    FFlag::LuauCodegenBufferInteger.set(value);
55    FFlag::LuauCodegenDsePtrStoreTagCheck.set(value);
56    FFlag::LuauCodegenDseRestoreHints.set(value);
57    FFlag::LuauCodegenExtraTableOpts.set(value);
58    FFlag::LuauCodegenFixBufferLenCheck.set(value);
59    FFlag::LuauCodegenForwardRematerialize.set(value);
60    FFlag::LuauCodegenFreeBlocks.set(value);
61    FFlag::LuauCodegenInteger2.set(value);
62    FFlag::LuauCodegenIntegerArg3Fix.set(value);
63    FFlag::LuauCodegenIntegerFastcall2k.set(value);
64    FFlag::LuauCodegenLinearSetupEntryState3.set(value);
65    FFlag::LuauCodegenLoadPropagateOrigin.set(value);
66    FFlag::LuauCodegenNopPadding.set(value);
67    FFlag::LuauCodegenProtectData.set(value);
68    FFlag::LuauCodegenRecordAllBlockExitInfo.set(value);
69    FFlag::LuauCodegenRegTag2.set(value);
70    FFlag::LuauCodegenSuggestArgumentRegisterX64.set(value);
71    FFlag::LuauCodegenVmExitSync.set(value);
72    FFlag::LuauCodegenVmExitSyncFix.set(value);
73    FFlag::LuauCompileDuptableConstantPack2.set(value);
74    FFlag::LuauCompileFastcall3CostModel.set(value);
75    FFlag::LuauCompileFoldOptimize.set(value);
76    FFlag::LuauCompileInlineTableFunctions.set(value);
77    FFlag::LuauCompileNewTableMutationTracker.set(value);
78    FFlag::LuauCompileNoOptNext.set(value);
79    FFlag::LuauCompilePropagateTableProps2.set(value);
80    FFlag::LuauCompileStringInterpTargetTop.set(value);
81    FFlag::LuauCompileTypeAliases.set(value);
82    FFlag::LuauCompileUdataDirect.set(value);
83    FFlag::LuauConcatDoesntAlwaysReturnString.set(value);
84    FFlag::LuauConst2.set(value);
85    FFlag::LuauConstJustReportErrorForUnderfill.set(value);
86    FFlag::LuauConstraintGraph.set(value);
87    FFlag::LuauCstExprGroup.set(value);
88    FFlag::LuauCstTypeGroup.set(value);
89    FFlag::LuauDirectFieldGet.set(value);
90    FFlag::LuauDisallowRedefiningBuiltinTypes.set(value);
91    FFlag::LuauEmitCallFeedback.set(value);
92    FFlag::LuauErrorTolerantPrettyPrinting.set(value);
93    FFlag::LuauExplicitTypeInstantiationSupport.set(value);
94    // Experimental "export values" syntax is intentionally NOT enabled here: it
95    // is incomplete in this port — a closure that captures an exported local
96    // mis-compiles the upvalue register (the C++ reference handles it), so it can
97    // produce out-of-range bytecode. Keep it off (default false) until the
98    // export-table/closure codegen is fixed. Tests that exercise it set the flag
99    // explicitly via a scoped override.
100    FFlag::LuauExportValueSyntax.set(false);
101    FFlag::LuauExportValueTypecheck.set(false);
102    FFlag::LuauExternTypesNormalizeWithShapes.set(value);
103    FFlag::LuauFixIndexerSubtypingOrdering.set(value);
104    FFlag::LuauFixPropReadsOnMetatableTypes.set(value);
105    FFlag::LuauInstantiateFunctionTypeBeforePush.set(value);
106    FFlag::LuauInstantiateInSubtyping.set(value);
107    FFlag::LuauInstantiationUsesPolarity.set(value);
108    FFlag::LuauIntegerBufferFastcalls.set(value);
109    FFlag::LuauIntegerFastcalls.set(value);
110    FFlag::LuauIntegerLibrary.set(value);
111    FFlag::LuauIntegerType2.set(value);
112    FFlag::LuauIterativeInstantiationQueuer.set(value);
113    FFlag::LuauKnowsTheDataModel3.set(value);
114    FFlag::LuauLValueCompoundAssignmentVisitLhs.set(value);
115    FFlag::LuauLimitUnificationRecursion.set(value);
116    FFlag::LuauNativeCodeTargetCheck.set(value);
117    FFlag::LuauNonStrictModeUseErrorSupressingTag.set(value);
118    FFlag::LuauOccursCheckForAllBindings.set(value);
119    FFlag::LuauPropagateFreeTypesIntoUnionAndIntersectionBounds.set(value);
120    FFlag::LuauPropagateTypeAnnotationsInForInLoops.set(value);
121    FFlag::LuauPropertyModifierMismatchErrors.set(value);
122    FFlag::LuauReadOnlyIndexers.set(value);
123    FFlag::LuauRefineNilFromTableIndexerResultType.set(value);
124    FFlag::LuauRemoveConstraintSolverEmplace.set(value);
125    FFlag::LuauReplacerIsSolverAgnostic.set(value);
126    FFlag::LuauRequireResolveAliasNullCheck.set(value);
127    FFlag::LuauResumeRestoreCcalls.set(value);
128    FFlag::LuauSilenceDynamicFormatStringErrors.set(value);
129    FFlag::LuauSolverV2.set(value);
130    FFlag::LuauSubtypingMissingPropertiesAsNil.set(value);
131    FFlag::LuauSubtypingTablesHasBetterErrorSuppression.set(value);
132    FFlag::LuauTableEntriesDontNeedToMatchIndent.set(value);
133    FFlag::LuauTableFreezeCheckIsSubtype.set(value);
134    FFlag::LuauTidyTypePrototyping.set(value);
135    FFlag::LuauTransitiveSubtyping.set(value);
136    FFlag::LuauTweakAccessViolationReporting.set(value);
137    FFlag::LuauTypeFunctionRobustness.set(value);
138    FFlag::LuauTypeFunctionSerializeArgNames.set(value);
139    FFlag::LuauTypeFunctionStructuredErrors.set(value);
140    FFlag::LuauTypeFunctionSupportsFrozen.set(value);
141    FFlag::LuauUdataDirectAccess6.set(value);
142    FFlag::LuauUdtfTypeIsSubtypeOf.set(value);
143    FFlag::LuauUseNativeStackGuard.set(value);
144    FFlag::LuauVisitCallTypeArgsInDfg.set(value);
145    FFlag::LuauYieldIter2.set(value);
146}
147
148/// FastFlag namespace `FFlag::` — static (non-dynamic) bool flags. Definitions
149/// from `LUAU_FASTFLAGVARIABLE(...)` across this crate's sources are collected
150/// here so C++ reads `FFlag::Name` map to `crate::FFlag::Name.get()`. (Rust
151/// modules are not open like C++ namespaces, so the per-crate namespace module
152/// is the aggregation point — see `crate::macros::luau_fastflagvariable`.)
153#[allow(non_snake_case)]
154pub mod FFlag {
155    // CodeGen/src/IrRegAllocA64.cpp
156    crate::LUAU_FASTFLAGVARIABLE!(DebugCodegenChaosA64);
157    // CodeGen/src/CodeGen.cpp
158    crate::LUAU_FASTFLAGVARIABLE!(DebugCodegenOptSize);
159    // CodeGen/src/CodeGen.cpp
160    crate::LUAU_FASTFLAGVARIABLE!(DebugCodegenSkipNumbering);
161    // Analysis/src/FragmentAutocomplete.cpp
162    crate::LUAU_FASTFLAGVARIABLE!(DebugLogFragmentsFromAutocomplete);
163    // CodeGen/src/OptimizeConstProp.cpp
164    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauAbortingChecks);
165    // Analysis/src/Frontend.cpp
166    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauAlwaysShowConstraintSolvingIncomplete);
167    // Analysis/src/ConstraintSolver.cpp
168    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauAssertOnForcedConstraint);
169    // Analysis/src/Normalize.cpp
170    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauCheckNormalizeInvariant);
171    // Analysis/src/DumpCFG.cpp
172    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauDumpCFGJson);
173    // Analysis/src/Frontend.cpp
174    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauForbidInternalTypes);
175    // tests/Fixture.cpp
176    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauForceAllNewSolverTests);
177    // tests/Fixture.cpp
178    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauForceAllOldSolverTests);
179    // Analysis/src/Frontend.cpp
180    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauForceNonStrictMode);
181    // Analysis/src/Frontend.cpp
182    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauForceOldSolver);
183    // Analysis/src/Frontend.cpp
184    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauForceStrictMode);
185    // Analysis/src/TypeArena.cpp
186    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauFreezeArena);
187    // Analysis/src/TypeInfer.cpp
188    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauFreezeDuringUnification);
189    // Analysis/src/ConstraintSolver.cpp
190    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauLogBindings);
191    // Analysis/src/DumpCFG.cpp
192    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauLogCFG);
193    // Analysis/src/ConstraintSolver.cpp
194    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauLogSolver);
195    // Analysis/src/Frontend.cpp
196    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauLogSolverToJson);
197    // Analysis/src/Frontend.cpp
198    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauLogSolverToJsonFile);
199    // Analysis/src/TypeFunction.cpp
200    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauLogTypeFamilies);
201    // Analysis/src/TypeInfer.cpp
202    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauMagicTypes);
203    // Analysis/src/AutocompleteCore.cpp
204    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauMagicVariableNames);
205    // Ast/src/Parser.cpp
206    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauNoInline);
207    // Analysis/src/Subtyping.cpp
208    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauSubtypingCheckPathValidity);
209    // Common/src/TimeTrace.cpp
210    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauTimeTracing);
211    // Analysis/src/ToString.cpp
212    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauToStringNoLexicalSort);
213    // Ast/src/Parser.cpp
214    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauUserDefinedClasses);
215    // VM/src/lvmexecute.cpp
216    crate::LUAU_FASTFLAGVARIABLE!(DebugLuauUserDefinedClassesRuntime);
217    // Ast/src/Parser.cpp
218    crate::LUAU_FASTFLAGVARIABLE!(DesugaredArrayTypeReferenceIsEmpty);
219    // VM/src/lmathlib.cpp
220    crate::LUAU_FASTFLAGVARIABLE!(FixMathNoisePrecision);
221    // Analysis/src/NonStrictTypeChecker.cpp
222    crate::LUAU_FASTFLAGVARIABLE!(LuauAddRecursionCounterToNonStrictTypeChecker);
223    // Ast/src/Parser.cpp
224    crate::LUAU_FASTFLAGVARIABLE!(LuauAllowGlobalDeclarationToBeCalledClass);
225    // Analysis/src/ConstraintSolver.cpp
226    crate::LUAU_FASTFLAGVARIABLE!(LuauAlsoInstantiateInferredArguments);
227    // Analysis/src/AutocompleteCore.cpp
228    crate::LUAU_FASTFLAGVARIABLE!(LuauAutocompleteConst);
229    // Analysis/src/AutocompleteCore.cpp
230    crate::LUAU_FASTFLAGVARIABLE!(LuauAutocompleteExport);
231    // Analysis/src/AutocompleteCore.cpp
232    crate::LUAU_FASTFLAGVARIABLE!(LuauAutocompleteStringSingletonIntersection);
233    // Analysis/src/ExpectedTypeVisitor.cpp
234    crate::LUAU_FASTFLAGVARIABLE!(LuauBidirectionalInferenceBetterUnionHandling);
235    // VM/src/lvmexecute.cpp
236    crate::LUAU_FASTFLAGVARIABLE!(LuauCallFeedback);
237    // Analysis/src/TypeChecker2.cpp
238    crate::LUAU_FASTFLAGVARIABLE!(LuauCheckFunctionStatementTypes);
239    // VM/src/lvmexecute.cpp
240    crate::LUAU_FASTFLAGVARIABLE!(LuauClosureUsageCounter);
241    // CodeGen/src/EmitInstructionX64.cpp
242    crate::LUAU_FASTFLAGVARIABLE!(LuauCodeGenCallWrapperEmitInst);
243    // CodeGen/src/IrTranslateBuiltins.cpp
244    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenBufferInteger);
245    // CodeGen/src/OptimizeDeadStore.cpp
246    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenDsePtrStoreTagCheck);
247    // CodeGen/src/OptimizeDeadStore.cpp
248    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenDseRestoreHints);
249    // CodeGen/src/OptimizeConstProp.cpp
250    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenExtraTableOpts);
251    // CodeGen/src/IrLoweringA64.cpp
252    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenFixBufferLenCheck);
253    // CodeGen/src/IrValueLocationTracking.cpp
254    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenForwardRematerialize);
255    // CodeGen/src/CodeAllocator.cpp
256    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenFreeBlocks);
257    // CodeGen/src/CodeGen.cpp
258    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenInteger2);
259    // CodeGen/src/IrTranslateBuiltins.cpp
260    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenIntegerArg3Fix);
261    // CodeGen/src/IrTranslation.cpp
262    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenIntegerFastcall2k);
263    // CodeGen/src/OptimizeConstProp.cpp
264    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenLinearSetupEntryState3);
265    // CodeGen/src/OptimizeConstProp.cpp
266    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenLoadPropagateOrigin);
267    // CodeGen/src/CodeGen.cpp
268    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenNopPadding);
269    // CodeGen/src/CodeAllocator.cpp
270    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenProtectData);
271    // CodeGen/src/OptimizeConstProp.cpp
272    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenRecordAllBlockExitInfo);
273    // CodeGen/src/BytecodeAnalysis.cpp
274    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenRegTag2);
275    // CodeGen/src/CodeGenX64.cpp
276    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenSuggestArgumentRegisterX64);
277    // CodeGen/src/IrAnalysis.cpp
278    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenVmExitSync);
279    // CodeGen/src/OptimizeDeadStore.cpp
280    crate::LUAU_FASTFLAGVARIABLE!(LuauCodegenVmExitSyncFix);
281    // Compiler/src/Compiler.cpp
282    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileDuptableConstantPack2);
283    // Compiler/src/CostModel.cpp
284    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileFastcall3CostModel);
285    // Compiler/src/ConstantFolding.cpp
286    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileFoldOptimize);
287    // Compiler/src/Compiler.cpp
288    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileInlineTableFunctions);
289    // Compiler/src/ConstantFolding.cpp
290    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileNewTableMutationTracker);
291    // Compiler/src/Compiler.cpp
292    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileNoOptNext);
293    // Compiler/src/ConstantFolding.cpp
294    crate::LUAU_FASTFLAGVARIABLE!(LuauCompilePropagateTableProps2);
295    // Compiler/src/Compiler.cpp
296    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileStringInterpTargetTop);
297    // Compiler/src/Types.cpp
298    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileTypeAliases);
299    // Bytecode/src/BytecodeBuilder.cpp
300    crate::LUAU_FASTFLAGVARIABLE!(LuauCompileUdataDirect);
301    // Analysis/src/BuiltinTypeFunctions.cpp
302    crate::LUAU_FASTFLAGVARIABLE!(LuauConcatDoesntAlwaysReturnString);
303    // Ast/src/Parser.cpp
304    crate::LUAU_FASTFLAGVARIABLE!(LuauConst2);
305    // Ast/src/Parser.cpp
306    crate::LUAU_FASTFLAGVARIABLE!(LuauConstJustReportErrorForUnderfill);
307    // Analysis/src/Constraint.cpp
308    crate::LUAU_FASTFLAGVARIABLE!(LuauConstraintGraph);
309    // Ast/src/Parser.cpp
310    crate::LUAU_FASTFLAGVARIABLE!(LuauCstExprGroup);
311    // Ast/src/Parser.cpp
312    crate::LUAU_FASTFLAGVARIABLE!(LuauCstTypeGroup);
313    // VM/src/lvmexecute.cpp
314    crate::LUAU_FASTFLAGVARIABLE!(LuauDirectFieldGet);
315    // Analysis/src/ConstraintGenerator.cpp
316    crate::LUAU_FASTFLAGVARIABLE!(LuauDisallowRedefiningBuiltinTypes);
317    // Compiler/src/Compiler.cpp
318    crate::LUAU_FASTFLAGVARIABLE!(LuauEmitCallFeedback);
319    // Ast/src/PrettyPrinter.cpp
320    crate::LUAU_FASTFLAGVARIABLE!(LuauErrorTolerantPrettyPrinting);
321    // Analysis/src/TypeInfer.cpp
322    crate::LUAU_FASTFLAGVARIABLE!(LuauExplicitTypeInstantiationSupport);
323    // Ast/src/Parser.cpp
324    crate::LUAU_FASTFLAGVARIABLE!(LuauExportValueSyntax);
325    // Analysis/src/Frontend.cpp
326    crate::LUAU_FASTFLAGVARIABLE!(LuauExportValueTypecheck);
327    // Analysis/src/Normalize.cpp
328    crate::LUAU_FASTFLAGVARIABLE!(LuauExternTypesNormalizeWithShapes);
329    // Analysis/src/Unifier.cpp
330    crate::LUAU_FASTFLAGVARIABLE!(LuauFixIndexerSubtypingOrdering);
331    // Analysis/src/ConstraintSolver.cpp
332    crate::LUAU_FASTFLAGVARIABLE!(LuauFixPropReadsOnMetatableTypes);
333    // Analysis/src/ConstraintSolver.cpp
334    crate::LUAU_FASTFLAGVARIABLE!(LuauInstantiateFunctionTypeBeforePush);
335    // Analysis/src/Unifier.cpp
336    crate::LUAU_FASTFLAGVARIABLE!(LuauInstantiateInSubtyping);
337    // Analysis/src/Instantiation.cpp
338    crate::LUAU_FASTFLAGVARIABLE!(LuauInstantiationUsesPolarity);
339    // Compiler/src/Builtins.cpp
340    crate::LUAU_FASTFLAGVARIABLE!(LuauIntegerBufferFastcalls);
341    // Compiler/src/Builtins.cpp
342    crate::LUAU_FASTFLAGVARIABLE!(LuauIntegerFastcalls);
343    // VM/src/lintlib.cpp
344    crate::LUAU_FASTFLAGVARIABLE!(LuauIntegerLibrary);
345    // Ast/src/Parser.cpp
346    crate::LUAU_FASTFLAGVARIABLE!(LuauIntegerType2);
347    // Analysis/src/ConstraintSolver.cpp
348    crate::LUAU_FASTFLAGVARIABLE!(LuauIterativeInstantiationQueuer);
349    // Analysis/src/Frontend.cpp
350    crate::LUAU_FASTFLAGVARIABLE!(LuauKnowsTheDataModel3);
351    // Analysis/src/TypeChecker2.cpp
352    crate::LUAU_FASTFLAGVARIABLE!(LuauLValueCompoundAssignmentVisitLhs);
353    // Analysis/src/Unifier2.cpp
354    crate::LUAU_FASTFLAGVARIABLE!(LuauLimitUnificationRecursion);
355    // CodeGen/src/CodeGenUtils.cpp
356    crate::LUAU_FASTFLAGVARIABLE!(LuauNativeCodeTargetCheck);
357    // Analysis/src/NonStrictTypeChecker.cpp
358    crate::LUAU_FASTFLAGVARIABLE!(LuauNonStrictModeUseErrorSupressingTag);
359    // Analysis/src/ConstraintSolver.cpp
360    crate::LUAU_FASTFLAGVARIABLE!(LuauOccursCheckForAllBindings);
361    // Analysis/src/Unifier2.cpp
362    crate::LUAU_FASTFLAGVARIABLE!(LuauPropagateFreeTypesIntoUnionAndIntersectionBounds);
363    // Analysis/src/ConstraintGenerator.cpp
364    crate::LUAU_FASTFLAGVARIABLE!(LuauPropagateTypeAnnotationsInForInLoops);
365    // Analysis/src/TypeChecker2.cpp
366    crate::LUAU_FASTFLAGVARIABLE!(LuauPropertyModifierMismatchErrors);
367    // Analysis/src/ConstraintGenerator.cpp
368    crate::LUAU_FASTFLAGVARIABLE!(LuauReadOnlyIndexers);
369    // Analysis/src/ConstraintSolver.cpp
370    crate::LUAU_FASTFLAGVARIABLE!(LuauRefineNilFromTableIndexerResultType);
371    // Analysis/src/ConstraintSolver.cpp
372    crate::LUAU_FASTFLAGVARIABLE!(LuauRemoveConstraintSolverEmplace);
373    // Analysis/src/Instantiation.cpp
374    crate::LUAU_FASTFLAGVARIABLE!(LuauReplacerIsSolverAgnostic);
375    // Require/src/RequireNavigator.cpp
376    crate::LUAU_FASTFLAGVARIABLE!(LuauRequireResolveAliasNullCheck);
377    // VM/src/ldo.cpp
378    crate::LUAU_FASTFLAGVARIABLE!(LuauResumeRestoreCcalls);
379    // Analysis/src/BuiltinDefinitions.cpp
380    crate::LUAU_FASTFLAGVARIABLE!(LuauSilenceDynamicFormatStringErrors);
381    // Ast/src/Parser.cpp
382    crate::LUAU_FASTFLAGVARIABLE!(LuauSolverV2);
383    // Analysis/src/Subtyping.cpp
384    crate::LUAU_FASTFLAGVARIABLE!(LuauSubtypingMissingPropertiesAsNil);
385    // Analysis/src/Subtyping.cpp
386    crate::LUAU_FASTFLAGVARIABLE!(LuauSubtypingTablesHasBetterErrorSuppression);
387    // Ast/src/Parser.cpp
388    crate::LUAU_FASTFLAGVARIABLE!(LuauTableEntriesDontNeedToMatchIndent);
389    // Analysis/src/BuiltinDefinitions.cpp
390    crate::LUAU_FASTFLAGVARIABLE!(LuauTableFreezeCheckIsSubtype);
391    // Analysis/src/ConstraintGenerator.cpp
392    crate::LUAU_FASTFLAGVARIABLE!(LuauTidyTypePrototyping);
393    // Analysis/src/Unifier.cpp
394    crate::LUAU_FASTFLAGVARIABLE!(LuauTransitiveSubtyping);
395    // Analysis/src/Error.cpp
396    crate::LUAU_FASTFLAGVARIABLE!(LuauTweakAccessViolationReporting);
397    // Analysis/src/TypeFunctionRuntime.cpp
398    crate::LUAU_FASTFLAGVARIABLE!(LuauTypeFunctionRobustness);
399    // Analysis/src/TypeFunctionRuntime.cpp
400    crate::LUAU_FASTFLAGVARIABLE!(LuauTypeFunctionSerializeArgNames);
401    // Analysis/src/TypeFunctionRuntime.cpp
402    crate::LUAU_FASTFLAGVARIABLE!(LuauTypeFunctionStructuredErrors);
403    // Analysis/src/TypeFunctionRuntime.cpp
404    crate::LUAU_FASTFLAGVARIABLE!(LuauTypeFunctionSupportsFrozen);
405    // VM/src/lvmload.cpp
406    crate::LUAU_FASTFLAGVARIABLE!(LuauUdataDirectAccess6);
407    // Analysis/src/TypeFunctionRuntime.cpp
408    crate::LUAU_FASTFLAGVARIABLE!(LuauUdtfTypeIsSubtypeOf);
409    // Analysis/src/NativeStackGuard.cpp
410    crate::LUAU_FASTFLAGVARIABLE!(LuauUseNativeStackGuard);
411    // Analysis/src/DataFlowGraph.cpp
412    crate::LUAU_FASTFLAGVARIABLE!(LuauVisitCallTypeArgsInDfg);
413    // VM/src/lvmexecute.cpp
414    crate::LUAU_FASTFLAGVARIABLE!(LuauYieldIter2);
415}
416
417/// Static int FastFlags, mirroring `FFlag`. C++ collects every
418/// `LUAU_FASTINTVARIABLE(...)` into `namespace FInt`; Rust modules aren't open,
419/// so the consumers' flags are gathered here. Read as `FInt::Flag.get()`.
420#[allow(non_snake_case)]
421pub mod FInt {
422    // CodeGen/src/CodeGen.cpp
423    crate::LUAU_FASTINTVARIABLE!(CodegenHeuristicsBlockInstructionLimit, 65_536);
424    // CodeGen/src/CodeGen.cpp
425    crate::LUAU_FASTINTVARIABLE!(CodegenHeuristicsBlockLimit, 32_768);
426    // CodeGen/src/CodeGen.cpp
427    crate::LUAU_FASTINTVARIABLE!(CodegenHeuristicsInstructionLimit, 1_048_576);
428    // CodeGen/src/CodeGenContext.cpp
429    crate::LUAU_FASTINTVARIABLE!(LuauCodeGenBlockSize, 4 * 1024 * 1024);
430    // CodeGen/src/CodeGenContext.cpp
431    crate::LUAU_FASTINTVARIABLE!(LuauCodeGenMaxTotalSize, 256 * 1024 * 1024);
432    // Analysis/src/Clone.cpp
433    crate::LUAU_FASTINTVARIABLE!(LuauTypeCloneIterationLimit, 100_000);
434    // Analysis/src/ToString.cpp
435    crate::LUAU_FASTINTVARIABLE!(DebugLuauVerboseTypeNames, 0);
436    // Analysis/src/TypeInfer.cpp
437    crate::LUAU_FASTINTVARIABLE!(LuauCheckRecursionLimit, 300);
438    // CodeGen/src/OptimizeConstProp.cpp
439    crate::LUAU_FASTINTVARIABLE!(LuauCodeGenLiveSlotReuseLimit, 8);
440    // CodeGen/src/OptimizeConstProp.cpp
441    crate::LUAU_FASTINTVARIABLE!(LuauCodeGenMinLinearBlockPath, 3);
442    // CodeGen/src/OptimizeConstProp.cpp
443    crate::LUAU_FASTINTVARIABLE!(LuauCodeGenReuseSlotLimit, 64);
444    // CodeGen/src/OptimizeConstProp.cpp
445    crate::LUAU_FASTINTVARIABLE!(LuauCodeGenReuseUdataTagLimit, 64);
446    // Compiler/src/Compiler.cpp
447    crate::LUAU_FASTINTVARIABLE!(LuauCompileInlineDepth, 5);
448    // Compiler/src/Compiler.cpp
449    crate::LUAU_FASTINTVARIABLE!(LuauCompileInlineThreshold, 25);
450    // Compiler/src/Compiler.cpp
451    crate::LUAU_FASTINTVARIABLE!(LuauCompileInlineThresholdMaxBoost, 300);
452    // Compiler/src/Compiler.cpp
453    crate::LUAU_FASTINTVARIABLE!(LuauCompileLoopUnrollThreshold, 25);
454    // Compiler/src/Compiler.cpp
455    crate::LUAU_FASTINTVARIABLE!(LuauCompileLoopUnrollThresholdMaxBoost, 300);
456    // Analysis/src/Generalization.cpp
457    crate::LUAU_FASTINTVARIABLE!(LuauGenericCounterMaxDepth, 15);
458    // Analysis/src/Generalization.cpp
459    crate::LUAU_FASTINTVARIABLE!(LuauGenericCounterMaxSteps, 1500);
460    // Analysis/src/Error.cpp
461    crate::LUAU_FASTINTVARIABLE!(LuauIndentTypeMismatchMaxTypeLength, 10);
462    // VM/src/lfunc.cpp
463    crate::LUAU_FASTINTVARIABLE!(LuauInlineHitsThreshold, 3);
464    // Analysis/src/NonStrictTypeChecker.cpp
465    crate::LUAU_FASTINTVARIABLE!(LuauNonStrictTypeCheckerRecursionLimit, 300);
466    // Analysis/src/Normalize.cpp
467    crate::LUAU_FASTINTVARIABLE!(LuauNormalizeCacheLimit, 100000);
468    // Analysis/src/Normalize.cpp
469    crate::LUAU_FASTINTVARIABLE!(LuauNormalizerInitialFuel, 3000);
470    // Ast/src/Parser.cpp
471    crate::LUAU_FASTINTVARIABLE!(LuauParseErrorLimit, 100);
472    // Analysis/src/ConstraintGenerator.cpp
473    crate::LUAU_FASTINTVARIABLE!(LuauPrimitiveInferenceInTableLimit, 500);
474    // Ast/src/Parser.cpp
475    crate::LUAU_FASTINTVARIABLE!(LuauRecursionLimit, 1000);
476    // Analysis/src/ConstraintSolver.cpp
477    crate::LUAU_FASTINTVARIABLE!(LuauSolverConstraintLimit, 1000);
478    // Analysis/src/ConstraintSolver.cpp
479    crate::LUAU_FASTINTVARIABLE!(LuauSolverRecursionLimit, 500);
480    // Analysis/src/NativeStackGuard.cpp
481    crate::LUAU_FASTINTVARIABLE!(LuauStackGuardThreshold, 1024);
482    // Analysis/src/Subtyping.cpp
483    crate::LUAU_FASTINTVARIABLE!(LuauSubtypingIterationLimit, 20000);
484    // Analysis/src/Subtyping.cpp
485    crate::LUAU_FASTINTVARIABLE!(LuauSubtypingReasoningLimit, 100);
486    // Analysis/src/Linter.cpp
487    crate::LUAU_FASTINTVARIABLE!(LuauSuggestionDistance, 4);
488    // Analysis/src/Type.cpp
489    crate::LUAU_FASTINTVARIABLE!(LuauTableTypeMaximumStringifierLength, 0);
490    // Analysis/src/Substitution.cpp
491    crate::LUAU_FASTINTVARIABLE!(LuauTarjanChildLimit, 10000);
492    // Analysis/src/Substitution.cpp
493    crate::LUAU_FASTINTVARIABLE!(LuauTarjanPreallocationSize, 256);
494    // Analysis/src/TypeInfer.cpp
495    crate::LUAU_FASTINTVARIABLE!(LuauTypeInferIterationLimit, 20000);
496    // Analysis/src/TypeInfer.cpp
497    crate::LUAU_FASTINTVARIABLE!(LuauTypeInferRecursionLimit, 165);
498    // Analysis/src/TypeInfer.cpp
499    crate::LUAU_FASTINTVARIABLE!(LuauTypeInferTypePackLoopLimit, 5000);
500    // Ast/src/Parser.cpp
501    crate::LUAU_FASTINTVARIABLE!(LuauTypeLengthLimit, 1000);
502    // Analysis/src/Type.cpp
503    crate::LUAU_FASTINTVARIABLE!(LuauTypeMaximumStringifierLength, 500);
504    // Analysis/src/TypeInfer.cpp
505    crate::LUAU_FASTINTVARIABLE!(LuauVisitRecursionLimit, 500);
506}
507
508/// Dynamic bool flags (`DFFlag::`), mirroring `FFlag`.
509#[allow(non_snake_case)]
510pub mod DFFlag {
511    // CodeGen/src/EmitCommonX64.cpp
512    crate::LUAU_DYNAMIC_FASTFLAGVARIABLE!(AddReturnExectargetCheck, false);
513    // Ast/src/Parser.cpp
514    crate::LUAU_DYNAMIC_FASTFLAGVARIABLE!(DebugLuauReportReturnTypeVariadicWithTypeSuffix, false);
515    // Require/src/RequireNavigator.cpp
516    crate::LUAU_DYNAMIC_FASTFLAGVARIABLE!(LuauRequireAliasOverrideOrderFix, false);
517}
518
519/// Dynamic int flags (`DFInt::`), mirroring `FInt`.
520#[allow(non_snake_case)]
521pub mod DFInt {
522    // Analysis/src/TypeFunction.cpp
523    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauTypeFamilyApplicationCartesianProductLimit, 5_000);
524    // Analysis/src/TypeFunction.cpp
525    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauTypeFamilyGraphReductionMaximumSteps, 1_000_000);
526    // Analysis/src/TypeFunctionRuntimeBuilder.cpp
527    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauTypeFunctionSerdeIterationLimit, 100_000);
528    // Analysis/src/ConstraintGenerator.cpp
529    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauConstraintGeneratorRecursionLimit, 300);
530    // Analysis/src/Simplify.cpp
531    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauSimplificationComplexityLimit, 8);
532    // Analysis/src/BuiltinTypeFunctions.cpp
533    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauStepRefineRecursionLimit, 64);
534    // Analysis/src/Subtyping.cpp
535    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauSubtypingRecursionLimit, 100);
536    // Analysis/src/TypeFunction.cpp
537    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauTypeFamilyUseGuesserDepth, -1);
538    // Analysis/src/TypePath.cpp
539    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauTypePathMaximumTraverseSteps, 100);
540    // Analysis/src/Simplify.cpp
541    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauTypeSimplificationIterationLimit, 128);
542    // Analysis/src/Unifier2.cpp
543    crate::LUAU_DYNAMIC_FASTINTVARIABLE!(LuauUnifierRecursionLimit, 100);
544}
545
546mod fastflag_timetrace_tests {
547    /// The macro-defined flag reads its default; the TimeTrace consumer macros
548    /// expand cleanly as no-ops (default `LUAU_ENABLE_TIME_TRACE` off).
549    #[test]
550    fn flag_default_and_timetrace_noops() {
551        assert_eq!(crate::FFlag::DebugLuauTimeTracing.get(), false);
552        crate::LUAU_TIMETRACE_SCOPE!("name", "category");
553        crate::LUAU_TIMETRACE_OPTIONAL_TAIL_SCOPE!("name", "category", 100);
554        crate::LUAU_TIMETRACE_ARGUMENT!("k", "v");
555        crate::FFlag::DebugLuauTimeTracing.set(true);
556        assert_eq!(crate::FFlag::DebugLuauTimeTracing.get(), true);
557    }
558}