{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/comments/187758775","pull_request_review_id":119610661,"id":187758775,"diff_hunk":"@@ -17004,3 +17097,308 @@ GlobOpt::ProcessMemOp()\n         }\n     } NEXT_LOOP_EDITING;\n }\n+\n+void GlobOpt::PRE::FieldPRE(Loop *loop)\n+{\n+    JitArenaAllocator *alloc = this->globOpt->tempAlloc;\n+\n+    this->FindPossiblePRECandidates(loop, alloc);\n+    this->PreloadPRECandidates(loop);\n+    this->RemoveOverlyOptimisticInitialValues(loop);\n+}\n+\n+bool\n+GlobOpt::PRE::InsertSymDefinitionInLandingPad(StackSym * sym, Loop * loop, Sym ** objPtrCopyPropSym)\n+{\n+    Assert(sym->IsSingleDef());\n+    IR::Instr * symDefInstr = sym->GetInstrDef();\n+    if (!GlobOpt::IsPREInstrSequenceCandidateLoad(symDefInstr->m_opcode))\n+    {\n+        return false;\n+    }\n+\n+    IR::Opnd * symDefInstrSrc1 = symDefInstr->GetSrc1();\n+    if (symDefInstrSrc1->IsSymOpnd())\n+    {\n+        Assert(symDefInstrSrc1->AsSymOpnd()->m_sym->IsPropertySym());\n+        // $L1\n+        //      T1 = o.x  (v1|T3)\n+        //      T2 = T1.y (v2|T4) <-- T1 is not live in the loop landing pad\n+        //      jmp $L1\n+\n+        // Trying to make T1 live in the landing pad\n+\n+        // o.x\n+        PropertySym* propSym = symDefInstrSrc1->AsSymOpnd()->m_sym->AsPropertySym();\n+\n+        if (candidates->candidatesBv->Test(propSym->m_id))\n+        {\n+            // If propsym is a PRE candidate, then it must have had the same value on all back edges.\n+            // So, just look up the value on one of the back edges.\n+\n+            BasicBlock* loopTail = loop->GetTailBlock();\n+            Value * valueOnBackEdge = loopTail->globOptData.FindValue(propSym);\n+\n+            *objPtrCopyPropSym = valueOnBackEdge->GetValueInfo()->GetSymStore();\n+\n+            if (candidates->candidatesToProcess->Test(propSym->m_id))\n+            {\n+                GlobHashBucket bucket;\n+                bucket.element = valueOnBackEdge;\n+                bucket.value = propSym;\n+                if (!PreloadPRECandidate(loop, &bucket))\n+                {\n+                    return false;\n+                }\n+                Assert(!candidates->candidatesToProcess->Test(propSym->m_id));\n+                Assert(loop->landingPad->globOptData.IsLive(valueOnBackEdge->GetValueInfo()->GetSymStore()));\n+\n+                // Inserted T3 = o.x\n+                // Now, we want to \n+                // 1. Insert T1 = o.x\n+                // 2. Insert T4 = T1.y\n+                // 3. Indentify T3 as the objptr copy prop sym for T1, and make T3.y live on the back-edges\n+\n+                // #1 is done next. #2 and #3 are done as part of preloading T1.y\n+\n+                // Insert T1 = o.x\n+                if (!InsertPropertySymPreloadInLandingPad(symDefInstr, loop, propSym))\n+                {\n+                    return false;\n+                }\n+                return true;\n+            }\n+            else\n+            {\n+                // o.x was already processed as a PRE candidate. If we were successful in preloading o.x,\n+                // we can now insert T1 = o.x\n+                if (loop->landingPad->globOptData.IsLive(*objPtrCopyPropSym))\n+                {\n+                    // insert T1 = o.x\n+                    if (!InsertPropertySymPreloadInLandingPad(symDefInstr, loop, propSym))\n+                    {\n+                        return false;\n+                    }\n+                    return true;\n+                }\n+                else\n+                {\n+                    return false;\n+                }\n+            }\n+        }\n+        else\n+        {\n+            return false;\n+        }\n+    }\n+    else if (symDefInstrSrc1->IsRegOpnd())\n+    {\n+        // T2 = T1\n+        // T3 = T2.y\n+        // trying to insert def of T2\n+\n+        // T1\n+        StackSym * symDefInstrSrc1Sym = symDefInstrSrc1->AsRegOpnd()->GetStackSym();\n+        if (!loop->landingPad->globOptData.IsLive(symDefInstrSrc1Sym))\n+        {\n+            if (symDefInstrSrc1Sym->IsSingleDef())\n+            {\n+                if (!InsertSymDefinitionInLandingPad(symDefInstrSrc1Sym, loop, objPtrCopyPropSym))\n+                {\n+                    return false;\n+                }\n+            }\n+        }\n+        else\n+        {\n+            *objPtrCopyPropSym = symDefInstrSrc1Sym;\n+        }\n+\n+        if (!(OpCodeAttr::TempNumberTransfer(symDefInstr->m_opcode) && OpCodeAttr::TempObjectTransfer(symDefInstr->m_opcode)))\n+        {\n+            *objPtrCopyPropSym = sym;\n+        }\n+        IR::Instr * instr = symDefInstr->Copy();\n+        if (instr->m_opcode == Js::OpCode::BytecodeArgOutCapture)\n+        {\n+            instr->m_opcode = Js::OpCode::Ld_A;\n+        }\n+        InsertInstrInLandingPad(instr, loop);\n+        return true;\n+    }\n+    else\n+    {\n+        return false;\n+    }\n+}\n+void\n+GlobOpt::PRE::InsertInstrInLandingPad(IR::Instr * instr, Loop * loop)\n+{\n+    instr->GetSrc1()->SetIsJITOptimizedReg(true);\n+    if (instr->GetDst())\n+    {\n+        instr->GetDst()->SetIsJITOptimizedReg(true);\n+        loop->landingPad->globOptData.liveVarSyms->Set(instr->GetDst()->GetStackSym()->m_id);\n+    }\n+\n+    if (instr->HasAnyImplicitCalls())\n+    {\n+        IR::Instr * bailInstr = globOpt->EnsureDisableImplicitCallRegion(loop);\n+\n+        bailInstr->InsertBefore(instr);\n+    }\n+    else if (loop->endDisableImplicitCall)\n+    {\n+        loop->endDisableImplicitCall->InsertBefore(instr);\n+    }\n+    else\n+    {\n+        loop->landingPad->InsertAfter(instr);\n+    }\n+\n+    instr->ClearByteCodeOffset();\n+    instr->SetByteCodeOffset(loop->landingPad->GetFirstInstr());\n+}\n+\n+IR::Instr *\n+GlobOpt::PRE::InsertPropertySymPreloadInLandingPad(IR::Instr * ldInstr, Loop * loop, PropertySym * propertySym)\n+{\n+    IR::Instr * instr = InsertPropertySymPreloadWithoutDstInLandingPad(ldInstr, loop, propertySym);\n+    if (!instr)\n+    {\n+        return nullptr;\n+    }\n+\n+    if (ldInstr->GetDst())\n+    {\n+        instr->SetDst(ldInstr->GetDst()->Copy(ldInstr->m_func));\n+        instr->GetDst()->SetIsJITOptimizedReg(true);\n+        loop->landingPad->globOptData.liveVarSyms->Set(instr->GetDst()->GetStackSym()->m_id);\n+    }\n+\n+    return instr;\n+}\n+\n+IR::Instr *\n+GlobOpt::PRE::InsertPropertySymPreloadWithoutDstInLandingPad(IR::Instr * ldInstr, Loop * loop, PropertySym * propertySym)\n+{\n+    IR::SymOpnd *ldSrc = ldInstr->GetSrc1()->AsSymOpnd();\n+\n+    if (ldSrc->m_sym != propertySym)\n+    {\n+        // It's possible that the propertySym but have equivalent objPtrs.  Verify their values.","path":"lib/Backend/GlobOpt.cpp","position":603,"original_position":603,"commit_id":"1a6bc36747d60b6abd50ad6d3cf80b191737fb14","original_commit_id":"1a6bc36747d60b6abd50ad6d3cf80b191737fb14","user":{"login":"LouisLaf","id":12550583,"avatar_url":"https://avatars3.githubusercontent.com/u/12550583?v=4","gravatar_id":"","url":"https://api.github.com/users/LouisLaf","html_url":"https://github.com/LouisLaf","followers_url":"https://api.github.com/users/LouisLaf/followers","following_url":"https://api.github.com/users/LouisLaf/following{/other_user}","gists_url":"https://api.github.com/users/LouisLaf/gists{/gist_id}","starred_url":"https://api.github.com/users/LouisLaf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LouisLaf/subscriptions","organizations_url":"https://api.github.com/users/LouisLaf/orgs","repos_url":"https://api.github.com/users/LouisLaf/repos","events_url":"https://api.github.com/users/LouisLaf/events{/privacy}","received_events_url":"https://api.github.com/users/LouisLaf/received_events","type":"User","site_admin":false},"body":">that the propertySy [](start = 25, length = 19)\r\n\r\nNit: fix comment\r\n","created_at":"2018-05-12T00:40:47Z","updated_at":"2018-05-12T00:40:47Z","html_url":"https://github.com/Microsoft/ChakraCore/pull/5110#discussion_r187758775","pull_request_url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/comments/187758775"},"html":{"href":"https://github.com/Microsoft/ChakraCore/pull/5110#discussion_r187758775"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110","id":186479851,"html_url":"https://github.com/Microsoft/ChakraCore/pull/5110","diff_url":"https://github.com/Microsoft/ChakraCore/pull/5110.diff","patch_url":"https://github.com/Microsoft/ChakraCore/pull/5110.patch","issue_url":"https://api.github.com/repos/Microsoft/ChakraCore/issues/5110","number":5110,"state":"open","locked":false,"title":"PRE for multi-level field loads in a loop","user":{"login":"rajatd","id":15348123,"avatar_url":"https://avatars0.githubusercontent.com/u/15348123?v=4","gravatar_id":"","url":"https://api.github.com/users/rajatd","html_url":"https://github.com/rajatd","followers_url":"https://api.github.com/users/rajatd/followers","following_url":"https://api.github.com/users/rajatd/following{/other_user}","gists_url":"https://api.github.com/users/rajatd/gists{/gist_id}","starred_url":"https://api.github.com/users/rajatd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rajatd/subscriptions","organizations_url":"https://api.github.com/users/rajatd/orgs","repos_url":"https://api.github.com/users/rajatd/repos","events_url":"https://api.github.com/users/rajatd/events{/privacy}","received_events_url":"https://api.github.com/users/rajatd/received_events","type":"User","site_admin":false},"body":"This PR enhances the existing Partial Redundancy Elimination (PRE) infrastructure to catch multi-level field loads, i.e., field loads of the form o.x.y.\r\n\r\n**Challenges:**\r\n1. Loading o.x.y translates to roughly the following IR:\r\n\r\n                T1 = o.x\r\n                T2 = T1.y\r\n\r\n\tIn order to put a load of `T1.y` in the loop landing pad, we need `T1` to be live there. But, since it’s a temp its not live in the landing pad. \r\n\t\r\n2. In the prepass, when we create initial values for `o.x` and `T1.y`, we give them new symStores (because we aren't sure what symStore will those syms end up with at the end of the loop). Symbol-to-value map entries look something like this:\r\n\r\n             symbol -> value -> symstore\r\n                  o.x -> v1 -> T3\r\n                  T1.y ->v2 -> T4\r\n\r\n\tThe PRE code that runs after the loop prepass, then uses these symStores to preload the PRE candidate property syms (`o.x` and `T1.y` in the above example). Assuming we could solve the previous problem by inserting `T1 = o.x` in the landing pad, landing pad would look something like this:\r\n\t\t\r\n                T3 = o.x\r\n                T1 = o.x\r\n                T4 = T1.y\r\n\r\n\tBut, now when we optimize the landing pad, `T1.y` gets object-pointer copy-propped to `T3.y`. So, now we have `T3.y` live coming in to the loop, but `T1.y` live on the back-edge. Since, these are two different property syms, they don’t produce a value for any `.y` during merging info on the loop header. This defeats the purpose of putting an initial value for `T1.y` in the landing pad.\r\n\t\r\n**Solutions:**\r\n1. For making `T1` live in the landing pad, I rely on it being single-def and go with the premise that if its single def, I should be able to insert its defining instruction in the landing pad, as long as the rhs of the instruction is live in the landing pad; if its not, I try to make the rhs live by either:\r\n\t\ta. Processing it as a PRE candidate (if it was one), or\r\n\t\tb. recursing on the same logic as above for making it live.\r\n\r\n2. Since, `T3` is the symstore for `o.x` on the back-edge, and we insert `T3 = o.x` in the landing pad, `T3` will eventually object-pointer copy-prop into `T2 = T1.y` (making it `T2 = T3.y`) during the main pass of the loop. To then field copy prop `T3.y`, we need `T3.y` to have a value on the loop header and to have that, we need `T3.y` live on the back edge. \r\n\tAnd that is exactly what I do - when preloading `T1.y` in the landing pad, I recognize that `T3` is going to be the copy-prop sym for `T1` and I make `T3.y` live in the landing pad and all the back edges.\r\n\r\n**Perf**\r\n```\r\nKraken                            Left run time      Right run time     ? Run time  ? Run time %  Comment\r\n--------------------------------  -----------------  -----------------  ----------  ------------  ---------------\r\nAi-astar                           203.80 ms ±0.90%   205.83 ms ±0.92%     2.03 ms         1.00%\r\nAudio-beat-detection               105.00 ms ±0.95%   102.50 ms ±0.49%    -2.50 ms        -2.38%\r\nAudio-dft                          141.89 ms ±0.99%   140.75 ms ±0.18%    -1.14 ms        -0.80%\r\nAudio-fft                           74.50 ms ±0.70%    75.91 ms ±0.74%     1.41 ms         1.89%\r\nAudio-oscillator                    73.63 ms ±0.43%    69.25 ms ±0.24%    -4.38 ms        -5.94%  Improved\r\nImaging-darkroom                   177.83 ms ±0.92%   176.33 ms ±0.68%    -1.50 ms        -0.84%\r\nImaging-desaturate                  75.57 ms ±0.49%    75.43 ms ±0.76%    -0.14 ms        -0.19%\r\nImaging-gaussian-blur              189.25 ms ±0.13%   165.60 ms ±0.24%   -23.65 ms       -12.50%  Improved\r\nJson-parse-financial                58.50 ms ±0.85%    57.60 ms ±0.89%    -0.90 ms        -1.54%\r\nJson-stringify-tinderbox            32.00 ms ±0.81%    32.00 ms ±0.99%     0.00 ms         0.00%\r\nStanford-crypto-aes                145.20 ms ±0.96%   144.80 ms ±0.94%    -0.40 ms        -0.28%\r\nStanford-crypto-ccm                112.00 ms ±0.89%   111.50 ms ±0.45%    -0.50 ms        -0.45%\r\nStanford-crypto-pbkdf2             246.33 ms ±0.27%   244.80 ms ±0.91%    -1.53 ms        -0.62%\r\nStanford-crypto-sha256-iterative    63.75 ms ±0.39%    62.83 ms ±0.96%    -0.92 ms        -1.44%\r\n--------------------------------  -----------------  -----------------  ----------  ------------  ---------------\r\nTotal                             1699.25 ms ±0.67%  1665.14 ms ±0.66%   -34.11 ms        -2.01%  Likely improved\r\n\r\nOctane            Left score       Right score      ∆ Score  ∆ Score %  Comment\r\n----------------  ---------------  ---------------  -------  ---------  ---------------\r\nBox2d             23756.13 ±0.16%  24083.13 ±0.58%   327.00      1.38%\r\nCode-load          8355.50 ±0.25%   8435.50 ±0.15%    80.00      0.96%  Improved\r\nCrypto            25798.93 ±0.24%  26194.50 ±0.18%   395.57      1.53%  Improved\r\nDeltablue         19073.33 ±0.66%  20072.00 ±0.23%   998.67      5.24%  Improved\r\nEarley-boyer      32181.25 ±0.36%  31788.40 ±0.49%  -392.85     -1.22%\r\nGbemu             36176.00 ±0.20%  36268.00 ±0.38%    92.00      0.25%\r\nMandreel          20893.25 ±0.32%  20803.50 ±0.27%   -89.75     -0.43%\r\nMandreel latency  61067.78 ±0.71%  61170.50 ±0.23%   102.72      0.17%\r\nNavier-stokes     29619.50 ±0.30%  31657.71 ±0.30%  2038.21      6.88%  Improved\r\nPdfjs             13850.75 ±0.41%  13977.63 ±0.44%   126.88      0.92%\r\nRaytrace          31511.67 ±0.38%  31847.71 ±0.30%   336.05      1.07%  Likely improved\r\nRegexp             3627.00 ±0.51%   3586.13 ±0.11%   -40.88     -1.13%\r\nRichards          17123.00 ±0.49%  17286.50 ±0.26%   163.50      0.95%\r\nSplay             16760.20 ±0.49%  16873.75 ±0.32%   113.55      0.68%\r\nSplay latency     34004.50 ±0.58%  34297.50 ±0.44%   293.00      0.86%\r\nTypescript        28073.38 ±0.49%  28221.88 ±0.41%   148.50      0.53%\r\nZlib              70900.88 ±0.17%  70701.75 ±0.25%  -199.13     -0.28%\r\n----------------  ---------------  ---------------  -------  ---------  ---------------\r\nTotal             22911.87 ±0.39%  23154.84 ±0.31%   242.96      1.06%  Likely improved\r\n\r\n```\r\n\r\nFollow up work will target catching multi-level field loads that have LdEnv in the load sequence, and loads of and stores to the same field in the same loop","created_at":"2018-05-07T22:17:28Z","updated_at":"2018-05-12T00:40:47Z","closed_at":null,"merged_at":null,"merge_commit_sha":"76c8d13f3f1886e0b927711cf192a6067485b507","assignee":null,"assignees":[],"requested_reviewers":[{"login":"Cellule","id":4157103,"avatar_url":"https://avatars1.githubusercontent.com/u/4157103?v=4","gravatar_id":"","url":"https://api.github.com/users/Cellule","html_url":"https://github.com/Cellule","followers_url":"https://api.github.com/users/Cellule/followers","following_url":"https://api.github.com/users/Cellule/following{/other_user}","gists_url":"https://api.github.com/users/Cellule/gists{/gist_id}","starred_url":"https://api.github.com/users/Cellule/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cellule/subscriptions","organizations_url":"https://api.github.com/users/Cellule/orgs","repos_url":"https://api.github.com/users/Cellule/repos","events_url":"https://api.github.com/users/Cellule/events{/privacy}","received_events_url":"https://api.github.com/users/Cellule/received_events","type":"User","site_admin":false},{"login":"pleath","id":15825988,"avatar_url":"https://avatars0.githubusercontent.com/u/15825988?v=4","gravatar_id":"","url":"https://api.github.com/users/pleath","html_url":"https://github.com/pleath","followers_url":"https://api.github.com/users/pleath/followers","following_url":"https://api.github.com/users/pleath/following{/other_user}","gists_url":"https://api.github.com/users/pleath/gists{/gist_id}","starred_url":"https://api.github.com/users/pleath/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pleath/subscriptions","organizations_url":"https://api.github.com/users/pleath/orgs","repos_url":"https://api.github.com/users/pleath/repos","events_url":"https://api.github.com/users/pleath/events{/privacy}","received_events_url":"https://api.github.com/users/pleath/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110/commits","review_comments_url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110/comments","review_comment_url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/ChakraCore/issues/5110/comments","statuses_url":"https://api.github.com/repos/Microsoft/ChakraCore/statuses/1a6bc36747d60b6abd50ad6d3cf80b191737fb14","head":{"label":"rajatd:oxy-no-ldslot","ref":"oxy-no-ldslot","sha":"1a6bc36747d60b6abd50ad6d3cf80b191737fb14","user":{"login":"rajatd","id":15348123,"avatar_url":"https://avatars0.githubusercontent.com/u/15348123?v=4","gravatar_id":"","url":"https://api.github.com/users/rajatd","html_url":"https://github.com/rajatd","followers_url":"https://api.github.com/users/rajatd/followers","following_url":"https://api.github.com/users/rajatd/following{/other_user}","gists_url":"https://api.github.com/users/rajatd/gists{/gist_id}","starred_url":"https://api.github.com/users/rajatd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rajatd/subscriptions","organizations_url":"https://api.github.com/users/rajatd/orgs","repos_url":"https://api.github.com/users/rajatd/repos","events_url":"https://api.github.com/users/rajatd/events{/privacy}","received_events_url":"https://api.github.com/users/rajatd/received_events","type":"User","site_admin":false},"repo":{"id":49607902,"name":"ChakraCore","full_name":"rajatd/ChakraCore","owner":{"login":"rajatd","id":15348123,"avatar_url":"https://avatars0.githubusercontent.com/u/15348123?v=4","gravatar_id":"","url":"https://api.github.com/users/rajatd","html_url":"https://github.com/rajatd","followers_url":"https://api.github.com/users/rajatd/followers","following_url":"https://api.github.com/users/rajatd/following{/other_user}","gists_url":"https://api.github.com/users/rajatd/gists{/gist_id}","starred_url":"https://api.github.com/users/rajatd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rajatd/subscriptions","organizations_url":"https://api.github.com/users/rajatd/orgs","repos_url":"https://api.github.com/users/rajatd/repos","events_url":"https://api.github.com/users/rajatd/events{/privacy}","received_events_url":"https://api.github.com/users/rajatd/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rajatd/ChakraCore","description":"ChakraCore is the core part of the Chakra Javascript engine that powers Microsoft Edge","fork":true,"url":"https://api.github.com/repos/rajatd/ChakraCore","forks_url":"https://api.github.com/repos/rajatd/ChakraCore/forks","keys_url":"https://api.github.com/repos/rajatd/ChakraCore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rajatd/ChakraCore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rajatd/ChakraCore/teams","hooks_url":"https://api.github.com/repos/rajatd/ChakraCore/hooks","issue_events_url":"https://api.github.com/repos/rajatd/ChakraCore/issues/events{/number}","events_url":"https://api.github.com/repos/rajatd/ChakraCore/events","assignees_url":"https://api.github.com/repos/rajatd/ChakraCore/assignees{/user}","branches_url":"https://api.github.com/repos/rajatd/ChakraCore/branches{/branch}","tags_url":"https://api.github.com/repos/rajatd/ChakraCore/tags","blobs_url":"https://api.github.com/repos/rajatd/ChakraCore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rajatd/ChakraCore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rajatd/ChakraCore/git/refs{/sha}","trees_url":"https://api.github.com/repos/rajatd/ChakraCore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rajatd/ChakraCore/statuses/{sha}","languages_url":"https://api.github.com/repos/rajatd/ChakraCore/languages","stargazers_url":"https://api.github.com/repos/rajatd/ChakraCore/stargazers","contributors_url":"https://api.github.com/repos/rajatd/ChakraCore/contributors","subscribers_url":"https://api.github.com/repos/rajatd/ChakraCore/subscribers","subscription_url":"https://api.github.com/repos/rajatd/ChakraCore/subscription","commits_url":"https://api.github.com/repos/rajatd/ChakraCore/commits{/sha}","git_commits_url":"https://api.github.com/repos/rajatd/ChakraCore/git/commits{/sha}","comments_url":"https://api.github.com/repos/rajatd/ChakraCore/comments{/number}","issue_comment_url":"https://api.github.com/repos/rajatd/ChakraCore/issues/comments{/number}","contents_url":"https://api.github.com/repos/rajatd/ChakraCore/contents/{+path}","compare_url":"https://api.github.com/repos/rajatd/ChakraCore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rajatd/ChakraCore/merges","archive_url":"https://api.github.com/repos/rajatd/ChakraCore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rajatd/ChakraCore/downloads","issues_url":"https://api.github.com/repos/rajatd/ChakraCore/issues{/number}","pulls_url":"https://api.github.com/repos/rajatd/ChakraCore/pulls{/number}","milestones_url":"https://api.github.com/repos/rajatd/ChakraCore/milestones{/number}","notifications_url":"https://api.github.com/repos/rajatd/ChakraCore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rajatd/ChakraCore/labels{/name}","releases_url":"https://api.github.com/repos/rajatd/ChakraCore/releases{/id}","deployments_url":"https://api.github.com/repos/rajatd/ChakraCore/deployments","created_at":"2016-01-13T23:02:12Z","updated_at":"2016-01-13T23:02:28Z","pushed_at":"2018-05-11T18:30:29Z","git_url":"git://github.com/rajatd/ChakraCore.git","ssh_url":"git@github.com:rajatd/ChakraCore.git","clone_url":"https://github.com/rajatd/ChakraCore.git","svn_url":"https://github.com/rajatd/ChakraCore","homepage":null,"size":124296,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Microsoft:master","ref":"master","sha":"b4e98fab77244e05a6bb8919526948fc96a5ceb2","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars2.githubusercontent.com/u/6154722?v=4","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":49086513,"name":"ChakraCore","full_name":"Microsoft/ChakraCore","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars2.githubusercontent.com/u/6154722?v=4","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/ChakraCore","description":"ChakraCore is the core part of the Chakra Javascript engine that powers Microsoft Edge","fork":false,"url":"https://api.github.com/repos/Microsoft/ChakraCore","forks_url":"https://api.github.com/repos/Microsoft/ChakraCore/forks","keys_url":"https://api.github.com/repos/Microsoft/ChakraCore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/ChakraCore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/ChakraCore/teams","hooks_url":"https://api.github.com/repos/Microsoft/ChakraCore/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/ChakraCore/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/ChakraCore/events","assignees_url":"https://api.github.com/repos/Microsoft/ChakraCore/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/ChakraCore/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/ChakraCore/tags","blobs_url":"https://api.github.com/repos/Microsoft/ChakraCore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/ChakraCore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/ChakraCore/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/ChakraCore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/ChakraCore/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/ChakraCore/languages","stargazers_url":"https://api.github.com/repos/Microsoft/ChakraCore/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/ChakraCore/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/ChakraCore/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/ChakraCore/subscription","commits_url":"https://api.github.com/repos/Microsoft/ChakraCore/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/ChakraCore/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/ChakraCore/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/ChakraCore/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/ChakraCore/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/ChakraCore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/ChakraCore/merges","archive_url":"https://api.github.com/repos/Microsoft/ChakraCore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/ChakraCore/downloads","issues_url":"https://api.github.com/repos/Microsoft/ChakraCore/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/ChakraCore/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/ChakraCore/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/ChakraCore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/ChakraCore/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/ChakraCore/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/ChakraCore/deployments","created_at":"2016-01-05T19:05:31Z","updated_at":"2018-05-12T00:22:53Z","pushed_at":"2018-05-12T00:22:47Z","git_url":"git://github.com/Microsoft/ChakraCore.git","ssh_url":"git@github.com:Microsoft/ChakraCore.git","clone_url":"https://github.com/Microsoft/ChakraCore.git","svn_url":"https://github.com/Microsoft/ChakraCore","homepage":"","size":132489,"stargazers_count":6997,"watchers_count":6997,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":924,"mirror_url":null,"archived":false,"open_issues_count":334,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":924,"open_issues":334,"watchers":6997,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110"},"html":{"href":"https://github.com/Microsoft/ChakraCore/pull/5110"},"issue":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/issues/5110"},"comments":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/issues/5110/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/pulls/5110/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/ChakraCore/statuses/1a6bc36747d60b6abd50ad6d3cf80b191737fb14"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"LouisLaf"}}