{"action":"created","comment":{"url":"https://api.github.com/repos/frida/frida-gum/pulls/comments/68141738","id":68141738,"diff_hunk":"@@ -0,0 +1,530 @@\n+/*\n+ * Copyright (C) 2014-2015 Ole André Vadla Ravnås <ole.andre.ravnas@tillitech.com>\n+ *\n+ * Licence: wxWindows Library Licence, Version 3.1\n+ */\n+\n+/* Useful reference: C4.1 A64 instruction index by encoding */\n+\n+#include \"gummipsrelocator.h\"\n+\n+#include \"gummemory.h\"\n+\n+#define GUM_MAX_INPUT_INSN_COUNT (100)\n+\n+typedef struct _GumCodeGenCtx GumCodeGenCtx;\n+\n+struct _GumCodeGenCtx\n+{\n+  const cs_insn * insn;\n+  cs_mips * detail;\n+\n+  const cs_insn * delay_slot_insn;\n+  cs_mips * delay_slot_detail;\n+\n+  GumMipsWriter * output;\n+};\n+\n+static gboolean gum_mips_has_delay_slot (const cs_insn * insn);\n+\n+void\n+gum_mips_relocator_init (GumMipsRelocator * relocator,\n+                          gconstpointer input_code,\n+                          GumMipsWriter * output)\n+{\n+  cs_err err;\n+#ifdef G_LITTLE_ENDIAN\n+  err = cs_open (CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_LITTLE_ENDIAN,\n+      &relocator->capstone);\n+#else\n+  err = cs_open (CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_BIG_ENDIAN,\n+      &relocator->capstone);\n+#endif\n+  g_assert_cmpint (err, ==, CS_ERR_OK);\n+  err = cs_option (relocator->capstone, CS_OPT_DETAIL, CS_OPT_ON);\n+  g_assert_cmpint (err, ==, CS_ERR_OK);\n+  relocator->input_insns = g_new0 (cs_insn *, GUM_MAX_INPUT_INSN_COUNT);\n+\n+  gum_mips_relocator_reset (relocator, input_code, output);\n+}\n+\n+void\n+gum_mips_relocator_reset (GumMipsRelocator * relocator,\n+                           gconstpointer input_code,\n+                           GumMipsWriter * output)\n+{\n+  guint i;\n+\n+  relocator->input_start = input_code;\n+  relocator->input_cur = input_code;\n+  relocator->input_pc = GUM_ADDRESS (input_code);\n+  for (i = 0; i != GUM_MAX_INPUT_INSN_COUNT; i++)\n+  {\n+    cs_insn * insn = relocator->input_insns[i];\n+    if (insn != NULL)\n+    {\n+      cs_free (insn, 1);\n+      relocator->input_insns[i] = NULL;\n+    }\n+  }\n+  relocator->output = output;\n+\n+  relocator->inpos = 0;\n+  relocator->outpos = 0;\n+\n+  relocator->delay_slot_pending = FALSE;\n+  relocator->eob = FALSE;\n+  relocator->eoi = FALSE;\n+}\n+\n+void\n+gum_mips_relocator_free (GumMipsRelocator * relocator)\n+{\n+  gum_mips_relocator_reset (relocator, relocator->input_start,\n+      relocator->output);\n+\n+  g_free (relocator->input_insns);\n+\n+  cs_close (&relocator->capstone);\n+}\n+\n+static guint\n+gum_mips_relocator_inpos (GumMipsRelocator * self)\n+{\n+  return self->inpos % GUM_MAX_INPUT_INSN_COUNT;\n+}\n+\n+static guint\n+gum_mips_relocator_outpos (GumMipsRelocator * self)\n+{\n+  return self->outpos % GUM_MAX_INPUT_INSN_COUNT;\n+}\n+\n+static void\n+gum_mips_relocator_increment_inpos (GumMipsRelocator * self)\n+{\n+  self->inpos++;\n+  g_assert_cmpint (self->inpos, >, self->outpos);\n+}\n+\n+static void\n+gum_mips_relocator_increment_outpos (GumMipsRelocator * self)\n+{\n+  self->outpos++;\n+  g_assert_cmpint (self->outpos, <=, self->inpos);\n+}\n+\n+guint\n+gum_mips_relocator_read_one (GumMipsRelocator * self,\n+                              const cs_insn ** instruction)\n+{\n+  cs_insn ** insn_ptr, * insn;\n+\n+  if (self->eoi && !self->delay_slot_pending)\n+    return 0;\n+\n+  insn_ptr = &self->input_insns[gum_mips_relocator_inpos (self)];\n+\n+  if (*insn_ptr != NULL)\n+  {\n+    cs_free (*insn_ptr, 1);\n+    *insn_ptr = NULL;\n+  }\n+\n+  if (cs_disasm (self->capstone, self->input_cur, 4, self->input_pc, 1,\n+      insn_ptr) != 1)\n+  {\n+    return 0;\n+  }\n+\n+  insn = *insn_ptr;\n+\n+  switch (insn->id)\n+  {\n+    case MIPS_INS_J:\n+      self->eob = TRUE;\n+      self->delay_slot_pending = TRUE;\n+      self->eoi = TRUE;\n+      break;\n+    case MIPS_INS_JR:\n+      self->eob = TRUE;\n+      self->delay_slot_pending = TRUE;\n+      self->eoi = TRUE;\n+      break;\n+    case MIPS_INS_BGEZAL:\n+    case MIPS_INS_BGEZALL:\n+    case MIPS_INS_BLTZAL:\n+    case MIPS_INS_BLTZALL:\n+    case MIPS_INS_JAL:\n+    case MIPS_INS_JALR:\n+      self->eob = TRUE;\n+      self->delay_slot_pending = TRUE;\n+      self->eoi = FALSE;\n+      break;\n+    case MIPS_INS_BEQ:\n+    case MIPS_INS_BEQL:\n+    case MIPS_INS_BGEZ:\n+    case MIPS_INS_BGEZL:\n+    case MIPS_INS_BGTZ:\n+    case MIPS_INS_BGTZL:\n+    case MIPS_INS_BLEZ:\n+    case MIPS_INS_BLEZL:\n+    case MIPS_INS_BLTZ:\n+    case MIPS_INS_BLTZL:\n+    case MIPS_INS_BNE:\n+    case MIPS_INS_BNEL:\n+      self->eob = TRUE;\n+      self->delay_slot_pending = TRUE;\n+      self->eoi = FALSE;\n+      break;\n+    default:\n+      if (self->delay_slot_pending)\n+         self->delay_slot_pending = FALSE;\n+      break;\n+  }\n+\n+  gum_mips_relocator_increment_inpos (self);\n+\n+  if (instruction != NULL)\n+    *instruction = insn;\n+\n+  self->input_cur += insn->size;\n+  self->input_pc += insn->size;\n+\n+  return self->input_cur - self->input_start;\n+}\n+\n+cs_insn *\n+gum_mips_relocator_peek_next_write_insn (GumMipsRelocator * self)\n+{\n+  if (self->outpos == self->inpos)\n+    return NULL;\n+\n+  return self->input_insns[gum_mips_relocator_outpos (self)];\n+}\n+\n+gpointer\n+gum_mips_relocator_peek_next_write_source (GumMipsRelocator * self)\n+{\n+  cs_insn * next;\n+\n+  next = gum_mips_relocator_peek_next_write_insn (self);\n+  if (next == NULL)\n+    return NULL;\n+\n+  return GSIZE_TO_POINTER (next->address);\n+}\n+\n+void\n+gum_mips_relocator_skip_one (GumMipsRelocator * self)\n+{\n+  cs_insn * next;\n+\n+  next = gum_mips_relocator_peek_next_write_insn (self);\n+  g_assert (next != NULL);\n+  gum_mips_relocator_increment_outpos (self);\n+}\n+\n+gboolean\n+gum_mips_relocator_write_one (GumMipsRelocator * self)\n+{\n+  const cs_insn * insn;\n+  const cs_insn * delay_slot_insn = NULL;\n+  GumCodeGenCtx ctx;\n+  gboolean rewritten;\n+\n+  if ((insn = gum_mips_relocator_peek_next_write_insn (self)) == NULL)\n+    return FALSE;\n+  gum_mips_relocator_increment_outpos (self);\n+  ctx.insn = insn;\n+  ctx.detail = &ctx.insn->detail->mips;\n+  ctx.output = self->output;\n+\n+  if (gum_mips_has_delay_slot (insn))\n+  {\n+    delay_slot_insn = gum_mips_relocator_peek_next_write_insn (self);\n+    if (delay_slot_insn == NULL)\n+      return FALSE;\n+    gum_mips_relocator_increment_outpos (self);\n+    ctx.delay_slot_insn = delay_slot_insn;\n+    ctx.delay_slot_detail = &ctx.delay_slot_insn->detail->mips;\n+  }\n+  else\n+  {\n+    ctx.delay_slot_insn = NULL;\n+    ctx.delay_slot_detail = NULL;\n+  }\n+\n+  switch (insn->id)\n+  {\n+    default:\n+      rewritten = FALSE;\n+      break;\n+  }\n+\n+  if (!rewritten)\n+  {\n+    gum_mips_writer_put_bytes (ctx.output, insn->bytes, insn->size);\n+    if (delay_slot_insn != NULL)\n+    {\n+      gum_mips_writer_put_bytes (ctx.output, delay_slot_insn->bytes,\n+          delay_slot_insn->size);\n+    }\n+  }\n+\n+  return TRUE;\n+}\n+\n+void\n+gum_mips_relocator_write_all (GumMipsRelocator * self)\n+{\n+  guint count = 0;\n+\n+  while (gum_mips_relocator_write_one (self))\n+    count++;\n+\n+  g_assert_cmpuint (count, >, 0);\n+}\n+\n+gboolean\n+gum_mips_relocator_eob (GumMipsRelocator * self)\n+{\n+  return self->eob || self->delay_slot_pending;\n+}\n+\n+gboolean\n+gum_mips_relocator_eoi (GumMipsRelocator * self)\n+{\n+  return self->eoi || self->delay_slot_pending;\n+}\n+\n+gboolean\n+gum_mips_relocator_can_relocate (gpointer address,\n+                                 guint min_bytes,\n+                                 GumRelocationScenario scenario,\n+                                 guint * maximum,\n+                                 mips_reg * available_scratch_reg)\n+{\n+  guint n = 0;\n+  guint8 * buf;\n+  GumMipsWriter cw;\n+  GumMipsRelocator rl;\n+  guint reloc_bytes;\n+\n+  buf = g_alloca (3 * min_bytes);\n+  gum_mips_writer_init (&cw, buf);\n+\n+  gum_mips_relocator_init (&rl, address, &cw);\n+\n+  do\n+  {\n+    const cs_insn * insn;\n+    gboolean safe_to_relocate_further;\n+\n+    reloc_bytes = gum_mips_relocator_read_one (&rl, &insn);\n+    if (reloc_bytes == 0)\n+      break;\n+\n+    n = reloc_bytes;\n+\n+    if (scenario == GUM_SCENARIO_ONLINE)\n+    {\n+      switch (insn->id)\n+      {\n+        case MIPS_INS_JAL:\n+        case MIPS_INS_JALR:\n+        case MIPS_INS_SYSCALL:\n+          safe_to_relocate_further = FALSE;\n+          break;\n+        default:\n+          safe_to_relocate_further = TRUE;\n+          break;\n+      }\n+    }\n+    else\n+    {\n+      safe_to_relocate_further = TRUE;\n+    }\n+\n+    if (!safe_to_relocate_further)\n+      break;\n+  }\n+  while (reloc_bytes < min_bytes || rl.delay_slot_pending);\n+\n+  if (!rl.eoi)\n+  {\n+    csh capstone;\n+    cs_err err;\n+    cs_insn * insn;\n+    size_t count, i;\n+    gboolean eoi;\n+\n+#ifdef G_LITTLE_ENDIAN\n+    err = cs_open (CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_LITTLE_ENDIAN,\n+        &capstone);\n+#else\n+    err = cs_open (CS_ARCH_MIPS, CS_MODE_MIPS32 | CS_MODE_BIG_ENDIAN,\n+        &capstone);\n+#endif\n+    g_assert_cmpint (err, == , CS_ERR_OK);\n+    err = cs_option (capstone, CS_OPT_DETAIL, CS_OPT_ON);\n+    g_assert_cmpint (err, ==, CS_ERR_OK);\n+\n+    count = cs_disasm (capstone, rl.input_cur, 1024, rl.input_pc, 0, &insn);\n+    g_assert (insn != NULL);\n+\n+    eoi = FALSE;\n+    for (i = 0; i != count && !eoi; i++)\n+    {\n+      cs_mips * d = &insn[i].detail->mips;\n+\n+      switch (insn[i].id)\n+      {\n+        case MIPS_INS_J:\n+        {\n+          cs_mips_op * op = &d->operands[0];\n+          g_assert (op->type == MIPS_OP_IMM);\n+          gssize target =\n+            (gssize) (GPOINTER_TO_SIZE (insn[i].address & 0xf0000000)) |\n+            (op->imm << 2);\n+          gssize offset = target - (gssize) GPOINTER_TO_SIZE (address);\n+          if (offset > 0 && offset < (gssize) n)\n+            n = offset;\n+          eoi = TRUE;\n+          break;\n+        }\n+        case MIPS_INS_BEQ:\n+        case MIPS_INS_BEQL:\n+        case MIPS_INS_BGEZ:\n+        case MIPS_INS_BGEZL:\n+        case MIPS_INS_BGTZ:\n+        case MIPS_INS_BGTZL:\n+        case MIPS_INS_BLEZ:\n+        case MIPS_INS_BLEZL:\n+        case MIPS_INS_BLTZ:\n+        case MIPS_INS_BLTZL:\n+        case MIPS_INS_BNE:\n+        case MIPS_INS_BNEL:\n+        {\n+          cs_mips_op * op =\n+            d->op_count == 3 ? &d->operands[2] : &d->operands[1];\n+          g_assert (op->type == MIPS_OP_IMM);\n+          gssize target = (gssize) insn->address +\n+            (op->imm & 0x8000 ? (0xffff0000 + op->imm) << 2 : op->imm << 2);\n+          gssize offset =\n+              target - (gssize) GPOINTER_TO_SIZE (address);","path":"gum/arch-mips/gummipsrelocator.c","position":415,"original_position":415,"commit_id":"8e48bf7c6d5d71d6f6ede359dcdc030f4dfcac50","original_commit_id":"8e48bf7c6d5d71d6f6ede359dcdc030f4dfcac50","user":{"login":"oleavr","id":735197,"avatar_url":"https://avatars.githubusercontent.com/u/735197?v=3","gravatar_id":"","url":"https://api.github.com/users/oleavr","html_url":"https://github.com/oleavr","followers_url":"https://api.github.com/users/oleavr/followers","following_url":"https://api.github.com/users/oleavr/following{/other_user}","gists_url":"https://api.github.com/users/oleavr/gists{/gist_id}","starred_url":"https://api.github.com/users/oleavr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oleavr/subscriptions","organizations_url":"https://api.github.com/users/oleavr/orgs","repos_url":"https://api.github.com/users/oleavr/repos","events_url":"https://api.github.com/users/oleavr/events{/privacy}","received_events_url":"https://api.github.com/users/oleavr/received_events","type":"User","site_admin":false},"body":"We should avoid declaration after statement for consistency. This also applies to the code above.","created_at":"2016-06-22T21:48:25Z","updated_at":"2016-06-22T21:48:25Z","html_url":"https://github.com/frida/frida-gum/pull/163#discussion_r68141738","pull_request_url":"https://api.github.com/repos/frida/frida-gum/pulls/163","_links":{"self":{"href":"https://api.github.com/repos/frida/frida-gum/pulls/comments/68141738"},"html":{"href":"https://github.com/frida/frida-gum/pull/163#discussion_r68141738"},"pull_request":{"href":"https://api.github.com/repos/frida/frida-gum/pulls/163"}}},"pull_request":{"url":"https://api.github.com/repos/frida/frida-gum/pulls/163","id":74790594,"html_url":"https://github.com/frida/frida-gum/pull/163","diff_url":"https://github.com/frida/frida-gum/pull/163.diff","patch_url":"https://github.com/frida/frida-gum/pull/163.patch","issue_url":"https://api.github.com/repos/frida/frida-gum/issues/163","number":163,"state":"open","locked":false,"title":"Add mips support to frida-gum","user":{"login":"s1341","id":5682183,"avatar_url":"https://avatars.githubusercontent.com/u/5682183?v=3","gravatar_id":"","url":"https://api.github.com/users/s1341","html_url":"https://github.com/s1341","followers_url":"https://api.github.com/users/s1341/followers","following_url":"https://api.github.com/users/s1341/following{/other_user}","gists_url":"https://api.github.com/users/s1341/gists{/gist_id}","starred_url":"https://api.github.com/users/s1341/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1341/subscriptions","organizations_url":"https://api.github.com/users/s1341/orgs","repos_url":"https://api.github.com/users/s1341/repos","events_url":"https://api.github.com/users/s1341/events{/privacy}","received_events_url":"https://api.github.com/users/s1341/received_events","type":"User","site_admin":false},"body":"This patch set adds initial working support for linux-mips(el) (tested on a linux-mipsel box) to frida-gum.\r\n\r\nThere are still some things left to do, which will probably come as additional pull requests, but this is initial working support with all tests passing.","created_at":"2016-06-22T14:08:49Z","updated_at":"2016-06-22T21:48:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"41bd130bfd722d60534eb760613554afc79629b4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/frida/frida-gum/pulls/163/commits","review_comments_url":"https://api.github.com/repos/frida/frida-gum/pulls/163/comments","review_comment_url":"https://api.github.com/repos/frida/frida-gum/pulls/comments{/number}","comments_url":"https://api.github.com/repos/frida/frida-gum/issues/163/comments","statuses_url":"https://api.github.com/repos/frida/frida-gum/statuses/8e48bf7c6d5d71d6f6ede359dcdc030f4dfcac50","head":{"label":"s1341:master","ref":"master","sha":"8e48bf7c6d5d71d6f6ede359dcdc030f4dfcac50","user":{"login":"s1341","id":5682183,"avatar_url":"https://avatars.githubusercontent.com/u/5682183?v=3","gravatar_id":"","url":"https://api.github.com/users/s1341","html_url":"https://github.com/s1341","followers_url":"https://api.github.com/users/s1341/followers","following_url":"https://api.github.com/users/s1341/following{/other_user}","gists_url":"https://api.github.com/users/s1341/gists{/gist_id}","starred_url":"https://api.github.com/users/s1341/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1341/subscriptions","organizations_url":"https://api.github.com/users/s1341/orgs","repos_url":"https://api.github.com/users/s1341/repos","events_url":"https://api.github.com/users/s1341/events{/privacy}","received_events_url":"https://api.github.com/users/s1341/received_events","type":"User","site_admin":false},"repo":{"id":48430626,"name":"frida-gum","full_name":"s1341/frida-gum","owner":{"login":"s1341","id":5682183,"avatar_url":"https://avatars.githubusercontent.com/u/5682183?v=3","gravatar_id":"","url":"https://api.github.com/users/s1341","html_url":"https://github.com/s1341","followers_url":"https://api.github.com/users/s1341/followers","following_url":"https://api.github.com/users/s1341/following{/other_user}","gists_url":"https://api.github.com/users/s1341/gists{/gist_id}","starred_url":"https://api.github.com/users/s1341/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s1341/subscriptions","organizations_url":"https://api.github.com/users/s1341/orgs","repos_url":"https://api.github.com/users/s1341/repos","events_url":"https://api.github.com/users/s1341/events{/privacy}","received_events_url":"https://api.github.com/users/s1341/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/s1341/frida-gum","description":"Low-level code instrumentation library used by frida-core","fork":true,"url":"https://api.github.com/repos/s1341/frida-gum","forks_url":"https://api.github.com/repos/s1341/frida-gum/forks","keys_url":"https://api.github.com/repos/s1341/frida-gum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/s1341/frida-gum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/s1341/frida-gum/teams","hooks_url":"https://api.github.com/repos/s1341/frida-gum/hooks","issue_events_url":"https://api.github.com/repos/s1341/frida-gum/issues/events{/number}","events_url":"https://api.github.com/repos/s1341/frida-gum/events","assignees_url":"https://api.github.com/repos/s1341/frida-gum/assignees{/user}","branches_url":"https://api.github.com/repos/s1341/frida-gum/branches{/branch}","tags_url":"https://api.github.com/repos/s1341/frida-gum/tags","blobs_url":"https://api.github.com/repos/s1341/frida-gum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/s1341/frida-gum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/s1341/frida-gum/git/refs{/sha}","trees_url":"https://api.github.com/repos/s1341/frida-gum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/s1341/frida-gum/statuses/{sha}","languages_url":"https://api.github.com/repos/s1341/frida-gum/languages","stargazers_url":"https://api.github.com/repos/s1341/frida-gum/stargazers","contributors_url":"https://api.github.com/repos/s1341/frida-gum/contributors","subscribers_url":"https://api.github.com/repos/s1341/frida-gum/subscribers","subscription_url":"https://api.github.com/repos/s1341/frida-gum/subscription","commits_url":"https://api.github.com/repos/s1341/frida-gum/commits{/sha}","git_commits_url":"https://api.github.com/repos/s1341/frida-gum/git/commits{/sha}","comments_url":"https://api.github.com/repos/s1341/frida-gum/comments{/number}","issue_comment_url":"https://api.github.com/repos/s1341/frida-gum/issues/comments{/number}","contents_url":"https://api.github.com/repos/s1341/frida-gum/contents/{+path}","compare_url":"https://api.github.com/repos/s1341/frida-gum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/s1341/frida-gum/merges","archive_url":"https://api.github.com/repos/s1341/frida-gum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/s1341/frida-gum/downloads","issues_url":"https://api.github.com/repos/s1341/frida-gum/issues{/number}","pulls_url":"https://api.github.com/repos/s1341/frida-gum/pulls{/number}","milestones_url":"https://api.github.com/repos/s1341/frida-gum/milestones{/number}","notifications_url":"https://api.github.com/repos/s1341/frida-gum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/s1341/frida-gum/labels{/name}","releases_url":"https://api.github.com/repos/s1341/frida-gum/releases{/id}","deployments_url":"https://api.github.com/repos/s1341/frida-gum/deployments","created_at":"2015-12-22T12:25:29Z","updated_at":"2016-01-11T12:23:43Z","pushed_at":"2016-06-22T15:16:28Z","git_url":"git://github.com/s1341/frida-gum.git","ssh_url":"git@github.com:s1341/frida-gum.git","clone_url":"https://github.com/s1341/frida-gum.git","svn_url":"https://github.com/s1341/frida-gum","homepage":"","size":14353,"stargazers_count":1,"watchers_count":1,"language":"C","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":1,"default_branch":"master"}},"base":{"label":"frida:master","ref":"master","sha":"7a3cfa046c3b70efe775747b8cc9156284d5e6d4","user":{"login":"frida","id":4073090,"avatar_url":"https://avatars.githubusercontent.com/u/4073090?v=3","gravatar_id":"","url":"https://api.github.com/users/frida","html_url":"https://github.com/frida","followers_url":"https://api.github.com/users/frida/followers","following_url":"https://api.github.com/users/frida/following{/other_user}","gists_url":"https://api.github.com/users/frida/gists{/gist_id}","starred_url":"https://api.github.com/users/frida/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/frida/subscriptions","organizations_url":"https://api.github.com/users/frida/orgs","repos_url":"https://api.github.com/users/frida/repos","events_url":"https://api.github.com/users/frida/events{/privacy}","received_events_url":"https://api.github.com/users/frida/received_events","type":"Organization","site_admin":false},"repo":{"id":9340574,"name":"frida-gum","full_name":"frida/frida-gum","owner":{"login":"frida","id":4073090,"avatar_url":"https://avatars.githubusercontent.com/u/4073090?v=3","gravatar_id":"","url":"https://api.github.com/users/frida","html_url":"https://github.com/frida","followers_url":"https://api.github.com/users/frida/followers","following_url":"https://api.github.com/users/frida/following{/other_user}","gists_url":"https://api.github.com/users/frida/gists{/gist_id}","starred_url":"https://api.github.com/users/frida/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/frida/subscriptions","organizations_url":"https://api.github.com/users/frida/orgs","repos_url":"https://api.github.com/users/frida/repos","events_url":"https://api.github.com/users/frida/events{/privacy}","received_events_url":"https://api.github.com/users/frida/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/frida/frida-gum","description":"Low-level code instrumentation library used by frida-core","fork":false,"url":"https://api.github.com/repos/frida/frida-gum","forks_url":"https://api.github.com/repos/frida/frida-gum/forks","keys_url":"https://api.github.com/repos/frida/frida-gum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/frida/frida-gum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/frida/frida-gum/teams","hooks_url":"https://api.github.com/repos/frida/frida-gum/hooks","issue_events_url":"https://api.github.com/repos/frida/frida-gum/issues/events{/number}","events_url":"https://api.github.com/repos/frida/frida-gum/events","assignees_url":"https://api.github.com/repos/frida/frida-gum/assignees{/user}","branches_url":"https://api.github.com/repos/frida/frida-gum/branches{/branch}","tags_url":"https://api.github.com/repos/frida/frida-gum/tags","blobs_url":"https://api.github.com/repos/frida/frida-gum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/frida/frida-gum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/frida/frida-gum/git/refs{/sha}","trees_url":"https://api.github.com/repos/frida/frida-gum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/frida/frida-gum/statuses/{sha}","languages_url":"https://api.github.com/repos/frida/frida-gum/languages","stargazers_url":"https://api.github.com/repos/frida/frida-gum/stargazers","contributors_url":"https://api.github.com/repos/frida/frida-gum/contributors","subscribers_url":"https://api.github.com/repos/frida/frida-gum/subscribers","subscription_url":"https://api.github.com/repos/frida/frida-gum/subscription","commits_url":"https://api.github.com/repos/frida/frida-gum/commits{/sha}","git_commits_url":"https://api.github.com/repos/frida/frida-gum/git/commits{/sha}","comments_url":"https://api.github.com/repos/frida/frida-gum/comments{/number}","issue_comment_url":"https://api.github.com/repos/frida/frida-gum/issues/comments{/number}","contents_url":"https://api.github.com/repos/frida/frida-gum/contents/{+path}","compare_url":"https://api.github.com/repos/frida/frida-gum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/frida/frida-gum/merges","archive_url":"https://api.github.com/repos/frida/frida-gum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/frida/frida-gum/downloads","issues_url":"https://api.github.com/repos/frida/frida-gum/issues{/number}","pulls_url":"https://api.github.com/repos/frida/frida-gum/pulls{/number}","milestones_url":"https://api.github.com/repos/frida/frida-gum/milestones{/number}","notifications_url":"https://api.github.com/repos/frida/frida-gum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/frida/frida-gum/labels{/name}","releases_url":"https://api.github.com/repos/frida/frida-gum/releases{/id}","deployments_url":"https://api.github.com/repos/frida/frida-gum/deployments","created_at":"2013-04-10T07:25:56Z","updated_at":"2016-05-12T17:41:06Z","pushed_at":"2016-06-22T15:16:29Z","git_url":"git://github.com/frida/frida-gum.git","ssh_url":"git@github.com:frida/frida-gum.git","clone_url":"https://github.com/frida/frida-gum.git","svn_url":"https://github.com/frida/frida-gum","homepage":"","size":14876,"stargazers_count":63,"watchers_count":63,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":28,"mirror_url":null,"open_issues_count":32,"forks":28,"open_issues":32,"watchers":63,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/frida/frida-gum/pulls/163"},"html":{"href":"https://github.com/frida/frida-gum/pull/163"},"issue":{"href":"https://api.github.com/repos/frida/frida-gum/issues/163"},"comments":{"href":"https://api.github.com/repos/frida/frida-gum/issues/163/comments"},"review_comments":{"href":"https://api.github.com/repos/frida/frida-gum/pulls/163/comments"},"review_comment":{"href":"https://api.github.com/repos/frida/frida-gum/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/frida/frida-gum/pulls/163/commits"},"statuses":{"href":"https://api.github.com/repos/frida/frida-gum/statuses/8e48bf7c6d5d71d6f6ede359dcdc030f4dfcac50"}}}}
{"actor":{"display_login":"oleavr"}}