Skip to content

Commit

Permalink
(draft, partial) avoid copy in SendEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
nic11 committed Dec 4, 2024
1 parent 9705011 commit 6e477e8
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 9 deletions.
5 changes: 3 additions & 2 deletions papyrus-vm/include/papyrus-vm/ActivePexInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -38,7 +39,7 @@ class ActivePexInstance
VarValue& GetIndentifierValue(std::vector<Local>& locals, VarValue& value,
bool treatStringsAsIdentifiers = false);

VarValue StartFunction(FunctionInfo& function,
VarValue StartFunction(const FunctionInfo& function,
std::vector<VarValue>& arguments,
std::shared_ptr<StackData> stackData);

Expand Down Expand Up @@ -68,7 +69,7 @@ class ActivePexInstance
std::shared_ptr<std::vector<Local>> locals);

std::shared_ptr<std::vector<ActivePexInstance::Local>> MakeLocals(
FunctionInfo& function, std::vector<VarValue>& arguments);
const FunctionInfo& function, const std::vector<VarValue>& arguments);

VarValue ExecuteAll(
ExecutionContext& ctx,
Expand Down
3 changes: 3 additions & 0 deletions papyrus-vm/include/papyrus-vm/FunctionCode.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
#pragma once

#include <cstdint>
#include <vector>

#include "VarValue.h"

struct FunctionCode
{
enum
Expand Down
3 changes: 3 additions & 0 deletions papyrus-vm/include/papyrus-vm/FunctionInfo.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
#pragma once

#include <cstdint>
#include <string>
#include <vector>

#include "FunctionCode.h"

struct FunctionInfo
{
bool valid = false;
Expand Down
2 changes: 2 additions & 0 deletions papyrus-vm/include/papyrus-vm/Object.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
#pragma once

#include <cstdint>
#include <string>
#include <vector>

#include "FunctionInfo.h"
#include "VarValue.h"

struct Object
Expand Down
12 changes: 7 additions & 5 deletions papyrus-vm/src/papyrus-vm-lib/ActivePexInstance.cpp
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -54,14 +55,15 @@ std::shared_ptr<ActivePexInstance> 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;
}
Expand Down Expand Up @@ -608,8 +610,8 @@ void ActivePexInstance::ExecuteOpCode(ExecutionContext* ctx, uint8_t op,
}

std::shared_ptr<std::vector<ActivePexInstance::Local>>
ActivePexInstance::MakeLocals(FunctionInfo& function,
std::vector<VarValue>& arguments)
ActivePexInstance::MakeLocals(const FunctionInfo& function,
const std::vector<VarValue>& arguments)
{
auto locals = std::make_shared<std::vector<Local>>();

Expand Down Expand Up @@ -733,7 +735,7 @@ VarValue ActivePexInstance::ExecuteAll(
return ctx.returnValue;
}

VarValue ActivePexInstance::StartFunction(FunctionInfo& function,
VarValue ActivePexInstance::StartFunction(const FunctionInfo& function,
std::vector<VarValue>& arguments,
std::shared_ptr<StackData> stackData)
{
Expand Down
7 changes: 5 additions & 2 deletions papyrus-vm/src/papyrus-vm-lib/VirtualMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ void VirtualMachine::SendEvent(std::shared_ptr<IGameObject> self,
for (auto& scriptInstance : self->ListActivePexInstances()) {
auto name = scriptInstance->GetActiveStateName();

// TODO: const&
auto fn = scriptInstance->GetFunctionByName(
eventName, scriptInstance->GetActiveStateName());
if (fn.valid) {
Expand All @@ -208,7 +209,7 @@ void VirtualMachine::SendEvent(ActivePexInstance* instance,
const char* eventName,
const std::vector<VarValue>& arguments)
{

// TODO: const&
auto fn =
instance->GetFunctionByName(eventName, instance->GetActiveStateName());
if (fn.valid) {
Expand Down Expand Up @@ -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") ||
Expand Down Expand Up @@ -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()]
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 6e477e8

Please sign in to comment.