Skip to content

Local variables are sometimes not declared #467

@SpaceWalkerRS

Description

@SpaceWalkerRS

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority: MediumMedium prioritySubsystem: VariablesAnything concerning variables, types, assignments, and castingType: BugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions