{"action":"created","comment":{"url":"https://api.github.com/repos/WebAssembly/design/pulls/comments/35161905","id":35161905,"diff_hunk":"@@ -66,16 +66,160 @@ Options under consideration:\n \n ## GC/DOM Integration\n \n-* Access to certain kinds of Garbage-Collected (GC) objects from variables,\n-  arguments, expressions.\n-* Ability to GC-allocate certain kinds of GC objects.\n-* Initially, things with fixed structure:\n-  * JavaScript strings;\n-  * JavaScript functions (as callable closures);\n-  * Typed Arrays;\n-  * [Typed objects](https://github.com/nikomatsakis/typed-objects-explainer/);\n-  * DOM objects via WebIDL.\n-* Perhaps a rooting API for safe reference from the linear address space.\n+To realize the [high-level goals](HighLevelGoals.md) of (1) integrating well\n+with the existing web platform and (2) supporting languages other than C++,\n+WebAssembly needs to be able to:\n+* reference DOM and other Web API objects directly from WebAssembly code;\n+* efficiently allocate and manipulate GC objects directly from WebAssembly\n+  code; and\n+* call Web APIs (passing primitives or DOM/GC/Web API objects) directly from\n+  WebAssembly without calling through JS.\n+\n+These goals can be separated into two complementary sub-features that are\n+specified independently of JS and the Web platform but allow a natural\n+integration.\n+\n+### Opaque reference types\n+\n+The first sub-feature is to extend [module imports](Modules.md#imports-and-exports)\n+to allow modules to import *opaque reference types*. \"Opaque\" means that the\n+reference type itself has no structural content and does not, e.g., define any\n+methods or fields. Once imported, an opaque reference type can be used in the\n+signature of other imported functions. Thus, the point of an opaque reference\n+type is to be passed to and returned from exported functions.\n+\n+Reference types are allowed to be used as the types of locals, parameters\n+and return types. Additionally, references would be allowed as operands to\n+operators that treat their values as black boxes (`conditional`, `comma`, maybe\n+`eq`, etc.). A new `dynamic_cast` operator would be added to allow checked\n+casting from any opaque reference type to any other opaque reference type.\n+Whether the cast succeeds is up to the host environment; WebAssembly itself\n+will define no a priori subtyping relationship.\n+\n+For reasons of safety and limiting nondeterminism, imported opaque reference\n+types would not be able to be loaded from or stored to linear memory where they\n+could otherwise be arbitrarily aliased as integers. Instead, a new set of\n+operations would be added for allocating, deallocating, loading and storing\n+from integer-indexed cells that could hold references and were not aliasable by\n+linear memory. There are several important alternatives to consider:\n+* LIFO allocation of cells versus (or in addition to) ad hoc explicit\n+  allocation and deallocation.\n+* Untyped cells (requiring `dynamic_cast` after load before use) vs. \n+  typed cells (with a separate index per type).\n+* Cells that hold a weak reference.\n+\n+With opaque reference types expressed as imports, host environments can provide\n+access to various kinds of reference-counted or garbage-collected host-defined\n+objects via builtin modules. While this design does not mandate a JS VM or\n+browser, it does allow natural integration with both\n+[JS](FutureFeatures.md#js-integration) and\n+[WebIDL](FutureFeatures.md#webidl-integration)\n+in a Web environment.\n+\n+### JS integration\n+\n+Using [opaque reference types](FutureFeatures.md#opaque-reference-types),\n+JS values could be made accessible to WebAssembly code through a builtin\n+`js` module providing:\n+* an exported `string` opaque reference type and exported functions\n+  to allocate, query length, and index `string` values;\n+* an exported `object` opaque reference type and exported functions\n+  that correspond with the ES5 meta-object protocol;\n+* an exported `value` opaque reference type with exported functions for\n+  constructing `value`s from integers, floats, `object`s, and `string`s and\n+  with exported functions for querying the type of a `value` and extracting the\n+  abovementioned payload types.\n+\n+Since a browser's WebAssembly engine would have full knowledge of the `js`\n+builtin module, it should be able to optimize string/object accesses as well as\n+a normal JS JIT (perhaps even using the same JIT compiler).\n+\n+### WebIDL integration\n+\n+Using [opaque reference types](FutureFeatures.md#opaque-reference-types), it\n+would be possible to allow direct access to DOM and Web APIs by mapping their\n+[WebIDL](http://www.w3.org/TR/WebIDL) interfaces to WebAssembly builtin module \n+signatures. In particular:\n+* WebIDL interfaces (like \n+  [WebGLRenderingContextBase](https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14)\n+  or [WebGLTexture](https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.9))\n+  would map to exported [opaque reference types](FutureFeatures.md#opaque-reference-types);\n+* methods of WebIDL interfaces would map to exported functions where the\n+  receiver was translated into an explicit argument and WebIDL value\n+  types were mapped to appropriate [local types](AstSemantics.md#local-types)\n+  (e.g., [bindTexture](https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14)\n+  would translate to `void (WebGLRenderingContextBase, int32, WebGLTexture?)`).\n+\n+This high-level description glosses over many important details about WebIDL:\n+\n+First, the WebIDL spec contains many JavaScript-specific details that are\n+unnecessary in a WebAssembly context. In particular, there are basically three\n+components specified by a WebIDL interface:\n+\n+1. a signature declaration composed of language-independent data types (like\n+   IEEE754 doubles and floats);\n+2. a set of basic wellformedness checks that are executed on the arguments of\n+   the signature declared in (1); and\n+3. a JavaScript-specific algorithm that maps the arbitrary set of JavaScript\n+   values passed to a WebIDL invocation to the signature declared by (1) and\n+   checked by (2).\n+\n+(1) and (2) of the WebIDL spec are meaningful to WebAssembly, but (3)\n+would effectively be skipped.\n+\n+Another important issue is mapping WebIDL values types that aren't simple\n+[primitive types](http://www.w3.org/TR/WebIDL/#dfn-primitive-type):\n+* [Dictionary types](http://www.w3.org/TR/WebIDL/#idl-dictionary)\n+  would [appear](http://www.w3.org/TR/WebIDL/#es-dictionary) to require\n+  JS objects but are actually defined as values such that they can\n+  be (and are, in various browser implementations) flattened to C structs.\n+  Thus, a natural WebAssembly binding would be to map dictionaries to structs\n+  in linear memory passed by reference (integer offset).\n+* The same goes for [sequence types](http://www.w3.org/TR/WebIDL/#idl-sequence).\n+* [Enumeration types](http://www.w3.org/TR/WebIDL/#es-enumeration) could be\n+  mapped to canonical integers.\n+* [Union types](http://www.w3.org/TR/WebIDL/#idl-union) could be handled in\n+  multiple ways. One option is to treat the union type itself as an importable\n+  opaque reference type (when all the elements are themselves reference types).\n+  Another option is to introduce an overload of each signature for each element\n+  of the union type such that all calls passed a single element type and the\n+  full Union Type was never explicitly represented in WebAssembly.\n+* [Callback function types](http://www.w3.org/TR/WebIDL/#es-callback-function)\n+  could map to a `(function pointer, environment pointer)` closure pair.\n+\n+Overall, the goal of mapping WebIDL to WebAssembly builtin modules is to avoid\n+the need to define a duplicate WebAssembly interface for all Web APIs.  In\n+practice, some WebIDL patterns may have an unnatural or inefficient mapping\n+into WebAssembly such that new overloads and best practices would need to be\n+adopted. Over time, though, these rough edges would be ironed out leaving the\n+long term benefit of defining Web APIs with a single interface and ensuring\n+that JS and WebAssembly always had access to the same raw functionality.\n+\n+### Direct GC access\n+\n+In contract to *opaque* reference types, a second sub-feature would be to allow\n+direct GC allocation and field access from WebAssembly code through\n+*non-opaque* reference types.\n+\n+There is a lot of the design left to\n+consider for this feature, but a few points of tentative agreement are:\n+* To avoid baking in a single language's object model, define low-level GC\n+  primitives (viz., structs and arrays) and allow the source language compiler\n+  to build up features like virtual dispatch and access control.\n+* GC struct and array types would have associated *struct/array reference\n+  types* that were similar to and symmetric with \n+  [opaque reference types](FutureFeatures.md#opaque-reference-types)\n+  (just not opaque).\n+* The GC heap would be semantically distinct from linear memory and thus","path":"FutureFeatures.md","position":158,"original_position":158,"commit_id":"c91866bc4e4b1b63fcefcbc95a4e77fc4c492a5c","original_commit_id":"c91866bc4e4b1b63fcefcbc95a4e77fc4c492a5c","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":"I see, yes. IIUC, in C++/CLI, one can allocate e.g. C# structs on the regular C++ stack, which seems quite different than for us. Although I suppose that might have been mostly a syntactic sugar issue, and the compiler did actually manage two separate stacks, and so we are closer to the output of the C++/CLI compiler than its input.","created_at":"2015-07-21T22:23:04Z","updated_at":"2015-07-21T22:23:04Z","html_url":"https://github.com/WebAssembly/design/pull/275#discussion_r35161905","pull_request_url":"https://api.github.com/repos/WebAssembly/design/pulls/275","_links":{"self":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/comments/35161905"},"html":{"href":"https://github.com/WebAssembly/design/pull/275#discussion_r35161905"},"pull_request":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/275"}}},"pull_request":{"url":"https://api.github.com/repos/WebAssembly/design/pulls/275","id":40508447,"html_url":"https://github.com/WebAssembly/design/pull/275","diff_url":"https://github.com/WebAssembly/design/pull/275.diff","patch_url":"https://github.com/WebAssembly/design/pull/275.patch","issue_url":"https://api.github.com/repos/WebAssembly/design/issues/275","number":275,"state":"open","locked":false,"title":"Fill in a more detailed sketch for GC/DOM/Web API integration","user":{"login":"lukewagner","id":9660325,"avatar_url":"https://avatars.githubusercontent.com/u/9660325?v=3","gravatar_id":"","url":"https://api.github.com/users/lukewagner","html_url":"https://github.com/lukewagner","followers_url":"https://api.github.com/users/lukewagner/followers","following_url":"https://api.github.com/users/lukewagner/following{/other_user}","gists_url":"https://api.github.com/users/lukewagner/gists{/gist_id}","starred_url":"https://api.github.com/users/lukewagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lukewagner/subscriptions","organizations_url":"https://api.github.com/users/lukewagner/orgs","repos_url":"https://api.github.com/users/lukewagner/repos","events_url":"https://api.github.com/users/lukewagner/events{/privacy}","received_events_url":"https://api.github.com/users/lukewagner/received_events","type":"User","site_admin":false},"body":"Over the last few weeks, I had several chances to talk to Mozilla DOM/WebIDL folks about how WebAssembly/Web API integration could work.  This PR is a sketch of the basic plan we discussed which breaks down the overall goal of \"GC/DOM integration\" into two WebAssembly features (independent of JS/Web) and then how these features would integrate with the Web platform.  Definitely interested in feedback, esp. from more people with Web API experience.","created_at":"2015-07-21T21:44:53Z","updated_at":"2015-07-21T22:23:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"23ff7103b6e5846def10c5de02524107304f95c5","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/WebAssembly/design/pulls/275/commits","review_comments_url":"https://api.github.com/repos/WebAssembly/design/pulls/275/comments","review_comment_url":"https://api.github.com/repos/WebAssembly/design/pulls/comments{/number}","comments_url":"https://api.github.com/repos/WebAssembly/design/issues/275/comments","statuses_url":"https://api.github.com/repos/WebAssembly/design/statuses/c91866bc4e4b1b63fcefcbc95a4e77fc4c492a5c","head":{"label":"WebAssembly:fill-in-webidl","ref":"fill-in-webidl","sha":"c91866bc4e4b1b63fcefcbc95a4e77fc4c492a5c","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":"2015-07-21T21:20:23Z","pushed_at":"2015-07-21T22:06:52Z","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":3040,"stargazers_count":4036,"watchers_count":4036,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":203,"mirror_url":null,"open_issues_count":58,"forks":203,"open_issues":58,"watchers":4036,"default_branch":"master"}},"base":{"label":"WebAssembly:master","ref":"master","sha":"1469cd085ae57842f3a6921d484d8ef411c2d63e","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":"2015-07-21T21:20:23Z","pushed_at":"2015-07-21T22:06:52Z","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":3040,"stargazers_count":4036,"watchers_count":4036,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":203,"mirror_url":null,"open_issues_count":58,"forks":203,"open_issues":58,"watchers":4036,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/275"},"html":{"href":"https://github.com/WebAssembly/design/pull/275"},"issue":{"href":"https://api.github.com/repos/WebAssembly/design/issues/275"},"comments":{"href":"https://api.github.com/repos/WebAssembly/design/issues/275/comments"},"review_comments":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/275/comments"},"review_comment":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/WebAssembly/design/pulls/275/commits"},"statuses":{"href":"https://api.github.com/repos/WebAssembly/design/statuses/c91866bc4e4b1b63fcefcbc95a4e77fc4c492a5c"}}}}