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}