{"action":"created","comment":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/80537671","id":80537671,"diff_hunk":"@@ -0,0 +1,880 @@\n+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT\n+// file at the top-level directory of this distribution and at\n+// http://rust-lang.org/COPYRIGHT.\n+//\n+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n+// option. This file may not be copied, modified, or distributed\n+// except according to those terms.\n+\n+//! Inlining pass for MIR functions\n+\n+use rustc::hir::def_id::DefId;\n+\n+use rustc_data_structures::bitvec::BitVector;\n+use rustc_data_structures::indexed_vec::{Idx, IndexVec};\n+use rustc_data_structures::graph;\n+\n+use rustc::dep_graph::DepNode;\n+use rustc::mir::mir_map::MirMap;\n+use rustc::mir::repr::*;\n+use rustc::mir::transform::{MirMapPass, MirPass, MirPassHook, MirSource, Pass};\n+use rustc::mir::visit::*;\n+use rustc::traits;\n+use rustc::ty::{self, Ty, TyCtxt};\n+use rustc::ty::subst::{Subst,Substs};\n+use rustc::util::nodemap::{DefIdMap, DefIdSet};\n+\n+use super::simplify_cfg::{remove_dead_blocks, CfgSimplifier};\n+use super::copy_prop::CopyPropagation;\n+\n+use syntax::attr;\n+use syntax::abi::Abi;\n+use syntax_pos::Span;\n+\n+use callgraph;\n+\n+const DEFAULT_THRESHOLD : usize = 50;\n+const HINT_THRESHOLD : usize = 100;\n+\n+const INSTR_COST : usize = 5;\n+const CALL_PENALTY : usize = 25;\n+\n+const UNKNOWN_SIZE_COST : usize = 10;\n+\n+use std::rc::Rc;\n+\n+pub struct Inline;\n+\n+impl<'tcx> MirMapPass<'tcx> for Inline {\n+    fn run_pass<'a>(\n+        &mut self,\n+        tcx: TyCtxt<'a, 'tcx, 'tcx>,\n+        map: &mut MirMap<'tcx>,\n+        hooks: &mut [Box<for<'s> MirPassHook<'s>>]) {\n+\n+        if tcx.sess.opts.mir_opt_level < 2 { return; }\n+\n+        let _ignore = tcx.dep_graph.in_ignore();\n+\n+        let callgraph = callgraph::CallGraph::build(map);\n+\n+        let mut inliner = Inliner {\n+            tcx: tcx,\n+            foreign_mirs: DefIdMap()\n+        };\n+\n+        let def_ids = map.map.keys();\n+        for &def_id in &def_ids {\n+            let _task = tcx.dep_graph.in_task(DepNode::Mir(def_id));\n+            let mir = map.map.get_mut(&def_id).unwrap();\n+            let id = tcx.map.as_local_node_id(def_id).unwrap();\n+            let src = MirSource::from_node(tcx, id);\n+\n+            for hook in &mut *hooks {\n+                hook.on_mir_pass(tcx, src, mir, self, false);\n+            }\n+        }\n+\n+        for scc in callgraph.scc_iter() {\n+            inliner.inline_scc(map, &callgraph, &scc);\n+        }\n+\n+        for def_id in def_ids {\n+            let _task = tcx.dep_graph.in_task(DepNode::Mir(def_id));\n+            let mir = map.map.get_mut(&def_id).unwrap();\n+            let id = tcx.map.as_local_node_id(def_id).unwrap();\n+            let src = MirSource::from_node(tcx, id);\n+\n+            for hook in &mut *hooks {\n+                hook.on_mir_pass(tcx, src, mir, self, true);\n+            }\n+        }\n+    }\n+}\n+\n+impl<'tcx> Pass for Inline { }\n+\n+struct Inliner<'a, 'tcx: 'a> {\n+    tcx: TyCtxt<'a, 'tcx, 'tcx>,\n+    foreign_mirs: DefIdMap<Rc<Mir<'tcx>>>,\n+}\n+\n+#[derive(Copy, Clone)]\n+struct CallSite<'tcx> {\n+    caller: DefId,\n+    callee: DefId,\n+    substs: &'tcx Substs<'tcx>,\n+    bb: BasicBlock,\n+    location: SourceInfo,\n+}\n+\n+impl<'a, 'tcx> Inliner<'a, 'tcx> {\n+    fn inline_scc(&mut self, map: &mut MirMap<'tcx>,\n+                            callgraph: &callgraph::CallGraph, scc: &[graph::NodeIndex]) -> bool {\n+        let mut callsites = Vec::new();\n+        let mut in_scc = DefIdSet();\n+\n+        let mut inlined_into = DefIdSet();\n+\n+        for &node in scc {\n+            let def_id = callgraph.def_id(node);\n+\n+            // Don't inspect functions from other crates\n+            let id = if let Some(id) = self.tcx.map.as_local_node_id(def_id) {\n+                id\n+            } else {\n+                continue;\n+            };\n+            let src = MirSource::from_node(self.tcx, id);\n+            if let MirSource::Fn(_) = src {\n+                let mir = if let Some(m) = map.map.get(&def_id) {\n+                    m\n+                } else {\n+                    continue;\n+                };\n+                for (bb, bb_data) in mir.basic_blocks().iter_enumerated() {\n+                    // Don't inline calls that are in cleanup blocks.\n+                    if bb_data.is_cleanup { continue; }\n+\n+                    // Only consider direct calls to functions\n+                    let terminator = bb_data.terminator();\n+                    if let TerminatorKind::Call {\n+                        func: Operand::Constant(ref f), .. } = terminator.kind {\n+                        if let ty::TyFnDef(callee_def_id, substs, _) = f.ty.sty {\n+                            callsites.push(CallSite {\n+                                caller: def_id,\n+                                callee: callee_def_id,\n+                                substs: substs,\n+                                bb: bb,\n+                                location: terminator.source_info\n+                            });\n+                        }\n+                    }\n+                }\n+\n+                in_scc.insert(def_id);\n+            }\n+        }\n+\n+        // Move callsites that are in the the SCC to the end so\n+        // they're inlined after calls to outside the SCC\n+        let mut first_call_in_scc = callsites.len();\n+\n+        let mut i = 0;\n+        while i < first_call_in_scc {\n+            let f = callsites[i].caller;\n+            if in_scc.contains(&f) {\n+                first_call_in_scc -= 1;\n+                callsites.swap(i, first_call_in_scc);\n+            } else {\n+                i += 1;\n+            }\n+        }\n+\n+        let mut local_change;\n+        let mut changed = false;\n+\n+        loop {\n+            local_change = false;\n+            let mut csi = 0;\n+            while csi < callsites.len() {\n+                let foreign_mir;\n+\n+                let callsite = callsites[csi];\n+                csi += 1;\n+\n+                let callee_mir = {\n+                    let callee_mir : Option<&Mir<'tcx>> = if callsite.callee.is_local() {\n+                        map.map.get(&callsite.callee)\n+                    } else {\n+                        foreign_mir = self.get_foreign_mir(callsite.callee);\n+                        foreign_mir.as_ref().map(|m| &**m)\n+                    };\n+\n+                    let callee_mir = if let Some(m) = callee_mir {\n+                        m\n+                    } else {\n+                        continue;\n+                    };\n+\n+                    if !self.should_inline(callsite, callee_mir) {\n+                        continue;\n+                    }\n+\n+                    callee_mir.subst(self.tcx, callsite.substs)\n+                };\n+\n+                let caller_mir = map.map.get_mut(&callsite.caller).unwrap();\n+\n+                let start = caller_mir.basic_blocks().len();\n+\n+                if !self.inline_call(callsite, caller_mir, callee_mir) {\n+                    continue;\n+                }\n+\n+                inlined_into.insert(callsite.caller);\n+\n+                // Add callsites from inlined function\n+                for (bb, bb_data) in caller_mir.basic_blocks().iter_enumerated().skip(start) {\n+                    // Only consider direct calls to functions\n+                    let terminator = bb_data.terminator();\n+                    if let TerminatorKind::Call {\n+                        func: Operand::Constant(ref f), .. } = terminator.kind {\n+                        if let ty::TyFnDef(callee_def_id, substs, _) = f.ty.sty {\n+                            // Don't inline the same function multiple times.\n+                            if callsite.callee != callee_def_id {\n+                                callsites.push(CallSite {\n+                                    caller: callsite.caller,\n+                                    callee: callee_def_id,\n+                                    substs: substs,\n+                                    bb: bb,\n+                                    location: terminator.source_info\n+                                });\n+                            }\n+                        }\n+                    }\n+                }\n+\n+\n+                csi -= 1;\n+                if scc.len() == 1 {\n+                    callsites.swap_remove(csi);\n+                } else {\n+                    callsites.remove(csi);\n+                }\n+\n+                local_change = true;\n+                changed = true;\n+            }\n+\n+            if !local_change {\n+                break;\n+            }\n+        }\n+\n+        // Simplify functions we inlined into.\n+        for def_id in inlined_into {\n+            let caller_mir = map.map.get_mut(&def_id).unwrap();\n+            debug!(\"Running simplify cfg on {:?}\", def_id);\n+            CfgSimplifier::new(caller_mir).simplify();\n+            remove_dead_blocks(caller_mir);\n+        }\n+        changed\n+    }\n+\n+    fn get_foreign_mir(&mut self, def_id: DefId) -> Option<Rc<Mir<'tcx>>> {\n+        if let Some(mir) = self.foreign_mirs.get(&def_id).cloned() {\n+            return Some(mir);\n+        }\n+        // Cache the foreign MIR\n+        let mir = self.tcx.sess.cstore.maybe_get_item_mir(self.tcx, def_id);\n+        let mir = mir.map(Rc::new);\n+        if let Some(ref mir) = mir {\n+            self.foreign_mirs.insert(def_id, mir.clone());\n+        }\n+\n+        mir\n+    }\n+\n+    fn should_inline(&self, callsite: CallSite<'tcx>,\n+                     callee_mir: &'a Mir<'tcx>) -> bool {\n+\n+        let tcx = self.tcx;\n+\n+        // Don't inline closures that have captures\n+        // FIXME: Handle closures better\n+        if callee_mir.upvar_decls.len() > 0 {\n+            return false;\n+        }\n+\n+        // Don't inline calls to trait methods\n+        // FIXME: Should try to resolve it to a concrete method, and\n+        // only bail if that isn't possible\n+        let trait_def = tcx.trait_of_item(callsite.callee);\n+        if trait_def.is_some() { return false; }\n+\n+        let attrs = tcx.get_attrs(callsite.callee);\n+        let hint = attr::find_inline_attr(None, &attrs[..]);\n+\n+        let hinted = match hint {\n+            // Just treat inline(always) as a hint for now,\n+            // there are cases that prevent inlining that we\n+            // need to check for first.\n+            attr::InlineAttr::Always => true,\n+            attr::InlineAttr::Never => return false,\n+            attr::InlineAttr::Hint => true,\n+            attr::InlineAttr::None => false,\n+        };\n+\n+        // Only inline local functions if they would be eligible for\n+        // cross-crate inlining. This ensures that any symbols they\n+        // use are reachable cross-crate\n+        // FIXME(#36594): This shouldn't be necessary, and is more conservative\n+        // than it could be, but trans should generate the reachable set from\n+        // the MIR anyway, making any check obsolete.\n+        if callsite.callee.is_local() {\n+            // No type substs and no inline hint means this function\n+            // wouldn't be eligible for cross-crate inlining\n+            if callsite.substs.types().count() == 0 && !hinted {\n+                return false;\n+            }\n+\n+        }\n+\n+        let mut threshold = if hinted {","path":"src/librustc_mir/transform/inline.rs","position":326,"original_position":326,"commit_id":"76cc7cf058ad565349b5530425a3cac70551466f","original_commit_id":"76cc7cf058ad565349b5530425a3cac70551466f","user":{"login":"arielb1","id":1830974,"avatar_url":"https://avatars.githubusercontent.com/u/1830974?v=3","gravatar_id":"","url":"https://api.github.com/users/arielb1","html_url":"https://github.com/arielb1","followers_url":"https://api.github.com/users/arielb1/followers","following_url":"https://api.github.com/users/arielb1/following{/other_user}","gists_url":"https://api.github.com/users/arielb1/gists{/gist_id}","starred_url":"https://api.github.com/users/arielb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arielb1/subscriptions","organizations_url":"https://api.github.com/users/arielb1/orgs","repos_url":"https://api.github.com/users/arielb1/repos","events_url":"https://api.github.com/users/arielb1/events{/privacy}","received_events_url":"https://api.github.com/users/arielb1/received_events","type":"User","site_admin":false},"body":"This logic is basically pure guesswork, right?","created_at":"2016-09-26T18:14:17Z","updated_at":"2016-09-26T18:14:17Z","html_url":"https://github.com/rust-lang/rust/pull/36593#discussion_r80537671","pull_request_url":"https://api.github.com/repos/rust-lang/rust/pulls/36593","_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/80537671"},"html":{"href":"https://github.com/rust-lang/rust/pull/36593#discussion_r80537671"},"pull_request":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36593"}}},"pull_request":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/36593","id":85907701,"html_url":"https://github.com/rust-lang/rust/pull/36593","diff_url":"https://github.com/rust-lang/rust/pull/36593.diff","patch_url":"https://github.com/rust-lang/rust/pull/36593.patch","issue_url":"https://api.github.com/repos/rust-lang/rust/issues/36593","number":36593,"state":"open","locked":false,"title":"[MIR] Initial implementation of inlining","user":{"login":"Aatch","id":342416,"avatar_url":"https://avatars.githubusercontent.com/u/342416?v=3","gravatar_id":"","url":"https://api.github.com/users/Aatch","html_url":"https://github.com/Aatch","followers_url":"https://api.github.com/users/Aatch/followers","following_url":"https://api.github.com/users/Aatch/following{/other_user}","gists_url":"https://api.github.com/users/Aatch/gists{/gist_id}","starred_url":"https://api.github.com/users/Aatch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Aatch/subscriptions","organizations_url":"https://api.github.com/users/Aatch/orgs","repos_url":"https://api.github.com/users/Aatch/repos","events_url":"https://api.github.com/users/Aatch/events{/privacy}","received_events_url":"https://api.github.com/users/Aatch/received_events","type":"User","site_admin":false},"body":"Implements basic inlining for MIR functions.\r\n\r\nInlining is currently only done if `mir-opt-level` is set to 2.\r\n\r\nDoes not handle debuginfo completely correctly at the moment.","created_at":"2016-09-20T04:02:54Z","updated_at":"2016-09-26T18:56:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f2271a00e27b68257eb1f2677ff49d7a831641ff","assignee":{"login":"arielb1","id":1830974,"avatar_url":"https://avatars.githubusercontent.com/u/1830974?v=3","gravatar_id":"","url":"https://api.github.com/users/arielb1","html_url":"https://github.com/arielb1","followers_url":"https://api.github.com/users/arielb1/followers","following_url":"https://api.github.com/users/arielb1/following{/other_user}","gists_url":"https://api.github.com/users/arielb1/gists{/gist_id}","starred_url":"https://api.github.com/users/arielb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arielb1/subscriptions","organizations_url":"https://api.github.com/users/arielb1/orgs","repos_url":"https://api.github.com/users/arielb1/repos","events_url":"https://api.github.com/users/arielb1/events{/privacy}","received_events_url":"https://api.github.com/users/arielb1/received_events","type":"User","site_admin":false},"assignees":[{"login":"arielb1","id":1830974,"avatar_url":"https://avatars.githubusercontent.com/u/1830974?v=3","gravatar_id":"","url":"https://api.github.com/users/arielb1","html_url":"https://github.com/arielb1","followers_url":"https://api.github.com/users/arielb1/followers","following_url":"https://api.github.com/users/arielb1/following{/other_user}","gists_url":"https://api.github.com/users/arielb1/gists{/gist_id}","starred_url":"https://api.github.com/users/arielb1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arielb1/subscriptions","organizations_url":"https://api.github.com/users/arielb1/orgs","repos_url":"https://api.github.com/users/arielb1/repos","events_url":"https://api.github.com/users/arielb1/events{/privacy}","received_events_url":"https://api.github.com/users/arielb1/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/rust-lang/rust/pulls/36593/commits","review_comments_url":"https://api.github.com/repos/rust-lang/rust/pulls/36593/comments","review_comment_url":"https://api.github.com/repos/rust-lang/rust/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rust-lang/rust/issues/36593/comments","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/76cc7cf058ad565349b5530425a3cac70551466f","head":{"label":"Aatch:mir-inlining","ref":"mir-inlining","sha":"76cc7cf058ad565349b5530425a3cac70551466f","user":{"login":"Aatch","id":342416,"avatar_url":"https://avatars.githubusercontent.com/u/342416?v=3","gravatar_id":"","url":"https://api.github.com/users/Aatch","html_url":"https://github.com/Aatch","followers_url":"https://api.github.com/users/Aatch/followers","following_url":"https://api.github.com/users/Aatch/following{/other_user}","gists_url":"https://api.github.com/users/Aatch/gists{/gist_id}","starred_url":"https://api.github.com/users/Aatch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Aatch/subscriptions","organizations_url":"https://api.github.com/users/Aatch/orgs","repos_url":"https://api.github.com/users/Aatch/repos","events_url":"https://api.github.com/users/Aatch/events{/privacy}","received_events_url":"https://api.github.com/users/Aatch/received_events","type":"User","site_admin":false},"repo":{"id":6915479,"name":"rust","full_name":"Aatch/rust","owner":{"login":"Aatch","id":342416,"avatar_url":"https://avatars.githubusercontent.com/u/342416?v=3","gravatar_id":"","url":"https://api.github.com/users/Aatch","html_url":"https://github.com/Aatch","followers_url":"https://api.github.com/users/Aatch/followers","following_url":"https://api.github.com/users/Aatch/following{/other_user}","gists_url":"https://api.github.com/users/Aatch/gists{/gist_id}","starred_url":"https://api.github.com/users/Aatch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Aatch/subscriptions","organizations_url":"https://api.github.com/users/Aatch/orgs","repos_url":"https://api.github.com/users/Aatch/repos","events_url":"https://api.github.com/users/Aatch/events{/privacy}","received_events_url":"https://api.github.com/users/Aatch/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Aatch/rust","description":"a safe, concurrent, practical language","fork":true,"url":"https://api.github.com/repos/Aatch/rust","forks_url":"https://api.github.com/repos/Aatch/rust/forks","keys_url":"https://api.github.com/repos/Aatch/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Aatch/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Aatch/rust/teams","hooks_url":"https://api.github.com/repos/Aatch/rust/hooks","issue_events_url":"https://api.github.com/repos/Aatch/rust/issues/events{/number}","events_url":"https://api.github.com/repos/Aatch/rust/events","assignees_url":"https://api.github.com/repos/Aatch/rust/assignees{/user}","branches_url":"https://api.github.com/repos/Aatch/rust/branches{/branch}","tags_url":"https://api.github.com/repos/Aatch/rust/tags","blobs_url":"https://api.github.com/repos/Aatch/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Aatch/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Aatch/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/Aatch/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Aatch/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/Aatch/rust/languages","stargazers_url":"https://api.github.com/repos/Aatch/rust/stargazers","contributors_url":"https://api.github.com/repos/Aatch/rust/contributors","subscribers_url":"https://api.github.com/repos/Aatch/rust/subscribers","subscription_url":"https://api.github.com/repos/Aatch/rust/subscription","commits_url":"https://api.github.com/repos/Aatch/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/Aatch/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/Aatch/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/Aatch/rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/Aatch/rust/contents/{+path}","compare_url":"https://api.github.com/repos/Aatch/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Aatch/rust/merges","archive_url":"https://api.github.com/repos/Aatch/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Aatch/rust/downloads","issues_url":"https://api.github.com/repos/Aatch/rust/issues{/number}","pulls_url":"https://api.github.com/repos/Aatch/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/Aatch/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/Aatch/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Aatch/rust/labels{/name}","releases_url":"https://api.github.com/repos/Aatch/rust/releases{/id}","deployments_url":"https://api.github.com/repos/Aatch/rust/deployments","created_at":"2012-11-29T05:04:07Z","updated_at":"2015-06-22T22:56:30Z","pushed_at":"2016-09-26T01:37:41Z","git_url":"git://github.com/Aatch/rust.git","ssh_url":"git@github.com:Aatch/rust.git","clone_url":"https://github.com/Aatch/rust.git","svn_url":"https://github.com/Aatch/rust","homepage":"http://www.rust-lang.org","size":302096,"stargazers_count":1,"watchers_count":1,"language":"Rust","has_issues":true,"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":"rust-lang:master","ref":"master","sha":"05c2fdd64f3f4acc358b653616de6034eced49b5","user":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":724712,"name":"rust","full_name":"rust-lang/rust","owner":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=3","gravatar_id":"","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rust-lang/rust","description":"A safe, concurrent, practical language.","fork":false,"url":"https://api.github.com/repos/rust-lang/rust","forks_url":"https://api.github.com/repos/rust-lang/rust/forks","keys_url":"https://api.github.com/repos/rust-lang/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rust-lang/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rust-lang/rust/teams","hooks_url":"https://api.github.com/repos/rust-lang/rust/hooks","issue_events_url":"https://api.github.com/repos/rust-lang/rust/issues/events{/number}","events_url":"https://api.github.com/repos/rust-lang/rust/events","assignees_url":"https://api.github.com/repos/rust-lang/rust/assignees{/user}","branches_url":"https://api.github.com/repos/rust-lang/rust/branches{/branch}","tags_url":"https://api.github.com/repos/rust-lang/rust/tags","blobs_url":"https://api.github.com/repos/rust-lang/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rust-lang/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rust-lang/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/rust-lang/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/rust-lang/rust/languages","stargazers_url":"https://api.github.com/repos/rust-lang/rust/stargazers","contributors_url":"https://api.github.com/repos/rust-lang/rust/contributors","subscribers_url":"https://api.github.com/repos/rust-lang/rust/subscribers","subscription_url":"https://api.github.com/repos/rust-lang/rust/subscription","commits_url":"https://api.github.com/repos/rust-lang/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/rust-lang/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/rust-lang/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/rust-lang/rust/issues/comments{/number}","contents_url":"https://api.github.com/repos/rust-lang/rust/contents/{+path}","compare_url":"https://api.github.com/repos/rust-lang/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rust-lang/rust/merges","archive_url":"https://api.github.com/repos/rust-lang/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rust-lang/rust/downloads","issues_url":"https://api.github.com/repos/rust-lang/rust/issues{/number}","pulls_url":"https://api.github.com/repos/rust-lang/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/rust-lang/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/rust-lang/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rust-lang/rust/labels{/name}","releases_url":"https://api.github.com/repos/rust-lang/rust/releases{/id}","deployments_url":"https://api.github.com/repos/rust-lang/rust/deployments","created_at":"2010-06-16T20:39:03Z","updated_at":"2016-09-26T16:23:26Z","pushed_at":"2016-09-26T18:56:01Z","git_url":"git://github.com/rust-lang/rust.git","ssh_url":"git@github.com:rust-lang/rust.git","clone_url":"https://github.com/rust-lang/rust.git","svn_url":"https://github.com/rust-lang/rust","homepage":"https://www.rust-lang.org","size":511871,"stargazers_count":18410,"watchers_count":18410,"language":"Rust","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3555,"mirror_url":null,"open_issues_count":2840,"forks":3555,"open_issues":2840,"watchers":18410,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36593"},"html":{"href":"https://github.com/rust-lang/rust/pull/36593"},"issue":{"href":"https://api.github.com/repos/rust-lang/rust/issues/36593"},"comments":{"href":"https://api.github.com/repos/rust-lang/rust/issues/36593/comments"},"review_comments":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36593/comments"},"review_comment":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/36593/commits"},"statuses":{"href":"https://api.github.com/repos/rust-lang/rust/statuses/76cc7cf058ad565349b5530425a3cac70551466f"}}}}
{"actor":{"display_login":"arielb1"}}