Skip to content

Commit 102ef9d

Browse files
Add GenContext field initializers and SourceFileScope RAII guard (#202)
- Default member initializers on all GenContext scalar/pointer fields; a plain "GenContext ctx;" no longer produces indeterminate codegen flags (review doc item A1) - SourceFileScope replaces the 9 hand-rolled sourceFile/mainSourceFileName guard pairs, using the MLIRValueGuard save-and-set constructor (review doc item A2) Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 9a2c395 commit 102ef9d

2 files changed

Lines changed: 57 additions & 74 deletions

File tree

tslang/include/TypeScript/MLIRLogic/MLIRGenContext.h

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -149,45 +149,45 @@ struct GenContext
149149
return stopProcess || rootContext && rootContext->stopProcess;
150150
}
151151

152-
bool allowPartialResolve;
153-
bool dummyRun;
154-
bool allowConstEval;
155-
bool allocateVarsInContextThis;
156-
bool allocateVarsOutsideOfOperation;
157-
bool allocateUsingVarsOutsideOfOperation;
158-
bool forceDiscover;
159-
bool discoverParamsOnly;
160-
bool insertIntoParentScope;
161-
mlir::Operation *currentOperation;
152+
bool allowPartialResolve = false;
153+
bool dummyRun = false;
154+
bool allowConstEval = false;
155+
bool allocateVarsInContextThis = false;
156+
bool allocateVarsOutsideOfOperation = false;
157+
bool allocateUsingVarsOutsideOfOperation = false;
158+
bool forceDiscover = false;
159+
bool discoverParamsOnly = false;
160+
bool insertIntoParentScope = false;
161+
mlir::Operation *currentOperation = nullptr;
162162
mlir_ts::FuncOp funcOp;
163163
FunctionPrototypeDOM::TypePtr funcProto;
164-
llvm::StringMap<ts::VariableDeclarationDOM::TypePtr> *capturedVars;
165-
llvm::SmallVector<ts::VariableDeclarationDOM::TypePtr> *usingVars;
164+
llvm::StringMap<ts::VariableDeclarationDOM::TypePtr> *capturedVars = nullptr;
165+
llvm::SmallVector<ts::VariableDeclarationDOM::TypePtr> *usingVars = nullptr;
166166
mlir::Type thisType;
167167
mlir_ts::ClassType thisClassType;
168168
mlir::Type receiverFuncType;
169169
mlir::Type receiverType;
170170
mlir::StringRef receiverName;
171-
bool isGlobalVarReceiver;
172-
PassResult *passResult;
173-
mlir::SmallVector<mlir::Block *> *cleanUps;
174-
mlir::SmallVector<mlir::Operation *> *cleanUpOps;
171+
bool isGlobalVarReceiver = false;
172+
PassResult *passResult = nullptr;
173+
mlir::SmallVector<mlir::Block *> *cleanUps = nullptr;
174+
mlir::SmallVector<mlir::Operation *> *cleanUpOps = nullptr;
175175
NodeArray<Statement> generatedStatements;
176176
llvm::StringMap<mlir::Type> typeAliasMap;
177177
llvm::StringMap<std::pair<TypeParameterDOM::TypePtr, mlir::Type>> typeParamsWithArgs;
178178
ArrayRef<mlir::Value> callOperands;
179-
int *state;
180-
bool disableSpreadParams;
181-
const GenContext* parentBlockContext;
182-
const GenContext* rootContext;
183-
bool isLoop;
179+
int *state = nullptr;
180+
bool disableSpreadParams = false;
181+
const GenContext* parentBlockContext = nullptr;
182+
const GenContext* rootContext = nullptr;
183+
bool isLoop = false;
184184
std::string loopLabel;
185-
bool stopProcess;
186-
mlir::SmallVector<std::unique_ptr<mlir::Diagnostic>> *postponedMessages;
187-
bool specialization;
185+
bool stopProcess = false;
186+
mlir::SmallVector<std::unique_ptr<mlir::Diagnostic>> *postponedMessages = nullptr;
187+
bool specialization = false;
188188
// TODO: special hack to detect initializing specialized class and see that generic methods are not initialized at the same time
189-
bool instantiateSpecializedFunction;
190-
llvm::StringMap<std::pair<TypeParameterDOM::TypePtr, mlir::Type>> *inferTypes;
189+
bool instantiateSpecializedFunction = false;
190+
llvm::StringMap<std::pair<TypeParameterDOM::TypePtr, mlir::Type>> *inferTypes = nullptr;
191191
};
192192

193193
struct ValueOrLogicalResult

tslang/lib/TypeScript/MLIRGen.cpp

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,28 @@ class MLIRGenImpl
192192
const_cast<llvm::SourceMgr &>(sourceMgr).setIncludeDirs(includeDirs);
193193
}
194194

195+
// RAII scope switching the current source file and file name (used for locations and debug info).
196+
class SourceFileScope
197+
{
198+
public:
199+
SourceFileScope(MLIRGenImpl &mlirGenImpl, ts::SourceFile newSourceFile, llvm::StringRef newFileName)
200+
: sourceFileGuard(mlirGenImpl.sourceFile, newSourceFile),
201+
fileNameGuard(mlirGenImpl.mainSourceFileName, newFileName)
202+
{
203+
}
204+
205+
// interns the file name from the source file's wide file name
206+
SourceFileScope(MLIRGenImpl &mlirGenImpl, ts::SourceFile newSourceFile)
207+
: SourceFileScope(mlirGenImpl, newSourceFile,
208+
llvm::StringRef(convertWideToUTF8(newSourceFile->fileName)).copy(mlirGenImpl.stringAllocator))
209+
{
210+
}
211+
212+
private:
213+
MLIRValueGuard<ts::SourceFile> sourceFileGuard;
214+
MLIRValueGuard<llvm::StringRef> fileNameGuard;
215+
};
216+
195217
mlir::LogicalResult report(SourceFile module, const std::vector<SourceFile> &includeFiles)
196218
{
197219
// output diag info
@@ -748,12 +770,7 @@ class MLIRGenImpl
748770

749771
for (auto includeFile : includeFiles)
750772
{
751-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
752-
auto fileNameUtf8 = convertWideToUTF8(includeFile->fileName);
753-
mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);
754-
755-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
756-
sourceFile = includeFile;
773+
SourceFileScope sourceFileScope(*this, includeFile);
757774

758775
if (failed(mlirGen(includeFile->statements, genContextPartial)))
759776
{
@@ -830,12 +847,7 @@ class MLIRGenImpl
830847

831848
for (auto includeFile : includeFiles)
832849
{
833-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
834-
auto fileNameUtf8 = convertWideToUTF8(includeFile->fileName);
835-
mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);;
836-
837-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
838-
sourceFile = includeFile;
850+
SourceFileScope sourceFileScope(*this, includeFile);
839851

840852
if (failed(mlirGen(includeFile->statements, genContext)))
841853
{
@@ -983,12 +995,7 @@ class MLIRGenImpl
983995
}
984996

985997
// we need to override filename to track it in DBG info
986-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
987-
auto fileNameUtf8 = convertWideToUTF8(importSource->fileName);
988-
mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);
989-
990-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
991-
sourceFile = importSource;
998+
SourceFileScope sourceFileScope(*this, importSource);
992999

9931000
if (mlir::succeeded(mlirDiscoverAllDependencies(importSource, importIncludeFiles)) &&
9941001
mlir::succeeded(mlirCodeGenModule(importSource, importIncludeFiles, false, false)))
@@ -2219,11 +2226,7 @@ class MLIRGenImpl
22192226
MLIRNamespaceGuard nsGuard(currentNamespace);
22202227
currentNamespace = functionGenericTypeInfo->elementNamespace;
22212228

2222-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2223-
sourceFile = functionGenericTypeInfo->sourceFile;
2224-
2225-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2226-
mainSourceFileName = functionGenericTypeInfo->fileName;
2229+
SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName);
22272230

22282231
return instantiateSpecializedFunctionTypeHelper(location, functionGenericTypeInfo->functionDeclaration,
22292232
recieverType, discoverReturnType, genContext);
@@ -2315,11 +2318,7 @@ class MLIRGenImpl
23152318
MLIRNamespaceGuard nsGuard(currentNamespace);
23162319
currentNamespace = functionGenericTypeInfo->elementNamespace;
23172320

2318-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2319-
sourceFile = functionGenericTypeInfo->sourceFile;
2320-
2321-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2322-
mainSourceFileName = functionGenericTypeInfo->fileName;
2321+
SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName);
23232322

23242323
auto [result, specFuncOp, specFuncName, isGeneric] =
23252324
mlirGenFunctionLikeDeclaration(functionGenericTypeInfo->functionDeclaration, funcGenContext);
@@ -2669,11 +2668,7 @@ class MLIRGenImpl
26692668
MLIRNamespaceGuard ng(currentNamespace);
26702669
currentNamespace = functionGenericTypeInfo->elementNamespace;
26712670

2672-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2673-
sourceFile = functionGenericTypeInfo->sourceFile;
2674-
2675-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2676-
mainSourceFileName = functionGenericTypeInfo->fileName;
2671+
SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName);
26772672

26782673
auto anyNamedGenericType = IsGeneric::False;
26792674

@@ -2900,11 +2895,7 @@ class MLIRGenImpl
29002895
MLIRNamespaceGuard ng(currentNamespace);
29012896
currentNamespace = genericClassInfo->elementNamespace;
29022897

2903-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2904-
sourceFile = genericClassInfo->sourceFile;
2905-
2906-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2907-
mainSourceFileName = genericClassInfo->fileName;
2898+
SourceFileScope sourceFileScope(*this, genericClassInfo->sourceFile, genericClassInfo->fileName);
29082899

29092900
GenContext genericTypeGenContext(genContext);
29102901
genericTypeGenContext.instantiateSpecializedFunction = false;
@@ -2970,11 +2961,7 @@ class MLIRGenImpl
29702961
MLIRNamespaceGuard ng(currentNamespace);
29712962
currentNamespace = genericClassInfo->elementNamespace;
29722963

2973-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2974-
sourceFile = genericClassInfo->sourceFile;
2975-
2976-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2977-
mainSourceFileName = genericClassInfo->fileName;
2964+
SourceFileScope sourceFileScope(*this, genericClassInfo->sourceFile, genericClassInfo->fileName);
29782965

29792966
GenContext genericTypeGenContext(genContext);
29802967
genericTypeGenContext.instantiateSpecializedFunction = false;
@@ -3044,11 +3031,7 @@ class MLIRGenImpl
30443031
MLIRNamespaceGuard ng(currentNamespace);
30453032
currentNamespace = genericInterfaceInfo->elementNamespace;
30463033

3047-
MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
3048-
sourceFile = genericInterfaceInfo->sourceFile;
3049-
3050-
MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
3051-
mainSourceFileName = genericInterfaceInfo->fileName;
3034+
SourceFileScope sourceFileScope(*this, genericInterfaceInfo->sourceFile, genericInterfaceInfo->fileName);
30523035

30533036
GenContext genericTypeGenContext(genContext);
30543037
auto typeParams = genericInterfaceInfo->typeParams;

0 commit comments

Comments
 (0)