+ lua_pop(L, 1); // Pop error handler
+}
+#endif
+
+// Push the list of callbacks (a lua table).
+// Then push nargs arguments.
+// Then call this function, which
+// - runs the callbacks
+// - replaces the table and arguments with the return value,
+// computed depending on mode
+// This function must only be called with scriptlock held (i.e. inside of a
+// code block with SCRIPTAPI_PRECHECKHEADER declared)
+void ScriptApiBase::runCallbacksRaw(int nargs,
+ RunCallbacksMode mode, const char *fxn)
+{
+#ifdef SCRIPTAPI_LOCK_DEBUG
+ assert(m_lock_recursion_count > 0);
+#endif
+ lua_State *L = getStack();
+ FATAL_ERROR_IF(lua_gettop(L) < nargs + 1, "Not enough arguments");
+
+ // Insert error handler
+ PUSH_ERROR_HANDLER(L);
+ int error_handler = lua_gettop(L) - nargs - 1;
+ lua_insert(L, error_handler);
+
+ // Insert run_callbacks between error handler and table
+ lua_getglobal(L, "core");
+ lua_getfield(L, -1, "run_callbacks");
+ lua_remove(L, -2);
+ lua_insert(L, error_handler + 1);
+
+ // Insert mode after table
+ lua_pushnumber(L, (int)mode);
+ lua_insert(L, error_handler + 3);
+
+ // Stack now looks like this:
+ // ... <error handler> <run_callbacks> <table> <mode> <arg#1> <arg#2> ... <arg#n>
+
+ int result = lua_pcall(L, nargs + 2, 1, error_handler);
+ if (result != 0)
+ scriptError(result, fxn);
+
+ lua_remove(L, error_handler);