Welcome to the GBF Test Portal

This was built to track decompiler and CFG progress.

Decompiler Output

Backtrace

{
  "frames": [
    {
      "line": 165,
      "function": "gbf_core::decompiler::function_decompiler_context::FunctionDecompilerContext::process_instruction",
      "file": ".\\gbf_core\\src\\decompiler\\function_decompiler_context.rs"
    },
    {
      "line": 467,
      "file": ".\\gbf_core\\src\\decompiler\\function_decompiler.rs",
      "function": "gbf_core::decompiler::function_decompiler::FunctionDecompiler::process_regions"
    },
    {
      "line": 286,
      "file": ".\\gbf_core\\src\\decompiler\\function_decompiler.rs",
      "function": "gbf_core::decompiler::function_decompiler::FunctionDecompiler::decompile"
    }
  ]
}

Context

{
  "current_block_id": {
    "index": 11,
    "block_type": "Normal",
    "address": 5117
  },
  "current_ast_node_stack": [
    {
      "StandaloneNode": {
        "Expression": {
          "Assignable": {
            "MemberAccess": {
              "metadata": {
                "properties": {},
                "comments": []
              },
              "node_id": 66557,
              "ptr": {
                "rhs": {
                  "Identifier": {
                    "metadata": {
                      "properties": {},
                      "comments": []
                    },
                    "ptr": {
                      "ssa_version": null,
                      "id": "buttons"
                    },
                    "node_id": 66556
                  }
                },
                "ssa_version": 2,
                "lhs": {
                  "Identifier": {
                    "metadata": {
                      "properties": {},
                      "comments": []
                    },
                    "node_id": 66555,
                    "ptr": {
                      "ssa_version": null,
                      "id": "temp"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    {
      "StandaloneNode": {
        "Expression": {
          "Literal": {
            "metadata": {
              "properties": {},
              "comments": []
            },
            "ptr": {
              "Number": 13
            },
            "node_id": 66558
          }
        }
      }
    }
  ],
  "current_instruction": {
    "opcode": "NewArray",
    "operand": null,
    "address": 5132
  }
}
function showRC()
{
    fn_call#6 = this.isOpen();
    // RegionId(1)
    if (fn_call#6) 
    {
        fn_call#8 = GuiRC.showtop();
        lit#9 = 0;
        return lit#9;
    }
    // RegionId(2)
    else
    {
        lit#10 = 1;
        fn_call#12 = settimer#11(lit#10);
        lit#13 = "GuiRC";
        gbf_new_obj#14 = lit#13;
        fn_call#16 = getRCGuiControlType#15();
        new_node#17 = new fn_call#16(gbf_new_obj#14);
        gbf_new_obj#18 = new_node#17;
        // RegionId(2)
        // RegionId(3)
        with (gbf_new_obj#14) 
        {
            fn_call#20 = this.objecttype();
            lit#21 = "GuiWindowCtrl";
            // RegionId(3)
            // RegionId(4)
            if (fn_call#20 == lit#21) 
            {
                lit#23 = 117;
                fn_call#25 = keyname2#24(lit#23);
                lit#26 = "2014/09/26";
                lit#27 = "Remote Control %s (%s)";
                builtin_fn_call#28 = format(lit#27, lit#26, fn_call#25);
                text#29 = builtin_fn_call#28;
                lit#31 = "GuiRCWindowProfile";
                profile#32 = lit#31;
                // RegionId(4)
                // RegionId(5)
                if (remotecontrol.options.noexternalstyle) 
                {
                    lit#37 = "none";
                }
                // RegionId(6)
                else
                {
                }
                phi<idx=1, regions=()> = phi<idx=0, regions=()>;
                lit#40 = true;
                clientrelative#41 = lit#40;
                lit#43 = true;
                closequery#44 = lit#43;
                lit#46 = true;
                isexternal#47 = lit#46;
            }
            lit#49 = 350;
            lit#50 = 500;
            clientextent#51 = {lit#50, lit#49};
            lit#53 = false;
            visible#54 = lit#53;
        }
        fn_call#56 = addcontrol#55(phi<idx=0, regions=()>);
        lit#57 = "GuiRCBitmap";
        gbf_new_obj#58 = lit#57;
        lit#59 = "GuiBitmapCtrl";
        new_node#60 = new lit#59(gbf_new_obj#58);
        gbf_new_obj#61 = new_node#60;
        // RegionId(9)
        // RegionId(10)
        with (gbf_new_obj#58) 
        {
            lit#63 = 160;
            extent#65 = {GuiRC.clientwidth, lit#63};
            lit#67 = "rc_graalonline.jpg";
            bitmap#68 = lit#67;
            lit#70 = "width";
            horizsizing#71 = lit#70;
        }
        fn_call#72 = addcontrol#55(phi<idx=0, regions=()>);
        fn_call#73 = GuiRC.addcontrol(GuiRCBitmap#3);
        lit#74 = 13;
        temp.buttons = new [lit#74];
        lit#75 = 0;
        lit#76 = "PlayerList";
        temp.buttons[lit#75] = lit#76;
        lit#77 = 0;
        lit#79 = "Player List";
        temp.buttons[lit#77].hint = lit#79;
        lit#80 = 0;
        lit#82 = 15;
        lit#83 = 5;
        temp.buttons[lit#80].position = {lit#83, lit#82};
        lit#84 = 0;
        lit#85 = "right";
        temp.buttons[lit#84].horizsizing = lit#85;
        lit#86 = 0;
        phi<idx=0, regions=()> = this.function_357_2;
        lit#89 = 1;
        lit#90 = "FileBrowser";
        temp.buttons[lit#89] = lit#90;
        lit#91 = 1;
        lit#92 = "File Browser";
        temp.buttons[lit#91].hint = lit#92;
        lit#93 = 1;
        lit#94 = 0;
        lit#95 = 1;
        lit#96 = 33;
        lit#97 = 5;
        temp.buttons[lit#93].position = {lit#97, temp.buttons[lit#94].position[lit#95] + lit#96};
        lit#98 = 1;
        lit#99 = "right";
        temp.buttons[lit#98].horizsizing = lit#99;
        lit#100 = 1;
        lit#101 = "folders";
        temp.buttons[lit#100].action = lit#101;
        lit#102 = 2;
        lit#103 = "Accounts";
        temp.buttons[lit#102] = lit#103;
        lit#104 = 2;
        lit#105 = "Account List";
        temp.buttons[lit#104].hint = lit#105;
        lit#106 = 2;
        lit#107 = 15;
        lit#108 = 0;
        lit#109 = 0;
        lit#110 = 33;
        temp.buttons[lit#106].position = {temp.buttons[lit#108].position[lit#109] + lit#110, lit#107};
        lit#111 = 2;
        lit#112 = "right";
        temp.buttons[lit#111].horizsizing = lit#112;
        lit#113 = 2;
        lit#116 = "Xor";
        lit#117 = "unixmad";
        temp.buttons[lit#113].visible = player.account in {lit#117, lit#116};
        lit#118 = 2;
        phi<idx=0, regions=()> = this.function_357_3;
        lit#120 = 3;
        lit#121 = "ToAlls";
        temp.buttons[lit#120] = lit#121;
        lit#122 = 3;
        lit#123 = "To Alls";
        temp.buttons[lit#122].hint = lit#123;
        lit#124 = 3;
        lit#125 = 15;
        lit#126 = 2;
        lit#127 = 0;
        lit#128 = 33;
        temp.buttons[lit#124].position = {temp.buttons[lit#126].position[lit#127] + lit#128, lit#125};
        lit#129 = 3;
        lit#130 = "right";
        temp.buttons[lit#129].horizsizing = lit#130;
        lit#131 = 3;
        phi<idx=0, regions=()> = this.function_357_4;
        lit#133 = 3;
        lit#134 = false;
        temp.buttons[lit#133].visible = lit#134;
        lit#135 = 4;
        lit#136 = "FolderOptions";
        temp.buttons[lit#135] = lit#136;
        lit#137 = 4;
        lit#138 = "Folder Options";
        temp.buttons[lit#137].hint = lit#138;
        lit#139 = 4;
        lit#140 = 15;
        lit#141 = 40;
        temp.buttons[lit#139].position = {GuiRCBitmap.clientwidth - lit#141, lit#140};
        lit#142 = 4;
        lit#143 = "left";
        temp.buttons[lit#142].horizsizing = lit#143;
        lit#144 = 4;
        lit#145 = "folderconfig";
        temp.buttons[lit#144].action = lit#145;
        lit#146 = 5;
        lit#147 = "ServerFlags";
        temp.buttons[lit#146] = lit#147;
        lit#148 = 5;
        lit#149 = "Server Flags";
        temp.buttons[lit#148].hint = lit#149;
        lit#150 = 5;
        lit#151 = 15;
        lit#152 = 4;
        lit#153 = 0;
        lit#154 = 33;
        temp.buttons[lit#150].position = {temp.buttons[lit#152].position[lit#153] - lit#154, lit#151};
        lit#155 = 5;
        lit#156 = "left";
        temp.buttons[lit#155].horizsizing = lit#156;
        lit#157 = 5;
        lit#158 = "serverflags";
        temp.buttons[lit#157].action = lit#158;
        lit#159 = 6;
        lit#160 = "Options";
        temp.buttons[lit#159] = lit#160;
        lit#161 = 6;
        lit#162 = "RC Options";
        temp.buttons[lit#161].hint = lit#162;
        lit#163 = 6;
        lit#164 = 15;
        lit#165 = 5;
        lit#166 = 0;
        lit#167 = 33;
        temp.buttons[lit#163].position = {temp.buttons[lit#165].position[lit#166] - lit#167, lit#164};
        lit#168 = 6;
        lit#169 = "left";
        temp.buttons[lit#168].horizsizing = lit#169;
        lit#170 = 6;
        phi<idx=0, regions=()> = this.function_357_5;
        lit#172 = 7;
        lit#173 = "ServerOptions";
        temp.buttons[lit#172] = lit#173;
        lit#174 = 7;
        lit#175 = "Server Options";
        temp.buttons[lit#174].hint = lit#175;
        lit#176 = 7;
        lit#177 = 4;
        lit#178 = 1;
        lit#179 = 33;
        lit#180 = 40;
        temp.buttons[lit#176].position = {GuiRCBitmap.clientwidth - lit#180, temp.buttons[lit#177].position[lit#178] + lit#179};
        lit#181 = 7;
        lit#182 = "left";
        temp.buttons[lit#181].horizsizing = lit#182;
        lit#183 = 7;
        lit#184 = "options";
        temp.buttons[lit#183].action = lit#184;
        lit#185 = 8;
        lit#186 = "LocalNPCs";
        temp.buttons[lit#185] = lit#186;
        lit#187 = 8;
        lit#188 = "Local NPCs";
        temp.buttons[lit#187].hint = lit#188;
        lit#189 = 8;
        lit#190 = 7;
        lit#191 = 1;
        lit#192 = 33;
        lit#193 = 40;
        temp.buttons[lit#189].position = {GuiRCBitmap.clientwidth - lit#193, temp.buttons[lit#190].position[lit#191] + lit#192};
        lit#194 = 8;
        lit#195 = "left";
        temp.buttons[lit#194].horizsizing = lit#195;
        lit#196 = 8;
        lit#197 = false;
        temp.buttons[lit#196].visible = lit#197;
        lit#198 = 9;
        lit#199 = "ClassList";
        temp.buttons[lit#198] = lit#199;
        lit#200 = 9;
        lit#201 = "Classes";
        temp.buttons[lit#200].hint = lit#201;
        lit#202 = 9;
        lit#203 = 8;
        lit#204 = 1;
        lit#205 = 33;
        lit#206 = 40;
        temp.buttons[lit#202].position = {GuiRCBitmap.clientwidth - lit#206, temp.buttons[lit#203].position[lit#204] + lit#205};
        lit#207 = 9;
        lit#208 = "left";
        temp.buttons[lit#207].horizsizing = lit#208;
        lit#209 = 9;
        lit#210 = "classlist";
        temp.buttons[lit#209].action = lit#210;
        lit#211 = 10;
        lit#212 = "WeaponList";
        temp.buttons[lit#211] = lit#212;
        lit#213 = 10;
        lit#214 = "Weapons";
        temp.buttons[lit#213].hint = lit#214;
        lit#215 = 10;
        lit#216 = 9;
        lit#217 = 1;
        lit#218 = 9;
        lit#219 = 0;
        lit#220 = 33;
        temp.buttons[lit#215].position = {temp.buttons[lit#218].position[lit#219] - lit#220, temp.buttons[lit#216].position[lit#217]};
        lit#221 = 10;
        lit#222 = "left";
        temp.buttons[lit#221].horizsizing = lit#222;
        lit#223 = 10;
        lit#224 = "weaponlist";
        temp.buttons[lit#223].action = lit#224;
        lit#225 = 11;
        lit#226 = "NPCList";
        temp.buttons[lit#225] = lit#226;
        lit#227 = 11;
        lit#228 = "NPCs";
        temp.buttons[lit#227].hint = lit#228;
        lit#229 = 11;
        lit#230 = 9;
        lit#231 = 1;
        lit#232 = 10;
        lit#233 = 0;
        lit#234 = 33;
        temp.buttons[lit#229].position = {temp.buttons[lit#232].position[lit#233] - lit#234, temp.buttons[lit#230].position[lit#231]};
        lit#235 = 11;
        lit#236 = "left";
        temp.buttons[lit#235].horizsizing = lit#236;
        lit#237 = 11;
        lit#238 = "npclist";
        temp.buttons[lit#237].action = lit#238;
        lit#239 = 12;
        lit#240 = "GUIScripts";
        temp.buttons[lit#239] = lit#240;
        lit#241 = 12;
        lit#242 = "NPCs";
        temp.buttons[lit#241].hint = lit#242;
        lit#243 = 12;
        lit#244 = 9;
        lit#245 = 1;
        lit#246 = 11;
        lit#247 = 0;
        lit#248 = 33;
        temp.buttons[lit#243].position = {temp.buttons[lit#246].position[lit#247] - lit#248, temp.buttons[lit#244].position[lit#245]};
        lit#249 = 12;
        lit#250 = "left";
        temp.buttons[lit#249].horizsizing = lit#250;
        lit#251 = 12;
        phi<idx=0, regions=()> = this.function_357_6;
        // RegionId(16)
        // RegionId(17)
        with (GuiRCBitmap#3) 
        {
            lit#254 = 0;
            temp.i = lit#254;
            builtin_fn_call#255 = temp.buttons.size();
            while (temp.i < builtin_fn_call#255) 
            {
                lit#256 = "GuiRC";
                lit#257 = "Button";
                gbf_new_obj#258 = (lit#256 @ temp.buttons[temp.i]) @ lit#257;
                lit#259 = "GuiBitmapButtonCtrl";
                new_node#260 = new lit#259(gbf_new_obj#258);
                gbf_new_obj#261 = new_node#260;
                // RegionId(19)
                // RegionId(20)
                with (gbf_new_obj#258) 
                {
                    lit#262 = 32;
                    lit#263 = 32;
                    extent#264 = {lit#263, lit#262};
                    lit#267 = "rc_";
                    lit#268 = "_normal.png";
                    normalbitmap#269 = (lit#267 @ temp.buttons[temp.i]) @ lit#268;
                    mouseoverbitmap#270 = normalbitmap#266;
                    lit#272 = "rc_";
                    lit#273 = "_pressed.png";
                    pressedbitmap#274 = (lit#272 @ temp.buttons[temp.i]) @ lit#273;
                    fn_call#277 = temp.buttons[temp.i].getdynamicvarnames();
                    lit#278 = 0;
                    for (phi<idx=0, regions=()> : phi<idx=1, regions=()>) 
                    {
                        this.temp.varname = temp.buttons[temp.i].temp.varname;
                        phi<idx=0, regions=()>++;
                    }
                    lit#279 = "onGuiRCButtonPressed";
                    lit#280 = "onAction";
                    fn_call#283 = thiso.catchevent(this#4, lit#280, lit#279);
                }
                fn_call#284 = addcontrol#55(phi<idx=0, regions=()>);
                temp.i++;
            }
        }
        lit#285 = "GuiRCServerText";
        gbf_new_obj#286 = lit#285;
        lit#287 = "GuiTextCtrl";
        new_node#288 = new lit#287(gbf_new_obj#286);
        gbf_new_obj#289 = new_node#288;
        // RegionId(26)
        // RegionId(27)
        with (gbf_new_obj#286) 
        {
            lit#290 = "GuiRCGreenTextProfile";
            profile#291 = lit#290;
            lit#292 = 87;
            lit#293 = 11;
            position#294 = {lit#293, lit#292};
            lit#295 = "none";
            style#296 = lit#295;
            lit#297 = "Server: ";
            text#299 = lit#297 @ servername#298;
        }
        fn_call#300 = addcontrol#55(phi<idx=0, regions=()>);
        fn_call#302 = GuiRCBitmap.addcontrol(GuiRCServerText#301);
        lit#303 = "GuiRCPlayersText";
        gbf_new_obj#304 = lit#303;
        lit#305 = "GuiTextCtrl";
        new_node#306 = new lit#305(gbf_new_obj#304);
        gbf_new_obj#307 = new_node#306;
        // RegionId(28)
        // RegionId(29)
        with (gbf_new_obj#304) 
        {
            lit#308 = "GuiRCGreenTextProfile";
            profile#309 = lit#308;
            lit#310 = 107;
            lit#311 = 11;
            position#312 = {lit#311, lit#310};
            lit#313 = "none";
            style#314 = lit#313;
        }
        fn_call#315 = addcontrol#55(phi<idx=0, regions=()>);
        fn_call#317 = GuiRCBitmap.addcontrol(GuiRCPlayersText#316);
        lit#318 = "GuiRCTabs";
        gbf_new_obj#319 = lit#318;
        lit#320 = "GuiTabCtrl";
        new_node#321 = new lit#320(gbf_new_obj#319);
        gbf_new_obj#322 = new_node#321;
        // RegionId(30)
        // RegionId(31)
        with (gbf_new_obj#319) 
        {
            lit#323 = "GuiRCTabProfile";
            profile#324 = lit#323;
            lit#325 = 24;
            extent#326 = {GuiRCBitmap.clientwidth, lit#325};
            lit#328 = 1;
            lit#329 = 0;
            position#330 = {lit#329, GuiRCBitmap.clientheight - extent#326[lit#328]};
            lit#332 = 64;
            tabwidth#333 = lit#332;
            lit#334 = "width";
            horizsizing#335 = lit#334;
            lit#336 = 0;
            fn_call#338 = setselectedrow#337(lit#336);
        }
        fn_call#339 = addcontrol#55(phi<idx=0, regions=()>);
        fn_call#341 = GuiRCBitmap.addcontrol(GuiRCTabs#340);
        fn_call#343 = GuiRCTabs.pushtoback();
        lit#344 = "GuiRCConsole";
        gbf_new_obj#345 = lit#344;
        lit#346 = "GuiControl";
        new_node#347 = new lit#346(gbf_new_obj#345);
        gbf_new_obj#348 = new_node#347;
        // RegionId(32)
        // RegionId(33)
        with (gbf_new_obj#345) 
        {
            lit#350 = 0;
            position#351 = {lit#350, GuiRCBitmap.height};
            extent#352 = {GuiRC.clientwidth, GuiRC.clientheight - GuiRCBitmap.height};
            lit#353 = "width";
            horizsizing#354 = lit#353;
            lit#356 = "height";
            vertsizing#357 = lit#356;
        }
        fn_call#358 = addcontrol#55(phi<idx=0, regions=()>);
        fn_call#360 = GuiRC.addcontrol(GuiRCConsole#359);
        lit#361 = "GuiRCConsoleTextEdit";
        gbf_new_obj#362 = lit#361;
        lit#363 = "GuiTextEditCtrl";
        new_node#364 = new lit#363(gbf_new_obj#362);
        gbf_new_obj#365 = new_node#364;
        // RegionId(34)
        // RegionId(35)
        with (gbf_new_obj#362) 
        {
            lit#366 = "GuiRCTextEditProfile";
            profile#367 = lit#366;
            lit#368 = 22;
            extent#369 = {GuiRCConsole.clientwidth, lit#368};
            lit#370 = 22;
            lit#371 = 0;
            position#372 = {lit#371, GuiRCConsole.clientheight - lit#370};
            lit#373 = "none";
            style#374 = lit#373;
            lit#375 = "width";
            horizsizing#376 = lit#375;
            lit#377 = "top";
            vertsizing#378 = lit#377;
        }
        fn_call#379 = addcontrol#55(phi<idx=0, regions=()>);
        fn_call#381 = GuiRCConsole.addcontrol(GuiRCConsoleTextEdit#380);
        fn_call#383 = updateGuiProfiles#382();
        lit#384 = true;
        GuiRC.visible = lit#384;
        lit#385 = true;
        fn_call#387 = GuiRCConsoleTextEdit.makefirstresponder(lit#385);
        // RegionId(36)
        // RegionId(37)
        if (GuiRC.isexternal) 
        {
            lit#390 = 3;
            lit#391 = 2;
            lit#393 = 3;
            lit#394 = 2;
            lit#396 = 2;
            lit#397 = 2;
            GuiRC.externalwindow.bounds = {(GuiRC.externalwindow.screenwidth - GuiRC.externalwindow.bounds[lit#396]) / lit#397, (GuiRC.externalwindow.screenheight - GuiRC.externalwindow.bounds[lit#393]) / lit#394, GuiRC.externalwindow.bounds[lit#391], GuiRC.externalwindow.bounds[lit#390]};
        }
        lit#398 = "RC Chat";
        lit#399 = "join";
        fn_call#401 = handleTabCommand#400(lit#399, {lit#398});
        lit#402 = "Welcome to ";
        fn_call#404 = getservername#403();
        lit#405 = " RC. Type /help for a list of available commands.";
        lit#406 = "RC Chat";
        lit#407 = "";
        lit#408 = "privmsg";
        fn_call#409 = handleTabCommand#400(lit#408, {lit#407, lit#406, (lit#402 @ fn_call#404) @ lit#405});
        lit#410 = 0;
        return lit#410;
    }
}