OpenClonk
C4AulExec Class Reference

#include <C4AulExec.h>

Public Member Functions

 C4AulExec ()
 
C4Value Exec (C4AulScriptFunc *pSFunc, C4PropList *p, C4Value pPars[], bool fPassErrors)
 
C4Value DirectExec (C4PropList *p, const char *szScript, const char *szContext, bool fPassErrors=false, C4AulScriptContext *context=nullptr, bool parse_function=false)
 
void StartTrace ()
 
void StartDirectExec ()
 
void StopDirectExec ()
 
int GetContextDepth () const
 
C4AulScriptContextGetContext (int iLevel)
 
void LogCallStack ()
 
void ClearPointers (C4Object *)
 

Static Public Member Functions

static C4StringFnTranslate (C4PropList *_this, C4String *text)
 
static bool FnLogCallStack (C4PropList *_this)
 

Friends

class C4AulProfiler
 

Detailed Description

Definition at line 54 of file C4AulExec.h.

Constructor & Destructor Documentation

◆ C4AulExec()

C4AulExec::C4AulExec ( )
inline

Definition at line 58 of file C4AulExec.h.

59  : pCurCtx(Contexts - 1), pCurVal(Values - 1)
60  { }

Member Function Documentation

◆ ClearPointers()

void C4AulExec::ClearPointers ( C4Object obj)

Definition at line 136 of file C4AulExec.cpp.

137 {
138  for (C4AulScriptContext *pCtx = pCurCtx; pCtx >= Contexts; pCtx--)
139  {
140  if (pCtx->Obj == obj)
141  pCtx->Obj = nullptr;
142  }
143 }

Referenced by C4Game::ClearPointers().

Here is the caller graph for this function:

◆ DirectExec()

C4Value C4AulExec::DirectExec ( C4PropList p,
const char *  szScript,
const char *  szContext,
bool  fPassErrors = false,
C4AulScriptContext context = nullptr,
bool  parse_function = false 
)

Definition at line 1012 of file C4AulExec.cpp.

1013 {
1015  {
1016  AddDbgRec(RCT_DirectExec, szScript, strlen(szScript)+1);
1017  int32_t iObjNumber = p && p->GetPropListNumbered() ? p->GetPropListNumbered()->Number : -1;
1018  AddDbgRec(RCT_DirectExec, &iObjNumber, sizeof(int32_t));
1019  }
1020  // profiler
1021  StartDirectExec();
1023  if (p && p->IsStatic())
1024  script = p->IsStatic();
1025  else if (p && p->GetDef())
1026  script = p->GetDef();
1027  // Add a new function
1028  auto pFunc = std::make_unique<C4AulScriptFunc>(script, nullptr, nullptr, szScript);
1029  // Parse function
1030  try
1031  {
1032  if (parse_function)
1033  {
1034  // Expect a full function (e.g. "func foo() { return bar(); }")
1035  pFunc->ParseDirectExecFunc(&::ScriptEngine, context);
1036  }
1037  else
1038  {
1039  // Expect a single statement (e.g. "bar()")
1040  pFunc->ParseDirectExecStatement(&::ScriptEngine, context);
1041  }
1042  C4AulParSet Pars;
1043  C4Value vRetVal(Exec(pFunc.get(), p, Pars.Par, fPassErrors));
1044  // profiler
1045  StopDirectExec();
1046  return vRetVal;
1047  }
1048  catch (C4AulError &ex)
1049  {
1050  if(fPassErrors)
1051  throw;
1053  LogCallStack();
1054  StopDirectExec();
1055  return C4VNull;
1056  }
1057 }
C4Config Config
Definition: C4Config.cpp:930
C4AulScriptEngine ScriptEngine
Definition: C4Globals.cpp:43
constexpr bool DEBUGREC_SCRIPT
Definition: C4Include.h:30
void AddDbgRec(C4RecordChunkType eType, const void *pData, int iSize)
Definition: C4Record.cpp:32
@ RCT_DirectExec
Definition: C4Record.h:84
C4GameScriptHost GameScript
const C4Value C4VNull
Definition: C4Value.cpp:30
virtual void OnError(const char *msg)=0
const char * what() const noexcept override
Definition: C4Aul.cpp:59
void LogCallStack()
Definition: C4AulExec.cpp:94
C4Value Exec(C4AulScriptFunc *pSFunc, C4PropList *p, C4Value pPars[], bool fPassErrors)
void StopDirectExec()
Definition: C4AulExec.h:85
void StartDirectExec()
Definition: C4AulExec.h:84
C4AulErrorHandler * GetErrorHandler() const
Definition: C4Aul.h:173
int32_t DebugRec
Definition: C4Config.h:63
C4ConfigGeneral General
Definition: C4Config.h:255
C4PropListStatic * GetPropList() override
virtual class C4PropListStatic * IsStatic()
Definition: C4PropList.h:89
virtual C4PropListNumbered * GetPropListNumbered()
Definition: C4PropList.cpp:672
virtual C4Def const * GetDef() const
Definition: C4PropList.cpp:654
C4Value Par[C4AUL_MAX_Par]
Definition: C4AulFunc.h:30

References AddDbgRec(), C4VNull, Config, C4ConfigGeneral::DebugRec, DEBUGREC_SCRIPT, Exec(), GameScript, C4Config::General, C4PropList::GetDef(), C4AulScriptEngine::GetErrorHandler(), C4GameScriptHost::GetPropList(), C4PropList::GetPropListNumbered(), C4PropList::IsStatic(), LogCallStack(), C4PropListNumbered::Number, C4AulErrorHandler::OnError(), C4AulParSet::Par, C4AulScriptFunc::ParseDirectExecFunc(), C4AulScriptFunc::ParseDirectExecStatement(), RCT_DirectExec, ScriptEngine, StartDirectExec(), StopDirectExec(), and C4AulError::what().

Referenced by C4Object::MenuCommand(), C4ObjectMenu::MenuCommand(), C4EditCursor::PerformDuplication(), C4PropertyPath::ResolveRoot(), and C4PropertyPath::ResolveValue().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ Exec()

C4Value C4AulExec::Exec ( C4AulScriptFunc pSFunc,
C4PropList p,
C4Value  pPars[],
bool  fPassErrors 
)

Referenced by DirectExec(), and C4AulScriptFunc::Exec().

Here is the caller graph for this function:

◆ FnLogCallStack()

bool C4AulExec::FnLogCallStack ( C4PropList _this)
static

Definition at line 130 of file C4AulExec.cpp.

131 {
133  return true;
134 }
C4AulExec AulExec
Definition: C4AulExec.cpp:29

References AulExec, and LogCallStack().

Referenced by InitCoreFunctionMap().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FnTranslate()

C4String * C4AulExec::FnTranslate ( C4PropList _this,
C4String text 
)
static

Definition at line 100 of file C4AulExec.cpp.

101 {
102 #define ReturnIfTranslationAvailable(script, key) do \
103 { \
104  const auto &s = script; \
105  const auto &k = key; \
106  if (s) \
107  { \
108  try \
109  { \
110  return ::Strings.RegString(s->Translate(k).c_str()); \
111  } \
112  catch (C4LangStringTable::NoSuchTranslation &) {} \
113  } \
114 } while(0)
115 
116  if (!text || text->GetData().isNull()) return nullptr;
117  // Find correct script: translations of the context if possible, containing script as fallback
118  if (_this && _this->GetDef())
119  ReturnIfTranslationAvailable(&(_this->GetDef()->Script), text->GetCStr());
120  ReturnIfTranslationAvailable(AulExec.pCurCtx[0].Func->pOrgScript, text->GetCStr());
121 
122  // No translation available, log
123  DebugLogF(R"(WARNING: Translate: no translation for string "%s")", text->GetCStr());
124  // Trace
126  return text;
127 #undef ReturnIfTranslationAvailable
128 }
#define ReturnIfTranslationAvailable(script, key)
bool DebugLogF(const char *strMessage ...)
Definition: C4Log.cpp:290
C4ScriptHost * pOrgScript
C4DefScriptHost Script
Definition: C4Def.h:181
C4AulScriptFunc * Func
Definition: C4AulExec.h:46

References AulExec, DebugLogF(), C4AulScriptContext::Func, C4PropList::GetDef(), LogCallStack(), C4AulScriptFunc::pOrgScript, ReturnIfTranslationAvailable, C4Def::Script, and C4ScriptGuiWindowPropertyName::text.

Referenced by InitCoreFunctionMap().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetContext()

C4AulScriptContext* C4AulExec::GetContext ( int  iLevel)
inline

Definition at line 88 of file C4AulExec.h.

88 { return iLevel >= 0 && iLevel < GetContextDepth() ? Contexts + iLevel : nullptr; }
int GetContextDepth() const
Definition: C4AulExec.h:87

References GetContextDepth().

Referenced by C4AulDebug::DebugStep().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetContextDepth()

int C4AulExec::GetContextDepth ( ) const
inline

Definition at line 87 of file C4AulExec.h.

87 { return pCurCtx - Contexts + 1; }

Referenced by C4AulDebug::DebugStep(), and GetContext().

Here is the caller graph for this function:

◆ LogCallStack()

void C4AulExec::LogCallStack ( )

Definition at line 94 of file C4AulExec.cpp.

95 {
96  for (C4AulScriptContext *pCtx = pCurCtx; pCtx >= Contexts; pCtx--)
97  pCtx->dump(StdStrBuf(" by: "));
98 }

Referenced by DirectExec(), FnLogCallStack(), and FnTranslate().

Here is the caller graph for this function:

◆ StartDirectExec()

void C4AulExec::StartDirectExec ( )
inline

Definition at line 84 of file C4AulExec.h.

84 { if (fProfiling) tDirectExecStart = C4TimeMilliseconds::Now(); }
static C4TimeMilliseconds Now()

References C4TimeMilliseconds::Now().

Referenced by DirectExec().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StartTrace()

void C4AulExec::StartTrace ( )

Definition at line 905 of file C4AulExec.cpp.

906 {
907  if (iTraceStart < 0)
908  iTraceStart = ContextStackSize();
909 }

◆ StopDirectExec()

void C4AulExec::StopDirectExec ( )
inline

Definition at line 85 of file C4AulExec.h.

85 { if (fProfiling) tDirectExecTotal += C4TimeMilliseconds::Now() - tDirectExecStart; }

References C4TimeMilliseconds::Now().

Referenced by DirectExec().

Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Function Documentation

◆ C4AulProfiler

friend class C4AulProfiler
friend

Definition at line 78 of file C4AulExec.h.


The documentation for this class was generated from the following files: