blob: 5f217e0714701e57555a9db302b3f0db5ec8937f [file] [log] [blame]
/* d1-pushc.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 <stdio.h>
#include "exp.h"
#include "class.h"
#include "decomp.h"
#include "cp.h"
#include "consts.h"
int pushimm(Classfile *c) /* push immediate value e.g. bipush 34 */
{
int pcval = currpc - 1;
int val = JDNEXT8S();
if (ch == 0x11) { val<<=8; val+=JDNEXT8U(); }
char *temp_str = new char[32];
sprintf(temp_str, "%i", val);
*stkptr++ = new Exp(pcval, temp_str, INT, IM); /* id->linfo = val */
return 0;
}
int pushconst(Classfile *c) /* push value from cp e.g. ldc1 #3 */
{
int pcval = currpc - 1;
int val = JDNEXT8U();
if (ch != 0x12) { val<<=8; val+=JDNEXT8U(); }
Type idtype;
char tmpstr[1024];
cp_info *cpi = c->cp[val];
switch (cpi->tag) {
case CONSTANT_Integer:
sprintf(tmpstr, "0x%lX", cpi->i);
idtype = INT;
// id->linfo = cpi->i;
break;
case CONSTANT_Long:
if (cpi->i)
sprintf(tmpstr, "0x%lX%08lXL", cpi->i, (cpi + 1)->i);
else
sprintf(tmpstr, "0x%lXL", (cpi + 1)->i);
idtype = LONG;
// id->linfo = (cpi + 1)->i;
// id->llinfo[2] = cpi->i;
break;
case CONSTANT_Float:
sprintf(tmpstr, "%.25Gf", cpi->f);
idtype = FLOAT;
// id->dinfo = cpi->f;
break;
case CONSTANT_Double:
sprintf(tmpstr, "%.25Gd", *(double *)&cpi->i);
idtype = DOUBLE;
// id->dinfo = *(double*)&cpi->i;
break;
case CONSTANT_String:
sprintf(tmpstr, "\"%s\"", c->cp[cpi->i]->chp);
idtype = OBJECT; /* java.lang.String */
// id->dinfo = (int)c->cp[cpi->i]->chp;
break;
default:
fprintf(stderr, "Unkown tag %d on constant\n", cpi->tag);
return -1;
}
char *idname = new char[strlen(tmpstr) + 1];
strcpy(idname, tmpstr);
*stkptr++ = new Exp(pcval, idname, idtype, CP, val);
return 0;
}
int pushimp(Classfile *c) /* push implied immediate value e.g. iconst_m1 */
{
*stkptr++ = new Exp(currpc - 1, ch - 1);
return 0;
}