{"action":"created","comment":{"url":"https://api.github.com/repos/scala-native/scala-native/pulls/comments/67718117","id":67718117,"diff_hunk":"@@ -33,88 +38,230 @@ sealed abstract class Array[T]\n \n   /** Create a shallow of given array. */\n   protected override def clone(): Array[T] = undefined\n-}\n-\n-final class ObjectArray private () extends Array[Object] {\n-  def apply(i: Int): Object =\n+  \n+  /*\n+   * helper methods\n+   */\n+   \n+  /** called by subclass::apply and subclass::update */\n+  protected def pointerAt(sizeOneElement: CSize, i: Int): Ptr[_] = {\n     if (i < 0 || i >= length)\n       throw new IndexOutOfBoundsException(i.toString)\n     else {\n-      val headptr = (this.cast[Ptr[Byte]] + sizeof[ArrayHeader]).cast[Ptr[Object]]\n-      headptr(i)\n+      (this.cast[Ptr[Byte]] + sizeof[ArrayHeader] + sizeOneElement * i).cast[Ptr[_]]\n     }\n+  }\n+  \n+  /** called by subclass::clone.  Allocate memory and copy header and data */\n+  protected def helperClone(sizeofElement: CSize): Ptr[_] = {\n+    val arrsize = sizeof[ArrayHeader] + sizeofElement * length\n+    val arr = runtime.alloc(arrsize)\n+    `llvm.memcpy.p0i8.p0i8.i64`(arr.cast[Ptr[Byte]], this.cast[Ptr[Byte]], arrsize, 1, false)\n+    arr        \n+  }  \n+}\n \n-  def update(i: Int, value: Object): Unit =\n-    if (i < 0 || i >= length)\n-      throw new IndexOutOfBoundsException(i.toString)\n-    else {\n-      val headptr = (this.cast[Ptr[Byte]] + sizeof[ArrayHeader]).cast[Ptr[Object]]\n-      headptr(i) = value\n-    }\n+/** Utilities methods\n+  *\n+  */\n+\n+object Array {\n+  /*\n+   *\n+   */    \n+  def copy (from: AnyRef, fromPos: Int, to: AnyRef, toPos: Int, length: Int): Unit = {\n+    if (from == null)\n+      throw new NullPointerException()\n+    \n+    if (to == null)\n+      throw new NullPointerException()\n+    \n+    val fromTypeId = instanceTypeId(from)\n+    val toTypeId = instanceTypeId(to)\n+    \n+    if (fromTypeId == arrayObjectTypeId && toTypeId == arrayObjectTypeId) \n+      throw new ArrayStoreException (\"copy from object array to object array isn't implemented yet\")    \n+    \n+% for T in primitiveTypes:\n+\n+    else if (fromTypeId == array${T}TypeId && toTypeId == array${T}TypeId) \n+      from.asInstanceOf[${T}Array].copyToArray (fromPos, to.asInstanceOf[${T}Array], toPos, length)\n+      \n+% end\n \n-  protected override def clone(): ObjectArray = {\n-    val newarr = ObjectArray.alloc(length)\n-    ObjectArray.copy(this, 0, newarr, 0, length)\n-    newarr\n+    else\n+      throw new ArrayStoreException (\"Not implemented yet.\")\n   }\n-}\n+  \n+  /*\n+   * the id's chosen by the compiler/linker for differents types of array\n+   */\n \n-object ObjectArray {\n-  def copy(from: ObjectArray, fromPos: Int,\n-           to: ObjectArray, toPos: Int, length: Int): Unit = {\n-    ???\n+  val arrayObjectTypeId = typeId (typeof[scalanative.runtime.ObjectArray])\n+  \n+% for T in primitiveTypes:\n+\n+  val array${T}TypeId = typeId (typeof[scalanative.runtime.${T}Array])\n+  \n+% end  \n+    \n+  /** \n+    *\n+    */      \n+  private def typeId (ptr : Ptr[Type]): Int = {\n+    (!ptr).id    \n+  }\n+  \n+  /** \n+    *\n+    */      \n+  private def instanceTypeId (any : AnyRef): Int = {\n+    typeId(runtime.getType(any))\n   }\n+  \n+  /*\n+   * validate boundaries and check overlap\n+   *\n+   * return:\n+   *  == 0: no overlap\n+   *  != 0: overlap, the sign indicates if forward or backward copy is needed   \n+   */   \n+  private[runtime] def validateBoundaries (from: Array[_], fromPos: Int, to: Array[_], toPos: Int, len: Int): Int = {\n+    if (len < 0)\n+      throw new IndexOutOfBoundsException(\"length is negative\")\n \n-  def alloc(length: Int): ObjectArray = {\n-    val arrty = typeof[ObjectArray]\n-    val arrsize = sizeof[ArrayHeader] + sizeof[Object] * length\n-    val arr = runtime.alloc(arrty, arrsize)\n+    if (fromPos < 0 || fromPos + len > from.length)\n+      throw new IndexOutOfBoundsException(fromPos.toString)\n+\n+    if (toPos < 0 || toPos + len > to.length)\n+      throw new IndexOutOfBoundsException(toPos.toString)\n+    \n+    if (from == to) {\n+      if (fromPos < toPos && fromPos + len > toPos)\n+        -1  // backward copy\n+      else if (fromPos > toPos && toPos + len > fromPos)\n+        1 // forward copy\n+      else\n+        0\n+    }\n+    else\n+      0\n+  }\n+     \n+  /*\n+   * only used by ObjectArray\n+   */   \n+  def alloc(length: Int, arrinfo:  Ptr[Type], sizeofElement: CSize): Ptr[_] = {\n+    val arrsize = sizeof[ArrayHeader] + sizeofElement * length\n+    val arr = runtime.alloc(arrinfo, arrsize)\n     // set the length\n-    !(arr.cast[Ptr[Byte]] + sizeof[Ptr[_]]).cast[Ptr[Int]] = length\n-    arr.cast[ObjectArray]\n+    !(arr.cast[Ptr[Byte]] + sizeof[Ptr[_]]).cast[Ptr[Int]] = length    \n+    arr        \n+  } \n+}\n+\n+/*\n+ * \n+ */\n+ \n+abstract class PrimitiveArray[T] extends Array[T] {\n+  /** called by subclass::clone.  Allocate memory using GC_malloc_atomic and copy header and data */\n+  override protected def helperClone(sizeofElement: CSize): Ptr[_] = {\n+    val arrsize = sizeof[ArrayHeader] + sizeofElement * length\n+    val arr = runtime.allocAtomic(arrsize)\n+    `llvm.memcpy.p0i8.p0i8.i64`(arr.cast[Ptr[Byte]], this.cast[Ptr[Byte]], arrsize, 1, false)\n+    arr\n+  }  \n+}\n+\n+/*\n+ * \n+ */\n+\n+object PrimitiveArray {\n+  /*\n+   * Primitive arrays don't contain pointers \n+   */   \n+  def alloc(length: Int, arrinfo:  Ptr[Type], sizeofElement: CSize): Ptr[_] = {\n+    val arrsize = sizeof[ArrayHeader] + sizeofElement * length\n+    val arr = runtime.allocAtomic(arrinfo, arrsize)\n+    // set the length\n+    !(arr.cast[Ptr[Byte]] + sizeof[Ptr[_]]).cast[Ptr[Int]] = length    \n+    arr        \n   }\n }\n \n+/*\n+ *\n+ */\n+final class ObjectArray private () extends Array[Object] {\n+  def apply(i: Int): Object = ! (pointerAt(sizeof[Object], i).cast[Ptr[Object]])\n+\n+  def update(i: Int, value: Object): Unit = ! (pointerAt(sizeof[Object], i).cast[Ptr[Object]]) = value\n+\n+  protected override def clone(): ObjectArray = helperClone (sizeof[Object]).cast[ObjectArray]  \n+}\n+\n+object ObjectArray {\n+  def alloc(length: Int): ObjectArray = Array.alloc(length, typeof[ObjectArray], sizeof[Object]).cast[ObjectArray]\n+}\n+\n % for T in primitiveTypes:\n \n-final class ${T}Array private () extends Array[${T}] {\n-  def apply(i: Int): ${T} =\n-    if (i < 0 || i >= length)\n-      throw new IndexOutOfBoundsException(i.toString)\n-    else {\n-      val headptr = (this.cast[Ptr[Byte]] + sizeof[ArrayHeader]).cast[Ptr[${T}]]\n-      headptr(i)\n-    }\n+final class ${T}Array private () extends PrimitiveArray[${T}] {\n+  def apply(i: Int): ${T} = ! (pointerAt(sizeof[${T}], i).cast[Ptr[${T}]])\n \n-  def update(i: Int, value: ${T}): Unit =\n-    if (i < 0 || i >= length)\n-      throw new IndexOutOfBoundsException(i.toString)\n-    else {\n-      val headptr = (this.cast[Ptr[Byte]] + sizeof[ArrayHeader]).cast[Ptr[${T}]]\n-      headptr(i) = value\n-    }\n+  def update(i: Int, value: ${T}): Unit = ! (pointerAt(sizeof[${T}], i).cast[Ptr[${T}]]) = value\n \n-  protected override def clone(): ${T}Array = {\n-    val newarr = ${T}Array.alloc(length)\n-    ${T}Array.copy(this, 0, newarr, 0, length)\n-    newarr\n-  }\n+  protected override def clone(): ${T}Array = helperClone (sizeof[${T}]).cast[${T}Array]\n+  \n+  protected def copyTo (fromPos: Int, toPos: Int): Unit = update (toPos, apply(fromPos)) ","path":"nativelib/src/main/scala/scala/scalanative/runtime/Arrays.scala.gyb","position":270,"original_position":270,"commit_id":"fe75dd866c560d17775b7b99077015df0a72ba70","original_commit_id":"fe75dd866c560d17775b7b99077015df0a72ba70","user":{"login":"densh","id":320966,"avatar_url":"https://avatars.githubusercontent.com/u/320966?v=3","gravatar_id":"","url":"https://api.github.com/users/densh","html_url":"https://github.com/densh","followers_url":"https://api.github.com/users/densh/followers","following_url":"https://api.github.com/users/densh/following{/other_user}","gists_url":"https://api.github.com/users/densh/gists{/gist_id}","starred_url":"https://api.github.com/users/densh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/densh/subscriptions","organizations_url":"https://api.github.com/users/densh/orgs","repos_url":"https://api.github.com/users/densh/repos","events_url":"https://api.github.com/users/densh/events{/privacy}","received_events_url":"https://api.github.com/users/densh/received_events","type":"User","site_admin":false},"body":"Additionally, all helpers should also be marked with `@inline`. ","created_at":"2016-06-20T16:13:26Z","updated_at":"2016-06-20T16:13:26Z","html_url":"https://github.com/scala-native/scala-native/pull/184#discussion_r67718117","pull_request_url":"https://api.github.com/repos/scala-native/scala-native/pulls/184","_links":{"self":{"href":"https://api.github.com/repos/scala-native/scala-native/pulls/comments/67718117"},"html":{"href":"https://github.com/scala-native/scala-native/pull/184#discussion_r67718117"},"pull_request":{"href":"https://api.github.com/repos/scala-native/scala-native/pulls/184"}}},"pull_request":{"url":"https://api.github.com/repos/scala-native/scala-native/pulls/184","id":73987196,"html_url":"https://github.com/scala-native/scala-native/pull/184","diff_url":"https://github.com/scala-native/scala-native/pull/184.diff","patch_url":"https://github.com/scala-native/scala-native/pull/184.patch","issue_url":"https://api.github.com/repos/scala-native/scala-native/issues/184","number":184,"state":"open","locked":false,"title":"implement array.clone() and basic array.copy()","user":{"login":"fbertra","id":18035,"avatar_url":"https://avatars.githubusercontent.com/u/18035?v=3","gravatar_id":"","url":"https://api.github.com/users/fbertra","html_url":"https://github.com/fbertra","followers_url":"https://api.github.com/users/fbertra/followers","following_url":"https://api.github.com/users/fbertra/following{/other_user}","gists_url":"https://api.github.com/users/fbertra/gists{/gist_id}","starred_url":"https://api.github.com/users/fbertra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fbertra/subscriptions","organizations_url":"https://api.github.com/users/fbertra/orgs","repos_url":"https://api.github.com/users/fbertra/repos","events_url":"https://api.github.com/users/fbertra/events{/privacy}","received_events_url":"https://api.github.com/users/fbertra/received_events","type":"User","site_admin":false},"body":"Modified files:\r\n\r\nMain logic:\r\n- nativelib/src/main/scala/scala/scalanative/runtime/Arrays.scala\r\n- nativelib/src/main/scala/scala/scalanative/runtime/Arrays.scala.gyb  \r\n\r\nNew methods to allocate memory for array::clone()\r\n- nativelib/src/main/scala/scala/scalanative/runtime/package.scala\r\n\r\nCall scalanative.runtime.Array::copy from java/scala legacy methods\r\n- scalalib/overrides-2.11/scala/Array.scala\r\n- javalib/src/main/scala/java/lang/System.scala\r\n","created_at":"2016-06-15T21:27:04Z","updated_at":"2016-06-20T16:13:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8bbe1c682e9501ac22ab912e1be6bba1302703c2","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scala-native/scala-native/pulls/184/commits","review_comments_url":"https://api.github.com/repos/scala-native/scala-native/pulls/184/comments","review_comment_url":"https://api.github.com/repos/scala-native/scala-native/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scala-native/scala-native/issues/184/comments","statuses_url":"https://api.github.com/repos/scala-native/scala-native/statuses/fe75dd866c560d17775b7b99077015df0a72ba70","head":{"label":"fbertra:implement_array_clone_basic_copy_pr","ref":"implement_array_clone_basic_copy_pr","sha":"fe75dd866c560d17775b7b99077015df0a72ba70","user":{"login":"fbertra","id":18035,"avatar_url":"https://avatars.githubusercontent.com/u/18035?v=3","gravatar_id":"","url":"https://api.github.com/users/fbertra","html_url":"https://github.com/fbertra","followers_url":"https://api.github.com/users/fbertra/followers","following_url":"https://api.github.com/users/fbertra/following{/other_user}","gists_url":"https://api.github.com/users/fbertra/gists{/gist_id}","starred_url":"https://api.github.com/users/fbertra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fbertra/subscriptions","organizations_url":"https://api.github.com/users/fbertra/orgs","repos_url":"https://api.github.com/users/fbertra/repos","events_url":"https://api.github.com/users/fbertra/events{/privacy}","received_events_url":"https://api.github.com/users/fbertra/received_events","type":"User","site_admin":false},"repo":{"id":59599153,"name":"scala-native","full_name":"fbertra/scala-native","owner":{"login":"fbertra","id":18035,"avatar_url":"https://avatars.githubusercontent.com/u/18035?v=3","gravatar_id":"","url":"https://api.github.com/users/fbertra","html_url":"https://github.com/fbertra","followers_url":"https://api.github.com/users/fbertra/followers","following_url":"https://api.github.com/users/fbertra/following{/other_user}","gists_url":"https://api.github.com/users/fbertra/gists{/gist_id}","starred_url":"https://api.github.com/users/fbertra/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fbertra/subscriptions","organizations_url":"https://api.github.com/users/fbertra/orgs","repos_url":"https://api.github.com/users/fbertra/repos","events_url":"https://api.github.com/users/fbertra/events{/privacy}","received_events_url":"https://api.github.com/users/fbertra/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/fbertra/scala-native","description":"Your favourite language gets closer to bare metal.","fork":true,"url":"https://api.github.com/repos/fbertra/scala-native","forks_url":"https://api.github.com/repos/fbertra/scala-native/forks","keys_url":"https://api.github.com/repos/fbertra/scala-native/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fbertra/scala-native/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fbertra/scala-native/teams","hooks_url":"https://api.github.com/repos/fbertra/scala-native/hooks","issue_events_url":"https://api.github.com/repos/fbertra/scala-native/issues/events{/number}","events_url":"https://api.github.com/repos/fbertra/scala-native/events","assignees_url":"https://api.github.com/repos/fbertra/scala-native/assignees{/user}","branches_url":"https://api.github.com/repos/fbertra/scala-native/branches{/branch}","tags_url":"https://api.github.com/repos/fbertra/scala-native/tags","blobs_url":"https://api.github.com/repos/fbertra/scala-native/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fbertra/scala-native/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fbertra/scala-native/git/refs{/sha}","trees_url":"https://api.github.com/repos/fbertra/scala-native/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fbertra/scala-native/statuses/{sha}","languages_url":"https://api.github.com/repos/fbertra/scala-native/languages","stargazers_url":"https://api.github.com/repos/fbertra/scala-native/stargazers","contributors_url":"https://api.github.com/repos/fbertra/scala-native/contributors","subscribers_url":"https://api.github.com/repos/fbertra/scala-native/subscribers","subscription_url":"https://api.github.com/repos/fbertra/scala-native/subscription","commits_url":"https://api.github.com/repos/fbertra/scala-native/commits{/sha}","git_commits_url":"https://api.github.com/repos/fbertra/scala-native/git/commits{/sha}","comments_url":"https://api.github.com/repos/fbertra/scala-native/comments{/number}","issue_comment_url":"https://api.github.com/repos/fbertra/scala-native/issues/comments{/number}","contents_url":"https://api.github.com/repos/fbertra/scala-native/contents/{+path}","compare_url":"https://api.github.com/repos/fbertra/scala-native/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fbertra/scala-native/merges","archive_url":"https://api.github.com/repos/fbertra/scala-native/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fbertra/scala-native/downloads","issues_url":"https://api.github.com/repos/fbertra/scala-native/issues{/number}","pulls_url":"https://api.github.com/repos/fbertra/scala-native/pulls{/number}","milestones_url":"https://api.github.com/repos/fbertra/scala-native/milestones{/number}","notifications_url":"https://api.github.com/repos/fbertra/scala-native/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fbertra/scala-native/labels{/name}","releases_url":"https://api.github.com/repos/fbertra/scala-native/releases{/id}","deployments_url":"https://api.github.com/repos/fbertra/scala-native/deployments","created_at":"2016-05-24T18:41:11Z","updated_at":"2016-05-24T18:41:13Z","pushed_at":"2016-06-15T21:58:57Z","git_url":"git://github.com/fbertra/scala-native.git","ssh_url":"git@github.com:fbertra/scala-native.git","clone_url":"https://github.com/fbertra/scala-native.git","svn_url":"https://github.com/fbertra/scala-native","homepage":"http://scala-native.org","size":2236,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"scala-native:master","ref":"master","sha":"0d496231d3d27137edc6267ff86b2e5addf75f9d","user":{"login":"scala-native","id":17545605,"avatar_url":"https://avatars.githubusercontent.com/u/17545605?v=3","gravatar_id":"","url":"https://api.github.com/users/scala-native","html_url":"https://github.com/scala-native","followers_url":"https://api.github.com/users/scala-native/followers","following_url":"https://api.github.com/users/scala-native/following{/other_user}","gists_url":"https://api.github.com/users/scala-native/gists{/gist_id}","starred_url":"https://api.github.com/users/scala-native/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scala-native/subscriptions","organizations_url":"https://api.github.com/users/scala-native/orgs","repos_url":"https://api.github.com/users/scala-native/repos","events_url":"https://api.github.com/users/scala-native/events{/privacy}","received_events_url":"https://api.github.com/users/scala-native/received_events","type":"Organization","site_admin":false},"repo":{"id":27235687,"name":"scala-native","full_name":"scala-native/scala-native","owner":{"login":"scala-native","id":17545605,"avatar_url":"https://avatars.githubusercontent.com/u/17545605?v=3","gravatar_id":"","url":"https://api.github.com/users/scala-native","html_url":"https://github.com/scala-native","followers_url":"https://api.github.com/users/scala-native/followers","following_url":"https://api.github.com/users/scala-native/following{/other_user}","gists_url":"https://api.github.com/users/scala-native/gists{/gist_id}","starred_url":"https://api.github.com/users/scala-native/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scala-native/subscriptions","organizations_url":"https://api.github.com/users/scala-native/orgs","repos_url":"https://api.github.com/users/scala-native/repos","events_url":"https://api.github.com/users/scala-native/events{/privacy}","received_events_url":"https://api.github.com/users/scala-native/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scala-native/scala-native","description":"Your favourite language gets closer to bare metal.","fork":false,"url":"https://api.github.com/repos/scala-native/scala-native","forks_url":"https://api.github.com/repos/scala-native/scala-native/forks","keys_url":"https://api.github.com/repos/scala-native/scala-native/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scala-native/scala-native/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scala-native/scala-native/teams","hooks_url":"https://api.github.com/repos/scala-native/scala-native/hooks","issue_events_url":"https://api.github.com/repos/scala-native/scala-native/issues/events{/number}","events_url":"https://api.github.com/repos/scala-native/scala-native/events","assignees_url":"https://api.github.com/repos/scala-native/scala-native/assignees{/user}","branches_url":"https://api.github.com/repos/scala-native/scala-native/branches{/branch}","tags_url":"https://api.github.com/repos/scala-native/scala-native/tags","blobs_url":"https://api.github.com/repos/scala-native/scala-native/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scala-native/scala-native/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scala-native/scala-native/git/refs{/sha}","trees_url":"https://api.github.com/repos/scala-native/scala-native/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scala-native/scala-native/statuses/{sha}","languages_url":"https://api.github.com/repos/scala-native/scala-native/languages","stargazers_url":"https://api.github.com/repos/scala-native/scala-native/stargazers","contributors_url":"https://api.github.com/repos/scala-native/scala-native/contributors","subscribers_url":"https://api.github.com/repos/scala-native/scala-native/subscribers","subscription_url":"https://api.github.com/repos/scala-native/scala-native/subscription","commits_url":"https://api.github.com/repos/scala-native/scala-native/commits{/sha}","git_commits_url":"https://api.github.com/repos/scala-native/scala-native/git/commits{/sha}","comments_url":"https://api.github.com/repos/scala-native/scala-native/comments{/number}","issue_comment_url":"https://api.github.com/repos/scala-native/scala-native/issues/comments{/number}","contents_url":"https://api.github.com/repos/scala-native/scala-native/contents/{+path}","compare_url":"https://api.github.com/repos/scala-native/scala-native/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scala-native/scala-native/merges","archive_url":"https://api.github.com/repos/scala-native/scala-native/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scala-native/scala-native/downloads","issues_url":"https://api.github.com/repos/scala-native/scala-native/issues{/number}","pulls_url":"https://api.github.com/repos/scala-native/scala-native/pulls{/number}","milestones_url":"https://api.github.com/repos/scala-native/scala-native/milestones{/number}","notifications_url":"https://api.github.com/repos/scala-native/scala-native/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scala-native/scala-native/labels{/name}","releases_url":"https://api.github.com/repos/scala-native/scala-native/releases{/id}","deployments_url":"https://api.github.com/repos/scala-native/scala-native/deployments","created_at":"2014-11-27T17:38:28Z","updated_at":"2016-06-20T16:10:52Z","pushed_at":"2016-06-20T15:54:44Z","git_url":"git://github.com/scala-native/scala-native.git","ssh_url":"git@github.com:scala-native/scala-native.git","clone_url":"https://github.com/scala-native/scala-native.git","svn_url":"https://github.com/scala-native/scala-native","homepage":"http://scala-native.org","size":2399,"stargazers_count":1823,"watchers_count":1823,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":72,"mirror_url":null,"open_issues_count":68,"forks":72,"open_issues":68,"watchers":1823,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scala-native/scala-native/pulls/184"},"html":{"href":"https://github.com/scala-native/scala-native/pull/184"},"issue":{"href":"https://api.github.com/repos/scala-native/scala-native/issues/184"},"comments":{"href":"https://api.github.com/repos/scala-native/scala-native/issues/184/comments"},"review_comments":{"href":"https://api.github.com/repos/scala-native/scala-native/pulls/184/comments"},"review_comment":{"href":"https://api.github.com/repos/scala-native/scala-native/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scala-native/scala-native/pulls/184/commits"},"statuses":{"href":"https://api.github.com/repos/scala-native/scala-native/statuses/fe75dd866c560d17775b7b99077015df0a72ba70"}}}}
{"actor":{"display_login":"densh"}}