Welcome to the GBF Test Portal

This was built to track decompiler and CFG progress.

Decompiler Output

Backtrace

{
  "frames": [
    {
      "line": 282,
      "function": "gbf_core::decompiler::function_decompiler_context::FunctionDecompilerContext::pop_assignable",
      "file": ".\\gbf_core\\src\\decompiler\\function_decompiler_context.rs"
    },
    {
      "line": 33,
      "file": ".\\gbf_core\\src\\decompiler\\handlers\\special_two_operand.rs",
      "function": "gbf_core::decompiler::handlers::special_two_operand::impl$0::handle_instruction"
    },
    {
      "line": 171,
      "file": ".\\gbf_core\\src\\decompiler\\function_decompiler_context.rs",
      "function": "gbf_core::decompiler::function_decompiler_context::FunctionDecompilerContext::process_instruction"
    },
    {
      "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": 16,
    "block_type": "Normal",
    "address": 3440
  },
  "current_ast_node_stack": [
    {
      "StandaloneNode": {
        "Expression": {
          "Assignable": {
            "Identifier": {
              "metadata": {
                "properties": {},
                "comments": []
              },
              "ptr": {
                "ssa_version": 50,
                "id": "gbf_new_obj"
              },
              "node_id": 64668
            }
          }
        }
      }
    },
    {
      "StandaloneNode": {
        "Expression": {
          "Assignable": {
            "Phi": {
              "metadata": {
                "properties": {},
                "comments": []
              },
              "node_id": 64669,
              "ptr": {
                "index": 0,
                "region_ids": [
                  [
                    {
                      "index": 14
                    },
                    "Fallthrough"
                  ],
                  [
                    {
                      "index": 13
                    },
                    "Branch"
                  ]
                ],
                "ssa_version": null
              }
            }
          }
        }
      }
    },
    {
      "StandaloneNode": {
        "Expression": {
          "Assignable": {
            "Identifier": {
              "metadata": {
                "properties": {},
                "comments": []
              },
              "ptr": {
                "ssa_version": 55,
                "id": "extent"
              },
              "node_id": 64670
            }
          }
        }
      }
    },
    {
      "BuildingArray": [
        {
          "Literal": {
            "metadata": {
              "properties": {},
              "comments": []
            },
            "node_id": 64671,
            "ptr": {
              "Number": 20
            }
          }
        }
      ]
    }
  ],
  "current_instruction": {
    "opcode": "AccessMember",
    "operand": null,
    "address": 3460
  }
}
function showAddScript(texttype#1, nextid#0)
{
    temp.identity = timevar2#4;
    lit#5 = "GuiRCAddScript_";
    gbf_new_obj#6 = lit#5 @ temp.identity;
    lit#7 = "GuiWindowCtrl";
    new_node#8 = new lit#7(gbf_new_obj#6);
    gbf_new_obj#9 = new_node#8;
    // RegionId(0)
    // RegionId(1)
    with (gbf_new_obj#6) 
    {
        lit#11 = "GuiRCWindowProfile";
        profile#12 = lit#11;
        // RegionId(1)
        // RegionId(2)
        if (remotecontrol.options.noexternalstyle) 
        {
            lit#17 = "none";
        }
        // RegionId(3)
        else
        {
        }
        phi<idx=1, regions=()> = phi<idx=0, regions=()>;
        lit#20 = "Add New ";
        text#21 = lit#20;
        lit#22 = "weapon";
        // RegionId(4)
        // RegionId(5)
        if (texttype#1 == lit#22) 
        {
            lit#23 = "Weapon";
            text#24 = text#21 @ lit#23;
        }
        // RegionId(6)
        else
        {
            lit#25 = "npc";
            // RegionId(6)
            // RegionId(7)
            if (texttype#1 == lit#25) 
            {
                lit#26 = "NPC";
                text#27 = text#24 @ lit#26;
            }
            // RegionId(8)
            else
            {
                lit#28 = "class";
                // RegionId(8)
                // RegionId(9)
                if (texttype#1 == lit#28) 
                {
                    lit#29 = "Class";
                    text#30 = text#27 @ lit#29;
                }
            }
        }
        lit#32 = true;
        isexternal#33 = lit#32;
        lit#35 = true;
        clientrelative#36 = lit#35;
        lit#38 = "npc";
        // RegionId(10)
        // RegionId(11)
        if (texttype#1 == lit#38) 
        {
            lit#39 = 264;
            lit#40 = 250;
        }
        // RegionId(12)
        else
        {
            lit#41 = 96;
            lit#42 = 250;
        }
        phi<idx=1, regions=()> = phi<idx=0, regions=()>;
        lit#44 = true;
        closequery#45 = lit#44;
        lit#47 = false;
        canresize#48 = lit#47;
        lit#50 = false;
        canmaximize#51 = lit#50;
        lit#53 = false;
        canminimize#54 = lit#53;
        lit#56 = false;
        visible#57 = lit#56;
        lit#58 = "GuiRCAddScriptNameText_";
        gbf_new_obj#59 = lit#58 @ temp.identity;
        lit#60 = "GuiTextCtrl";
        new_node#61 = new lit#60(gbf_new_obj#59);
        gbf_new_obj#62 = new_node#61;
        // RegionId(13)
        // RegionId(14)
        with (gbf_new_obj#59) 
        {
            lit#63 = "GuiRCTextProfile";
            profile#64 = lit#63;
            lit#66 = 20;
            lit#67 = 20;
            position#68 = {lit#67, lit#66};
            lit#69 = "Name:";
            text#70 = lit#69;
        }
        fn_call#72 = addcontrol#71(phi<idx=0, regions=()>);
        lit#73 = "GuiRCAddScriptNameTextEdit_";
        gbf_new_obj#74 = lit#73 @ temp.identity;
        lit#75 = "GuiTextEditCtrl";
        new_node#76 = new lit#75(gbf_new_obj#74);
        gbf_new_obj#77 = new_node#76;
        // RegionId(15)
        // RegionId(16)
        with (gbf_new_obj#74) 
        {
            lit#78 = "GuiRCTextEditProfile";
            profile#79 = lit#78;
            lit#80 = 20;
            lit#81 = 72;
            position#82 = {lit#81, lit#80};
            lit#84 = 20;
            lit#85 = "GuiRCAddScript_";
            lit#86 = 0;
            lit#87 = 0;
            lit#88 = 20;
            extent#89 = {((lit#85 @ temp.identity).clientextent[lit#86] - position#82[lit#87]) - lit#88, lit#84};
        }
        fn_call#90 = addcontrol#71(phi<idx=0, regions=()>);
        lit#91 = "npc";
        // RegionId(17)
        // RegionId(18)
        if (texttype#1 == lit#91) 
        {
            lit#92 = "GuiRCAddScriptIDText_";
            gbf_new_obj#93 = lit#92 @ temp.identity;
            lit#94 = "GuiTextCtrl";
            new_node#95 = new lit#94(gbf_new_obj#93);
            gbf_new_obj#96 = new_node#95;
            // RegionId(18)
            // RegionId(19)
            with (gbf_new_obj#93) 
            {
                lit#97 = "GuiRCTextProfile";
                profile#98 = lit#97;
                lit#99 = 48;
                lit#100 = 20;
                position#101 = {lit#100, lit#99};
                lit#102 = "ID:";
                text#103 = lit#102;
            }
            fn_call#104 = addcontrol#71(phi<idx=0, regions=()>);
            lit#105 = "GuiRCAddScriptIDTextEdit_";
            gbf_new_obj#106 = lit#105 @ temp.identity;
            lit#107 = "GuiTextEditCtrl";
            new_node#108 = new lit#107(gbf_new_obj#106);
            gbf_new_obj#109 = new_node#108;
            // RegionId(20)
            // RegionId(21)
            with (gbf_new_obj#106) 
            {
                lit#110 = "GuiRCTextEditProfile";
                profile#111 = lit#110;
                lit#113 = true;
                useownprofile#114 = lit#113;
                lit#116 = true;
                profile.numbersonly = lit#116;
                lit#117 = 48;
                lit#118 = 72;
                position#119 = {lit#118, lit#117};
                lit#120 = 20;
                lit#121 = "GuiRCAddScript_";
                lit#122 = 0;
                lit#123 = 0;
                lit#124 = 20;
                extent#125 = {((lit#121 @ temp.identity).clientextent[lit#122] - position#119[lit#123]) - lit#124, lit#120};
                text#126 = nextid#0;
            }
            fn_call#127 = addcontrol#71(phi<idx=0, regions=()>);
            lit#128 = "GuiRCAddScriptTypeText_";
            gbf_new_obj#129 = lit#128 @ temp.identity;
            lit#130 = "GuiTextCtrl";
            new_node#131 = new lit#130(gbf_new_obj#129);
            gbf_new_obj#132 = new_node#131;
            // RegionId(22)
            // RegionId(23)
            with (gbf_new_obj#129) 
            {
                lit#133 = "GuiRCTextProfile";
                profile#134 = lit#133;
                lit#135 = 76;
                lit#136 = 20;
                position#137 = {lit#136, lit#135};
                lit#138 = "Type:";
                text#139 = lit#138;
            }
            fn_call#140 = addcontrol#71(phi<idx=0, regions=()>);
            lit#141 = "GuiRCAddScriptTypeTextEdit_";
            gbf_new_obj#142 = lit#141 @ temp.identity;
            lit#143 = "GuiTextEditCtrl";
            new_node#144 = new lit#143(gbf_new_obj#142);
            gbf_new_obj#145 = new_node#144;
            // RegionId(24)
            // RegionId(25)
            with (gbf_new_obj#142) 
            {
                lit#146 = "GuiRCTextEditProfile";
                profile#147 = lit#146;
                lit#148 = 76;
                lit#149 = 72;
                position#150 = {lit#149, lit#148};
                lit#151 = 20;
                lit#152 = "GuiRCAddScript_";
                lit#153 = 0;
                lit#154 = 0;
                lit#155 = 20;
                extent#156 = {((lit#152 @ temp.identity).clientextent[lit#153] - position#150[lit#154]) - lit#155, lit#151};
                lit#157 = "OBJECT";
                text#158 = lit#157;
            }
            fn_call#159 = addcontrol#71(phi<idx=0, regions=()>);
            lit#160 = "GuiRCAddScriptScripterText_";
            gbf_new_obj#161 = lit#160 @ temp.identity;
            lit#162 = "GuiTextCtrl";
            new_node#163 = new lit#162(gbf_new_obj#161);
            gbf_new_obj#164 = new_node#163;
            // RegionId(26)
            // RegionId(27)
            with (gbf_new_obj#161) 
            {
                lit#165 = "GuiRCTextProfile";
                profile#166 = lit#165;
                lit#167 = 104;
                lit#168 = 20;
                position#169 = {lit#168, lit#167};
                lit#170 = "Scripter:";
                text#171 = lit#170;
            }
            fn_call#172 = addcontrol#71(phi<idx=0, regions=()>);
            lit#173 = "GuiRCAddScriptScripterTextEdit_";
            gbf_new_obj#174 = lit#173 @ temp.identity;
            lit#175 = "GuiTextEditCtrl";
            new_node#176 = new lit#175(gbf_new_obj#174);
            gbf_new_obj#177 = new_node#176;
            // RegionId(28)
            // RegionId(29)
            with (gbf_new_obj#174) 
            {
                lit#178 = "GuiRCTextEditProfile";
                profile#179 = lit#178;
                lit#180 = 104;
                lit#181 = 72;
                position#182 = {lit#181, lit#180};
                lit#183 = 20;
                lit#184 = "GuiRCAddScript_";
                lit#185 = 0;
                lit#186 = 0;
                lit#187 = 20;
                extent#188 = {((lit#184 @ temp.identity).clientextent[lit#185] - position#182[lit#186]) - lit#187, lit#183};
                text#191 = player.account;
            }
            fn_call#192 = addcontrol#71(phi<idx=0, regions=()>);
            lit#193 = "GuiRCAddScriptLevelText_";
            gbf_new_obj#194 = lit#193 @ temp.identity;
            lit#195 = "GuiTextCtrl";
            new_node#196 = new lit#195(gbf_new_obj#194);
            gbf_new_obj#197 = new_node#196;
            // RegionId(30)
            // RegionId(31)
            with (gbf_new_obj#194) 
            {
                lit#198 = "GuiRCTextProfile";
                profile#199 = lit#198;
                lit#200 = 132;
                lit#201 = 20;
                position#202 = {lit#201, lit#200};
                lit#203 = "Level:";
                text#204 = lit#203;
            }
            fn_call#205 = addcontrol#71(phi<idx=0, regions=()>);
            lit#206 = "GuiRCAddScriptLevelTextEdit_";
            gbf_new_obj#207 = lit#206 @ temp.identity;
            lit#208 = "GuiTextEditCtrl";
            new_node#209 = new lit#208(gbf_new_obj#207);
            gbf_new_obj#210 = new_node#209;
            // RegionId(32)
            // RegionId(33)
            with (gbf_new_obj#207) 
            {
                lit#211 = "GuiRCTextEditProfile";
                profile#212 = lit#211;
                lit#213 = 132;
                lit#214 = 72;
                position#215 = {lit#214, lit#213};
                lit#216 = 20;
                lit#217 = "GuiRCAddScript_";
                lit#218 = 0;
                lit#219 = 0;
                lit#220 = 20;
                extent#221 = {((lit#217 @ temp.identity).clientextent[lit#218] - position#215[lit#219]) - lit#220, lit#216};
                lit#222 = "onlinestartlocal.nw";
                text#223 = lit#222;
            }
            fn_call#224 = addcontrol#71(phi<idx=0, regions=()>);
            lit#225 = "GuiRCAddScriptXText_";
            gbf_new_obj#226 = lit#225 @ temp.identity;
            lit#227 = "GuiTextCtrl";
            new_node#228 = new lit#227(gbf_new_obj#226);
            gbf_new_obj#229 = new_node#228;
            // RegionId(34)
            // RegionId(35)
            with (gbf_new_obj#226) 
            {
                lit#230 = "GuiRCTextProfile";
                profile#231 = lit#230;
                lit#232 = 160;
                lit#233 = 20;
                position#234 = {lit#233, lit#232};
                lit#235 = "X:";
                text#236 = lit#235;
            }
            fn_call#237 = addcontrol#71(phi<idx=0, regions=()>);
            lit#238 = "GuiRCAddScriptXTextEdit_";
            gbf_new_obj#239 = lit#238 @ temp.identity;
            lit#240 = "GuiTextEditCtrl";
            new_node#241 = new lit#240(gbf_new_obj#239);
            gbf_new_obj#242 = new_node#241;
            // RegionId(36)
            // RegionId(37)
            with (gbf_new_obj#239) 
            {
                lit#243 = "GuiRCTextEditProfile";
                profile#244 = lit#243;
                lit#245 = true;
                useownprofile#246 = lit#245;
                lit#247 = true;
                profile.numbersonly = lit#247;
                lit#248 = 160;
                lit#249 = 72;
                position#250 = {lit#249, lit#248};
                lit#251 = 20;
                lit#252 = "GuiRCAddScript_";
                lit#253 = 0;
                lit#254 = 0;
                lit#255 = 20;
                extent#256 = {((lit#252 @ temp.identity).clientextent[lit#253] - position#250[lit#254]) - lit#255, lit#251};
                lit#257 = "30";
                text#258 = lit#257;
            }
            fn_call#259 = addcontrol#71(phi<idx=0, regions=()>);
            lit#260 = "GuiRCAddScriptYText_";
            gbf_new_obj#261 = lit#260 @ temp.identity;
            lit#262 = "GuiTextCtrl";
            new_node#263 = new lit#262(gbf_new_obj#261);
            gbf_new_obj#264 = new_node#263;
            // RegionId(38)
            // RegionId(39)
            with (gbf_new_obj#261) 
            {
                lit#265 = "GuiRCTextProfile";
                profile#266 = lit#265;
                lit#267 = 188;
                lit#268 = 20;
                position#269 = {lit#268, lit#267};
                lit#270 = "Y:";
                text#271 = lit#270;
            }
            fn_call#272 = addcontrol#71(phi<idx=0, regions=()>);
            lit#273 = "GuiRCAddScriptYTextEdit_";
            gbf_new_obj#274 = lit#273 @ temp.identity;
            lit#275 = "GuiTextEditCtrl";
            new_node#276 = new lit#275(gbf_new_obj#274);
            gbf_new_obj#277 = new_node#276;
            // RegionId(40)
            // RegionId(41)
            with (gbf_new_obj#274) 
            {
                lit#278 = "GuiRCTextEditProfile";
                profile#279 = lit#278;
                lit#280 = true;
                useownprofile#281 = lit#280;
                lit#282 = true;
                profile.numbersonly = lit#282;
                lit#283 = 188;
                lit#284 = 72;
                position#285 = {lit#284, lit#283};
                lit#286 = 20;
                lit#287 = "GuiRCAddScript_";
                lit#288 = 0;
                lit#289 = 0;
                lit#290 = 20;
                extent#291 = {((lit#287 @ temp.identity).clientextent[lit#288] - position#285[lit#289]) - lit#290, lit#286};
                lit#292 = "30";
                text#293 = lit#292;
            }
            fn_call#294 = addcontrol#71(phi<idx=0, regions=()>);
        }
        lit#295 = "GuiRCAddScriptAddButton_";
        gbf_new_obj#296 = lit#295 @ temp.identity;
        lit#297 = "GuiButtonCtrl";
        new_node#298 = new lit#297(gbf_new_obj#296);
        gbf_new_obj#299 = new_node#298;
        // RegionId(43)
        // RegionId(44)
        with (gbf_new_obj#296) 
        {
            lit#300 = "GuiRCButtonProfile";
            profile#301 = lit#300;
            lit#302 = 24;
            lit#303 = 80;
            extent#304 = {lit#303, lit#302};
            lit#305 = "GuiRCAddScript_";
            lit#306 = 1;
            lit#307 = 1;
            lit#308 = 20;
            lit#309 = 20;
            position#310 = {lit#309, ((lit#305 @ temp.identity).clientextent[lit#306] - extent#304[lit#307]) - lit#308};
            lit#311 = "Add";
            text#312 = lit#311;
            lit#313 = "onGuiRCAddScriptAddButtonPressed";
            lit#314 = "onAction";
            fn_call#318 = thiso.catchevent(this#315, lit#314, lit#313);
        }
        fn_call#319 = addcontrol#71(phi<idx=0, regions=()>);
        lit#320 = "GuiRCAddScriptCancelButton_";
        gbf_new_obj#321 = lit#320 @ temp.identity;
        lit#322 = "GuiButtonCtrl";
        new_node#323 = new lit#322(gbf_new_obj#321);
        gbf_new_obj#324 = new_node#323;
        // RegionId(45)
        // RegionId(46)
        with (gbf_new_obj#321) 
        {
            lit#325 = "GuiRCButtonProfile";
            profile#326 = lit#325;
            lit#327 = 24;
            lit#328 = 80;
            extent#329 = {lit#328, lit#327};
            lit#330 = "GuiRCAddScript_";
            lit#331 = 1;
            lit#332 = 1;
            lit#333 = 20;
            lit#334 = 250;
            lit#335 = 0;
            lit#336 = 20;
            position#337 = {(lit#334 - extent#329[lit#335]) - lit#336, ((lit#330 @ temp.identity).clientextent[lit#331] - extent#329[lit#332]) - lit#333};
            lit#338 = "Cancel";
            text#339 = lit#338;
            lit#340 = "onGuiRCAddScriptCloseQuery";
            lit#341 = "onAction";
            fn_call#342 = thiso.catchevent(this#315, lit#341, lit#340);
        }
        fn_call#343 = addcontrol#71(phi<idx=0, regions=()>);
        lit#344 = true;
        visible#345 = lit#344;
        fn_call#348 = getTitleByTextType#347(texttype#1);
        temp.title = fn_call#348;
        lit#350 = "GuiRC";
        lit#351 = "ListTextList";
        builtin_fn_call#353 = (lit#350 @ temp.title) @ lit#351.rows.size();
        this.existingscripts = new [builtin_fn_call#353];
        lit#355 = 0;
        temp.i = lit#355;
        builtin_fn_call#356 = this.existingscripts.size();
        while (temp.i < builtin_fn_call#356) 
        {
            lit#357 = "GuiRC";
            lit#358 = "ListTextList";
            this.existingscripts[temp.i] = (lit#357 @ temp.title) @ lit#358.rows[temp.i].text;
            temp.i++;
        }
        lit#359 = "onRCAddScriptCloseQuery";
        lit#360 = "onCloseQuery";
        fn_call#361 = thiso.catchevent(this#315, lit#360, lit#359);
        lit#362 = "onRCAddScriptCloseQuery";
        lit#363 = "onHide";
        fn_call#364 = thiso.catchevent(this#315, lit#363, lit#362);
    }
    fn_call#365 = addcontrol#71(phi<idx=0, regions=()>);
    lit#366 = true;
    lit#367 = "GuiRCAddScriptNameTextEdit_";
    fn_call#369 = lit#367 @ temp.identity.makefirstresponder(lit#366);
    lit#370 = "GuiRCAddScript_";
    lit#370 @ temp.identity.texttype = texttype#1;
    fn_call#371 = getTitleByTextType#347(texttype#1);
    temp.title = fn_call#371;
    lit#372 = "GuiRCAddScript_";
    lit#375 = "GuiRCAddScript_";
    lit#376 = 3;
    lit#377 = "GuiRCAddScript_";
    lit#378 = 2;
    lit#379 = 0;
    lit#380 = "GuiRC";
    lit#381 = "List";
    lit#382 = 1;
    lit#383 = "GuiRC";
    lit#384 = "List";
    lit#385 = 3;
    lit#386 = "GuiRCAddScript_";
    lit#387 = 3;
    lit#388 = 2;
    builtin_fn_call#389 = max(lit#379, ((lit#380 @ temp.title) @ lit#381).externalwindow.bounds[lit#382] + ((((lit#383 @ temp.title) @ lit#384).externalwindow.bounds[lit#385] - (lit#386 @ temp.identity).externalwindow.bounds[lit#387]) / lit#388));
    lit#390 = 0;
    lit#391 = "GuiRC";
    lit#392 = "List";
    lit#393 = 0;
    lit#394 = "GuiRC";
    lit#395 = "List";
    lit#396 = 2;
    lit#397 = "GuiRCAddScript_";
    lit#398 = 2;
    lit#399 = 2;
    builtin_fn_call#400 = max(lit#390, ((lit#391 @ temp.title) @ lit#392).externalwindow.bounds[lit#393] + ((((lit#394 @ temp.title) @ lit#395).externalwindow.bounds[lit#396] - (lit#397 @ temp.identity).externalwindow.bounds[lit#398]) / lit#399));
    lit#372 @ temp.identity.externalwindow.bounds = {builtin_fn_call#400, builtin_fn_call#389, lit#377 @ temp.identity.externalwindow.bounds[lit#378], lit#375 @ temp.identity.externalwindow.bounds[lit#376]};
    lit#401 = 0;
    return lit#401;
}