int StaticRunner::launch() { //set execution thread in java if (!initialJavaHooks && getScilabMode() != SCILAB_NWNI) { initialJavaHooks = true; // Execute the initial hooks registered in Scilab.java ExecuteInitialHooks(); } int iRet = 0; // get the runner to execute std::unique_ptr<Runner> runMe(getRunner()); // set if the current comment is interruptible setInterruptibleCommand(runMe->isInterruptible()); debugger::DebuggerMagager* manager = debugger::DebuggerMagager::getInstance(); ConfigVariable::resetExecutionBreak(); int oldMode = ConfigVariable::getPromptMode(); symbol::Context* pCtx = symbol::Context::getInstance(); int scope = pCtx->getScopeLevel(); // a TCL command display nothing int iOldPromptMode = 0; if (runMe->getCommandOrigin() == TCLSCI) { iOldPromptMode = ConfigVariable::getPromptMode(); ConfigVariable::setPromptMode(-1); } try { int level = ConfigVariable::getRecursionLevel(); try { runMe->getProgram()->accept(*(runMe->getVisitor())); } catch (const ast::RecursionException& re) { // management of pause if (ConfigVariable::getPauseLevel()) { ConfigVariable::DecreasePauseLevel(); throw re; } //close opened scope during try while (pCtx->getScopeLevel() > scope) { pCtx->scope_end(); } //decrease recursion to init value and close where while (ConfigVariable::getRecursionLevel() > level) { ConfigVariable::where_end(); ConfigVariable::decreaseRecursion(); } ConfigVariable::resetWhereError(); ConfigVariable::setPromptMode(oldMode); //print msg about recursion limit and trigger an error wchar_t sz[1024]; os_swprintf(sz, 1024, _W("Recursion limit reached (%d).\n").data(), ConfigVariable::getRecursionLimit()); throw ast::InternalError(sz); } } catch (const ast::InternalError& se) { if (runMe->getCommandOrigin() == TCLSCI) { ConfigVariable::setPromptMode(iOldPromptMode); } std::wostringstream ostr; ConfigVariable::whereErrorToString(ostr); scilabErrorW(ostr.str().c_str()); scilabErrorW(se.GetErrorMessage().c_str()); ConfigVariable::resetWhereError(); iRet = 1; } catch (const ast::InternalAbort& ia) { if (runMe->getCommandOrigin() == TCLSCI) { ConfigVariable::setPromptMode(iOldPromptMode); } // management of pause if (ConfigVariable::getPauseLevel()) { ConfigVariable::DecreasePauseLevel(); throw ia; } // close all scope before return to console scope symbol::Context* pCtx = symbol::Context::getInstance(); while (pCtx->getScopeLevel() > scope) { pCtx->scope_end(); } // send the good signal about the end of execution sendExecDoneSignal(runMe.get()); //clean debugger step flag if debugger is not interrupted ( end of debug ) manager->resetStep(); throw ia; } if (runMe->getCommandOrigin() == TCLSCI) { ConfigVariable::setPromptMode(iOldPromptMode); } if (getScilabMode() != SCILAB_NWNI && getScilabMode() != SCILAB_API) { char *cwd = NULL; int err = 0; UpdateBrowseVar(); cwd = scigetcwd(&err); if (cwd) { FileBrowserChDir(cwd); FREE(cwd); } } // reset error state when new prompt occurs ConfigVariable::resetError(); // send the good signal about the end of execution sendExecDoneSignal(runMe.get()); //clean debugger step flag if debugger is not interrupted ( end of debug ) manager->resetStep(); return iRet; }
/* * Previously called zzledt... Called by Fortran... * Now renamed to EventLoopPrompt * @TODO remove unused arg buf_size, menusflag, modex & dummy1 */ void C2F(eventloopprompt) (char *buffer, int *buf_size, int *len_line, int *eof) { if (getScilabMode() == SCILAB_API) { return; } if (!initialJavaHooks && getScilabMode() != SCILAB_NWNI) { initialJavaHooks = TRUE; // Execute the initial hooks registered in Scilab.java ExecuteInitialHooks(); } /* if not an interactive terminal */ #ifdef _MSC_VER /* if file descriptor returned is -2 stdin is not associated with an input stream */ /* example : echo plot3d | scilex -nw -e */ if (!isatty(fileno(stdin)) && (fileno(stdin) != -2) && getScilabMode() != SCILAB_STD) #else if (!isatty(fileno(stdin)) && getScilabMode() != SCILAB_STD) #endif { /* remove newline character if there */ if (__CommandLine != NULL) { /* read a line into the buffer, but not too * big */ *eof = (fgets(__CommandLine, *buf_size, stdin) == NULL); *len_line = (int)strlen(__CommandLine); /* remove newline character if there */ if (__CommandLine[*len_line - 1] == '\n') { (*len_line)--; } return; } } if (!initialized) { initAll(); } __LockSignal(pReadyForLaunch); if (__CommandLine) { FREE(__CommandLine); __CommandLine = NULL; } __CommandLine = strdup(""); if (ismenu() == 0) { if (!WatchGetCmdLineThreadAlive) { if (WatchGetCmdLineThread) { __WaitThreadDie(WatchGetCmdLineThread); } if (getScilabMode() != SCILAB_NWNI) { char *cwd = NULL; int err = 0; UpdateBrowseVar(TRUE); cwd = scigetcwd(&err); if (cwd) { FileBrowserChDir(cwd); FREE(cwd); } } __CreateThread(&WatchGetCmdLineThread, &watchGetCommandLine); WatchGetCmdLineThreadAlive = TRUE; } if (!WatchStoreCmdThreadAlive) { if (WatchStoreCmdThread) { __WaitThreadDie(WatchStoreCmdThread); } __CreateThread(&WatchStoreCmdThread, &watchStoreCommand); WatchStoreCmdThreadAlive = TRUE; } __Wait(&TimeToWork, pReadyForLaunch); } __UnLockSignal(pReadyForLaunch); /* ** WARNING : Old crappy f.... code ** do not change reference to buffer ** or fortran will be lost !!!! */ if (__CommandLine) { strcpy(buffer, __CommandLine); } else { strcpy(buffer, ""); } *len_line = (int)strlen(buffer); *eof = FALSE; }