diff --git a/papyrus-vm/include/papyrus-vm/ActivePexInstance.h b/papyrus-vm/include/papyrus-vm/ActivePexInstance.h index 78f8f36446..a1cdcf0949 100644 --- a/papyrus-vm/include/papyrus-vm/ActivePexInstance.h +++ b/papyrus-vm/include/papyrus-vm/ActivePexInstance.h @@ -29,6 +29,7 @@ class ActivePexInstance VirtualMachine* parentVM, VarValue activeInstanceOwner, std::string childrenName); + // TODO(#xyz): return const& FunctionInfo GetFunctionByName(const char* name, std::string stateName) const; @@ -38,7 +39,7 @@ class ActivePexInstance VarValue& GetIndentifierValue(std::vector& locals, VarValue& value, bool treatStringsAsIdentifiers = false); - VarValue StartFunction(FunctionInfo& function, + VarValue StartFunction(const FunctionInfo& function, std::vector& arguments, std::shared_ptr stackData); @@ -68,7 +69,7 @@ class ActivePexInstance std::shared_ptr> locals); std::shared_ptr> MakeLocals( - FunctionInfo& function, std::vector& arguments); + const FunctionInfo& function, const std::vector& arguments); VarValue ExecuteAll( ExecutionContext& ctx, diff --git a/papyrus-vm/include/papyrus-vm/FunctionCode.h b/papyrus-vm/include/papyrus-vm/FunctionCode.h index 41b6e06b9e..69d45c030d 100644 --- a/papyrus-vm/include/papyrus-vm/FunctionCode.h +++ b/papyrus-vm/include/papyrus-vm/FunctionCode.h @@ -1,7 +1,10 @@ #pragma once + #include #include +#include "VarValue.h" + struct FunctionCode { enum diff --git a/papyrus-vm/include/papyrus-vm/FunctionInfo.h b/papyrus-vm/include/papyrus-vm/FunctionInfo.h index 115ef2522d..7190bfb784 100644 --- a/papyrus-vm/include/papyrus-vm/FunctionInfo.h +++ b/papyrus-vm/include/papyrus-vm/FunctionInfo.h @@ -1,8 +1,11 @@ #pragma once + #include #include #include +#include "FunctionCode.h" + struct FunctionInfo { bool valid = false; diff --git a/papyrus-vm/include/papyrus-vm/Object.h b/papyrus-vm/include/papyrus-vm/Object.h index ae0ae5e76a..c6c74e24ab 100644 --- a/papyrus-vm/include/papyrus-vm/Object.h +++ b/papyrus-vm/include/papyrus-vm/Object.h @@ -1,8 +1,10 @@ #pragma once + #include #include #include +#include "FunctionInfo.h" #include "VarValue.h" struct Object diff --git a/papyrus-vm/src/papyrus-vm-lib/ActivePexInstance.cpp b/papyrus-vm/src/papyrus-vm-lib/ActivePexInstance.cpp index c8165340d3..a45928c1f3 100644 --- a/papyrus-vm/src/papyrus-vm-lib/ActivePexInstance.cpp +++ b/papyrus-vm/src/papyrus-vm-lib/ActivePexInstance.cpp @@ -1,4 +1,5 @@ #include "ScopedTask.h" +#include "papyrus-vm/FunctionInfo.h" #include "papyrus-vm/OpcodesImplementation.h" #include "papyrus-vm/Utils.h" #include "papyrus-vm/VirtualMachine.h" @@ -54,14 +55,15 @@ std::shared_ptr ActivePexInstance::FillParentInstance( FunctionInfo ActivePexInstance::GetFunctionByName(const char* name, std::string stateName) const { - + // static FunctionInfo kInvalidFunction; FunctionInfo function; for (auto& object : sourcePex.fn()->objectTable) { for (auto& state : object.states) { if (state.name == stateName) { for (auto& func : state.functions) { if (!Utils::stricmp(func.name.data(), name)) { - function = func.function; + // return func; ??? + function = func.function; // ??? function.valid = true; return function; } @@ -608,8 +610,8 @@ void ActivePexInstance::ExecuteOpCode(ExecutionContext* ctx, uint8_t op, } std::shared_ptr> -ActivePexInstance::MakeLocals(FunctionInfo& function, - std::vector& arguments) +ActivePexInstance::MakeLocals(const FunctionInfo& function, + const std::vector& arguments) { auto locals = std::make_shared>(); @@ -733,7 +735,7 @@ VarValue ActivePexInstance::ExecuteAll( return ctx.returnValue; } -VarValue ActivePexInstance::StartFunction(FunctionInfo& function, +VarValue ActivePexInstance::StartFunction(const FunctionInfo& function, std::vector& arguments, std::shared_ptr stackData) { diff --git a/papyrus-vm/src/papyrus-vm-lib/VirtualMachine.cpp b/papyrus-vm/src/papyrus-vm-lib/VirtualMachine.cpp index e69946b252..aa70e17f4f 100644 --- a/papyrus-vm/src/papyrus-vm-lib/VirtualMachine.cpp +++ b/papyrus-vm/src/papyrus-vm-lib/VirtualMachine.cpp @@ -190,6 +190,7 @@ void VirtualMachine::SendEvent(std::shared_ptr self, for (auto& scriptInstance : self->ListActivePexInstances()) { auto name = scriptInstance->GetActiveStateName(); + // TODO: const& auto fn = scriptInstance->GetFunctionByName( eventName, scriptInstance->GetActiveStateName()); if (fn.valid) { @@ -208,7 +209,7 @@ void VirtualMachine::SendEvent(ActivePexInstance* instance, const char* eventName, const std::vector& arguments) { - + // TODO: const& auto fn = instance->GetFunctionByName(eventName, instance->GetActiveStateName()); if (fn.valid) { @@ -277,6 +278,7 @@ VarValue VirtualMachine::CallMethod( // TODO: in theory we shouldn't iterate over all scripts, but only use the // current one for (auto& activeScript : instances) { + // TODO: const& (ref/optional) FunctionInfo functionInfo; if (!Utils::stricmp(methodName, "GotoState") || @@ -328,7 +330,6 @@ VarValue VirtualMachine::CallStatic(const std::string& className, } VarValue result = VarValue::None(); - FunctionInfo function; auto f = nativeStaticFunctions[className.data()][functionName.data()] ? nativeStaticFunctions[className.data()][functionName.data()] @@ -359,6 +360,8 @@ VarValue VirtualMachine::CallStatic(const std::string& className, VarValue::None(), ""); } + // TODO: const& + FunctionInfo function; function = instance->GetFunctionByName(functionName.c_str(), ""); if (function.valid) {