{"action":"created","comment":{"url":"https://api.github.com/repos/WebAssembly/design/pulls/comments/50227957","id":50227957,"diff_hunk":"@@ -3,120 +3,143 @@\n This document describes the [portable](Portability.md) binary encoding of the\n [Abstract Syntax Tree](AstSemantics.md) nodes.\n \n-The binary encoding is designed to allow fast startup, which includes reducing\n-download size and allow for quick decoding. For more information, see the \n-[rationale document](Rationale.md#why-a-binary-encoding)\n-\n-Reducing download size, is achieved through three layers:\n-\n- * The **raw** binary encoding itself, natively decoded by the browser, and to\n-   be standardized in the [MVP](MVP.md).\n- * **Specific** compression to the binary encoding, that is unreasonable to\n-   expect a generic compression algorithm like gzip to achieve.\n-   * This is not meant to be standardized, at least not initially, as it can be\n-     done with a downloaded decompressor that runs as web content on the client,\n-     and in particular can be implemented in a [polyfill](Polyfill.md).\n- * **Generic** compression, such as gzip, already supported in browsers. Other\n-   compression algorithms being considered and which might be standardized\n-   include: LZMA, [LZHAM](https://github.com/richgel999/lzham_codec),\n-    [Brotli](https://datatracker.ietf.org/doc/draft-alakuijala-brotli/).\n-\n-## Variable-length integers\n- * [Polyfill prototype](https://github.com/WebAssembly/polyfill-prototype-1) shows significant size savings before (31%) and after (7%) compression.\n- * [LEB128](https://en.wikipedia.org/wiki/LEB128) except limited to uint32_t payloads.\n-\n-## Global structure\n-\n-* A module contains (in this order):\n-  - A header, containing:\n-    + The [magic number](https://en.wikipedia.org/wiki/Magic_number_%28programming%29)\n-    + Other data TBD\n-  - A table (sorted by offset) containing, for each section:\n-    + A string literal section type name\n-    + 64-bit offset within the module\n-  - A sequence of sections\n-* A section contains:\n-  - A header followed by\n-  - The section contents (specific to the section type)\n-* A `definitions` section contains (in this order):\n-  - The generic section header\n-  - A table (sorted by offset) containing, for each type which has operators:\n-    + A standardized string literal [type name](AstSemantics.md#expression-types).\n-      The index of a type name in this table is referred to as a type ID\n-    + 64-bit offset of its operator table within the section\n-  - A sequence of operator tables\n-  - An operator table contains:\n-    + A sequence of standardized string literal [operator names](AstSemantics.md),\n-      where order determines operator index\n-* A `code` section contains (in this order):\n-  - The generic section header\n-  - A table (sorted by offset) containing, for each function:\n-     + Signature\n-     + Function attributes, valid attributes TBD (could include hot/cold, optimization level, noreturn, read/write/pure, ...)\n-     + 64-bit offset within the section\n-  - A sequence of functions\n-  - A function contains:\n-    + A table containing, for each type ID that has [locals](AstSemantics.md#local-variables):\n-      * Type ID\n-      * Count of locals\n-    + The serialized AST\n-* A `data` section contains (in this order):\n-   - The generic section header\n-   - A sequence of byte ranges within the binary and corresponding addresses in the linear memory\n-\n-\n-All strings are encoded as null-terminated UTF8. Data segments represent\n-initialized data that is loaded directly from the binary into the linear memory\n-when the program starts (see [modules](Modules.md#linear-memory-section)).\n-\n-## Serialized AST\n-\n-* Use a preorder encoding of the AST\n-  * Efficient single-pass validation+compilation and polyfill\n-* The data of a node (if there is any), is written immediately after the operator and before child nodes\n-  * The operator statically determines what follows, so no generic metadata is necessary.\n+The binary encoding is a general representation of syntax trees and module\n+information that enables small files, fast decoding, and reduced memory usage.\n+See the [rationale document](Rationale.md#why-a-binary-encoding) for more detail.\n+\n+The encoding is split into three layers:\n+\n+* **Layer 0** is a simple pre-order encoding of the AST and related data structures.\n+  The encoding is dense and trivial to interact with, making it suitable for\n+  scenarios like JIT, instrumentation tools, and debugging.\n+* **Layer 1** provides structural compression on top of layer 0, exploiting\n+  specific knowledge about the nature of the syntax tree and its nodes.\n+  The structural compression introduces more efficient encoding of values, \n+  rearranges values within the module, and prunes structurally identical\n+  tree nodes.\n+* **Layer 2** applies generic compression techniques, already available\n+  in browsers and other tooling. Algorithms as simple as gzip can deliver\n+  good results, but more sophisticated algorithms like \n+  [LZHAM](https://github.com/richgel999/lzham_codec) and\n+  [Brotli](https://datatracker.ietf.org/doc/draft-alakuijala-brotli/) are able\n+  to deliver dramatically smaller files.\n+\n+Most importantly, the layering approach allows development and standardization to\n+occur incrementally, even though production-quality implementations will need to\n+implement all of the layers.\n+\n+# Primitives and key terminology\n+\n+### varuint32\n+A [LEB128](https://en.wikipedia.org/wiki/LEB128) variable-length integer, limited to uint32_t payloads. Provides considerable size reduction.\n+\n+### Pre-order encoding\n+Refers to an approach for encoding syntax trees, where each node begins with an identifier, followed by any arguments or child nodes.\n+Pre-order trees can be decoded iteratively or recursively. Alternative approaches include post-order trees and table representations.\n+\n * Examples\n   * Given a simple AST node: `struct I32Add { AstNode *left, *right; }`\n     * First write the operator of `I32Add` (1 byte)\n     * Then recursively write the left and right nodes.\n+\n   * Given a call AST node: `struct Call { uint32_t callee; vector<AstNode*> args; }`\n     * First write the operator of `Call` (1 byte)\n     * Then write the (variable-length) integer `Call::callee` (1-5 bytes)\n     * Then recursively write each arg node (arity is determined by looking up `callee` in table of signatures)\n \n-## Backwards Compatibility\n-\n-As explained above, for size- and decode-efficiency, the binary format will serialize AST nodes,\n-their contents and children using dense integer indices and without any kind of embedded metadata \n-or tagging. This raises the question of how to reconcile the efficient encoding with the \n-backwards-compatibility goals.\n-\n-Specifically, we'd like to avoid the situation where a future version of WebAssembly has features \n-F1 and F2 and vendor V1 implements F1, assigning the next logical operator indices to F1's new\n-operators, and V2 implements F2, assigning the same next logical operator indices to F2's new operators \n-and now a single binary has ambiguous semantics if it tries to use either F1 or F2. This type of \n-non-linear feature addition is commonplace in JavaScript and Web APIs and is guarded against by \n-having unique names for unique features (and associated [conventions](https://hsivonen.fi/vendor-prefixes/)).\n-\n-The current proposal is to maintain both the efficiency of indices in the [serialized AST](BinaryEncoding.md#serialized-ast) and the established\n-conflict-avoidance practices surrounding string names:\n-  * The WebAssembly spec doesn't define any global index spaces\n-    * So, as a general rule, no magic numbers in the spec (other than the literal [magic number](https://en.wikipedia.org/wiki/Magic_number_%28programming%29)).\n-  * Instead, a module defines its *own* local index spaces of operators by providing tables *of names*. \n-    * So what the spec *would* define is a set of names and their associated semantics.\n-  * To avoid (over time) large index-space declaration sections that are largely the same\n-    between modules, finalized versions of standards would define named baseline index spaces\n-    that modules could optionally use as a starting point to further refine.\n-    * For example, to use all of [the MVP](MVP.md) plus\n-      [SIMD](PostMVP.md#fixed-width-simd) the declaration could be \"base\"\n-      followed by the list of SIMD operators used.\n-    * This feature would also be most useful for people handwriting the [text format](TextFormat.md).\n-    * However, such a version declaration does not establish a global \"version\" for the module\n-      or affect anything outside of the initialization of the index spaces; decoders would\n-      remain versionless and simply add cases for new *names* (as with current JavaScript parsers).\n-\n-## Proposals\n-\n-The native prototype built for [V8](https://github.com/WebAssembly/v8-native-prototype)\n-implements a binary format that embodies most, but not all of the ideas in this document.\n-It is described in detail in a [public design doc](https://docs.google.com/a/google.com/document/d/1761v1AfhFM5kE8NArF_PyXcl-iVh0Dx3InOrmcyIoiI/pub) and a [copy of the original](https://docs.google.com/document/d/1-G11CnMA0My20KI9D7dBR6ZCPOBCRD0oCH6SHCPFGx0/edit?usp=sharing).\n+### Stream splitting\n+Refers to splitting the single encoded binary stream out into smaller streams, partitioned based on element type or semantic information.\n+Research has shown that splitting constants, names, and opcodes into their own streams increases the effectiveness of generic compression.\n+\n+### Subtree deduplication / nullary macros\n+Identifies and prunes structurally identical nodes and trees of nodes. Most applications contain significant amounts of structural \n+duplication that is not completely erased by generic compression.\n+**Non-nullary macros** are an extension of this technique that enables further compression at the cost of additional complexity.\n+\n+### Index tables\n+Modules contain multiple index tables that assign indexes to key pieces of information like opcodes or data types. This enables\n+compatibility between implementations and allows information to be represented more efficiently.\n+\n+### Sections\n+Modules are split up into sections with well-defined contents that can refer to each other and are identified by name.\n+The use of names allows new section types to be introduced in the future.\n+\n+### Strings\n+Strings are encoded as null-terminated [UTF8](http://unicode.org/faq/utf_bom.html#UTF8).\n+\n+# v8-native module structure\n+\n+The following documents the current v8-native prototype format, not the binary encoding intended for standardization.\n+\n+## High-level structure\n+A module contains (in this order):\n+* A stream of sections, containing for each section:\n+  - ```uint8```: A [section type identifier](https://github.com/v8/v8/blob/master/src/wasm/wasm-module.h#L26) for the section\n+  - The section body (defined below by section type)\n+\n+### Memory section\n+* ```uint8```: The minimum size of the module heap in bytes, as a power of two\n+* ```uint8```: The maximum size of the module heap in bytes, as a power of two\n+* ```uint8```: ```1``` if the module's memory is externally visible\n+\n+### Signatures section\n+* [```varuint32```](#varuint32): The number of function signatures in the section\n+* For each function signature:\n+  - ```uint8```: The number of parameters\n+  - ```uint8```: The function return type, as a [LocalType](https://github.com/v8/v8/blob/master/src/wasm/wasm-opcodes.h#L16)\n+  - For each parameter:\n+    + ```uint8```: The parameter type, as a LocalType\n+\n+### Functions section\n+This section must be preceded by a [Signatures](#signatures-section) section.\n+\n+* ```varuint32```: The number of functions in the section\n+* For each function:\n+  - ```uint8```: The [function declaration bits](https://github.com/v8/v8/blob/master/src/wasm/wasm-module.h#L39)\n+  - ```uint16```: The function signature (as an index into the Signatures section)\n+  - If the ```kDeclFunctionName``` bit is set:\n+    + ```uint32```: The offset of the function name in the file.\n+  - If the ```kDeclFunctionImport``` bit is set, **the function entry ends here**","path":"BinaryEncoding.md","position":208,"original_position":208,"commit_id":"66c752d6946a4ef53e0b8604576f8401dbcdc531","original_commit_id":"66c752d6946a4ef53e0b8604576f8401dbcdc531","user":{"login":"titzer","id":12184276,"avatar_url":"https://avatars.githubusercontent.com/u/12184276?v=3","gravatar_id":"","url":"https://api.github.com/users/titzer","html_url":"https://github.com/titzer","followers_url":"https://api.github.com/users/titzer/followers","following_url":"https://api.github.com/users/titzer/following{/other_user}","gists_url":"https://api.github.com/users/titzer/gists{/gist_id}","starred_url":"https://api.github.com/users/titzer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/titzer/subscriptions","organizations_url":"https://api.github.com/users/titzer/orgs","repos_url":"https://api.github.com/users/titzer/repos","events_url":"https://api.github.com/users/titzer/events{/privacy}","received_events_url":"https://api.github.com/users/titzer/received_events","type":"User","site_admin":false},"body":"Reverse the condition here, if the kDeclFunctionImport bit is not set, then a function body follows.","created_at":"2016-01-20T08:55:40Z","updated_at":"2016-01-20T08:55:40Z","html_url":"https://github.com/WebAssembly/design/pull/520#discussion_r50227957","pull_request_url":"https://api.github.com/repos/WebAssembly/design/pulls/520","_links":{"self":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/comments/50227957"},"html":{"href":"https://github.com/WebAssembly/design/pull/520#discussion_r50227957"},"pull_request":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/520"}}},"pull_request":{"url":"https://api.github.com/repos/WebAssembly/design/pulls/520","id":56525906,"html_url":"https://github.com/WebAssembly/design/pull/520","diff_url":"https://github.com/WebAssembly/design/pull/520.diff","patch_url":"https://github.com/WebAssembly/design/pull/520.patch","issue_url":"https://api.github.com/repos/WebAssembly/design/issues/520","number":520,"state":"open","locked":false,"title":"Rewrite BinaryEncoding.md to accurately represent the current v8-native decoder","user":{"login":"kg","id":198130,"avatar_url":"https://avatars.githubusercontent.com/u/198130?v=3","gravatar_id":"","url":"https://api.github.com/users/kg","html_url":"https://github.com/kg","followers_url":"https://api.github.com/users/kg/followers","following_url":"https://api.github.com/users/kg/following{/other_user}","gists_url":"https://api.github.com/users/kg/gists{/gist_id}","starred_url":"https://api.github.com/users/kg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kg/subscriptions","organizations_url":"https://api.github.com/users/kg/orgs","repos_url":"https://api.github.com/users/kg/repos","events_url":"https://api.github.com/users/kg/events{/privacy}","received_events_url":"https://api.github.com/users/kg/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-01-19T21:09:58Z","updated_at":"2016-01-20T08:55:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f5ffe7eac02955be3f9584abfd1bb0a786985258","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/WebAssembly/design/pulls/520/commits","review_comments_url":"https://api.github.com/repos/WebAssembly/design/pulls/520/comments","review_comment_url":"https://api.github.com/repos/WebAssembly/design/pulls/comments{/number}","comments_url":"https://api.github.com/repos/WebAssembly/design/issues/520/comments","statuses_url":"https://api.github.com/repos/WebAssembly/design/statuses/66c752d6946a4ef53e0b8604576f8401dbcdc531","head":{"label":"kg:rewrite-binary","ref":"rewrite-binary","sha":"66c752d6946a4ef53e0b8604576f8401dbcdc531","user":{"login":"kg","id":198130,"avatar_url":"https://avatars.githubusercontent.com/u/198130?v=3","gravatar_id":"","url":"https://api.github.com/users/kg","html_url":"https://github.com/kg","followers_url":"https://api.github.com/users/kg/followers","following_url":"https://api.github.com/users/kg/following{/other_user}","gists_url":"https://api.github.com/users/kg/gists{/gist_id}","starred_url":"https://api.github.com/users/kg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kg/subscriptions","organizations_url":"https://api.github.com/users/kg/orgs","repos_url":"https://api.github.com/users/kg/repos","events_url":"https://api.github.com/users/kg/events{/privacy}","received_events_url":"https://api.github.com/users/kg/received_events","type":"User","site_admin":false},"repo":{"id":39026792,"name":"design","full_name":"kg/design","owner":{"login":"kg","id":198130,"avatar_url":"https://avatars.githubusercontent.com/u/198130?v=3","gravatar_id":"","url":"https://api.github.com/users/kg","html_url":"https://github.com/kg","followers_url":"https://api.github.com/users/kg/followers","following_url":"https://api.github.com/users/kg/following{/other_user}","gists_url":"https://api.github.com/users/kg/gists{/gist_id}","starred_url":"https://api.github.com/users/kg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kg/subscriptions","organizations_url":"https://api.github.com/users/kg/orgs","repos_url":"https://api.github.com/users/kg/repos","events_url":"https://api.github.com/users/kg/events{/privacy}","received_events_url":"https://api.github.com/users/kg/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kg/design","description":"WebAssembly Design Documents","fork":true,"url":"https://api.github.com/repos/kg/design","forks_url":"https://api.github.com/repos/kg/design/forks","keys_url":"https://api.github.com/repos/kg/design/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kg/design/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kg/design/teams","hooks_url":"https://api.github.com/repos/kg/design/hooks","issue_events_url":"https://api.github.com/repos/kg/design/issues/events{/number}","events_url":"https://api.github.com/repos/kg/design/events","assignees_url":"https://api.github.com/repos/kg/design/assignees{/user}","branches_url":"https://api.github.com/repos/kg/design/branches{/branch}","tags_url":"https://api.github.com/repos/kg/design/tags","blobs_url":"https://api.github.com/repos/kg/design/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kg/design/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kg/design/git/refs{/sha}","trees_url":"https://api.github.com/repos/kg/design/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kg/design/statuses/{sha}","languages_url":"https://api.github.com/repos/kg/design/languages","stargazers_url":"https://api.github.com/repos/kg/design/stargazers","contributors_url":"https://api.github.com/repos/kg/design/contributors","subscribers_url":"https://api.github.com/repos/kg/design/subscribers","subscription_url":"https://api.github.com/repos/kg/design/subscription","commits_url":"https://api.github.com/repos/kg/design/commits{/sha}","git_commits_url":"https://api.github.com/repos/kg/design/git/commits{/sha}","comments_url":"https://api.github.com/repos/kg/design/comments{/number}","issue_comment_url":"https://api.github.com/repos/kg/design/issues/comments{/number}","contents_url":"https://api.github.com/repos/kg/design/contents/{+path}","compare_url":"https://api.github.com/repos/kg/design/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kg/design/merges","archive_url":"https://api.github.com/repos/kg/design/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kg/design/downloads","issues_url":"https://api.github.com/repos/kg/design/issues{/number}","pulls_url":"https://api.github.com/repos/kg/design/pulls{/number}","milestones_url":"https://api.github.com/repos/kg/design/milestones{/number}","notifications_url":"https://api.github.com/repos/kg/design/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kg/design/labels{/name}","releases_url":"https://api.github.com/repos/kg/design/releases{/id}","created_at":"2015-07-13T17:26:43Z","updated_at":"2016-01-14T23:31:29Z","pushed_at":"2016-01-19T21:10:37Z","git_url":"git://github.com/kg/design.git","ssh_url":"git@github.com:kg/design.git","clone_url":"https://github.com/kg/design.git","svn_url":"https://github.com/kg/design","homepage":"","size":852,"stargazers_count":0,"watchers_count":0,"language":null,"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":"WebAssembly:master","ref":"master","sha":"fb835be063c65cb279021a8d059f43431694ab71","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":34808241,"name":"design","full_name":"WebAssembly/design","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/design","description":"WebAssembly Design Documents","fork":false,"url":"https://api.github.com/repos/WebAssembly/design","forks_url":"https://api.github.com/repos/WebAssembly/design/forks","keys_url":"https://api.github.com/repos/WebAssembly/design/keys{/key_id}","collaborators_url":"https://api.github.com/repos/WebAssembly/design/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/WebAssembly/design/teams","hooks_url":"https://api.github.com/repos/WebAssembly/design/hooks","issue_events_url":"https://api.github.com/repos/WebAssembly/design/issues/events{/number}","events_url":"https://api.github.com/repos/WebAssembly/design/events","assignees_url":"https://api.github.com/repos/WebAssembly/design/assignees{/user}","branches_url":"https://api.github.com/repos/WebAssembly/design/branches{/branch}","tags_url":"https://api.github.com/repos/WebAssembly/design/tags","blobs_url":"https://api.github.com/repos/WebAssembly/design/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/WebAssembly/design/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/WebAssembly/design/git/refs{/sha}","trees_url":"https://api.github.com/repos/WebAssembly/design/git/trees{/sha}","statuses_url":"https://api.github.com/repos/WebAssembly/design/statuses/{sha}","languages_url":"https://api.github.com/repos/WebAssembly/design/languages","stargazers_url":"https://api.github.com/repos/WebAssembly/design/stargazers","contributors_url":"https://api.github.com/repos/WebAssembly/design/contributors","subscribers_url":"https://api.github.com/repos/WebAssembly/design/subscribers","subscription_url":"https://api.github.com/repos/WebAssembly/design/subscription","commits_url":"https://api.github.com/repos/WebAssembly/design/commits{/sha}","git_commits_url":"https://api.github.com/repos/WebAssembly/design/git/commits{/sha}","comments_url":"https://api.github.com/repos/WebAssembly/design/comments{/number}","issue_comment_url":"https://api.github.com/repos/WebAssembly/design/issues/comments{/number}","contents_url":"https://api.github.com/repos/WebAssembly/design/contents/{+path}","compare_url":"https://api.github.com/repos/WebAssembly/design/compare/{base}...{head}","merges_url":"https://api.github.com/repos/WebAssembly/design/merges","archive_url":"https://api.github.com/repos/WebAssembly/design/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/WebAssembly/design/downloads","issues_url":"https://api.github.com/repos/WebAssembly/design/issues{/number}","pulls_url":"https://api.github.com/repos/WebAssembly/design/pulls{/number}","milestones_url":"https://api.github.com/repos/WebAssembly/design/milestones{/number}","notifications_url":"https://api.github.com/repos/WebAssembly/design/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/WebAssembly/design/labels{/name}","releases_url":"https://api.github.com/repos/WebAssembly/design/releases{/id}","created_at":"2015-04-29T17:36:05Z","updated_at":"2016-01-19T21:38:29Z","pushed_at":"2016-01-19T21:09:59Z","git_url":"git://github.com/WebAssembly/design.git","ssh_url":"git@github.com:WebAssembly/design.git","clone_url":"https://github.com/WebAssembly/design.git","svn_url":"https://github.com/WebAssembly/design","homepage":"","size":1857,"stargazers_count":5095,"watchers_count":5095,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":252,"mirror_url":null,"open_issues_count":80,"forks":252,"open_issues":80,"watchers":5095,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/520"},"html":{"href":"https://github.com/WebAssembly/design/pull/520"},"issue":{"href":"https://api.github.com/repos/WebAssembly/design/issues/520"},"comments":{"href":"https://api.github.com/repos/WebAssembly/design/issues/520/comments"},"review_comments":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/520/comments"},"review_comment":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/520/commits"},"statuses":{"href":"https://api.github.com/repos/WebAssembly/design/statuses/66c752d6946a4ef53e0b8604576f8401dbcdc531"}}}}