Skip to content

Commit

Permalink
[cling] Lifetime of MetaParser is that of its input:
Browse files Browse the repository at this point in the history
Before, MetaParser might have pointed to a StringRef whose storage
was gone, see asan failure in roottest/cling/other/runfileClose.C below.

This was caused by recursive uses of MetaParser; see stack trace below:
the inner recursion returned, but as the same MetaParser object was used
by both frames, the objects cursor now pointed to freed memory.

Instead, create a MetaParser (and MetaLexer) object per input. That way,
their lifetime corresponds to the lifetime of their input.

=================================================================
==529104==ERROR: AddressSanitizer: stack-use-after-return on address 0x7ffff3afd82a at pc 0x7fffea18df6d bp 0x7fffffff8170 sp 0x7fffffff8168
READ of size 1 at 0x7ffff3afd82a thread T0
[Detaching after fork from child process 529183]
    #0 0x7fffea18df6c in cling::MetaLexer::Lex(cling::Token&) src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:58:11
    #1 0x7fffea190d7c in cling::MetaParser::lookAhead(unsigned int) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:89:15
    #2 0x7fffea190bd5 in cling::MetaParser::consumeToken() src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:49:5
    #3 0x7fffea191d4d in cling::MetaParser::isLCommand(cling::MetaSema::ActionResult&) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:147:9
    #4 0x7fffea1914dd in cling::MetaParser::isCommand(cling::MetaSema::ActionResult&, cling::Value*) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:123:12
    #5 0x7fffea191216 in cling::MetaParser::isMetaCommand(cling::MetaSema::ActionResult&, cling::Value*) src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:101:33
    #6 0x7fffea14e5aa in cling::MetaProcessor::process(llvm::StringRef, cling::Interpreter::CompilationResult&, cling::Value*, bool) src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:317:24
    #7 0x7fffe99b67b7 in HandleInterpreterException(cling::MetaProcessor*, char const*, cling::Interpreter::CompilationResult&, cling::Value*) src/core/metacling/src/TCling.cxx:2431:29
    #8 0x7fffe99bde30 in TCling::Load(char const*, bool) src/core/metacling/src/TCling.cxx:3454:10
    #9 0x7ffff7865f11 in TSystem::Load(char const*, char const*, bool) src/core/base/src/TSystem.cxx:1941:27
    #10 0x7ffff7b8a0e3 in TUnixSystem::Load(char const*, char const*, bool) src/core/unix/src/TUnixSystem.cxx:2789:20
    #11 0x7fffd78dd08b  (<unknown module>)
    #12 0x7fffe9f8a5d9 in cling::IncrementalExecutor::executeWrapper(llvm::StringRef, cling::Value*) const src/interpreter/cling/lib/Interpreter/IncrementalExecutor.cpp:376:3
    #13 0x7fffe9d73dc2 in cling::Interpreter::RunFunction(clang::FunctionDecl const*, cling::Value*) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1141:20
    #14 0x7fffe9d6e317 in cling::Interpreter::EvaluateInternal(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cling::CompilationOptions, cling::Value*, cling::Transaction**, unsigned long) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1391:29
    #15 0x7fffe9d6c1fe in cling::Interpreter::process(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, cling::Value*, cling::Transaction**, bool) src/interpreter/cling/lib/Interpreter/Interpreter.cpp:819:9
    #16 0x7fffea151826 in cling::MetaProcessor::readInputFromFile(llvm::StringRef, cling::Value*, unsigned long, bool) src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:507:22
    #17 0x7fffe99b585b in TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:2570:39
    #18 0x7fffe99bbfee in TCling::ProcessLineSynch(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:3496:17
    #19 0x7ffff77203d3 in TApplication::ExecuteFile(char const*, int*, bool) src/core/base/src/TApplication.cxx:1608:30
    #20 0x7ffff771ebdf in TApplication::ProcessFile(char const*, int*, bool) src/core/base/src/TApplication.cxx:1480:11
    #21 0x7ffff771e385 in TApplication::ProcessLine(char const*, bool, int*) src/core/base/src/TApplication.cxx:1453:14
    #22 0x7ffff7f8157a in TRint::ProcessLineNr(char const*, char const*, int*) src/core/rint/src/TRint.cxx:766:11
    #23 0x7ffff7f802f0 in TRint::Run(bool) src/core/rint/src/TRint.cxx:424:22
    #24 0x4ff96d in main src/main/src/rmain.cxx:30:12
    #25 0x7ffff6e040b2 in __libc_start_main /build/glibc-YbNSs7/glibc-2.31/csu/../csu/libc-start.c:308:16
    #26 0x41f35d in _start (asan/bin/root.exe+0x41f35d)

Address 0x7ffff3afd82a is located in stack of thread T0 at offset 42 in frame
    #0 0x7fffe99b3d8f in TCling::ProcessLine(char const*, TInterpreter::EErrorCode*) src/core/metacling/src/TCling.cxx:2456

  This frame has 21 object(s):
    [32, 56) 'sLine' (line 2462) <== Memory access at offset 42 is inside this variable
    [96, 104) 'R__guard2471' (line 2471)
    [128, 136) 'R__guard2488' (line 2488)
    [160, 176) 'interpreterFlagsRAII' (line 2491)
    [192, 240) 'result' (line 2511)
    [272, 276) 'compRes' (line 2512)
    [288, 312) 'mod_line' (line 2517)
    [352, 376) 'aclicMode' (line 2518)
    [416, 440) 'arguments' (line 2519)
    [480, 504) 'io' (line 2520)
    [544, 568) 'fname' (line 2521)
    [608, 632) 'ref.tmp' (line 2547)
    [672, 696) 'ref.tmp145' (line 2547)
    [736, 768) 'code' (line 2555)
    [800, 832) 'codeline' (line 2556)
    [864, 1384) 'in' (line 2559)
    [1520, 1552) 'ref.tmp176' (line 2562)
    [1584, 1600) 'agg.tmp'
    [1616, 1624) 'ref.tmp198' (line 2568)
    [1648, 1664) 'agg.tmp207'
    [1680, 1696) 'autoParseRaii' (line 2588)
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-use-after-return src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:58:11 in cling::MetaLexer::Lex(cling::Token&)
Shadow bytes around the buggy address:
  0x10007e757ab0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757ac0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757ad0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757ae0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757af0: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
=>0x10007e757b00: f5 f5 f5 f5 f5[f5]f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b10: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b20: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b30: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b40: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
  0x10007e757b50: f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5 f5
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==529104==ABORTING

    at src/interpreter/cling/lib/MetaProcessor/MetaLexer.cpp:49
    at src/interpreter/cling/lib/MetaProcessor/MetaParser.cpp:41
    compRes=@0x7ffff3afd910: cling::Interpreter::kSuccess, result=0x7ffff3afd8c0, disableValuePrinting=false)
    at src/interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp:314
    input_line=0x7ffff3afd829 "#define XYZ 21", compRes=@0x7ffff3afd910: cling::Interpreter::kSuccess,
    result=0x7ffff3afd8c0) at src/core/metacling/src/TCling.cxx:2431
    error=0x7fffd78cb0f4 <x>) at src/core/metacling/src/TCling.cxx:2591
    sync=false, err=0x7fffd78cb0f4 <x>) at src/core/base/src/TApplication.cxx:1472
    line=0x7fffd78c9000 "#define XYZ 21", error=0x7fffd78cb0f4 <x>)
    at src/core/base/src/TROOT.cxx:2328
   from asan/roottest/cling/other/fileClose_C.so
    filename=0x6070000f0fd0 "asan/roottest/cling/other/fileClose_C.so", flag=257)
    at /home/axel/build/llvm/llvm-project/compiler-rt/lib/asan/../sanitizer_common/sanitizer_common_interceptors.inc:6270
    at src/interpreter/cling/lib/Utils/PlatformPosix.cpp:118
    permanent=false, resolved=true)
    at src/interpreter/cling/lib/Interpreter/DynamicLibraryManager.cpp:184
    at src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1444
    T=0x0) at src/interpreter/cling/lib/Interpreter/Interpreter.cpp:1560
    at src/interpreter/cling/lib/MetaProcessor/MetaSema.cpp:57
    actionResult=@0x7ffff39532b0: cling::MetaSema::AR_Success)
  • Loading branch information
Axel-Naumann committed May 5, 2021
1 parent 3c11e8b commit 3aa83e5
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 53 deletions.
7 changes: 3 additions & 4 deletions interpreter/cling/include/cling/MetaProcessor/MetaParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ namespace cling {
class MetaParser {
private:
MetaLexer m_Lexer;
std::unique_ptr<MetaSema> m_Actions;
MetaSema &m_Actions;
llvm::SmallVector<Token, 2> m_TokenCache;
llvm::SmallVector<Token, 4> m_MetaSymbolCache;
private:
Expand Down Expand Up @@ -113,8 +113,7 @@ namespace cling {
bool isShellCommand(MetaSema::ActionResult& actionResult,
Value* resultValue);
public:
MetaParser(MetaSema* Actions);
void enterNewInputLine(llvm::StringRef Line);
MetaParser(MetaSema &Actions, llvm::StringRef Line);

///\brief Drives the recursive decendent parsing.
///
Expand All @@ -127,7 +126,7 @@ namespace cling {
///
bool isQuitRequested() const;

MetaSema& getActions() const { return *m_Actions.get(); }
MetaSema& getActions() const { return m_Actions; }
};
} // end namespace cling

Expand Down
4 changes: 2 additions & 2 deletions interpreter/cling/include/cling/MetaProcessor/MetaProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace cling {

class Interpreter;
class InputValidator;
class MetaParser;
class MetaSema;
class Value;

///\brief Class that helps processing meta commands, which add extra
Expand All @@ -43,7 +43,7 @@ namespace cling {

///\brief The parser used to parse our tiny "meta" language
///
std::unique_ptr<MetaParser> m_MetaParser;
std::unique_ptr<MetaSema> m_MetaSema;

///\brief Currently executing file as passed into executeFile
///
Expand Down
79 changes: 37 additions & 42 deletions interpreter/cling/lib/MetaProcessor/MetaParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@

namespace cling {

MetaParser::MetaParser(MetaSema* Actions) : m_Lexer("") {
m_Actions.reset(Actions);
const InvocationOptions& Opts = Actions->getInterpreter().getOptions();
MetaParser::MetaParser(MetaSema &Actions, llvm::StringRef Line) :
m_Lexer(Line), m_Actions(Actions) {
const InvocationOptions& Opts = Actions.getInterpreter().getOptions();
MetaLexer metaSymbolLexer(Opts.MetaString);
Token Tok;
while(true) {
Expand All @@ -37,11 +37,6 @@ namespace cling {
}
}

void MetaParser::enterNewInputLine(llvm::StringRef Line) {
m_Lexer.reset(Line);
m_TokenCache.clear();
}

void MetaParser::consumeToken() {
if (m_TokenCache.size())
m_TokenCache.erase(m_TokenCache.begin());
Expand Down Expand Up @@ -102,7 +97,7 @@ namespace cling {
}

bool MetaParser::isQuitRequested() const {
return m_Actions->isQuitRequested();
return m_Actions.isQuitRequested();
}

bool MetaParser::isCommandSymbol() {
Expand Down Expand Up @@ -143,11 +138,11 @@ namespace cling {
consumeAnyStringToken(tok::comment);
if (getCurTok().is(tok::raw_ident)) {
result = true;
actionResult = m_Actions->actOnLCommand(getCurTok().getIdent());
actionResult = m_Actions.actOnLCommand(getCurTok().getIdent());
consumeToken();
if (getCurTok().is(tok::comment)) {
consumeAnyStringToken(tok::eof);
m_Actions->actOnComment(getCurTok().getIdent());
m_Actions.actOnComment(getCurTok().getIdent());
}
}
}
Expand All @@ -168,7 +163,7 @@ namespace cling {
if (getCurTok().is(tok::raw_ident)) {
result = true;
std::string outputFile = getCurTok().getIdent();
actionResult = m_Actions->actOnTCommand(inputFile, outputFile);
actionResult = m_Actions.actOnTCommand(inputFile, outputFile);
}
}
}
Expand Down Expand Up @@ -257,9 +252,9 @@ namespace cling {
}
// Empty file means std.
actionResult =
m_Actions->actOnRedirectCommand(file/*file*/,
stream/*which stream to redirect*/,
append/*append mode*/);
m_Actions.actOnRedirectCommand(file/*file*/,
stream/*which stream to redirect*/,
append/*append mode*/);
return true;
}
return false;
Expand Down Expand Up @@ -316,7 +311,7 @@ namespace cling {

if (args.empty())
args = "()";
actionResult = m_Actions->actOnxCommand(file, args, resultValue);
actionResult = m_Actions.actOnxCommand(file, args, resultValue);
return true;
}

Expand All @@ -335,7 +330,7 @@ namespace cling {
bool result = false;
if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("q")) {
result = true;
m_Actions->actOnqCommand();
m_Actions.actOnqCommand();
}
return result;
}
Expand All @@ -346,7 +341,7 @@ namespace cling {
llvm::StringRef path;
if (getCurTok().is(tok::raw_ident)) {
path = getCurTok().getIdent();
actionResult = m_Actions->actOnUCommand(path);
actionResult = m_Actions.actOnUCommand(path);
return true;
}
}
Expand All @@ -361,7 +356,7 @@ namespace cling {
llvm::StringRef path;
if (getCurTok().is(tok::raw_ident))
path = getCurTok().getIdent();
m_Actions->actOnICommand(path);
m_Actions.actOnICommand(path);
return true;
}
return false;
Expand All @@ -378,7 +373,7 @@ namespace cling {
consumeAnyStringToken(tok::eof);
if (getCurTok().is(tok::raw_ident))
return false;
actionResult = m_Actions->actOnOCommand(level);
actionResult = m_Actions.actOnOCommand(level);
return true;
}
} else {
Expand All @@ -389,11 +384,11 @@ namespace cling {
int level = 0;
if (!lastStringToken.getIdent().getAsInteger(10, level)
&& level >= 0) {
actionResult = m_Actions->actOnOCommand(level);
actionResult = m_Actions.actOnOCommand(level);
return true;
}
} else {
m_Actions->actOnOCommand();
m_Actions.actOnOCommand();
actionResult = MetaSema::AR_Success;
return true;
}
Expand All @@ -409,7 +404,7 @@ namespace cling {
) {
consumeToken();
skipWhitespace();
m_Actions->actOnAtCommand();
m_Actions.actOnAtCommand();
return true;
}
return false;
Expand All @@ -423,7 +418,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool();
m_Actions->actOnrawInputCommand(mode);
m_Actions.actOnrawInputCommand(mode);
return true;
}
return false;
Expand All @@ -437,7 +432,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = getCurTok().getConstant();
m_Actions->actOndebugCommand(mode);
m_Actions.actOndebugCommand(mode);
return true;
}
return false;
Expand All @@ -451,7 +446,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool();
m_Actions->actOnprintDebugCommand(mode);
m_Actions.actOnprintDebugCommand(mode);
return true;
}
return false;
Expand All @@ -467,7 +462,7 @@ namespace cling {
return false; // FIXME: Issue proper diagnostics
std::string ident = getCurTok().getIdentNoQuotes();
consumeToken();
m_Actions->actOnstoreStateCommand(ident);
m_Actions.actOnstoreStateCommand(ident);
return true;
}
return false;
Expand All @@ -483,7 +478,7 @@ namespace cling {
return false; // FIXME: Issue proper diagnostics
std::string ident = getCurTok().getIdentNoQuotes();
consumeToken();
m_Actions->actOncompareStateCommand(ident);
m_Actions.actOncompareStateCommand(ident);
return true;
}
return false;
Expand All @@ -500,7 +495,7 @@ namespace cling {
consumeToken();
skipWhitespace();
const Token& next = getCurTok();
m_Actions->actOnstatsCommand(what, next.is(tok::ident)
m_Actions.actOnstatsCommand(what, next.is(tok::ident)
? next.getIdent() : llvm::StringRef());
return true;
}
Expand All @@ -518,7 +513,7 @@ namespace cling {
llvm::StringRef ident = getCurTok().getIdent();
consumeToken();
skipWhitespace();
m_Actions->actOnstatsCommand(ident.equals("ast")
m_Actions.actOnstatsCommand(ident.equals("ast")
? llvm::StringRef("asttree") : ident,
getCurTok().is(tok::ident) ? getCurTok().getIdent() : llvm::StringRef());
consumeToken();
Expand All @@ -534,9 +529,9 @@ namespace cling {
skipWhitespace();
const Token& next = getCurTok();
if (next.is(tok::constant))
m_Actions->actOnUndoCommand(next.getConstant());
m_Actions.actOnUndoCommand(next.getConstant());
else
m_Actions->actOnUndoCommand();
m_Actions.actOnUndoCommand();
return true;
}
return false;
Expand All @@ -550,7 +545,7 @@ namespace cling {
skipWhitespace();
if (getCurTok().is(tok::constant))
mode = (MetaSema::SwitchMode)getCurTok().getConstantAsBool();
m_Actions->actOndynamicExtensionsCommand(mode);
m_Actions.actOndynamicExtensionsCommand(mode);
return true;
}
return false;
Expand All @@ -560,23 +555,23 @@ namespace cling {
const Token& Tok = getCurTok();
if (Tok.is(tok::quest_mark) ||
(Tok.is(tok::ident) && Tok.getIdent().equals("help"))) {
m_Actions->actOnhelpCommand();
m_Actions.actOnhelpCommand();
return true;
}
return false;
}

bool MetaParser::isfileExCommand() {
if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("fileEx")) {
m_Actions->actOnfileExCommand();
m_Actions.actOnfileExCommand();
return true;
}
return false;
}

bool MetaParser::isfilesCommand() {
if (getCurTok().is(tok::ident) && getCurTok().getIdent().equals("files")) {
m_Actions->actOnfilesCommand();
m_Actions.actOnfilesCommand();
return true;
}
return false;
Expand All @@ -591,11 +586,11 @@ namespace cling {
llvm::StringRef className;
if (NextTok.is(tok::raw_ident))
className = NextTok.getIdent();
m_Actions->actOnclassCommand(className);
m_Actions.actOnclassCommand(className);
return true;
}
else if (Tok.getIdent().equals("Class")) {
m_Actions->actOnClassCommand();
m_Actions.actOnClassCommand();
return true;
}
}
Expand All @@ -609,7 +604,7 @@ namespace cling {
consumeAnyStringToken(tok::eof);
if (getCurTok().is(tok::raw_ident))
return false;
m_Actions->actOnNamespaceCommand();
m_Actions.actOnNamespaceCommand();
return true;
}
}
Expand All @@ -623,7 +618,7 @@ namespace cling {
llvm::StringRef varName;
if (getCurTok().is(tok::ident))
varName = getCurTok().getIdent();
m_Actions->actOngCommand(varName);
m_Actions.actOngCommand(varName);
return true;
}
return false;
Expand All @@ -638,7 +633,7 @@ namespace cling {
llvm::StringRef typedefName;
if (NextTok.is(tok::raw_ident))
typedefName = NextTok.getIdent();
m_Actions->actOnTypedefCommand(typedefName);
m_Actions.actOnTypedefCommand(typedefName);
return true;
}
}
Expand All @@ -656,7 +651,7 @@ namespace cling {
if (NextTok.is(tok::raw_ident)) {
llvm::StringRef commandLine(NextTok.getIdent());
if (!commandLine.empty())
actionResult = m_Actions->actOnShellCommand(commandLine,
actionResult = m_Actions.actOnShellCommand(commandLine,
resultValue);
}
return true;
Expand Down
10 changes: 5 additions & 5 deletions interpreter/cling/lib/MetaProcessor/MetaProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ namespace cling {
MetaProcessor::MetaProcessor(Interpreter& interp, raw_ostream& outs)
: m_Interp(interp), m_Outs(&outs) {
m_InputValidator.reset(new InputValidator());
m_MetaParser.reset(new MetaParser(new MetaSema(interp, *this)));
m_MetaSema.reset(new MetaSema(interp, *this));
}

MetaProcessor::~MetaProcessor() {
Expand All @@ -311,12 +311,12 @@ namespace cling {
}

// Check for and handle meta commands.
m_MetaParser->enterNewInputLine(input_line);
MetaParser parser(*m_MetaSema, input_line);
MetaSema::ActionResult actionResult = MetaSema::AR_Success;
if (!m_InputValidator->inBlockComment() &&
m_MetaParser->isMetaCommand(actionResult, result)) {
parser.isMetaCommand(actionResult, result)) {

if (m_MetaParser->isQuitRequested())
if (parser.isQuitRequested())
return -1;

if (actionResult != MetaSema::AR_Success)
Expand Down Expand Up @@ -525,7 +525,7 @@ namespace cling {

void MetaProcessor::registerUnloadPoint(const Transaction* T,
llvm::StringRef filename) {
m_MetaParser->getActions().registerUnloadPoint(T, filename);
m_MetaSema->registerUnloadPoint(T, filename);
}

} // end namespace cling

0 comments on commit 3aa83e5

Please sign in to comment.