forked from mirror/openmw-tes3mp
Issue #181: added member variable access opcodes
This commit is contained in:
parent
eb0be10e80
commit
ce43ff8d05
3 changed files with 178 additions and 53 deletions
|
@ -121,5 +121,11 @@ op 58: report string literal index in stack[0];
|
||||||
additional arguments (if any) in stack[n]..stack[1];
|
additional arguments (if any) in stack[n]..stack[1];
|
||||||
n is determined according to the message string
|
n is determined according to the message string
|
||||||
all arguments are removed from stack
|
all arguments are removed from stack
|
||||||
opcodes 59-33554431 unused
|
op 59: store stack[0] in member short stack[2] of object with ID stack[1]
|
||||||
|
op 60: store stack[0] in member long stack[2] of object with ID stack[1]
|
||||||
|
op 61: store stack[0] in member float stack[2] of object with ID stack[1]
|
||||||
|
op 62: replace stack[0] with member short stack[1] of object with ID stack[0]
|
||||||
|
op 63: replace stack[0] with member short stack[1] of object with ID stack[0]
|
||||||
|
op 64: replace stack[0] with member short stack[1] of object with ID stack[0]
|
||||||
|
opcodes 65-33554431 unused
|
||||||
opcodes 33554432-67108863 reserved for extensions
|
opcodes 33554432-67108863 reserved for extensions
|
||||||
|
|
|
@ -40,6 +40,12 @@ namespace Interpreter
|
||||||
interpreter.installSegment5 (42, new OpFetchGlobalShort);
|
interpreter.installSegment5 (42, new OpFetchGlobalShort);
|
||||||
interpreter.installSegment5 (43, new OpFetchGlobalLong);
|
interpreter.installSegment5 (43, new OpFetchGlobalLong);
|
||||||
interpreter.installSegment5 (44, new OpFetchGlobalFloat);
|
interpreter.installSegment5 (44, new OpFetchGlobalFloat);
|
||||||
|
interpreter.installSegment5 (59, new OpStoreMemberShort);
|
||||||
|
interpreter.installSegment5 (60, new OpStoreMemberLong);
|
||||||
|
interpreter.installSegment5 (61, new OpStoreMemberFloat);
|
||||||
|
interpreter.installSegment5 (62, new OpFetchMemberShort);
|
||||||
|
interpreter.installSegment5 (63, new OpFetchMemberLong);
|
||||||
|
interpreter.installSegment5 (64, new OpFetchMemberFloat);
|
||||||
|
|
||||||
// math
|
// math
|
||||||
interpreter.installSegment5 (9, new OpAddInt<Type_Integer>);
|
interpreter.installSegment5 (9, new OpAddInt<Type_Integer>);
|
||||||
|
|
|
@ -205,7 +205,120 @@ namespace Interpreter
|
||||||
runtime[0].mFloat = value;
|
runtime[0].mFloat = value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class OpStoreMemberShort : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
Type_Integer data = runtime[0].mInteger;
|
||||||
|
Type_Integer index = runtime[1].mInteger;
|
||||||
|
std::string id = runtime.getStringLiteral (index);
|
||||||
|
index = runtime[2].mInteger;
|
||||||
|
std::string variable = runtime.getStringLiteral (index);
|
||||||
|
|
||||||
|
runtime.getContext().setMemberShort (id, variable, data);
|
||||||
|
|
||||||
|
runtime.pop();
|
||||||
|
runtime.pop();
|
||||||
|
runtime.pop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpStoreMemberLong : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
Type_Integer data = runtime[0].mInteger;
|
||||||
|
Type_Integer index = runtime[1].mInteger;
|
||||||
|
std::string id = runtime.getStringLiteral (index);
|
||||||
|
index = runtime[2].mInteger;
|
||||||
|
std::string variable = runtime.getStringLiteral (index);
|
||||||
|
|
||||||
|
runtime.getContext().setMemberLong (id, variable, data);
|
||||||
|
|
||||||
|
runtime.pop();
|
||||||
|
runtime.pop();
|
||||||
|
runtime.pop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpStoreMemberFloat : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
Type_Integer index = runtime[0].mInteger;
|
||||||
|
std::string id = runtime.getStringLiteral (index);
|
||||||
|
Type_Float data = runtime[1].mFloat;
|
||||||
|
index = runtime[2].mInteger;
|
||||||
|
std::string variable = runtime.getStringLiteral (index);
|
||||||
|
|
||||||
|
runtime.getContext().setMemberFloat (id, variable, data);
|
||||||
|
|
||||||
|
runtime.pop();
|
||||||
|
runtime.pop();
|
||||||
|
runtime.pop();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpFetchMemberShort : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
Type_Integer index = runtime[0].mInteger;
|
||||||
|
std::string id = runtime.getStringLiteral (index);
|
||||||
|
index = runtime[1].mInteger;
|
||||||
|
std::string variable = runtime.getStringLiteral (index);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
index = runtime[0].mInteger;
|
||||||
|
int value = runtime.getContext().getMemberShort (id, variable);
|
||||||
|
runtime[0].mInteger = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpFetchMemberLong : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
Type_Integer index = runtime[0].mInteger;
|
||||||
|
std::string id = runtime.getStringLiteral (index);
|
||||||
|
index = runtime[1].mInteger;
|
||||||
|
std::string variable = runtime.getStringLiteral (index);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
index = runtime[0].mInteger;
|
||||||
|
int value = runtime.getContext().getMemberLong (id, variable);
|
||||||
|
runtime[0].mInteger = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class OpFetchMemberFloat : public Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Runtime& runtime)
|
||||||
|
{
|
||||||
|
Type_Integer index = runtime[0].mInteger;
|
||||||
|
std::string id = runtime.getStringLiteral (index);
|
||||||
|
index = runtime[1].mInteger;
|
||||||
|
std::string variable = runtime.getStringLiteral (index);
|
||||||
|
runtime.pop();
|
||||||
|
|
||||||
|
index = runtime[0].mInteger;
|
||||||
|
float value = runtime.getContext().getMemberFloat (id, variable);
|
||||||
|
runtime[0].mFloat = value;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue