Skip to main content

luaur_compiler/records/
reg_scope.rs

1//! Generated skeleton item.
2//! Node: `cxx:Record:Luau.Compiler:Compiler/src/Compiler.cpp:4883:reg_scope`
3//! Source: `Compiler/src/Compiler.cpp`
4//! Graph edges:
5//! - declared_by: source_file Compiler/src/Compiler.cpp
6//! - source_includes:
7//!   - includes -> source_file Compiler/include/Luau/Compiler.h
8//!   - includes -> source_file Ast/include/Luau/Ast.h
9//!   - includes -> source_file Bytecode/include/Luau/BytecodeBuilder.h
10//!   - includes -> source_file Common/include/Luau/Common.h
11//!   - includes -> source_file Ast/include/Luau/Parser.h
12//!   - includes -> source_file Common/include/Luau/InsertionOrderedMap.h
13//!   - includes -> source_file Common/include/Luau/StringUtils.h
14//!   - includes -> source_file Common/include/Luau/TimeTrace.h
15//!   - includes -> source_file CodeGen/src/IrTranslateBuiltins.h
16//!   - includes -> source_file Compiler/src/ConstantFolding.h
17//!   - includes -> source_file Compiler/src/CostModel.h
18//!   - includes -> source_file Compiler/src/TableShape.h
19//!   - includes -> source_file Analysis/include/Luau/AutocompleteTypes.h
20//!   - includes -> source_file Analysis/include/Luau/AstUtils.h
21//!   - includes -> source_file Compiler/src/ValueTracking.h
22//! - incoming:
23//!   - declares <- source_file Compiler/src/Compiler.cpp
24//!   - type_ref <- record Compiler (Compiler/src/Compiler.cpp)
25//!   - type_ref <- method Compiler::compileFunction (Compiler/src/Compiler.cpp)
26//!   - type_ref <- method Compiler::compileExprTempMultRet (Compiler/src/Compiler.cpp)
27//!   - type_ref <- method Compiler::compileExprTempTop (Compiler/src/Compiler.cpp)
28//!   - type_ref <- method Compiler::compileInlinedCall (Compiler/src/Compiler.cpp)
29//!   - type_ref <- method Compiler::compileExprCall (Compiler/src/Compiler.cpp)
30//!   - type_ref <- method Compiler::compileExprFunction (Compiler/src/Compiler.cpp)
31//!   - type_ref <- method Compiler::compileClassDeclaration (Compiler/src/Compiler.cpp)
32//!   - type_ref <- method Compiler::compileCompareJump (Compiler/src/Compiler.cpp)
33//!   - type_ref <- method Compiler::compileConditionValue (Compiler/src/Compiler.cpp)
34//!   - type_ref <- method Compiler::compileExprAndOr (Compiler/src/Compiler.cpp)
35//!   - type_ref <- method Compiler::compileExprUnary (Compiler/src/Compiler.cpp)
36//!   - type_ref <- method Compiler::compileExprBinary (Compiler/src/Compiler.cpp)
37//!   - type_ref <- method Compiler::compileExprIfElseAndOr (Compiler/src/Compiler.cpp)
38//!   - type_ref <- method Compiler::compileExprInterpString (Compiler/src/Compiler.cpp)
39//!   - type_ref <- method Compiler::compileExprTable (Compiler/src/Compiler.cpp)
40//!   - type_ref <- method Compiler::compileExprIndexName (Compiler/src/Compiler.cpp)
41//!   - type_ref <- method Compiler::compileExprIndexExpr (Compiler/src/Compiler.cpp)
42//!   - type_ref <- method Compiler::compileExprAuto (Compiler/src/Compiler.cpp)
43//!   - type_ref <- method Compiler::compileExprSide (Compiler/src/Compiler.cpp)
44//!   - type_ref <- method Compiler::compileLValueIndex (Compiler/src/Compiler.cpp)
45//!   - type_ref <- method Compiler::compileLValue (Compiler/src/Compiler.cpp)
46//!   - type_ref <- method Compiler::compileStatRepeat (Compiler/src/Compiler.cpp)
47//!   - type_ref <- method Compiler::compileStatReturn (Compiler/src/Compiler.cpp)
48//!   - type_ref <- method Compiler::compileStatFor (Compiler/src/Compiler.cpp)
49//!   - type_ref <- method Compiler::compileStatForIn (Compiler/src/Compiler.cpp)
50//!   - type_ref <- method Compiler::compileStatAssign (Compiler/src/Compiler.cpp)
51//!   - type_ref <- method Compiler::compileStatCompoundAssign (Compiler/src/Compiler.cpp)
52//!   - type_ref <- method Compiler::compileStatFunction (Compiler/src/Compiler.cpp)
53//!   - type_ref <- method Compiler::compileStat (Compiler/src/Compiler.cpp)
54//!   - type_ref <- method Compiler::RegScope::RegScope (Compiler/src/Compiler.cpp)
55//!   - type_ref <- method Compiler::RegScope::RegScope (Compiler/src/Compiler.cpp)
56//!   - type_ref <- method Compiler::RegScope::~RegScope (Compiler/src/Compiler.cpp)
57//! - outgoing:
58//!   - type_ref -> record Compiler (Compiler/src/Compiler.cpp)
59//!   - translates_to -> rust_item RegScope
60
61use crate::records::compiler::Compiler;
62
63// RAII register-stack guard. Must NOT be `Copy`/`Clone`: the C++ `~RegScope`
64// restores `regTop = oldTop` on scope exit, reproduced by the `Drop` below. The
65// prior `Copy` derive silently elided that restore, leaving `regTop` un-rewound
66// between sibling sub-expressions and tripping `assert!(top <= regTop)` in
67// `reg_scope_compiler_i32`.
68#[derive(Debug)]
69pub struct RegScope {
70    pub(crate) self_: *mut Compiler,
71    pub(crate) old_top: core::ffi::c_uint,
72}
73
74impl Drop for RegScope {
75    fn drop(&mut self) {
76        // C++ `~RegScope() { self->regTop = oldTop; }`
77        unsafe {
78            (*self.self_).reg_top = self.old_top;
79        }
80    }
81}