From 44c0f0d1156923592242019fbb1a058588f8276f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Thu, 15 Apr 2021 23:39:14 +0100 Subject: [PATCH] AGS: Improve print of arguments when dumping script instruction --- engines/ags/engine/script/cc_instance.cpp | 45 +++++++++++++++++++-- engines/ags/engine/script/systemimports.cpp | 8 ++++ engines/ags/engine/script/systemimports.h | 1 + 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/engines/ags/engine/script/cc_instance.cpp b/engines/ags/engine/script/cc_instance.cpp index 62be478e6a6..78ba82f0f9e 100644 --- a/engines/ags/engine/script/cc_instance.cpp +++ b/engines/ags/engine/script/cc_instance.cpp @@ -1288,11 +1288,50 @@ void ccInstance::DumpInstruction(const ScriptOperation &op) { if (i > 0) { msg += ','; } + RuntimeScriptValue arg = op.Args[i]; if (cmd_info.ArgIsReg[i]) { - msg += Common::String::format(" %s", regnames[op.Args[i].IValue]); + msg += Common::String::format(" %s", regnames[arg.IValue]); } else { - // FIXME: check type and write appropriate values - msg += Common::String::format(" %lld", (long long)op.Args[i].GetPtrWithOffset()); + if (arg.Type == kScValStackPtr || arg.Type == kScValGlobalVar) + arg = *arg.RValue; + switch(arg.Type) { + case kScValInteger: + case kScValPluginArg: + msg += Common::String::format(" %d", arg.IValue); + break; + case kScValFloat: + msg += Common::String::format(" %f", arg.FValue); + break; + case kScValStringLiteral: + msg += Common::String::format(" \"%s\"", arg.Ptr); + break; + case kScValStackPtr: + case kScValGlobalVar: + msg += Common::String::format(" %p", (void*)arg.RValue); + break; + case kScValData: + case kScValCodePtr: + msg += Common::String::format(" %p", (void*)arg.GetPtrWithOffset()); + break; + case kScValStaticArray: + case kScValStaticObject: + case kScValDynamicObject: + case kScValStaticFunction: + case kScValObjectFunction: + case kScValPluginFunction: + case kScValPluginObject: + { + String name = _GP(simp).findName(arg); + if (!name.IsEmpty()) + msg += Common::String::format(" &%s", name.GetCStr()); + else + msg += Common::String::format(" %p", (void*)arg.GetPtrWithOffset()); + } + break; + case kScValUndefined: + msg += " undefined"; + break; + } } } msg += '\n'; diff --git a/engines/ags/engine/script/systemimports.cpp b/engines/ags/engine/script/systemimports.cpp index 165d138114d..b76e72067c1 100644 --- a/engines/ags/engine/script/systemimports.cpp +++ b/engines/ags/engine/script/systemimports.cpp @@ -103,6 +103,14 @@ int SystemImports::get_index_of(const String &name) { return -1; } +String SystemImports::findName(const RuntimeScriptValue &value) { + for (size_t i = 0; i < imports.size(); ++i) { + if (imports[i].Value == value) + return imports[i].Name; + } + return String(); +} + void SystemImports::RemoveScriptExports(ccInstance *inst) { if (!inst) { return; diff --git a/engines/ags/engine/script/systemimports.h b/engines/ags/engine/script/systemimports.h index f79fd65bffe..5472b69366a 100644 --- a/engines/ags/engine/script/systemimports.h +++ b/engines/ags/engine/script/systemimports.h @@ -59,6 +59,7 @@ public: const ScriptImport *getByName(const String &name); int get_index_of(const String &name); const ScriptImport *getByIndex(int index); + String findName(const RuntimeScriptValue &value); void RemoveScriptExports(ccInstance *inst); void clear(); };