{"action":"created","comment":{"url":"https://api.github.com/repos/Igalia/pflua/pulls/comments/33464764","id":33464764,"diff_hunk":"@@ -176,15 +176,24 @@ local function simplify(expr, is_tail)\n       if type(lhs) == 'number' and type(rhs) == 'number' then\n          return assert(folders[op])(lhs, rhs)\n       elseif associative_binops[op] then\n-         if type(rhs) == 'table' and rhs[1] == op and type(lhs) == 'number' then\n+         -- Try to make the right operand a number.\n+         if type(lhs) == 'number' then","path":"src/pf/optimize.lua","position":6,"original_position":6,"commit_id":"29a3c7838042493c682bbb2b80a5d536d6ae7e44","original_commit_id":"29a3c7838042493c682bbb2b80a5d536d6ae7e44","user":{"login":"andywingo","id":1745903,"avatar_url":"https://avatars.githubusercontent.com/u/1745903?v=3","gravatar_id":"","url":"https://api.github.com/users/andywingo","html_url":"https://github.com/andywingo","followers_url":"https://api.github.com/users/andywingo/followers","following_url":"https://api.github.com/users/andywingo/following{/other_user}","gists_url":"https://api.github.com/users/andywingo/gists{/gist_id}","starred_url":"https://api.github.com/users/andywingo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andywingo/subscriptions","organizations_url":"https://api.github.com/users/andywingo/orgs","repos_url":"https://api.github.com/users/andywingo/repos","events_url":"https://api.github.com/users/andywingo/events{/privacy}","received_events_url":"https://api.github.com/users/andywingo/received_events","type":"User","site_admin":false},"body":"Let's only do this if the RHS isn't a number.  Otherwise we introduce arbitrary mutations to the graph depending on how many times the thing is run.","created_at":"2015-06-29T13:46:59Z","updated_at":"2015-06-29T13:46:59Z","html_url":"https://github.com/Igalia/pflua/pull/220#discussion_r33464764","pull_request_url":"https://api.github.com/repos/Igalia/pflua/pulls/220","_links":{"self":{"href":"https://api.github.com/repos/Igalia/pflua/pulls/comments/33464764"},"html":{"href":"https://github.com/Igalia/pflua/pull/220#discussion_r33464764"},"pull_request":{"href":"https://api.github.com/repos/Igalia/pflua/pulls/220"}}},"pull_request":{"url":"https://api.github.com/repos/Igalia/pflua/pulls/220","id":35757983,"html_url":"https://github.com/Igalia/pflua/pull/220","diff_url":"https://github.com/Igalia/pflua/pull/220.diff","patch_url":"https://github.com/Igalia/pflua/pull/220.patch","issue_url":"https://api.github.com/repos/Igalia/pflua/issues/220","number":220,"state":"open","locked":false,"title":"Fold associative binops more aggresively","user":{"login":"mpeterv","id":6032370,"avatar_url":"https://avatars.githubusercontent.com/u/6032370?v=3","gravatar_id":"","url":"https://api.github.com/users/mpeterv","html_url":"https://github.com/mpeterv","followers_url":"https://api.github.com/users/mpeterv/followers","following_url":"https://api.github.com/users/mpeterv/following{/other_user}","gists_url":"https://api.github.com/users/mpeterv/gists{/gist_id}","starred_url":"https://api.github.com/users/mpeterv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpeterv/subscriptions","organizations_url":"https://api.github.com/users/mpeterv/orgs","repos_url":"https://api.github.com/users/mpeterv/repos","events_url":"https://api.github.com/users/mpeterv/events{/privacy}","received_events_url":"https://api.github.com/users/mpeterv/received_events","type":"User","site_admin":false},"body":"This change allows associative binop folding to always work if an expression tree contains at least two numbers. E.g. `(A + C1) + (B + C2)` now folds to `(A + B) + (C1 + C2)`.\r\n\r\nThis improves code generated for #215: 517 lines -> 472 lines, 270 arithmetic ops (number of pluses) -> 187 ops.\r\n\r\n```lua\r\nlocal lshift = require(\"bit\").lshift\r\nlocal band = require(\"bit\").band\r\nlocal cast = require(\"ffi\").cast\r\nreturn function(P,length)\r\n   if length < 14 then return false end\r\n   local var1 = cast(\"uint16_t*\", P+12)[0]\r\n   if var1 == 8 then\r\n      if length < 54 then return false end\r\n      if P[23] ~= 6 then return false end\r\n      if band(cast(\"uint16_t*\", P+20)[0],65311) ~= 0 then return false end\r\n      local var7 = lshift(band(P[14],15),2)\r\n      if (var7 + 28) > length then return false end\r\n      if band(P[(var7 + 27)],2) == 0 then return false end\r\n      local var18 = (var7 + 35)\r\n      if var18 > length then return false end\r\n      local var23 = P[(var7 + 34)]\r\n      if var23 == 3 then return true end\r\n      if var23 == 1 then goto L21 end\r\n      do\r\n         if (var7 + 36) > length then return false end\r\n         local var40 = P[var18]\r\n         local var41 = (var7 + var40)\r\n         local var42 = (var41 + 35)\r\n         if var42 > length then return false end\r\n         local var53 = P[(var41 + 34)]\r\n         if var53 == 3 then return true end\r\n         if var53 == 1 then goto L31 end\r\n         do\r\n            if (var41 + 36) > length then return false end\r\n            local var94 = (var40 + P[var42])\r\n            local var95 = (var7 + var94)\r\n            local var96 = (var95 + 35)\r\n            if var96 > length then return false end\r\n            local var119 = P[(var95 + 34)]\r\n            if var119 == 3 then return true end\r\n            if var119 == 1 then goto L41 end\r\n            do\r\n               if (var95 + 36) > length then return false end\r\n               local var208 = (var94 + P[var96])\r\n               local var209 = (var7 + var208)\r\n               local var210 = (var209 + 35)\r\n               if var210 > length then return false end\r\n               local var257 = P[(var209 + 34)]\r\n               if var257 == 3 then return true end\r\n               if var257 == 1 then goto L51 end\r\n               do\r\n                  if (var209 + 36) > length then return false end\r\n                  local var442 = (var208 + P[var210])\r\n                  local var443 = (var7 + var442)\r\n                  local var444 = (var443 + 35)\r\n                  if var444 > length then return false end\r\n                  local var539 = P[(var443 + 34)]\r\n                  if var539 == 3 then return true end\r\n                  if var539 == 1 then goto L61 end\r\n                  do\r\n                     if (var443 + 36) > length then return false end\r\n                     local var917 = (var7 + (var442 + P[var444]))\r\n                     if (var917 + 35) > length then return false end\r\n                     if P[(var917 + 34)] == 3 then return true end\r\n                     goto L61\r\n                  end\r\n::L61::\r\n                  if var539 ~= 1 then goto L51 end\r\n                  if (var443 + 36) > length then return false end\r\n                  if P[var444] == 3 then return true end\r\n                  goto L51\r\n               end\r\n::L51::\r\n               if var257 ~= 1 then goto L41 end\r\n               local var1486 = (var209 + 36)\r\n               if var1486 > length then return false end\r\n               local var1533 = P[var210]\r\n               if var1533 == 3 then return true end\r\n               if var1533 == 1 then goto L79 end\r\n               do\r\n                  if (var209 + 37) > length then return false end\r\n                  local var1719 = (var7 + (var208 + P[var1486]))\r\n                  if (var1719 + 36) > length then return false end\r\n                  if P[(var1719 + 35)] == 3 then return true end\r\n                  goto L79\r\n               end\r\n::L79::\r\n               if var1533 ~= 1 then goto L41 end\r\n               if (var209 + 37) > length then return false end\r\n               if P[var1486] == 3 then return true end\r\n               goto L41\r\n            end\r\n::L41::\r\n            if var119 ~= 1 then goto L31 end\r\n            local var2000 = (var95 + 36)\r\n            if var2000 > length then return false end\r\n            local var2023 = P[var96]\r\n            if var2023 == 3 then return true end\r\n            if var2023 == 1 then goto L97 end\r\n            do\r\n               if (var95 + 37) > length then return false end\r\n               local var2112 = (var94 + P[var2000])\r\n               local var2113 = (var7 + var2112)\r\n               local var2114 = (var2113 + 36)\r\n               if var2114 > length then return false end\r\n               local var2161 = P[(var2113 + 35)]\r\n               if var2161 == 3 then return true end\r\n               if var2161 == 1 then goto L107 end\r\n               do\r\n                  if (var2113 + 37) > length then return false end\r\n                  local var2347 = (var7 + (var2112 + P[var2114]))\r\n                  if (var2347 + 36) > length then return false end\r\n                  if P[(var2347 + 35)] == 3 then return true end\r\n                  goto L107\r\n               end\r\n::L107::\r\n               if var2161 ~= 1 then goto L97 end\r\n               if (var2113 + 37) > length then return false end\r\n               if P[var2114] == 3 then return true end\r\n               goto L97\r\n            end\r\n::L97::\r\n            if var2023 ~= 1 then goto L31 end\r\n            local var2628 = (var95 + 37)\r\n            if var2628 > length then return false end\r\n            local var2651 = P[var2000]\r\n            if var2651 == 3 then return true end\r\n            if var2651 == 1 then goto L125 end\r\n            do\r\n               if (var95 + 38) > length then return false end\r\n               local var2741 = (var7 + (var94 + P[var2628]))\r\n               if (var2741 + 37) > length then return false end\r\n               if P[(var2741 + 36)] == 3 then return true end\r\n               goto L125\r\n            end\r\n::L125::\r\n            if var2651 ~= 1 then goto L31 end\r\n            if (var95 + 38) > length then return false end\r\n            if P[var2628] == 3 then return true end\r\n            goto L31\r\n         end\r\n::L31::\r\n         if var53 ~= 1 then goto L21 end\r\n         local var2878 = (var41 + 36)\r\n         if var2878 > length then return false end\r\n         local var2889 = P[var42]\r\n         if var2889 == 3 then return true end\r\n         if var2889 == 1 then goto L143 end\r\n         do\r\n            if (var41 + 37) > length then return false end\r\n            local var2930 = (var40 + P[var2878])\r\n            local var2931 = (var7 + var2930)\r\n            local var2932 = (var2931 + 36)\r\n            if var2932 > length then return false end\r\n            local var2955 = P[(var2931 + 35)]\r\n            if var2955 == 3 then return true end\r\n            if var2955 == 1 then goto L153 end\r\n            do\r\n               if (var2931 + 37) > length then return false end\r\n               local var3044 = (var2930 + P[var2932])\r\n               local var3045 = (var7 + var3044)\r\n               local var3046 = (var3045 + 36)\r\n               if var3046 > length then return false end\r\n               local var3093 = P[(var3045 + 35)]\r\n               if var3093 == 3 then return true end\r\n               if var3093 == 1 then goto L163 end\r\n               do\r\n                  if (var3045 + 37) > length then return false end\r\n                  local var3279 = (var7 + (var3044 + P[var3046]))\r\n                  if (var3279 + 36) > length then return false end\r\n                  if P[(var3279 + 35)] == 3 then return true end\r\n                  goto L163\r\n               end\r\n::L163::\r\n               if var3093 ~= 1 then goto L153 end\r\n               if (var3045 + 37) > length then return false end\r\n               if P[var3046] == 3 then return true end\r\n               goto L153\r\n            end\r\n::L153::\r\n            if var2955 ~= 1 then goto L143 end\r\n            local var3560 = (var2931 + 37)\r\n            if var3560 > length then return false end\r\n            local var3583 = P[var2932]\r\n            if var3583 == 3 then return true end\r\n            if var3583 == 1 then goto L181 end\r\n            do\r\n               if (var2931 + 38) > length then return false end\r\n               local var3673 = (var7 + (var2930 + P[var3560]))\r\n               if (var3673 + 37) > length then return false end\r\n               if P[(var3673 + 36)] == 3 then return true end\r\n               goto L181\r\n            end\r\n::L181::\r\n            if var3583 ~= 1 then goto L143 end\r\n            if (var2931 + 38) > length then return false end\r\n            if P[var3560] == 3 then return true end\r\n            goto L143\r\n         end\r\n::L143::\r\n         if var2889 ~= 1 then goto L21 end\r\n         local var3810 = (var41 + 37)\r\n         if var3810 > length then return false end\r\n         local var3821 = P[var2878]\r\n         if var3821 == 3 then return true end\r\n         if var3821 == 1 then goto L199 end\r\n         do\r\n            if (var41 + 38) > length then return false end\r\n            local var3862 = (var40 + P[var3810])\r\n            local var3863 = (var7 + var3862)\r\n            local var3864 = (var3863 + 37)\r\n            if var3864 > length then return false end\r\n            local var3887 = P[(var3863 + 36)]\r\n            if var3887 == 3 then return true end\r\n            if var3887 == 1 then goto L209 end\r\n            do\r\n               if (var3863 + 38) > length then return false end\r\n               local var3977 = (var7 + (var3862 + P[var3864]))\r\n               if (var3977 + 37) > length then return false end\r\n               if P[(var3977 + 36)] == 3 then return true end\r\n               goto L209\r\n            end\r\n::L209::\r\n            if var3887 ~= 1 then goto L199 end\r\n            if (var3863 + 38) > length then return false end\r\n            if P[var3864] == 3 then return true end\r\n            goto L199\r\n         end\r\n::L199::\r\n         if var3821 ~= 1 then goto L21 end\r\n         local var4114 = (var41 + 38)\r\n         if var4114 > length then return false end\r\n         local var4125 = P[var3810]\r\n         if var4125 == 3 then return true end\r\n         if var4125 == 1 then goto L227 end\r\n         do\r\n            if (var41 + 39) > length then return false end\r\n            local var4167 = (var7 + (var40 + P[var4114]))\r\n            if (var4167 + 38) > length then return false end\r\n            if P[(var4167 + 37)] == 3 then return true end\r\n            goto L227\r\n         end\r\n::L227::\r\n         if var4125 ~= 1 then goto L21 end\r\n         if (var41 + 39) > length then return false end\r\n         if P[var4114] == 3 then return true end\r\n         goto L21\r\n      end\r\n::L21::\r\n      if var23 ~= 1 then return false end\r\n      local var4232 = (var7 + 36)\r\n      if var4232 > length then return false end\r\n      local var4237 = P[var18]\r\n      if var4237 == 3 then return true end\r\n      if var4237 == 1 then goto L245 end\r\n      do\r\n         if (var7 + 37) > length then return false end\r\n         local var4254 = P[var4232]\r\n         local var4255 = (var7 + var4254)\r\n         local var4256 = (var4255 + 36)\r\n         if var4256 > length then return false end\r\n         local var4267 = P[(var4255 + 35)]\r\n         if var4267 == 3 then return true end\r\n         if var4267 == 1 then goto L255 end\r\n         do\r\n            if (var4255 + 37) > length then return false end\r\n            local var4308 = (var4254 + P[var4256])\r\n            local var4309 = (var7 + var4308)\r\n            local var4310 = (var4309 + 36)\r\n            if var4310 > length then return false end\r\n            local var4333 = P[(var4309 + 35)]\r\n            if var4333 == 3 then return true end\r\n            if var4333 == 1 then goto L265 end\r\n            do\r\n               if (var4309 + 37) > length then return false end\r\n               local var4422 = (var4308 + P[var4310])\r\n               local var4423 = (var7 + var4422)\r\n               local var4424 = (var4423 + 36)\r\n               if var4424 > length then return false end\r\n               local var4471 = P[(var4423 + 35)]\r\n               if var4471 == 3 then return true end\r\n               if var4471 == 1 then goto L275 end\r\n               do\r\n                  if (var4423 + 37) > length then return false end\r\n                  local var4657 = (var7 + (var4422 + P[var4424]))\r\n                  if (var4657 + 36) > length then return false end\r\n                  if P[(var4657 + 35)] == 3 then return true end\r\n                  goto L275\r\n               end\r\n::L275::\r\n               if var4471 ~= 1 then goto L265 end\r\n               if (var4423 + 37) > length then return false end\r\n               if P[var4424] == 3 then return true end\r\n               goto L265\r\n            end\r\n::L265::\r\n            if var4333 ~= 1 then goto L255 end\r\n            local var4938 = (var4309 + 37)\r\n            if var4938 > length then return false end\r\n            local var4961 = P[var4310]\r\n            if var4961 == 3 then return true end\r\n            if var4961 == 1 then goto L293 end\r\n            do\r\n               if (var4309 + 38) > length then return false end\r\n               local var5051 = (var7 + (var4308 + P[var4938]))\r\n               if (var5051 + 37) > length then return false end\r\n               if P[(var5051 + 36)] == 3 then return true end\r\n               goto L293\r\n            end\r\n::L293::\r\n            if var4961 ~= 1 then goto L255 end\r\n            if (var4309 + 38) > length then return false end\r\n            if P[var4938] == 3 then return true end\r\n            goto L255\r\n         end\r\n::L255::\r\n         if var4267 ~= 1 then goto L245 end\r\n         local var5188 = (var4255 + 37)\r\n         if var5188 > length then return false end\r\n         local var5199 = P[var4256]\r\n         if var5199 == 3 then return true end\r\n         if var5199 == 1 then goto L311 end\r\n         do\r\n            if (var4255 + 38) > length then return false end\r\n            local var5240 = (var4254 + P[var5188])\r\n            local var5241 = (var7 + var5240)\r\n            local var5242 = (var5241 + 37)\r\n            if var5242 > length then return false end\r\n            local var5265 = P[(var5241 + 36)]\r\n            if var5265 == 3 then return true end\r\n            if var5265 == 1 then goto L321 end\r\n            do\r\n               if (var5241 + 38) > length then return false end\r\n               local var5355 = (var7 + (var5240 + P[var5242]))\r\n               if (var5355 + 37) > length then return false end\r\n               if P[(var5355 + 36)] == 3 then return true end\r\n               goto L321\r\n            end\r\n::L321::\r\n            if var5265 ~= 1 then goto L311 end\r\n            if (var5241 + 38) > length then return false end\r\n            if P[var5242] == 3 then return true end\r\n            goto L311\r\n         end\r\n::L311::\r\n         if var5199 ~= 1 then goto L245 end\r\n         local var5492 = (var4255 + 38)\r\n         if var5492 > length then return false end\r\n         local var5503 = P[var5188]\r\n         if var5503 == 3 then return true end\r\n         if var5503 == 1 then goto L339 end\r\n         do\r\n            if (var4255 + 39) > length then return false end\r\n            local var5545 = (var7 + (var4254 + P[var5492]))\r\n            if (var5545 + 38) > length then return false end\r\n            if P[(var5545 + 37)] == 3 then return true end\r\n            goto L339\r\n         end\r\n::L339::\r\n         if var5503 ~= 1 then goto L245 end\r\n         if (var4255 + 39) > length then return false end\r\n         if P[var5492] == 3 then return true end\r\n         goto L245\r\n      end\r\n::L245::\r\n      if var4237 ~= 1 then return false end\r\n      local var5610 = (var7 + 37)\r\n      if var5610 > length then return false end\r\n      local var5615 = P[var4232]\r\n      if var5615 == 3 then return true end\r\n      if var5615 == 1 then goto L357 end\r\n      do\r\n         if (var7 + 38) > length then return false end\r\n         local var5632 = P[var5610]\r\n         local var5633 = (var7 + var5632)\r\n         local var5634 = (var5633 + 37)\r\n         if var5634 > length then return false end\r\n         local var5645 = P[(var5633 + 36)]\r\n         if var5645 == 3 then return true end\r\n         if var5645 == 1 then goto L367 end\r\n         do\r\n            if (var5633 + 38) > length then return false end\r\n            local var5686 = (var5632 + P[var5634])\r\n            local var5687 = (var7 + var5686)\r\n            local var5688 = (var5687 + 37)\r\n            if var5688 > length then return false end\r\n            local var5711 = P[(var5687 + 36)]\r\n            if var5711 == 3 then return true end\r\n            if var5711 == 1 then goto L377 end\r\n            do\r\n               if (var5687 + 38) > length then return false end\r\n               local var5801 = (var7 + (var5686 + P[var5688]))\r\n               if (var5801 + 37) > length then return false end\r\n               if P[(var5801 + 36)] == 3 then return true end\r\n               goto L377\r\n            end\r\n::L377::\r\n            if var5711 ~= 1 then goto L367 end\r\n            if (var5687 + 38) > length then return false end\r\n            if P[var5688] == 3 then return true end\r\n            goto L367\r\n         end\r\n::L367::\r\n         if var5645 ~= 1 then goto L357 end\r\n         local var5938 = (var5633 + 38)\r\n         if var5938 > length then return false end\r\n         local var5949 = P[var5634]\r\n         if var5949 == 3 then return true end\r\n         if var5949 == 1 then goto L395 end\r\n         do\r\n            if (var5633 + 39) > length then return false end\r\n            local var5991 = (var7 + (var5632 + P[var5938]))\r\n            if (var5991 + 38) > length then return false end\r\n            if P[(var5991 + 37)] == 3 then return true end\r\n            goto L395\r\n         end\r\n::L395::\r\n         if var5949 ~= 1 then goto L357 end\r\n         if (var5633 + 39) > length then return false end\r\n         if P[var5938] == 3 then return true end\r\n         goto L357\r\n      end\r\n::L357::\r\n      if var5615 ~= 1 then return false end\r\n      local var6056 = (var7 + 38)\r\n      if var6056 > length then return false end\r\n      local var6061 = P[var5610]\r\n      if var6061 == 3 then return true end\r\n      if var6061 == 1 then goto L413 end\r\n      do\r\n         if (var7 + 39) > length then return false end\r\n         local var6078 = P[var6056]\r\n         local var6079 = (var7 + var6078)\r\n         local var6080 = (var6079 + 38)\r\n         if var6080 > length then return false end\r\n         local var6091 = P[(var6079 + 37)]\r\n         if var6091 == 3 then return true end\r\n         if var6091 == 1 then goto L423 end\r\n         do\r\n            if (var6079 + 39) > length then return false end\r\n            local var6133 = (var7 + (var6078 + P[var6080]))\r\n            if (var6133 + 38) > length then return false end\r\n            if P[(var6133 + 37)] == 3 then return true end\r\n            goto L423\r\n         end\r\n::L423::\r\n         if var6091 ~= 1 then goto L413 end\r\n         if (var6079 + 39) > length then return false end\r\n         if P[var6080] == 3 then return true end\r\n         goto L413\r\n      end\r\n::L413::\r\n      if var6061 ~= 1 then return false end\r\n      local var6198 = (var7 + 39)\r\n      if var6198 > length then return false end\r\n      local var6203 = P[var6056]\r\n      if var6203 == 3 then return true end\r\n      if var6203 == 1 then goto L441 end\r\n      do\r\n         if (var7 + 40) > length then return false end\r\n         local var6221 = (var7 + P[var6198])\r\n         if (var6221 + 39) > length then return false end\r\n         if P[(var6221 + 38)] == 3 then return true end\r\n         goto L441\r\n      end\r\n::L441::\r\n      if var6203 ~= 1 then return false end\r\n      if (var7 + 40) > length then return false end\r\n      return P[var6198] == 3\r\n   else\r\n      if var1 ~= 56710 then return false end\r\n      if length < 54 then return false end\r\n      local var6249 = P[20]\r\n      return false\r\n   end\r\nend\r\n\r\n```","created_at":"2015-05-19T18:05:40Z","updated_at":"2015-06-29T13:46:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"18ed412704ec4c9e6edf36827547a1f7eb2c55f3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Igalia/pflua/pulls/220/commits","review_comments_url":"https://api.github.com/repos/Igalia/pflua/pulls/220/comments","review_comment_url":"https://api.github.com/repos/Igalia/pflua/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Igalia/pflua/issues/220/comments","statuses_url":"https://api.github.com/repos/Igalia/pflua/statuses/29a3c7838042493c682bbb2b80a5d536d6ae7e44","head":{"label":"mpeterv:fold-assoc-binops","ref":"fold-assoc-binops","sha":"29a3c7838042493c682bbb2b80a5d536d6ae7e44","user":{"login":"mpeterv","id":6032370,"avatar_url":"https://avatars.githubusercontent.com/u/6032370?v=3","gravatar_id":"","url":"https://api.github.com/users/mpeterv","html_url":"https://github.com/mpeterv","followers_url":"https://api.github.com/users/mpeterv/followers","following_url":"https://api.github.com/users/mpeterv/following{/other_user}","gists_url":"https://api.github.com/users/mpeterv/gists{/gist_id}","starred_url":"https://api.github.com/users/mpeterv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpeterv/subscriptions","organizations_url":"https://api.github.com/users/mpeterv/orgs","repos_url":"https://api.github.com/users/mpeterv/repos","events_url":"https://api.github.com/users/mpeterv/events{/privacy}","received_events_url":"https://api.github.com/users/mpeterv/received_events","type":"User","site_admin":false},"repo":{"id":25504184,"name":"pflua","full_name":"mpeterv/pflua","owner":{"login":"mpeterv","id":6032370,"avatar_url":"https://avatars.githubusercontent.com/u/6032370?v=3","gravatar_id":"","url":"https://api.github.com/users/mpeterv","html_url":"https://github.com/mpeterv","followers_url":"https://api.github.com/users/mpeterv/followers","following_url":"https://api.github.com/users/mpeterv/following{/other_user}","gists_url":"https://api.github.com/users/mpeterv/gists{/gist_id}","starred_url":"https://api.github.com/users/mpeterv/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpeterv/subscriptions","organizations_url":"https://api.github.com/users/mpeterv/orgs","repos_url":"https://api.github.com/users/mpeterv/repos","events_url":"https://api.github.com/users/mpeterv/events{/privacy}","received_events_url":"https://api.github.com/users/mpeterv/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mpeterv/pflua","description":"Packet filtering in Lua","fork":true,"url":"https://api.github.com/repos/mpeterv/pflua","forks_url":"https://api.github.com/repos/mpeterv/pflua/forks","keys_url":"https://api.github.com/repos/mpeterv/pflua/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mpeterv/pflua/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mpeterv/pflua/teams","hooks_url":"https://api.github.com/repos/mpeterv/pflua/hooks","issue_events_url":"https://api.github.com/repos/mpeterv/pflua/issues/events{/number}","events_url":"https://api.github.com/repos/mpeterv/pflua/events","assignees_url":"https://api.github.com/repos/mpeterv/pflua/assignees{/user}","branches_url":"https://api.github.com/repos/mpeterv/pflua/branches{/branch}","tags_url":"https://api.github.com/repos/mpeterv/pflua/tags","blobs_url":"https://api.github.com/repos/mpeterv/pflua/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mpeterv/pflua/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mpeterv/pflua/git/refs{/sha}","trees_url":"https://api.github.com/repos/mpeterv/pflua/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mpeterv/pflua/statuses/{sha}","languages_url":"https://api.github.com/repos/mpeterv/pflua/languages","stargazers_url":"https://api.github.com/repos/mpeterv/pflua/stargazers","contributors_url":"https://api.github.com/repos/mpeterv/pflua/contributors","subscribers_url":"https://api.github.com/repos/mpeterv/pflua/subscribers","subscription_url":"https://api.github.com/repos/mpeterv/pflua/subscription","commits_url":"https://api.github.com/repos/mpeterv/pflua/commits{/sha}","git_commits_url":"https://api.github.com/repos/mpeterv/pflua/git/commits{/sha}","comments_url":"https://api.github.com/repos/mpeterv/pflua/comments{/number}","issue_comment_url":"https://api.github.com/repos/mpeterv/pflua/issues/comments{/number}","contents_url":"https://api.github.com/repos/mpeterv/pflua/contents/{+path}","compare_url":"https://api.github.com/repos/mpeterv/pflua/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mpeterv/pflua/merges","archive_url":"https://api.github.com/repos/mpeterv/pflua/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mpeterv/pflua/downloads","issues_url":"https://api.github.com/repos/mpeterv/pflua/issues{/number}","pulls_url":"https://api.github.com/repos/mpeterv/pflua/pulls{/number}","milestones_url":"https://api.github.com/repos/mpeterv/pflua/milestones{/number}","notifications_url":"https://api.github.com/repos/mpeterv/pflua/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mpeterv/pflua/labels{/name}","releases_url":"https://api.github.com/repos/mpeterv/pflua/releases{/id}","created_at":"2014-10-21T05:31:33Z","updated_at":"2015-04-30T15:25:45Z","pushed_at":"2015-06-26T18:16:48Z","git_url":"git://github.com/mpeterv/pflua.git","ssh_url":"git@github.com:mpeterv/pflua.git","clone_url":"https://github.com/mpeterv/pflua.git","svn_url":"https://github.com/mpeterv/pflua","homepage":null,"size":11046,"stargazers_count":0,"watchers_count":0,"language":"Lua","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Igalia:master","ref":"master","sha":"a518e4f83bed6b89fd7c39b7305afed96bbaf811","user":{"login":"Igalia","id":1576566,"avatar_url":"https://avatars.githubusercontent.com/u/1576566?v=3","gravatar_id":"","url":"https://api.github.com/users/Igalia","html_url":"https://github.com/Igalia","followers_url":"https://api.github.com/users/Igalia/followers","following_url":"https://api.github.com/users/Igalia/following{/other_user}","gists_url":"https://api.github.com/users/Igalia/gists{/gist_id}","starred_url":"https://api.github.com/users/Igalia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Igalia/subscriptions","organizations_url":"https://api.github.com/users/Igalia/orgs","repos_url":"https://api.github.com/users/Igalia/repos","events_url":"https://api.github.com/users/Igalia/events{/privacy}","received_events_url":"https://api.github.com/users/Igalia/received_events","type":"Organization","site_admin":false},"repo":{"id":21120074,"name":"pflua","full_name":"Igalia/pflua","owner":{"login":"Igalia","id":1576566,"avatar_url":"https://avatars.githubusercontent.com/u/1576566?v=3","gravatar_id":"","url":"https://api.github.com/users/Igalia","html_url":"https://github.com/Igalia","followers_url":"https://api.github.com/users/Igalia/followers","following_url":"https://api.github.com/users/Igalia/following{/other_user}","gists_url":"https://api.github.com/users/Igalia/gists{/gist_id}","starred_url":"https://api.github.com/users/Igalia/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Igalia/subscriptions","organizations_url":"https://api.github.com/users/Igalia/orgs","repos_url":"https://api.github.com/users/Igalia/repos","events_url":"https://api.github.com/users/Igalia/events{/privacy}","received_events_url":"https://api.github.com/users/Igalia/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Igalia/pflua","description":"Packet filtering in Lua","fork":false,"url":"https://api.github.com/repos/Igalia/pflua","forks_url":"https://api.github.com/repos/Igalia/pflua/forks","keys_url":"https://api.github.com/repos/Igalia/pflua/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Igalia/pflua/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Igalia/pflua/teams","hooks_url":"https://api.github.com/repos/Igalia/pflua/hooks","issue_events_url":"https://api.github.com/repos/Igalia/pflua/issues/events{/number}","events_url":"https://api.github.com/repos/Igalia/pflua/events","assignees_url":"https://api.github.com/repos/Igalia/pflua/assignees{/user}","branches_url":"https://api.github.com/repos/Igalia/pflua/branches{/branch}","tags_url":"https://api.github.com/repos/Igalia/pflua/tags","blobs_url":"https://api.github.com/repos/Igalia/pflua/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Igalia/pflua/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Igalia/pflua/git/refs{/sha}","trees_url":"https://api.github.com/repos/Igalia/pflua/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Igalia/pflua/statuses/{sha}","languages_url":"https://api.github.com/repos/Igalia/pflua/languages","stargazers_url":"https://api.github.com/repos/Igalia/pflua/stargazers","contributors_url":"https://api.github.com/repos/Igalia/pflua/contributors","subscribers_url":"https://api.github.com/repos/Igalia/pflua/subscribers","subscription_url":"https://api.github.com/repos/Igalia/pflua/subscription","commits_url":"https://api.github.com/repos/Igalia/pflua/commits{/sha}","git_commits_url":"https://api.github.com/repos/Igalia/pflua/git/commits{/sha}","comments_url":"https://api.github.com/repos/Igalia/pflua/comments{/number}","issue_comment_url":"https://api.github.com/repos/Igalia/pflua/issues/comments{/number}","contents_url":"https://api.github.com/repos/Igalia/pflua/contents/{+path}","compare_url":"https://api.github.com/repos/Igalia/pflua/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Igalia/pflua/merges","archive_url":"https://api.github.com/repos/Igalia/pflua/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Igalia/pflua/downloads","issues_url":"https://api.github.com/repos/Igalia/pflua/issues{/number}","pulls_url":"https://api.github.com/repos/Igalia/pflua/pulls{/number}","milestones_url":"https://api.github.com/repos/Igalia/pflua/milestones{/number}","notifications_url":"https://api.github.com/repos/Igalia/pflua/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Igalia/pflua/labels{/name}","releases_url":"https://api.github.com/repos/Igalia/pflua/releases{/id}","created_at":"2014-06-23T09:05:09Z","updated_at":"2015-06-20T16:30:33Z","pushed_at":"2015-06-29T13:22:45Z","git_url":"git://github.com/Igalia/pflua.git","ssh_url":"git@github.com:Igalia/pflua.git","clone_url":"https://github.com/Igalia/pflua.git","svn_url":"https://github.com/Igalia/pflua","homepage":null,"size":13191,"stargazers_count":175,"watchers_count":175,"language":"Lua","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":25,"forks":14,"open_issues":25,"watchers":175,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Igalia/pflua/pulls/220"},"html":{"href":"https://github.com/Igalia/pflua/pull/220"},"issue":{"href":"https://api.github.com/repos/Igalia/pflua/issues/220"},"comments":{"href":"https://api.github.com/repos/Igalia/pflua/issues/220/comments"},"review_comments":{"href":"https://api.github.com/repos/Igalia/pflua/pulls/220/comments"},"review_comment":{"href":"https://api.github.com/repos/Igalia/pflua/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Igalia/pflua/pulls/220/commits"},"statuses":{"href":"https://api.github.com/repos/Igalia/pflua/statuses/29a3c7838042493c682bbb2b80a5d536d6ae7e44"}}}}