2022-04-19 05:28:40 +00:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef MTROPOLIS_DEBUG_H
|
|
|
|
#define MTROPOLIS_DEBUG_H
|
|
|
|
|
|
|
|
#include "common/str.h"
|
|
|
|
#include "common/ptr.h"
|
2022-04-21 22:49:40 +00:00
|
|
|
#include "common/hashmap.h"
|
2022-04-19 05:28:40 +00:00
|
|
|
|
2022-06-05 00:08:00 +00:00
|
|
|
#include "mtropolis/core.h"
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
#define MTROPOLIS_DEBUG_VTHREAD_STACKS
|
2022-05-01 06:04:20 +00:00
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
#define MTROPOLIS_DEBUG_ENABLE
|
2022-05-01 06:04:20 +00:00
|
|
|
#if defined(MTROPOLIS_DEBUG_ENABLE) && !defined(MTROPOLIS_DEBUG_VTHREAD_STACKS)
|
|
|
|
// VThread stack debugging is mandatory when debugging
|
|
|
|
#define MTROPOLIS_DEBUG_VTHREAD_STACKS
|
|
|
|
#endif
|
2022-04-19 05:28:40 +00:00
|
|
|
|
|
|
|
namespace MTropolis {
|
|
|
|
|
|
|
|
#ifdef MTROPOLIS_DEBUG_ENABLE
|
2022-04-19 07:24:13 +00:00
|
|
|
|
|
|
|
class Runtime;
|
2022-04-21 22:49:40 +00:00
|
|
|
class Window;
|
|
|
|
class Structural;
|
|
|
|
class Modifier;
|
2022-05-09 08:01:32 +00:00
|
|
|
class DebugInspector;
|
2022-04-30 05:00:00 +00:00
|
|
|
class DebugToolWindowBase;
|
2022-05-09 08:01:32 +00:00
|
|
|
class RuntimeObject;
|
2022-04-19 07:24:13 +00:00
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
struct IDebuggable;
|
|
|
|
|
|
|
|
enum SupportStatus {
|
2022-05-28 03:10:48 +00:00
|
|
|
kSupportStatusNone, // Only loads, not functional
|
|
|
|
kSupportStatusPartial, // Partially-implemented, some use cases may silently fail
|
|
|
|
kSupportStatusDone, // Not necessarily "done" but "done" enough that unsupported cases will trigger errors
|
2022-04-19 05:28:40 +00:00
|
|
|
};
|
|
|
|
|
2022-06-05 00:29:07 +00:00
|
|
|
struct IDebugInspectionReport : public IInterfaceBase {
|
2022-05-09 08:01:32 +00:00
|
|
|
// Attempts to declare a row with static contents. If this returns true, then declareStaticContents must be called.
|
|
|
|
virtual bool declareStatic(const char *name) = 0;
|
|
|
|
|
|
|
|
// Declares the contents of a static row
|
|
|
|
virtual void declareStaticContents(const Common::String &data) = 0;
|
|
|
|
|
|
|
|
// Declares the contents of a dynamic row
|
|
|
|
virtual void declareDynamic(const char *name, const Common::String &data) = 0;
|
|
|
|
|
|
|
|
// Declares the contents of a loose row
|
2022-05-11 05:16:04 +00:00
|
|
|
virtual void declareLoose(const Common::String &data) = 0;
|
2022-05-09 08:01:32 +00:00
|
|
|
};
|
|
|
|
|
2022-06-05 00:08:00 +00:00
|
|
|
struct IDebuggable : public IInterfaceBase {
|
2022-05-09 08:01:32 +00:00
|
|
|
virtual SupportStatus debugGetSupportStatus() const = 0;
|
|
|
|
virtual const char *debugGetTypeName() const = 0;
|
|
|
|
virtual const Common::String &debugGetName() const = 0;
|
|
|
|
virtual const Common::SharedPtr<DebugInspector> &debugGetInspector() = 0;
|
|
|
|
virtual void debugInspect(IDebugInspectionReport *report) const = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
// The debug inspector link goes inside of a debuggable, it contains an inspector and
|
|
|
|
// will notify the inspector of the object's destruction
|
|
|
|
class Debuggable : public IDebuggable {
|
|
|
|
public:
|
|
|
|
Debuggable();
|
|
|
|
Debuggable(const Debuggable &other);
|
2022-05-09 22:33:39 +00:00
|
|
|
Debuggable(Debuggable &&other);
|
2022-05-09 08:01:32 +00:00
|
|
|
~Debuggable();
|
|
|
|
|
|
|
|
private:
|
|
|
|
const Common::SharedPtr<DebugInspector> &debugGetInspector() override;
|
|
|
|
|
|
|
|
Common::SharedPtr<DebugInspector> _inspector;
|
|
|
|
};
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
class DebugInspector {
|
|
|
|
public:
|
|
|
|
explicit DebugInspector(IDebuggable *debuggable);
|
|
|
|
virtual ~DebugInspector();
|
|
|
|
|
2022-05-09 08:01:32 +00:00
|
|
|
void onDestroyed(IDebuggable *instance);
|
|
|
|
void changePrimaryInstance(IDebuggable *instance);
|
2022-04-19 05:28:40 +00:00
|
|
|
|
2022-05-09 08:01:32 +00:00
|
|
|
IDebuggable *getDebuggable() const;
|
2022-05-01 06:04:20 +00:00
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
private:
|
2022-05-09 08:01:32 +00:00
|
|
|
IDebuggable *_instance;
|
2022-04-19 05:28:40 +00:00
|
|
|
};
|
|
|
|
|
2022-05-01 06:04:20 +00:00
|
|
|
class DebugPrimaryTaskList {
|
|
|
|
public:
|
|
|
|
explicit DebugPrimaryTaskList(const Common::String &name);
|
|
|
|
|
|
|
|
void addItem(IDebuggable *debuggable);
|
|
|
|
const Common::Array<IDebuggable *> &getItems() const;
|
|
|
|
|
|
|
|
const Common::String &getName() const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
Common::String _name;
|
|
|
|
Common::Array<IDebuggable *> _primaryTasks;
|
|
|
|
};
|
|
|
|
|
2022-04-19 07:24:13 +00:00
|
|
|
enum DebugSeverity {
|
|
|
|
kDebugSeverityInfo,
|
|
|
|
kDebugSeverityWarning,
|
|
|
|
kDebugSeverityError,
|
|
|
|
};
|
|
|
|
|
|
|
|
class Notification {
|
|
|
|
public:
|
|
|
|
|
|
|
|
private:
|
2022-07-13 21:37:39 +00:00
|
|
|
//Runtime *_runtime;
|
2022-04-19 07:24:13 +00:00
|
|
|
};
|
|
|
|
|
2022-04-30 01:49:03 +00:00
|
|
|
enum DebuggerTool {
|
|
|
|
kDebuggerToolSceneTree,
|
|
|
|
kDebuggerToolInspector,
|
|
|
|
kDebuggerToolStepThrough,
|
|
|
|
|
|
|
|
kDebuggerToolCount,
|
|
|
|
};
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
class Debugger {
|
|
|
|
public:
|
2022-04-19 07:24:13 +00:00
|
|
|
explicit Debugger(Runtime *runtime);
|
2022-04-19 05:28:40 +00:00
|
|
|
~Debugger();
|
|
|
|
|
2022-05-01 06:04:20 +00:00
|
|
|
// runFrame runs after the frame, before rendering, and before event processing for the following frame
|
2022-04-21 22:49:40 +00:00
|
|
|
void runFrame(uint32 msec);
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
void setPaused(bool paused);
|
|
|
|
bool isPaused() const;
|
2022-04-21 22:49:40 +00:00
|
|
|
|
2022-04-30 05:00:00 +00:00
|
|
|
Runtime *getRuntime() const;
|
|
|
|
|
2022-04-19 07:24:13 +00:00
|
|
|
void notify(DebugSeverity severity, const Common::String &str);
|
|
|
|
void notifyFmt(DebugSeverity severity, const char *fmt, ...);
|
|
|
|
void vnotifyFmt(DebugSeverity severity, const char *fmt, va_list args);
|
2022-04-19 05:28:40 +00:00
|
|
|
|
2022-04-21 22:49:40 +00:00
|
|
|
void refreshSceneStatus();
|
|
|
|
void complainAboutUnfinished(Structural *structural);
|
|
|
|
|
2022-04-30 01:49:03 +00:00
|
|
|
void openToolWindow(DebuggerTool tool);
|
|
|
|
void closeToolWindow(DebuggerTool tool);
|
|
|
|
|
2022-05-09 08:01:32 +00:00
|
|
|
void inspectObject(IDebuggable *debuggable);
|
|
|
|
void tryInspectObject(RuntimeObject *object);
|
|
|
|
|
|
|
|
const Common::SharedPtr<DebugInspector> &getInspector() const;
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
private:
|
2022-04-19 07:24:13 +00:00
|
|
|
Debugger();
|
|
|
|
|
2022-04-21 22:49:40 +00:00
|
|
|
static void scanStructuralStatus(Structural *structural, Common::HashMap<Common::String, SupportStatus> &unfinishedModifiers, Common::HashMap<Common::String, SupportStatus> &unfinishedElements);
|
|
|
|
static void scanModifierStatus(Modifier *modifier, Common::HashMap<Common::String, SupportStatus> &unfinishedModifiers, Common::HashMap<Common::String, SupportStatus> &unfinishedElements);
|
|
|
|
static void scanDebuggableStatus(IDebuggable *debuggable, Common::HashMap<Common::String, SupportStatus> &unfinished);
|
|
|
|
|
|
|
|
struct ToastNotification {
|
2022-07-23 03:04:37 +00:00
|
|
|
ToastNotification();
|
|
|
|
|
2022-04-21 22:49:40 +00:00
|
|
|
Common::SharedPtr<Window> window;
|
|
|
|
uint64 dismissTime;
|
|
|
|
};
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
bool _paused;
|
2022-04-19 07:24:13 +00:00
|
|
|
Runtime *_runtime;
|
2022-04-21 22:49:40 +00:00
|
|
|
Common::SharedPtr<Window> _sceneStatusWindow;
|
2022-04-30 01:49:03 +00:00
|
|
|
Common::SharedPtr<Window> _toolsWindow;
|
2022-04-30 05:00:00 +00:00
|
|
|
Common::SharedPtr<DebugToolWindowBase> _toolWindows[kDebuggerToolCount];
|
2022-04-21 22:49:40 +00:00
|
|
|
Common::Array<ToastNotification> _toastNotifications;
|
2022-05-09 08:01:32 +00:00
|
|
|
Common::SharedPtr<DebugInspector> _inspector;
|
2022-04-19 05:28:40 +00:00
|
|
|
};
|
|
|
|
|
2022-05-09 08:01:32 +00:00
|
|
|
#else
|
2022-04-19 05:28:40 +00:00
|
|
|
|
|
|
|
struct IDebuggable {
|
|
|
|
};
|
|
|
|
|
2022-05-09 08:01:32 +00:00
|
|
|
struct Debuggable : public IDebuggable {
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* !MTROPOLIS_DEBUG_ENABLE */
|
|
|
|
|
2022-04-19 05:28:40 +00:00
|
|
|
} // End of namespace MTropolis
|
|
|
|
|
|
|
|
#endif /* MTROPOLIS_DEBUG_H */
|