Issue #181: added member variable access opcodes

actorid
Marc Zinnschlag 13 years ago
parent eb0be10e80
commit ce43ff8d05

@ -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>);

@ -6,11 +6,11 @@
#include "context.hpp" #include "context.hpp"
namespace Interpreter namespace Interpreter
{ {
class OpStoreLocalShort : public Opcode0 class OpStoreLocalShort : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Integer data = runtime[0].mInteger; Type_Integer data = runtime[0].mInteger;
@ -20,13 +20,13 @@ namespace Interpreter
runtime.pop(); runtime.pop();
runtime.pop(); runtime.pop();
} }
}; };
class OpStoreLocalLong : public Opcode0 class OpStoreLocalLong : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Integer data = runtime[0].mInteger; Type_Integer data = runtime[0].mInteger;
@ -36,13 +36,13 @@ namespace Interpreter
runtime.pop(); runtime.pop();
runtime.pop(); runtime.pop();
} }
}; };
class OpStoreLocalFloat : public Opcode0 class OpStoreLocalFloat : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Float data = runtime[0].mFloat; Type_Float data = runtime[0].mFloat;
@ -52,71 +52,71 @@ namespace Interpreter
runtime.pop(); runtime.pop();
runtime.pop(); runtime.pop();
} }
}; };
class OpFetchIntLiteral : public Opcode0 class OpFetchIntLiteral : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Integer intValue = runtime.getIntegerLiteral (runtime[0].mInteger); Type_Integer intValue = runtime.getIntegerLiteral (runtime[0].mInteger);
runtime[0].mInteger = intValue; runtime[0].mInteger = intValue;
} }
}; };
class OpFetchFloatLiteral : public Opcode0 class OpFetchFloatLiteral : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Float floatValue = runtime.getFloatLiteral (runtime[0].mInteger); Type_Float floatValue = runtime.getFloatLiteral (runtime[0].mInteger);
runtime[0].mFloat = floatValue; runtime[0].mFloat = floatValue;
} }
}; };
class OpFetchLocalShort : public Opcode0 class OpFetchLocalShort : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
int index = runtime[0].mInteger; int index = runtime[0].mInteger;
int value = runtime.getContext().getLocalShort (index); int value = runtime.getContext().getLocalShort (index);
runtime[0].mInteger = value; runtime[0].mInteger = value;
} }
}; };
class OpFetchLocalLong : public Opcode0 class OpFetchLocalLong : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
int index = runtime[0].mInteger; int index = runtime[0].mInteger;
int value = runtime.getContext().getLocalLong (index); int value = runtime.getContext().getLocalLong (index);
runtime[0].mInteger = value; runtime[0].mInteger = value;
} }
}; };
class OpFetchLocalFloat : public Opcode0 class OpFetchLocalFloat : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
int index = runtime[0].mInteger; int index = runtime[0].mInteger;
float value = runtime.getContext().getLocalFloat (index); float value = runtime.getContext().getLocalFloat (index);
runtime[0].mFloat = value; runtime[0].mFloat = value;
} }
}; };
class OpStoreGlobalShort : public Opcode0 class OpStoreGlobalShort : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Integer data = runtime[0].mInteger; Type_Integer data = runtime[0].mInteger;
@ -128,13 +128,13 @@ namespace Interpreter
runtime.pop(); runtime.pop();
runtime.pop(); runtime.pop();
} }
}; };
class OpStoreGlobalLong : public Opcode0 class OpStoreGlobalLong : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Integer data = runtime[0].mInteger; Type_Integer data = runtime[0].mInteger;
@ -146,13 +146,13 @@ namespace Interpreter
runtime.pop(); runtime.pop();
runtime.pop(); runtime.pop();
} }
}; };
class OpStoreGlobalFloat : public Opcode0 class OpStoreGlobalFloat : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
Type_Float data = runtime[0].mFloat; Type_Float data = runtime[0].mFloat;
@ -164,48 +164,161 @@ namespace Interpreter
runtime.pop(); runtime.pop();
runtime.pop(); runtime.pop();
} }
}; };
class OpFetchGlobalShort : public Opcode0 class OpFetchGlobalShort : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
int index = runtime[0].mInteger; int index = runtime[0].mInteger;
std::string name = runtime.getStringLiteral (index); std::string name = runtime.getStringLiteral (index);
Type_Integer value = runtime.getContext().getGlobalShort (name); Type_Integer value = runtime.getContext().getGlobalShort (name);
runtime[0].mInteger = value; runtime[0].mInteger = value;
} }
}; };
class OpFetchGlobalLong : public Opcode0 class OpFetchGlobalLong : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
int index = runtime[0].mInteger; int index = runtime[0].mInteger;
std::string name = runtime.getStringLiteral (index); std::string name = runtime.getStringLiteral (index);
Type_Integer value = runtime.getContext().getGlobalLong (name); Type_Integer value = runtime.getContext().getGlobalLong (name);
runtime[0].mInteger = value; runtime[0].mInteger = value;
} }
}; };
class OpFetchGlobalFloat : public Opcode0 class OpFetchGlobalFloat : public Opcode0
{ {
public: public:
virtual void execute (Runtime& runtime) virtual void execute (Runtime& runtime)
{ {
int index = runtime[0].mInteger; int index = runtime[0].mInteger;
std::string name = runtime.getStringLiteral (index); std::string name = runtime.getStringLiteral (index);
Type_Float value = runtime.getContext().getGlobalFloat (name); Type_Float value = runtime.getContext().getGlobalFloat (name);
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…
Cancel
Save