Fixed longstanding bugs and cleaned up code

This commit is contained in:
Samuel D. Crow
2022-06-28 21:10:15 -05:00
parent bf70fd087b
commit 6a3c37b02c
4 changed files with 49 additions and 10 deletions

View File

@@ -276,10 +276,10 @@ void shutDown()
variableType *v; variableType *v;
printSegment *print; printSegment *print;
fn *func;
operands *o; operands *o;
expression *e; expression *e;
list<operands *>p; list<operands *>p;
void testInt() void testInt()
{ {
logger("testInt started"); logger("testInt started");
@@ -331,7 +331,7 @@ void testFunc()
logger("testFunc started"); logger("testFunc started");
string name=string("square"); string name=string("square");
o = operands::createOp(T_FLOATVAR); o = operands::createOp(T_FLOATVAR);
func=fn::declare(name, T_FLOATFUNC, o); fn *func=fn::declare(name, T_FLOATFUNC, o);
name=string("radius"); name=string("radius");
func->addParameter(name, T_FLOATVAR); func->addParameter(name, T_FLOATVAR);
logger("param added"); logger("param added");
@@ -349,10 +349,43 @@ void testFunc()
logger("call generated"); logger("call generated");
e=new expression(o); e=new expression(o);
print=new printSegment(e); print=new printSegment(e);
print->generate();
o->dispose(); o->dispose();
delete print;
p.clear();
logger("testFunc cleared");
}
void testIf()
{
logger("testIf started");
string name=string("check");
logger("name declared");
fn *func2=fn::declare(name, T_UNKNOWNFUNC);
logger("check fn declared");
string name2=string("checker");
func2->addParameter(name2, T_FLOATVAR);
logger("checker added");
o=operands::createOp(T_FLOATVAR);
e=new expression(new expression(o), O_LESS, new expression(new constOp("0.0", T_FLOAT)));
ifStatement *i=new ifStatement(e);
print=new printSegment(new expression(new constOp("less", T_STRING)));
print->generate(); print->generate();
delete print; delete print;
logger("testFunc cleared"); i->alternative();
print=new printSegment(new expression(new constOp("greater or equal", T_STRING)));
print->generate();
delete print;
i->close();
func2->close();
delete i;
p.push_back(new constOp("0.0", T_FLOAT));
func2->generateCall(name, p);
p.clear();
p.push_back(new constOp("-0.1", T_FLOAT));
func2->generateCall(name, p);
p.clear();
logger("testIf cleared");
} }
void testForLoop() void testForLoop()
@@ -384,6 +417,7 @@ void compile()
testString(); testString();
testFloat(); testFloat();
testFunc(); testFunc();
testIf();
testForLoop(); testForLoop();
logger("generating end"); logger("generating end");
label::generateEnd(); label::generateEnd();

View File

@@ -286,7 +286,7 @@ public:
label(){this->id = ++nextID;} label(){this->id = ++nextID;}
label(string &s) label(string &s)
{ {
label(); this->id = ++nextID;
label::lookup[s]=unique_ptr<label>(this); label::lookup[s]=unique_ptr<label>(this);
} }
@@ -411,7 +411,7 @@ class fn
unsigned int id; unsigned int id;
enum CODES type; enum CODES type;
enum TYPES kind; enum TYPES kind;
operands *rc; operands *rc; // Return Code
label *startAddr; label *startAddr;
label *skipDef; label *skipDef;
/* stamdard constructor called by declare */ /* stamdard constructor called by declare */

View File

@@ -100,7 +100,7 @@ void label::generateCondJump(expression *e)
if (o->getType()==T_INT||o->getType()==T_INTVAR) if (o->getType()==T_INT||o->getType()==T_INTVAR)
{ {
output_cpp<< "if(" << o->boxName() output_cpp<< "if(" << o->boxName()
<< "!=0)state=" << this->getID() << ";\nbreak;\n"; << "!=0){state=" << this->getID() << ";break;}\n";
o->dispose(); o->dispose();
delete e; delete e;
return; return;

View File

@@ -75,6 +75,8 @@ void fn::addParameter(string &name, enum TYPES t)
/* TODO needs to be broken into smaller pieces */ /* TODO needs to be broken into smaller pieces */
operands *fn::generateCall(string &name, list<operands *>&paramList) operands *fn::generateCall(string &name, list<operands *>&paramList)
{ {
static unsigned int callID;
unsigned int callEnumerator;
auto v=params.begin(); auto v=params.begin();
operands *current; operands *current;
label *retAddr=new label(); label *retAddr=new label();
@@ -88,12 +90,13 @@ operands *fn::generateCall(string &name, list<operands *>&paramList)
error(E_TOO_MANY_PARAMETERS); error(E_TOO_MANY_PARAMETERS);
} }
/* TODO CHECK THIS */ /* TODO CHECK THIS */
callEnumerator = ++callID;
heap_h << "struct f" << g->getID() heap_h << "struct f" << g->getID()
<< " *sub" << this->getID() << ";\n"; << " *sub" << callEnumerator << ";\n";
output_cpp << " sub" << this->getID() output_cpp << " sub" << this->getID()
<< "= new f" << g->getID() << "= new f" << g->getID()
<< "(" << retAddr->getID() << ");\n" << "(" << retAddr->getID() << ");\n"
<< "callStack = sub" << this->getID() << ";\n"; << "callStack = sub" << callEnumerator << ";\n";
/* TODO Make parameter processing a separate function */ /* TODO Make parameter processing a separate function */
while(paramList.size()>0) while(paramList.size()>0)
@@ -243,6 +246,7 @@ void fn::close()
fn *fn::declare(string &s, enum CODES t, operands *returnCode) fn *fn::declare(string &s, enum CODES t, operands *returnCode)
{ {
/* sd is the skipDef of this function */
label *sd=new label(); label *sd=new label();
/* check for nesting error */ /* check for nesting error */
if (!scopeGlobal) error(E_END_FUNCTION); if (!scopeGlobal) error(E_END_FUNCTION);
@@ -281,6 +285,7 @@ fn::fn(enum CODES t, operands *returnCode)
startAddr->generate(); startAddr->generate();
} }
/* Destructor is called only at the end of the unique pointer's existence */
fn::~fn() fn::~fn()
{ {
delete startAddr; delete startAddr;