{"action":"created","comment":{"url":"https://api.github.com/repos/WebAssembly/binaryen/pulls/comments/59243793","id":59243793,"diff_hunk":"@@ -157,185 +149,209 @@ struct WasmWalkerBase : public WasmVisitor<SubType, ReturnType> {\n     self->visitMemory(&module->memory);\n     self->visitModule(module);\n   }\n-};\n \n-template<typename ParentType>\n-struct ChildWalker : public WasmWalkerBase<ChildWalker<ParentType>> {\n-  ParentType& parent;\n+  // Walk implementation. We don't use recursion as ASTs may be highly\n+  // nested.\n \n-  ChildWalker(ParentType& parent) : parent(parent) {}\n+  // Tasks receive the this pointer and a pointer to the pointer to operate on\n+  typedef void (*TaskFunc)(SubType*, Expression**);\n \n-  void visitBlock(Block *curr) {\n-    ExpressionList& list = curr->list;\n-    for (size_t z = 0; z < list.size(); z++) {\n-      parent.walk(list[z]);\n-    }\n-  }\n-  void visitIf(If *curr) {\n-    parent.walk(curr->condition);\n-    parent.walk(curr->ifTrue);\n-    parent.walk(curr->ifFalse);\n-  }\n-  void visitLoop(Loop *curr) {\n-    parent.walk(curr->body);\n-  }\n-  void visitBreak(Break *curr) {\n-    parent.walk(curr->condition);\n-    parent.walk(curr->value);\n-  }\n-  void visitSwitch(Switch *curr) {\n-    parent.walk(curr->condition);\n-    if (curr->value) parent.walk(curr->value);\n-  }\n-  void visitCall(Call *curr) {\n-    ExpressionList& list = curr->operands;\n-    for (size_t z = 0; z < list.size(); z++) {\n-      parent.walk(list[z]);\n-    }\n-  }\n-  void visitCallImport(CallImport *curr) {\n-    ExpressionList& list = curr->operands;\n-    for (size_t z = 0; z < list.size(); z++) {\n-      parent.walk(list[z]);\n-    }\n+  struct Task {\n+    TaskFunc func;\n+    Expression** currp;\n+    Task(TaskFunc func, Expression** currp) : func(func), currp(currp) {}\n+  };\n+\n+  std::vector<Task> stack;\n+\n+  void addTask(TaskFunc func, Expression** currp) {\n+    stack.emplace_back(func, currp);\n   }\n-  void visitCallIndirect(CallIndirect *curr) {\n-    parent.walk(curr->target);\n-    ExpressionList& list = curr->operands;\n-    for (size_t z = 0; z < list.size(); z++) {\n-      parent.walk(list[z]);\n+  void maybeAddTask(TaskFunc func, Expression** currp) {\n+    if (*currp) {\n+      stack.emplace_back(func, currp);\n     }\n   }\n-  void visitGetLocal(GetLocal *curr) {}\n-  void visitSetLocal(SetLocal *curr) {\n-    parent.walk(curr->value);\n-  }\n-  void visitLoad(Load *curr) {\n-    parent.walk(curr->ptr);\n-  }\n-  void visitStore(Store *curr) {\n-    parent.walk(curr->ptr);\n-    parent.walk(curr->value);\n-  }\n-  void visitConst(Const *curr) {}\n-  void visitUnary(Unary *curr) {\n-    parent.walk(curr->value);\n-  }\n-  void visitBinary(Binary *curr) {\n-    parent.walk(curr->left);\n-    parent.walk(curr->right);\n-  }\n-  void visitSelect(Select *curr) {\n-    parent.walk(curr->ifTrue);\n-    parent.walk(curr->ifFalse);\n-    parent.walk(curr->condition);\n-  }\n-  void visitReturn(Return *curr) {\n-    parent.walk(curr->value);\n-  }\n-  void visitHost(Host *curr) {\n-    ExpressionList& list = curr->operands;\n-    for (size_t z = 0; z < list.size(); z++) {\n-      parent.walk(list[z]);\n+  Task getTask() {\n+    auto ret = stack.back();\n+    stack.pop_back();\n+    return ret;\n+  }\n+\n+  void walk(Expression*& root) {\n+    assert(stack.size() == 0);\n+    addTask(SubType::scan, &root);\n+    while (stack.size() > 0) {\n+      auto task = getTask();\n+      assert(*task.currp);\n+      task.func(static_cast<SubType*>(this), task.currp);\n+      if (replace) {\n+        *task.currp = replace;\n+        replace = nullptr;\n+      }\n     }\n   }\n-  void visitNop(Nop *curr) {}\n-  void visitUnreachable(Unreachable *curr) {}\n-};\n-\n-// Walker that allows replacements\n-template<typename SubType, typename ReturnType = void>\n-struct WasmReplacerWalker : public WasmWalkerBase<SubType, ReturnType> {\n-  Expression* replace = nullptr;\n-\n-  // methods can call this to replace the current node\n-  void replaceCurrent(Expression *expression) {\n-    replace = expression;\n-  }\n \n-  void walk(Expression*& curr) override {\n-    if (!curr) return;\n-\n-    this->visit(curr);\n-\n-    if (replace) {\n-      curr = replace;\n-      replace = nullptr;\n-    }\n-  }\n+  // subclasses implement this to define the proper order of execution\n+  static void scan(SubType* self, Expression** currp) { abort(); }\n+\n+  // task hooks to call visitors\n+\n+  static void doVisitBlock(SubType* self, Expression** currp)        { self->visitExpression(*currp); self->visitBlock((*currp)->cast<Block>()); }\n+  static void doVisitIf(SubType* self, Expression** currp)           { self->visitExpression(*currp); self->visitIf((*currp)->cast<If>()); }\n+  static void doVisitLoop(SubType* self, Expression** currp)         { self->visitExpression(*currp); self->visitLoop((*currp)->cast<Loop>()); }\n+  static void doVisitBreak(SubType* self, Expression** currp)        { self->visitExpression(*currp); self->visitBreak((*currp)->cast<Break>()); }\n+  static void doVisitSwitch(SubType* self, Expression** currp)       { self->visitExpression(*currp); self->visitSwitch((*currp)->cast<Switch>()); }\n+  static void doVisitCall(SubType* self, Expression** currp)         { self->visitExpression(*currp); self->visitCall((*currp)->cast<Call>()); }\n+  static void doVisitCallImport(SubType* self, Expression** currp)   { self->visitExpression(*currp); self->visitCallImport((*currp)->cast<CallImport>()); }\n+  static void doVisitCallIndirect(SubType* self, Expression** currp) { self->visitExpression(*currp); self->visitCallIndirect((*currp)->cast<CallIndirect>()); }\n+  static void doVisitGetLocal(SubType* self, Expression** currp)     { self->visitExpression(*currp); self->visitGetLocal((*currp)->cast<GetLocal>()); }\n+  static void doVisitSetLocal(SubType* self, Expression** currp)     { self->visitExpression(*currp); self->visitSetLocal((*currp)->cast<SetLocal>()); }\n+  static void doVisitLoad(SubType* self, Expression** currp)         { self->visitExpression(*currp); self->visitLoad((*currp)->cast<Load>()); }\n+  static void doVisitStore(SubType* self, Expression** currp)        { self->visitExpression(*currp); self->visitStore((*currp)->cast<Store>()); }\n+  static void doVisitConst(SubType* self, Expression** currp)        { self->visitExpression(*currp); self->visitConst((*currp)->cast<Const>()); }\n+  static void doVisitUnary(SubType* self, Expression** currp)        { self->visitExpression(*currp); self->visitUnary((*currp)->cast<Unary>()); }\n+  static void doVisitBinary(SubType* self, Expression** currp)       { self->visitExpression(*currp); self->visitBinary((*currp)->cast<Binary>()); }\n+  static void doVisitSelect(SubType* self, Expression** currp)       { self->visitExpression(*currp); self->visitSelect((*currp)->cast<Select>()); }\n+  static void doVisitReturn(SubType* self, Expression** currp)       { self->visitExpression(*currp); self->visitReturn((*currp)->cast<Return>()); }\n+  static void doVisitHost(SubType* self, Expression** currp)         { self->visitExpression(*currp); self->visitHost((*currp)->cast<Host>()); }\n+  static void doVisitNop(SubType* self, Expression** currp)          { self->visitExpression(*currp); self->visitNop((*currp)->cast<Nop>()); }\n+  static void doVisitUnreachable(SubType* self, Expression** currp)  { self->visitExpression(*currp); self->visitUnreachable((*currp)->cast<Unreachable>()); }\n };\n \n-//\n-// Simple WebAssembly children-first walking (i.e., post-order, if you look\n-// at the children as subtrees of the current node), with the ability to replace\n-// the current expression node. Useful for writing optimization passes.\n-//\n+// Walks in post-order, i.e., children first. When there isn't an obvious\n+// order to operands, we follow them in order of execution.\n \n-template<typename SubType, typename ReturnType = void>\n-struct WasmWalker : public WasmReplacerWalker<SubType, ReturnType> {\n-  // By default, do nothing\n-  ReturnType visitBlock(Block *curr) {}\n-  ReturnType visitIf(If *curr) {}\n-  ReturnType visitLoop(Loop *curr) {}\n-  ReturnType visitBreak(Break *curr) {}\n-  ReturnType visitSwitch(Switch *curr) {}\n-  ReturnType visitCall(Call *curr) {}\n-  ReturnType visitCallImport(CallImport *curr) {}\n-  ReturnType visitCallIndirect(CallIndirect *curr) {}\n-  ReturnType visitGetLocal(GetLocal *curr) {}\n-  ReturnType visitSetLocal(SetLocal *curr) {}\n-  ReturnType visitLoad(Load *curr) {}\n-  ReturnType visitStore(Store *curr) {}\n-  ReturnType visitConst(Const *curr) {}\n-  ReturnType visitUnary(Unary *curr) {}\n-  ReturnType visitBinary(Binary *curr) {}\n-  ReturnType visitSelect(Select *curr) {}\n-  ReturnType visitReturn(Return *curr) {}\n-  ReturnType visitHost(Host *curr) {}\n-  ReturnType visitNop(Nop *curr) {}\n-  ReturnType visitUnreachable(Unreachable *curr) {}\n+template<typename SubType>\n+struct PostWalker : public Walker<SubType> {\n \n-  ReturnType visitFunctionType(FunctionType *curr) {}\n-  ReturnType visitImport(Import *curr) {}\n-  ReturnType visitExport(Export *curr) {}\n-  ReturnType visitFunction(Function *curr) {}\n-  ReturnType visitTable(Table *curr) {}\n-  ReturnType visitMemory(Memory *curr) {}\n-  ReturnType visitModule(Module *curr) {}\n+  static void scan(SubType* self, Expression** currp) {\n \n-  // children-first\n-  void walk(Expression*& curr) override {\n-    if (!curr) return;\n-\n-    // special-case Block, because Block nesting (in their first element) can be incredibly deep\n-    if (curr->is<Block>()) {\n-      auto* block = curr->dyn_cast<Block>();\n-      std::vector<Block*> stack;\n-      stack.push_back(block);\n-      while (block->list.size() > 0 && block->list[0]->is<Block>()) {\n-        block = block->list[0]->cast<Block>();\n-        stack.push_back(block);\n+    Expression* curr = *currp;\n+    switch (curr->_id) {\n+      case Expression::Id::InvalidId: abort();","path":"src/wasm-traversal.h","position":386,"original_position":386,"commit_id":"c0c33a65d4dbb34bc913a627859952a5739fe029","original_commit_id":"c0c33a65d4dbb34bc913a627859952a5739fe029","user":{"login":"dschuff","id":1122856,"avatar_url":"https://avatars.githubusercontent.com/u/1122856?v=3","gravatar_id":"","url":"https://api.github.com/users/dschuff","html_url":"https://github.com/dschuff","followers_url":"https://api.github.com/users/dschuff/followers","following_url":"https://api.github.com/users/dschuff/following{/other_user}","gists_url":"https://api.github.com/users/dschuff/gists{/gist_id}","starred_url":"https://api.github.com/users/dschuff/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dschuff/subscriptions","organizations_url":"https://api.github.com/users/dschuff/orgs","repos_url":"https://api.github.com/users/dschuff/repos","events_url":"https://api.github.com/users/dschuff/events{/privacy}","received_events_url":"https://api.github.com/users/dschuff/received_events","type":"User","site_admin":false},"body":"should this be `WASM_UNREACHABLE()` what's the difference in expected use between that and `abort()`?","created_at":"2016-04-11T17:19:27Z","updated_at":"2016-04-11T17:19:27Z","html_url":"https://github.com/WebAssembly/binaryen/pull/333#discussion_r59243793","pull_request_url":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333","_links":{"self":{"href":"https://api.github.com/repos/WebAssembly/binaryen/pulls/comments/59243793"},"html":{"href":"https://github.com/WebAssembly/binaryen/pull/333#discussion_r59243793"},"pull_request":{"href":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333"}}},"pull_request":{"url":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333","id":65927807,"html_url":"https://github.com/WebAssembly/binaryen/pull/333","diff_url":"https://github.com/WebAssembly/binaryen/pull/333.diff","patch_url":"https://github.com/WebAssembly/binaryen/pull/333.patch","issue_url":"https://api.github.com/repos/WebAssembly/binaryen/issues/333","number":333,"state":"open","locked":false,"title":"De-recurse traversals","user":{"login":"kripken","id":173661,"avatar_url":"https://avatars.githubusercontent.com/u/173661?v=3","gravatar_id":"","url":"https://api.github.com/users/kripken","html_url":"https://github.com/kripken","followers_url":"https://api.github.com/users/kripken/followers","following_url":"https://api.github.com/users/kripken/following{/other_user}","gists_url":"https://api.github.com/users/kripken/gists{/gist_id}","starred_url":"https://api.github.com/users/kripken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kripken/subscriptions","organizations_url":"https://api.github.com/users/kripken/orgs","repos_url":"https://api.github.com/users/kripken/repos","events_url":"https://api.github.com/users/kripken/events{/privacy}","received_events_url":"https://api.github.com/users/kripken/received_events","type":"User","site_admin":false},"body":"Followup for https://github.com/WebAssembly/binaryen/pull/319#issuecomment-207497139 where it was suggested to make traversal non-recursive.\r\n\r\nThis PR does that, however, it makes -O twice as slow as before :( Perhaps there are some obvious optimizations I'm missing?\r\n","created_at":"2016-04-10T23:56:16Z","updated_at":"2016-04-11T17:19:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"47849bd5338ce5fd67daa85e2a4710a267b611c7","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333/commits","review_comments_url":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333/comments","review_comment_url":"https://api.github.com/repos/WebAssembly/binaryen/pulls/comments{/number}","comments_url":"https://api.github.com/repos/WebAssembly/binaryen/issues/333/comments","statuses_url":"https://api.github.com/repos/WebAssembly/binaryen/statuses/c0c33a65d4dbb34bc913a627859952a5739fe029","head":{"label":"WebAssembly:opts","ref":"opts","sha":"c0c33a65d4dbb34bc913a627859952a5739fe029","user":{"login":"WebAssembly","id":11578470,"avatar_url":"https://avatars.githubusercontent.com/u/11578470?v=3","gravatar_id":"","url":"https://api.github.com/users/WebAssembly","html_url":"https://github.com/WebAssembly","followers_url":"https://api.github.com/users/WebAssembly/followers","following_url":"https://api.github.com/users/WebAssembly/following{/other_user}","gists_url":"https://api.github.com/users/WebAssembly/gists{/gist_id}","starred_url":"https://api.github.com/users/WebAssembly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WebAssembly/subscriptions","organizations_url":"https://api.github.com/users/WebAssembly/orgs","repos_url":"https://api.github.com/users/WebAssembly/repos","events_url":"https://api.github.com/users/WebAssembly/events{/privacy}","received_events_url":"https://api.github.com/users/WebAssembly/received_events","type":"Organization","site_admin":false},"repo":{"id":45208608,"name":"binaryen","full_name":"WebAssembly/binaryen","owner":{"login":"WebAssembly","id":11578470,"avatar_url":"https://avatars.githubusercontent.com/u/11578470?v=3","gravatar_id":"","url":"https://api.github.com/users/WebAssembly","html_url":"https://github.com/WebAssembly","followers_url":"https://api.github.com/users/WebAssembly/followers","following_url":"https://api.github.com/users/WebAssembly/following{/other_user}","gists_url":"https://api.github.com/users/WebAssembly/gists{/gist_id}","starred_url":"https://api.github.com/users/WebAssembly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WebAssembly/subscriptions","organizations_url":"https://api.github.com/users/WebAssembly/orgs","repos_url":"https://api.github.com/users/WebAssembly/repos","events_url":"https://api.github.com/users/WebAssembly/events{/privacy}","received_events_url":"https://api.github.com/users/WebAssembly/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/WebAssembly/binaryen","description":"Compiler infrastructure and toolchain library for WebAssembly, in C++","fork":false,"url":"https://api.github.com/repos/WebAssembly/binaryen","forks_url":"https://api.github.com/repos/WebAssembly/binaryen/forks","keys_url":"https://api.github.com/repos/WebAssembly/binaryen/keys{/key_id}","collaborators_url":"https://api.github.com/repos/WebAssembly/binaryen/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/WebAssembly/binaryen/teams","hooks_url":"https://api.github.com/repos/WebAssembly/binaryen/hooks","issue_events_url":"https://api.github.com/repos/WebAssembly/binaryen/issues/events{/number}","events_url":"https://api.github.com/repos/WebAssembly/binaryen/events","assignees_url":"https://api.github.com/repos/WebAssembly/binaryen/assignees{/user}","branches_url":"https://api.github.com/repos/WebAssembly/binaryen/branches{/branch}","tags_url":"https://api.github.com/repos/WebAssembly/binaryen/tags","blobs_url":"https://api.github.com/repos/WebAssembly/binaryen/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/WebAssembly/binaryen/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/WebAssembly/binaryen/git/refs{/sha}","trees_url":"https://api.github.com/repos/WebAssembly/binaryen/git/trees{/sha}","statuses_url":"https://api.github.com/repos/WebAssembly/binaryen/statuses/{sha}","languages_url":"https://api.github.com/repos/WebAssembly/binaryen/languages","stargazers_url":"https://api.github.com/repos/WebAssembly/binaryen/stargazers","contributors_url":"https://api.github.com/repos/WebAssembly/binaryen/contributors","subscribers_url":"https://api.github.com/repos/WebAssembly/binaryen/subscribers","subscription_url":"https://api.github.com/repos/WebAssembly/binaryen/subscription","commits_url":"https://api.github.com/repos/WebAssembly/binaryen/commits{/sha}","git_commits_url":"https://api.github.com/repos/WebAssembly/binaryen/git/commits{/sha}","comments_url":"https://api.github.com/repos/WebAssembly/binaryen/comments{/number}","issue_comment_url":"https://api.github.com/repos/WebAssembly/binaryen/issues/comments{/number}","contents_url":"https://api.github.com/repos/WebAssembly/binaryen/contents/{+path}","compare_url":"https://api.github.com/repos/WebAssembly/binaryen/compare/{base}...{head}","merges_url":"https://api.github.com/repos/WebAssembly/binaryen/merges","archive_url":"https://api.github.com/repos/WebAssembly/binaryen/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/WebAssembly/binaryen/downloads","issues_url":"https://api.github.com/repos/WebAssembly/binaryen/issues{/number}","pulls_url":"https://api.github.com/repos/WebAssembly/binaryen/pulls{/number}","milestones_url":"https://api.github.com/repos/WebAssembly/binaryen/milestones{/number}","notifications_url":"https://api.github.com/repos/WebAssembly/binaryen/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/WebAssembly/binaryen/labels{/name}","releases_url":"https://api.github.com/repos/WebAssembly/binaryen/releases{/id}","deployments_url":"https://api.github.com/repos/WebAssembly/binaryen/deployments","created_at":"2015-10-29T20:26:28Z","updated_at":"2016-04-11T15:09:31Z","pushed_at":"2016-04-11T04:59:22Z","git_url":"git://github.com/WebAssembly/binaryen.git","ssh_url":"git@github.com:WebAssembly/binaryen.git","clone_url":"https://github.com/WebAssembly/binaryen.git","svn_url":"https://github.com/WebAssembly/binaryen","homepage":"","size":15561,"stargazers_count":591,"watchers_count":591,"language":"Assembly","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":45,"mirror_url":null,"open_issues_count":53,"forks":45,"open_issues":53,"watchers":591,"default_branch":"master"}},"base":{"label":"WebAssembly:master","ref":"master","sha":"675c045de41d609e431a5b97f8b00fe433dd18cd","user":{"login":"WebAssembly","id":11578470,"avatar_url":"https://avatars.githubusercontent.com/u/11578470?v=3","gravatar_id":"","url":"https://api.github.com/users/WebAssembly","html_url":"https://github.com/WebAssembly","followers_url":"https://api.github.com/users/WebAssembly/followers","following_url":"https://api.github.com/users/WebAssembly/following{/other_user}","gists_url":"https://api.github.com/users/WebAssembly/gists{/gist_id}","starred_url":"https://api.github.com/users/WebAssembly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WebAssembly/subscriptions","organizations_url":"https://api.github.com/users/WebAssembly/orgs","repos_url":"https://api.github.com/users/WebAssembly/repos","events_url":"https://api.github.com/users/WebAssembly/events{/privacy}","received_events_url":"https://api.github.com/users/WebAssembly/received_events","type":"Organization","site_admin":false},"repo":{"id":45208608,"name":"binaryen","full_name":"WebAssembly/binaryen","owner":{"login":"WebAssembly","id":11578470,"avatar_url":"https://avatars.githubusercontent.com/u/11578470?v=3","gravatar_id":"","url":"https://api.github.com/users/WebAssembly","html_url":"https://github.com/WebAssembly","followers_url":"https://api.github.com/users/WebAssembly/followers","following_url":"https://api.github.com/users/WebAssembly/following{/other_user}","gists_url":"https://api.github.com/users/WebAssembly/gists{/gist_id}","starred_url":"https://api.github.com/users/WebAssembly/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/WebAssembly/subscriptions","organizations_url":"https://api.github.com/users/WebAssembly/orgs","repos_url":"https://api.github.com/users/WebAssembly/repos","events_url":"https://api.github.com/users/WebAssembly/events{/privacy}","received_events_url":"https://api.github.com/users/WebAssembly/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/WebAssembly/binaryen","description":"Compiler infrastructure and toolchain library for WebAssembly, in C++","fork":false,"url":"https://api.github.com/repos/WebAssembly/binaryen","forks_url":"https://api.github.com/repos/WebAssembly/binaryen/forks","keys_url":"https://api.github.com/repos/WebAssembly/binaryen/keys{/key_id}","collaborators_url":"https://api.github.com/repos/WebAssembly/binaryen/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/WebAssembly/binaryen/teams","hooks_url":"https://api.github.com/repos/WebAssembly/binaryen/hooks","issue_events_url":"https://api.github.com/repos/WebAssembly/binaryen/issues/events{/number}","events_url":"https://api.github.com/repos/WebAssembly/binaryen/events","assignees_url":"https://api.github.com/repos/WebAssembly/binaryen/assignees{/user}","branches_url":"https://api.github.com/repos/WebAssembly/binaryen/branches{/branch}","tags_url":"https://api.github.com/repos/WebAssembly/binaryen/tags","blobs_url":"https://api.github.com/repos/WebAssembly/binaryen/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/WebAssembly/binaryen/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/WebAssembly/binaryen/git/refs{/sha}","trees_url":"https://api.github.com/repos/WebAssembly/binaryen/git/trees{/sha}","statuses_url":"https://api.github.com/repos/WebAssembly/binaryen/statuses/{sha}","languages_url":"https://api.github.com/repos/WebAssembly/binaryen/languages","stargazers_url":"https://api.github.com/repos/WebAssembly/binaryen/stargazers","contributors_url":"https://api.github.com/repos/WebAssembly/binaryen/contributors","subscribers_url":"https://api.github.com/repos/WebAssembly/binaryen/subscribers","subscription_url":"https://api.github.com/repos/WebAssembly/binaryen/subscription","commits_url":"https://api.github.com/repos/WebAssembly/binaryen/commits{/sha}","git_commits_url":"https://api.github.com/repos/WebAssembly/binaryen/git/commits{/sha}","comments_url":"https://api.github.com/repos/WebAssembly/binaryen/comments{/number}","issue_comment_url":"https://api.github.com/repos/WebAssembly/binaryen/issues/comments{/number}","contents_url":"https://api.github.com/repos/WebAssembly/binaryen/contents/{+path}","compare_url":"https://api.github.com/repos/WebAssembly/binaryen/compare/{base}...{head}","merges_url":"https://api.github.com/repos/WebAssembly/binaryen/merges","archive_url":"https://api.github.com/repos/WebAssembly/binaryen/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/WebAssembly/binaryen/downloads","issues_url":"https://api.github.com/repos/WebAssembly/binaryen/issues{/number}","pulls_url":"https://api.github.com/repos/WebAssembly/binaryen/pulls{/number}","milestones_url":"https://api.github.com/repos/WebAssembly/binaryen/milestones{/number}","notifications_url":"https://api.github.com/repos/WebAssembly/binaryen/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/WebAssembly/binaryen/labels{/name}","releases_url":"https://api.github.com/repos/WebAssembly/binaryen/releases{/id}","deployments_url":"https://api.github.com/repos/WebAssembly/binaryen/deployments","created_at":"2015-10-29T20:26:28Z","updated_at":"2016-04-11T15:09:31Z","pushed_at":"2016-04-11T04:59:22Z","git_url":"git://github.com/WebAssembly/binaryen.git","ssh_url":"git@github.com:WebAssembly/binaryen.git","clone_url":"https://github.com/WebAssembly/binaryen.git","svn_url":"https://github.com/WebAssembly/binaryen","homepage":"","size":15561,"stargazers_count":591,"watchers_count":591,"language":"Assembly","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":45,"mirror_url":null,"open_issues_count":53,"forks":45,"open_issues":53,"watchers":591,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333"},"html":{"href":"https://github.com/WebAssembly/binaryen/pull/333"},"issue":{"href":"https://api.github.com/repos/WebAssembly/binaryen/issues/333"},"comments":{"href":"https://api.github.com/repos/WebAssembly/binaryen/issues/333/comments"},"review_comments":{"href":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333/comments"},"review_comment":{"href":"https://api.github.com/repos/WebAssembly/binaryen/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/WebAssembly/binaryen/pulls/333/commits"},"statuses":{"href":"https://api.github.com/repos/WebAssembly/binaryen/statuses/c0c33a65d4dbb34bc913a627859952a5739fe029"}}}}