diff --git a/tslang/include/TypeScript/MLIRLogic/MLIRGenContext.h b/tslang/include/TypeScript/MLIRLogic/MLIRGenContext.h index 3bc768d5..4f3b35aa 100644 --- a/tslang/include/TypeScript/MLIRLogic/MLIRGenContext.h +++ b/tslang/include/TypeScript/MLIRLogic/MLIRGenContext.h @@ -149,45 +149,45 @@ struct GenContext return stopProcess || rootContext && rootContext->stopProcess; } - bool allowPartialResolve; - bool dummyRun; - bool allowConstEval; - bool allocateVarsInContextThis; - bool allocateVarsOutsideOfOperation; - bool allocateUsingVarsOutsideOfOperation; - bool forceDiscover; - bool discoverParamsOnly; - bool insertIntoParentScope; - mlir::Operation *currentOperation; + bool allowPartialResolve = false; + bool dummyRun = false; + bool allowConstEval = false; + bool allocateVarsInContextThis = false; + bool allocateVarsOutsideOfOperation = false; + bool allocateUsingVarsOutsideOfOperation = false; + bool forceDiscover = false; + bool discoverParamsOnly = false; + bool insertIntoParentScope = false; + mlir::Operation *currentOperation = nullptr; mlir_ts::FuncOp funcOp; FunctionPrototypeDOM::TypePtr funcProto; - llvm::StringMap *capturedVars; - llvm::SmallVector *usingVars; + llvm::StringMap *capturedVars = nullptr; + llvm::SmallVector *usingVars = nullptr; mlir::Type thisType; mlir_ts::ClassType thisClassType; mlir::Type receiverFuncType; mlir::Type receiverType; mlir::StringRef receiverName; - bool isGlobalVarReceiver; - PassResult *passResult; - mlir::SmallVector *cleanUps; - mlir::SmallVector *cleanUpOps; + bool isGlobalVarReceiver = false; + PassResult *passResult = nullptr; + mlir::SmallVector *cleanUps = nullptr; + mlir::SmallVector *cleanUpOps = nullptr; NodeArray generatedStatements; llvm::StringMap typeAliasMap; llvm::StringMap> typeParamsWithArgs; ArrayRef callOperands; - int *state; - bool disableSpreadParams; - const GenContext* parentBlockContext; - const GenContext* rootContext; - bool isLoop; + int *state = nullptr; + bool disableSpreadParams = false; + const GenContext* parentBlockContext = nullptr; + const GenContext* rootContext = nullptr; + bool isLoop = false; std::string loopLabel; - bool stopProcess; - mlir::SmallVector> *postponedMessages; - bool specialization; + bool stopProcess = false; + mlir::SmallVector> *postponedMessages = nullptr; + bool specialization = false; // TODO: special hack to detect initializing specialized class and see that generic methods are not initialized at the same time - bool instantiateSpecializedFunction; - llvm::StringMap> *inferTypes; + bool instantiateSpecializedFunction = false; + llvm::StringMap> *inferTypes = nullptr; }; struct ValueOrLogicalResult diff --git a/tslang/lib/TypeScript/MLIRGen.cpp b/tslang/lib/TypeScript/MLIRGen.cpp index 6bb1ee5a..5cdf7588 100644 --- a/tslang/lib/TypeScript/MLIRGen.cpp +++ b/tslang/lib/TypeScript/MLIRGen.cpp @@ -192,6 +192,28 @@ class MLIRGenImpl const_cast(sourceMgr).setIncludeDirs(includeDirs); } + // RAII scope switching the current source file and file name (used for locations and debug info). + class SourceFileScope + { + public: + SourceFileScope(MLIRGenImpl &mlirGenImpl, ts::SourceFile newSourceFile, llvm::StringRef newFileName) + : sourceFileGuard(mlirGenImpl.sourceFile, newSourceFile), + fileNameGuard(mlirGenImpl.mainSourceFileName, newFileName) + { + } + + // interns the file name from the source file's wide file name + SourceFileScope(MLIRGenImpl &mlirGenImpl, ts::SourceFile newSourceFile) + : SourceFileScope(mlirGenImpl, newSourceFile, + llvm::StringRef(convertWideToUTF8(newSourceFile->fileName)).copy(mlirGenImpl.stringAllocator)) + { + } + + private: + MLIRValueGuard sourceFileGuard; + MLIRValueGuard fileNameGuard; + }; + mlir::LogicalResult report(SourceFile module, const std::vector &includeFiles) { // output diag info @@ -748,12 +770,7 @@ class MLIRGenImpl for (auto includeFile : includeFiles) { - MLIRValueGuard vgFileName(mainSourceFileName); - auto fileNameUtf8 = convertWideToUTF8(includeFile->fileName); - mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator); - - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = includeFile; + SourceFileScope sourceFileScope(*this, includeFile); if (failed(mlirGen(includeFile->statements, genContextPartial))) { @@ -830,12 +847,7 @@ class MLIRGenImpl for (auto includeFile : includeFiles) { - MLIRValueGuard vgFileName(mainSourceFileName); - auto fileNameUtf8 = convertWideToUTF8(includeFile->fileName); - mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);; - - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = includeFile; + SourceFileScope sourceFileScope(*this, includeFile); if (failed(mlirGen(includeFile->statements, genContext))) { @@ -983,12 +995,7 @@ class MLIRGenImpl } // we need to override filename to track it in DBG info - MLIRValueGuard vgFileName(mainSourceFileName); - auto fileNameUtf8 = convertWideToUTF8(importSource->fileName); - mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator); - - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = importSource; + SourceFileScope sourceFileScope(*this, importSource); if (mlir::succeeded(mlirDiscoverAllDependencies(importSource, importIncludeFiles)) && mlir::succeeded(mlirCodeGenModule(importSource, importIncludeFiles, false, false))) @@ -2219,11 +2226,7 @@ class MLIRGenImpl MLIRNamespaceGuard nsGuard(currentNamespace); currentNamespace = functionGenericTypeInfo->elementNamespace; - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = functionGenericTypeInfo->sourceFile; - - MLIRValueGuard vgFileName(mainSourceFileName); - mainSourceFileName = functionGenericTypeInfo->fileName; + SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName); return instantiateSpecializedFunctionTypeHelper(location, functionGenericTypeInfo->functionDeclaration, recieverType, discoverReturnType, genContext); @@ -2315,11 +2318,7 @@ class MLIRGenImpl MLIRNamespaceGuard nsGuard(currentNamespace); currentNamespace = functionGenericTypeInfo->elementNamespace; - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = functionGenericTypeInfo->sourceFile; - - MLIRValueGuard vgFileName(mainSourceFileName); - mainSourceFileName = functionGenericTypeInfo->fileName; + SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName); auto [result, specFuncOp, specFuncName, isGeneric] = mlirGenFunctionLikeDeclaration(functionGenericTypeInfo->functionDeclaration, funcGenContext); @@ -2669,11 +2668,7 @@ class MLIRGenImpl MLIRNamespaceGuard ng(currentNamespace); currentNamespace = functionGenericTypeInfo->elementNamespace; - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = functionGenericTypeInfo->sourceFile; - - MLIRValueGuard vgFileName(mainSourceFileName); - mainSourceFileName = functionGenericTypeInfo->fileName; + SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName); auto anyNamedGenericType = IsGeneric::False; @@ -2900,11 +2895,7 @@ class MLIRGenImpl MLIRNamespaceGuard ng(currentNamespace); currentNamespace = genericClassInfo->elementNamespace; - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = genericClassInfo->sourceFile; - - MLIRValueGuard vgFileName(mainSourceFileName); - mainSourceFileName = genericClassInfo->fileName; + SourceFileScope sourceFileScope(*this, genericClassInfo->sourceFile, genericClassInfo->fileName); GenContext genericTypeGenContext(genContext); genericTypeGenContext.instantiateSpecializedFunction = false; @@ -2970,11 +2961,7 @@ class MLIRGenImpl MLIRNamespaceGuard ng(currentNamespace); currentNamespace = genericClassInfo->elementNamespace; - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = genericClassInfo->sourceFile; - - MLIRValueGuard vgFileName(mainSourceFileName); - mainSourceFileName = genericClassInfo->fileName; + SourceFileScope sourceFileScope(*this, genericClassInfo->sourceFile, genericClassInfo->fileName); GenContext genericTypeGenContext(genContext); genericTypeGenContext.instantiateSpecializedFunction = false; @@ -3044,11 +3031,7 @@ class MLIRGenImpl MLIRNamespaceGuard ng(currentNamespace); currentNamespace = genericInterfaceInfo->elementNamespace; - MLIRValueGuard vgSourceFile(sourceFile); - sourceFile = genericInterfaceInfo->sourceFile; - - MLIRValueGuard vgFileName(mainSourceFileName); - mainSourceFileName = genericInterfaceInfo->fileName; + SourceFileScope sourceFileScope(*this, genericInterfaceInfo->sourceFile, genericInterfaceInfo->fileName); GenContext genericTypeGenContext(genContext); auto typeParams = genericInterfaceInfo->typeParams;