blob: 2279a472d53c10dd4cabfa9ef628c90bb15de6b4 [file] [log] [blame]
/* da-field.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"
#include "field.h"
int doget(Classfile *c)
{
unsigned pcval = currpc - 1;
int val = JDNEXT16S();
Ref *mr = (Ref*)c->cp[val]->p;
NameAndType *nt = (NameAndType*)c->cp[mr->name_and_type]->p;
char *tmpstr = c->cp[nt->name_index]->chp;
Exp *e = new Exp(pcval, tmpstr, sig2type(c->cp[nt->signature_index]->chp), CP, val);
if (ch == 0xB2) { /* getstatic */
Exp *e1;
tmpstr = c->cp(mr->class_index)->chp;
// int tmpint = strlen(c->package_name);
if (strcmp(tmpstr, c->this_class_name)) {
Exp *e2 = new Exp(pcval, tmpstr, VOID, NO);
e1 = new Exp(pcval, BINARY, e->e->type, DOT, e2, e);
e->e->type = VOID;
} else {
e1 = e;
}
*stkptr++ = e1;
return 0;
} else { /* getfield */
if (((*(stkptr-1))->e->et == IDENT) && !strcmp((*(stkptr-1))->e->id->name,"this")) {
/* this.bar == bar */
e->minpc = min(pcval, (*(stkptr-1))->minpc);
*(stkptr-1) = e; return 0;
} else {
/* foo.bar */
*(stkptr-1) = new Exp(pcval, min(pcval, (*(stkptr-1))->minpc), BINARY,
e->e->type, DOT, *(stkptr-1), e);
e->e->type = VOID;
return 0;
}
}
}
int doput(Classfile *c)
{
unsigned pcval = currpc - 1;
int val = JDNEXT16S();
Ref *mr = (Ref*)c->cp[val]->p;
NameAndType *nt = (NameAndType*)c->cp[mr->name_and_type]->p;
char *tmpstr = c->cp[nt->name_index]->chp;
Exp *e = new Exp(pcval, tmpstr, sig2type(c->cp[nt->signature_index]->chp), NO);
if (ch == 0xB3) { /* putstatic */
Exp *e1;
tmpstr = c->cp(mr->class_index)->chp;
if (strcmp(tmpstr, c->this_class_name)) {
Exp *e2 = new Exp(pcval, tmpstr, VOID, NO);
e1 = new Exp(pcval, BINARY, e->e->type, DOT, e2, e);
e->e->type = VOID;
} else {
e1 = e;
}
Exp *e3 = *(--stkptr);
if ((e3->e->type == INT) && (e1->e->type == BOOLEAN)) {
if ((e3->e == std_exps + 2)||(e3->e == std_exps + 3))
e3->e += 13;
else
/* CMPEQ */;
}
*donestkptr++ = new Exp(pcval, min(pcval, e3->minpc), BINARY,
e1->e->type, ASSIGN, e1, e3);
return 0;
} else { /* putfield */
Exp *e3 = *(stkptr-2);
if ((e3->e->et == IDENT) && !strcmp(e3->e->id->name,"this")) {
/* this.bar == bar */
e3 = *(--stkptr);
if ((e3->e->type == INT) && (e->e->type == BOOLEAN)) {
if ((e3->e == std_exps + 2)||(e3->e == std_exps + 3))
e3->e += 13;
else
/* CMPEQ */;
}
stkptr--;
*donestkptr++ = new Exp(pcval, min(min(pcval, (*stkptr)->minpc),
(*stkptr)->minpc),
BINARY, e->e->type, ASSIGN, e, e3);
return 0;
} else {
/* foo.bar */
Exp *e1 = new Exp(pcval, min((*(stkptr-1))->minpc, pcval), BINARY,
e->e->type, DOT, e3, e);
e->e->type = VOID;
e3 = *(--stkptr);
if ((e3->e->type == INT) && (e1->e->type == BOOLEAN)) {
if ((e3->e == std_exps + 2)||(e3->e == std_exps + 3))
e3->e += 13;
else
/* CMPEQ */;
}
*donestkptr++ = new Exp(pcval, min(e3->minpc, e1->minpc), BINARY,
e1->e->type, ASSIGN, e1, e3);
return 0;
}
}
}