blob: 12b5570593f2fef206c0c3dd20046d4c51bacc22 [file] [log] [blame]
/* d7-cntrl.cpp */
/*
Java Decompiler
Copyright (c) 1994-2003, Pete Ryland.
Distributed under the GNU GPL Version 2.
This package is available from http://pdr.cx/hbd/
*/
#include "exp.h"
#include "class.h"
#include "decomp.h"
#include "cp.h"
int cond_pcend;
Exp *cond_e;
Exp *cond_e2;
Exp **cond_donestkptr;
Exp **cond_stkptr;
int doif1(Classfile *c)
{
unsigned pcval = currpc - 1;
Exp *e = *(--stkptr), *e1, *e2;
switch (e->e->type) {
case CMPTYPE:
if (e->e->op != CMP) { fprintf(stderr, "doif1 error\n"); return 1; }
e->e->op = (Op)(EQUAL + ch - 0x99); e->e->type = BOOLEAN;
break;
case BOOLEAN:
if (ch == 0x99) // ifeq (ie if false)
if (notexp(&e)) { fprintf(stderr, "doif1 error\n"); return 1; }
break;
case INT:
e1 = *stkptr; e2 = new Exp(pcval, I0EXP);
e = new Exp(pcval, e1->minpc, BINARY, BOOLEAN, (Op)(EQUAL + ch - 0x99), e1, e2);
break;
case OBJECT:
e1 = *stkptr; e2 = new Exp(pcval, NULLEXP);
e = new Exp(pcval, e1->minpc, BINARY, BOOLEAN, (Op)(EQUAL + ch - 0xC6), e1, e2);
break;
default:
break;
}
*donestkptr++ = new Exp(pcval, e->minpc, IFEXP, e, pcval + JDNEXT16S());
return 0;
}
int doif2(Classfile *c)
{
unsigned pcval = currpc - 1;
Exp *e2 = *(--stkptr);
Exp *e1 = *(--stkptr);
Exp *e = new Exp(pcval, min(e1->minpc, e2->minpc), BINARY, BOOLEAN,
(Op)(EQUAL + ((ch - 0x9F) % 6)), e1, e2);
*donestkptr++ = new Exp(pcval, e->minpc, /*std_exp*/IFEXP, e,
/*branch_pc*/pcval + JDNEXT16S());
return 0;
}
int docmp(Classfile *c)
{
unsigned pcval = currpc - 1;
Exp *e2 = *(--stkptr);
Exp *e1 = *(stkptr-1);
*(stkptr-1) = new Exp(pcval, min(e1->minpc, e2->minpc), BINARY, CMPTYPE, CMP, e1, e2);
return 0;
}
int finishconditional(Classfile *c) {
if ((stkptr != cond_stkptr) || (donestkptr != cond_donestkptr))
{ fprintf(stderr, "Error cond\n"); return 1; }
cond_e->e++;
if ((cond_e->exp1->e->op > LESSOREQUAL) || (cond_e->exp1->e->op < EQUAL)) {
if (cond_e->exp1->e->type != BOOLEAN) { fprintf(stderr, "Can't not a non-boolean\n"); return 1; }
Exp *e1 = cond_e->exp1;
cond_e->exp1 = new Exp(currpc, e1->minpc, PREUNARY, BOOLEAN, NOT_BOOL, e1);
} else {
*((int*)(&cond_e->exp1->e->op)) ^= 1;
}
cond_e->exp2 = cond_e2; cond_e->exp3 = *(stkptr-1);
*(stkptr-1) = cond_e;
cond_pcend = -1;
return 0;
}