-
Couldn't load subscription status.
- Fork 110
Open
Labels
Priority: MediumMedium priorityMedium prioritySubsystem: VariablesAnything concerning variables, types, assignments, and castingAnything concerning variables, types, assignments, and castingType: BugSomething isn't workingSomething isn't working
Description
Vineflower version
1.10.1, 1.11.1
Describe the bug
Sometimes the declaration for a local variable is missing.
Additional information
This affects old Minecraft versions. For example, class abe in the 1.0.0 client jar has a method a(Ljava/lang/String;IIIZ)V that decompiles to the following:
public void a(String string, int integer2, int integer3, int integer4, boolean boolean5) {
if (string != null) {
boolean var6 = false;
if (boolean5) {
int var7 = integer4 & 0xFF000000;
integer4 = (integer4 & 16579836) >> 2;
integer4 += var7;
}
GL11.glBindTexture(3553, this.a);
float var12 = (float)(integer4 >> 16 & 0xFF) / 255.0F;
float var8 = (float)(integer4 >> 8 & 0xFF) / 255.0F;
float var9 = (float)(integer4 & 0xFF) / 255.0F;
float var10 = (float)(integer4 >> 24 & 0xFF) / 255.0F;
if (var10 == 0.0F) {
var10 = 1.0F;
}
GL11.glColor4f(var12, var8, var9, var10);
((Buffer)this.f).clear();
GL11.glPushMatrix();
GL11.glTranslatef((float)integer2, (float)integer3, 0.0F);
for (int var13 = 0; var13 < string.length(); var13++) {
for (; string.length() > var13 + 1 && string.charAt(var13) == 167; var13 += 2) {
char var14 = string.toLowerCase().charAt(var13 + 1);
if (var14 == 'k') {
var6 = true;
} else {
var6 = false;
int var16 = "0123456789abcdef".indexOf(var14);
if (var16 < 0 || var16 > 15) {
var16 = 15;
}
this.f.put(this.e + 256 + var16 + (boolean5 ? 16 : 0));
if (this.f.remaining() == 0) {
((Buffer)this.f).flip();
GL11.glCallLists(this.f);
((Buffer)this.f).clear();
}
}
}
if (var13 < string.length()) {
int var15 = age.a.indexOf(string.charAt(var13));
if (var15 >= 0) {
if (!var6) {
this.f.put(this.e + var15 + 32);
} else {
boolean var17 = false;
do {
var18 = this.c.nextInt(age.a.length());
} while (this.d[var15 + 32] != this.d[var18 + 32]);
this.f.put(this.e + 256 + this.c.nextInt(2) + 8 + (boolean5 ? 16 : 0));
this.f.put(this.e + var18 + 32);
}
}
}
if (this.f.remaining() == 0) {
((Buffer)this.f).flip();
GL11.glCallLists(this.f);
((Buffer)this.f).clear();
}
}
((Buffer)this.f).flip();
GL11.glCallLists(this.f);
GL11.glPopMatrix();
}
}Notice that var18 is not declared, but is assigned a value inside a do-while block. I have noticed similar behavior in class we method a(Lry;ZZ)I:
public static final int a(ry ry, boolean boolean2, boolean boolean3) {
if (!boolean2 && !boolean3) {
return 0;
} else {
b.clear();
for (int var3 = 0; var3 < ry.i.size(); var3++) {
vi var4 = (vi)ry.i.get(var3);
int var5 = me.c(var4.s / 16.0);
int var6 = me.c(var4.u / 16.0);
byte var7 = 8;
for (int var8 = -var7; var8 <= var7; var8++) {
for (int var9 = -var7; var9 <= var7; var9++) {
boolean var10 = var8 == -var7 || var8 == var7 || var9 == -var7 || var9 == var7;
acm var11 = new acm(var8 + var5, var9 + var6);
if (!var10) {
b.put(var11, false);
} else if (!b.containsKey(var11)) {
b.put(var11, true);
}
}
}
}
int var31 = 0;
dh var32 = ry.v();
for (jf var36 : jf.values()) {
if ((!var36.d() || boolean3) && (var36.d() || boolean2) && ry.b(var36.a()) <= var36.b() * b.size() / 256) {
label123:
for (acm var38 : b.keySet()) {
if (!(Boolean)b.get(var38)) {
am var39 = a(ry, var38.a * 16, var38.b * 16);
int var12 = var39.a;
int var13 = var39.b;
int var14 = var39.c;
if (!ry.g(var12, var13, var14) && ry.e(var12, var13, var14) == var36.c()) {
int var15 = 0;
for (int var16 = 0; var16 < 3; var16++) {
int var17 = var12;
int var18 = var13;
int var19 = var14;
byte var20 = 6;
yx var21 = null;
for (int var22 = 0; var22 < 4; var22++) {
var17 += ry.w.nextInt(var20) - ry.w.nextInt(var20);
var18 += ry.w.nextInt(1) - ry.w.nextInt(1);
var19 += ry.w.nextInt(var20) - ry.w.nextInt(var20);
if (a(var36, ry, var17, var18, var19)) {
float var23 = (float)var17 + 0.5F;
float var24 = (float)var18;
float var25 = (float)var19 + 0.5F;
if (ry.a((double)var23, (double)var24, (double)var25, 24.0) == null) {
float var26 = var23 - (float)var32.a;
float var27 = var24 - (float)var32.b;
float var28 = var25 - (float)var32.c;
float var29 = var26 * var26 + var27 * var27 + var28 * var28;
if (!(var29 < 576.0F)) {
if (var21 == null) {
var21 = ry.a(var36, var17, var18, var19);
if (var21 == null) {
break;
}
}
try {
var40 = (nq)var21.a.getConstructor(ry.class).newInstance(ry);
} catch (Exception var30) {
var30.printStackTrace();
return var31;
}
var40.c((double)var23, (double)var24, (double)var25, ry.w.nextFloat() * 360.0F, 0.0F);
if (var40.i()) {
var15++;
ry.a(var40);
a(var40, ry, var23, var24, var25);
if (var15 >= var40.g_()) {
continue label123;
}
}
var31 += var15;
}
}
}
}
}
}
}
}
}
}
return var31;
}
}Notice that var40 is not declared but given a value inside a try-catch block.
demiurgeQuantified
Metadata
Metadata
Assignees
Labels
Priority: MediumMedium priorityMedium prioritySubsystem: VariablesAnything concerning variables, types, assignments, and castingAnything concerning variables, types, assignments, and castingType: BugSomething isn't workingSomething isn't working