Keep track of variable types

This commit is contained in:
Simon Robertshaw 2013-01-31 23:35:16 +00:00
parent ca7c0d777b
commit 004710fcea
8 changed files with 139 additions and 12 deletions

View File

@ -958,8 +958,8 @@ int LuaScriptInterface::updateVM(UPDATE_FUNC_ARGS)
machine->CSPush(i); machine->CSPush(i);
machine->CSPush(x); machine->CSPush(x);
machine->CSPush(y); machine->CSPush(y);
//machine->Call(0); machine->Call(0);
machine->CallCompiled(0); //machine->CallCompiled(0);
/*vm::VirtualMachine * vMachine = updateVirtualMachines[parts[i].type]; /*vm::VirtualMachine * vMachine = updateVirtualMachines[parts[i].type];

View File

@ -274,11 +274,30 @@ namespace pim
variableType = type; variableType = type;
} }
void Generator::PushType(int type)
{
typeStack.push(type);
}
void Generator::pushType(int type)
{
typeStack.push(type);
}
void Generator::popType(int count)
{
while(count--)
{
typeStack.pop();
}
}
void Generator::ScopeVariable(std::string label) void Generator::ScopeVariable(std::string label)
{ {
currentScope->Definitions.push_back(Definition(label, variableType, currentScope->FrameSize)); currentScope->Definitions.push_back(Definition(label, typeStack.top(), currentScope->FrameSize));
currentScope->FrameSize += 4; currentScope->FrameSize += 4;
currentScope->LocalFrameSize += 4; currentScope->LocalFrameSize += 4;
typeStack.pop();
output << "#declare " << label << " " << currentScope->FrameSize-4 << std::endl; output << "#declare " << label << " " << currentScope->FrameSize-4 << std::endl;
} }
@ -290,22 +309,42 @@ namespace pim
void Generator::LoadVariable(std::string label) void Generator::LoadVariable(std::string label)
{ {
Definition d = currentScope->GetDefinition(label);
pushType(d.Type);
writeOpcode(Opcode::Load); writeOpcode(Opcode::Load);
writeConstant(currentScope->GetDefinition(label).StackPosition); writeConstant(d.StackPosition);
output << "load " << label << std::endl; output << "load " << label << std::endl;
} }
void Generator::StoreVariable(std::string label) void Generator::StoreVariable(std::string label)
{ {
Definition d = currentScope->GetDefinition(label);
int otherType = typeStack.top();
if(otherType != d.Type)
{
if(otherType == DataType::Integer && d.Type == DataType::Float)
{
ToFloat();
}
else if(otherType == DataType::Float && d.Type == DataType::Integer)
{
ToInteger();
}
}
popType(2);
writeOpcode(Opcode::Store); writeOpcode(Opcode::Store);
writeConstant(currentScope->GetDefinition(label).StackPosition); writeConstant(d.StackPosition);
output << "store " << label << std::endl; output << "store " << label << std::endl;
} }
void Generator::RTConstant(std::string name) void Generator::RTConstant(std::string name)
{ {
pushType(Type::Integer);
writeOpcode(Opcode::Constant); writeOpcode(Opcode::Constant);
writeConstantMacroPlaceholder(name); writeConstantMacroPlaceholder(name);
@ -314,6 +353,7 @@ namespace pim
void Generator::Constant(std::string constant) void Generator::Constant(std::string constant)
{ {
pushType(DataType::Integer);
writeOpcode(Opcode::Constant); writeOpcode(Opcode::Constant);
writeConstant(constant); writeConstant(constant);
@ -331,6 +371,7 @@ namespace pim
void Generator::Discard() void Generator::Discard()
{ {
popType(1);
writeOpcode(Opcode::Discard); writeOpcode(Opcode::Discard);
output << "discard" << std::endl; output << "discard" << std::endl;
@ -338,6 +379,7 @@ namespace pim
void Generator::Duplicate() void Generator::Duplicate()
{ {
pushType(typeStack.top());
writeOpcode(Opcode::Duplicate); writeOpcode(Opcode::Duplicate);
output << "duplicate" << std::endl; output << "duplicate" << std::endl;
@ -345,6 +387,8 @@ namespace pim
void Generator::Add() void Generator::Add()
{ {
popType(2);
pushType(DataType::Integer);
writeOpcode(Opcode::Add); writeOpcode(Opcode::Add);
output << "add" << std::endl; output << "add" << std::endl;
@ -352,6 +396,8 @@ namespace pim
void Generator::Subtract() void Generator::Subtract()
{ {
popType(2);
pushType(DataType::Integer);
writeOpcode(Opcode::Subtract); writeOpcode(Opcode::Subtract);
output << "sub" << std::endl; output << "sub" << std::endl;
@ -359,13 +405,32 @@ namespace pim
void Generator::Multiply() void Generator::Multiply()
{ {
popType(2);
pushType(DataType::Integer);
writeOpcode(Opcode::Multiply); writeOpcode(Opcode::Multiply);
output << "mul" << std::endl; output << "mul" << std::endl;
} }
void Generator::ToInteger()
{
popType(1);
pushType(DataType::Integer);
writeOpcode(OpCode::ToInteger);
}
void Generator::ToFloat()
{
popType(1);
pushType(DataType::Float);
writeOpcode(OpCode::ToFloat);
}
void Generator::Divide() void Generator::Divide()
{ {
popType(2);
pushType(DataType::Integer);
writeOpcode(Opcode::Divide); writeOpcode(Opcode::Divide);
output << "div" << std::endl; output << "div" << std::endl;
@ -374,6 +439,8 @@ namespace pim
void Generator::Modulus() void Generator::Modulus()
{ {
writeOpcode(Opcode::Modulus); writeOpcode(Opcode::Modulus);
popType(2);
pushType(DataType::Integer);
output << "add" << std::endl; output << "add" << std::endl;
} }
@ -401,6 +468,8 @@ namespace pim
void Generator::GetParticle() void Generator::GetParticle()
{ {
popType(2);
pushType(DataType::Integer);
writeOpcode(Opcode::Get); writeOpcode(Opcode::Get);
output << "getpart" << std::endl; output << "getpart" << std::endl;
@ -408,6 +477,9 @@ namespace pim
void Generator::GetPosition() void Generator::GetPosition()
{ {
popType(1);
pushType(DataType::Integer);
pushType(DataType::Integer);
writeOpcode(Opcode::Position); writeOpcode(Opcode::Position);
output << "getpos" << std::endl; output << "getpos" << std::endl;
@ -415,6 +487,7 @@ namespace pim
void Generator::KillParticle() void Generator::KillParticle()
{ {
popType(1);
writeOpcode(Opcode::Kill); writeOpcode(Opcode::Kill);
output << "kill" << std::endl; output << "kill" << std::endl;
@ -422,6 +495,8 @@ namespace pim
void Generator::LoadProperty(std::string property) void Generator::LoadProperty(std::string property)
{ {
popType(2);
pushType(DataType::Integer);
writeOpcode(Opcode::LoadProperty); writeOpcode(Opcode::LoadProperty);
writeConstantPropertyPlaceholder(property); writeConstantPropertyPlaceholder(property);
@ -430,6 +505,7 @@ namespace pim
void Generator::StoreProperty(std::string property) void Generator::StoreProperty(std::string property)
{ {
popType(2);
writeOpcode(Opcode::StoreProperty); writeOpcode(Opcode::StoreProperty);
writeConstantPropertyPlaceholder(property); writeConstantPropertyPlaceholder(property);
@ -449,6 +525,7 @@ namespace pim
void Generator::JumpEqual(std::string label) void Generator::JumpEqual(std::string label)
{ {
popType(2);
writeOpcode(Opcode::JumpEqual); writeOpcode(Opcode::JumpEqual);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);
@ -457,6 +534,7 @@ namespace pim
void Generator::JumpNotEqual(std::string label) void Generator::JumpNotEqual(std::string label)
{ {
popType(2);
writeOpcode(Opcode::JumpNotEqual); writeOpcode(Opcode::JumpNotEqual);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);
@ -465,6 +543,7 @@ namespace pim
void Generator::JumpGreater(std::string label) void Generator::JumpGreater(std::string label)
{ {
popType(2);
writeOpcode(Opcode::JumpGreater); writeOpcode(Opcode::JumpGreater);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);
@ -473,6 +552,7 @@ namespace pim
void Generator::JumpGreaterEqual(std::string label) void Generator::JumpGreaterEqual(std::string label)
{ {
popType(2);
writeOpcode(Opcode::JumpGreaterEqual); writeOpcode(Opcode::JumpGreaterEqual);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);
@ -481,6 +561,7 @@ namespace pim
void Generator::JumpLess(std::string label) void Generator::JumpLess(std::string label)
{ {
popType(2);
writeOpcode(Opcode::JumpLess); writeOpcode(Opcode::JumpLess);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);
@ -489,6 +570,7 @@ namespace pim
void Generator::JumpLessEqual(std::string label) void Generator::JumpLessEqual(std::string label)
{ {
popType(2);
writeOpcode(Opcode::JumpLessEqual); writeOpcode(Opcode::JumpLessEqual);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);
@ -497,6 +579,7 @@ namespace pim
void Generator::Jump(std::string label) void Generator::Jump(std::string label)
{ {
popType(2);
writeOpcode(Opcode::Jump); writeOpcode(Opcode::Jump);
writeConstantPlaceholder(label); writeConstantPlaceholder(label);

View File

@ -5,6 +5,7 @@
#include <stack> #include <stack>
#include <iostream> #include <iostream>
#include "Token.h" #include "Token.h"
#include "Types.h"
namespace pim namespace pim
{ {
namespace compiler namespace compiler
@ -36,10 +37,6 @@ namespace pim
} }
~SymbolNotFoundException() throw() {}; ~SymbolNotFoundException() throw() {};
}; };
class Type
{
enum { Integer = Token::IntegerSymbol, Decimal = Token::DecimalSymbol };
};
class Definition class Definition
{ {
public: public:
@ -88,6 +85,7 @@ namespace pim
class Generator class Generator
{ {
int variableType; int variableType;
std::stack<int> typeStack;
std::stack<Scope*> scopes; std::stack<Scope*> scopes;
Scope * currentScope; Scope * currentScope;
std::ostream & output; std::ostream & output;
@ -110,6 +108,9 @@ namespace pim
std::vector<unsigned char> program; std::vector<unsigned char> program;
void pushType(int type);
void popType(int count);
void defineLabel(std::string label); void defineLabel(std::string label);
void writeOpcode(int opcode); void writeOpcode(int opcode);
void writeConstant(std::string constant); void writeConstant(std::string constant);
@ -135,6 +136,7 @@ namespace pim
void ScopeVariableType(int type); void ScopeVariableType(int type);
void ScopeVariable(std::string label); void ScopeVariable(std::string label);
void PushType(int type);
void PushVariableAddress(std::string label); void PushVariableAddress(std::string label);
// void Store(); // void Store();
void LoadVariable(std::string label); void LoadVariable(std::string label);
@ -151,6 +153,8 @@ namespace pim
void Divide(); void Divide();
void Modulus(); void Modulus();
void Negate(); void Negate();
void ToInteger();
void ToFloat();
void TransformParticle(); void TransformParticle();
void CreateParticle(); void CreateParticle();

View File

@ -4,6 +4,7 @@
#include <fstream> #include <fstream>
#include "Machine.h" #include "Machine.h"
#include "Opcodes.h" #include "Opcodes.h"
#include "Types.h"
#include "simulation/Simulation.h" #include "simulation/Simulation.h"
#include "X86Native.h" #include "X86Native.h"
namespace pim namespace pim

View File

@ -2,6 +2,7 @@ namespace pim
{ {
struct Opcode struct Opcode
{ {
public:
enum enum
{ {
#define OPDEF(name) name, #define OPDEF(name) name,

View File

@ -1,4 +1,6 @@
OPDEF(Load) OPDEF(Load)
OPDEF(ToFloat)
OPDEF(ToInteger)
OPDEF(Store) OPDEF(Store)
OPDEF(Constant) OPDEF(Constant)
OPDEF(Increment) OPDEF(Increment)

View File

@ -1,6 +1,7 @@
//Syntax analyser //Syntax analyser
#include "Parser.h" #include "Parser.h"
#include "Format.h" #include "Format.h"
#include "Types.h"
namespace pim namespace pim
{ {
namespace compiler namespace compiler
@ -106,7 +107,18 @@ namespace pim
*/ */
void Parser::argument() void Parser::argument()
{ {
generator->ScopeVariableType(token.Symbol); int type;
switch(token.Symbol)
{
case Token::DecimalConstant:
type = DataType::Float;
break;
case Token::IntegerConstant:
case Token::ParticleConstant:
type = DataType::Integer;
break;
}
generator->ScopeVariableType(type);
if(!accept(Token::IntegerSymbol)) if(!accept(Token::IntegerSymbol))
if(!accept(Token::DecimalSymbol)) if(!accept(Token::DecimalSymbol))
if(!accept(Token::ParticleSymbol)) if(!accept(Token::ParticleSymbol))
@ -130,7 +142,18 @@ namespace pim
*/ */
void Parser::declaration() void Parser::declaration()
{ {
generator->ScopeVariableType(token.Symbol); int type;
switch(token.Symbol)
{
case Token::DecimalConstant:
type = DataType::Float;
break;
case Token::IntegerConstant:
case Token::ParticleConstant:
type = DataType::Integer;
break;
}
generator->ScopeVariableType(type);
if(!accept(Token::IntegerSymbol)) if(!accept(Token::IntegerSymbol))
if(!accept(Token::DecimalSymbol)) if(!accept(Token::DecimalSymbol))
if(!accept(Token::ParticleSymbol)) if(!accept(Token::ParticleSymbol))
@ -296,7 +319,7 @@ namespace pim
generator->PushLocalScope(loopLabel+"Start"); generator->PushLocalScope(loopLabel+"Start");
neighbourVariable = token.Source; neighbourVariable = token.Source;
expect(Token::Identifier); expect(Token::Identifier);
generator->ScopeVariableType(Token::IntegerConstant); generator->ScopeVariableType(DataType::Integer);
generator->ScopeVariable(neighbourVariable); generator->ScopeVariable(neighbourVariable);
generator->ScopeVariable(xVar); generator->ScopeVariable(xVar);
generator->ScopeVariable(yVar); generator->ScopeVariable(yVar);

13
src/pim/Types.h Normal file
View File

@ -0,0 +1,13 @@
#pragma once
namespace pim
{
struct DataType
{
public:
enum
{
Integer,
Float
};
};
}