{"action":"created","comment":{"url":"https://api.github.com/repos/nodejs/node-chakracore/pulls/comments/82072437","pull_request_review_id":3005634,"id":82072437,"diff_hunk":"@@ -21,71 +21,715 @@\n #include \"v8.h\"\n #include \"v8-debug.h\"\n #include \"jsrtutils.h\"\n+#include \"chakra_natives.h\"\n \n namespace v8 {\n \n-__declspec(thread) bool g_EnableDebug = false;\n-static JsContextRef g_debugContext = JS_INVALID_REFERENCE;\n+  __declspec(thread) bool g_EnableDebug = false;\n \n-bool Debug::EnableAgent(const char *name, int port, bool wait_for_connection) {\n-  HRESULT hr = S_OK;\n+  MessageQueue Debug::messageQueue;\n+  Debug::MessageHandler Debug::handler = nullptr;\n \n-#ifndef NODE_ENGINE_CHAKRACORE\n-  if (!g_EnableDebug) {\n-    // JsStartDebugging needs COM initialization\n-    IfComFailError(CoInitializeEx(nullptr, COINIT_MULTITHREADED));\n+  MessageQueue::MessageQueue() {\n+    this->waitingForMessage = false;\n+    this->isProcessingDebuggerMsg = false;\n+    this->debugEventProcessCount = 0;\n+    this->msgQueue = new std::queue<wchar_t*>();\n \n+    int err = uv_sem_init(&newMsgSem, 0);\n+    CHAKRA_VERIFY(err == 0);\n+    err = uv_mutex_init(&msgMutex);\n+    CHAKRA_VERIFY(err == 0);\n+  }\n+\n+  MessageQueue::~MessageQueue() {\n+    uv_mutex_destroy(&msgMutex);\n+    uv_sem_destroy(&newMsgSem);\n+    delete this->msgQueue;\n+    this->msgQueue = nullptr;\n+  }\n+\n+  void MessageQueue::SaveMessage(const uint16_t* command, int length) {\n+    uint16_t* msg = new uint16_t[length + 1];\n+    for (int i = 0; i < length; i++) msg[i] = command[i];\n+    msg[length] = '\\0';\n+\n+    static_assert(sizeof(uint16_t) == sizeof(wchar_t),\n+      \"sizeof uint16_t and wchar_t is not same, cast below is wrong.\");\n+\n+    uv_mutex_lock(&msgMutex);\n+    this->msgQueue->push(reinterpret_cast<wchar_t*>(msg));\n+\n+    if (this->waitingForMessage) {\n+      uv_sem_post(&newMsgSem);\n+      this->waitingForMessage = false;\n+    }\n+\n+    uv_mutex_unlock(&msgMutex);\n+  }\n+\n+  wchar_t* MessageQueue::PopMessage() {\n+    uv_mutex_lock(&msgMutex);\n+    wchar_t* msg = this->msgQueue->front();\n+    this->msgQueue->pop();\n+    uv_mutex_unlock(&msgMutex);\n+    return msg;\n+  }\n+\n+  bool MessageQueue::IsEmpty() {\n+    return this->msgQueue->empty();\n+  }\n+\n+  void MessageQueue::WaitForMessage() {\n+    uv_mutex_lock(&msgMutex);\n+\n+    if (!this->IsEmpty()) {\n+      uv_mutex_unlock(&msgMutex);\n+      return;\n+    }\n+\n+    this->waitingForMessage = true;\n+    uv_mutex_unlock(&msgMutex);\n+    uv_sem_wait(&newMsgSem);\n+  }\n+\n+  void MessageQueue::SetProcessMessageFunctions(\n+    JsValueRef chakraDebugObject,\n+    JsValueRef processDebuggerMessageFn,\n+    JsValueRef processDebugEventFn,\n+    JsValueRef processShouldContinueFn) {\n+    this->chakraDebugObject = chakraDebugObject;\n+    this->processDebuggerMessageFn = processDebuggerMessageFn;\n+    this->processDebugEventFn = processDebugEventFn;\n+    this->processShouldContinueFn = processShouldContinueFn;\n+  }\n+\n+  void MessageQueue::ProcessDebuggerMessage() {\n+    if (this->isProcessingDebuggerMsg) {\n+      return;\n+    }\n+\n+    if (!this->IsEmpty()) {\n+      this->isProcessingDebuggerMsg = true;\n+\n+      wchar_t* msg = this->PopMessage();\n+\n+      JsValueRef msgArg;\n+      JsErrorCode errorCode = JsPointerToString(msg, wcslen(msg), &msgArg);\n+      CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+      JsValueRef args[] = { jsrt::GetUndefined(), msgArg };\n+      JsValueRef responseRef;\n+      errorCode = JsCallFunction(\n+        this->processDebuggerMessageFn, args, _countof(args), &responseRef);\n+      CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+      JsValueType resultType;\n+      errorCode = JsGetValueType(responseRef, &resultType);\n+      CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+      if (resultType == JsString) {\n+        v8::Local<v8::String> v8Str =\n+          MessageImpl::JsValueRefToV8String(responseRef);\n+        v8::MessageImpl* msgImpl = new v8::MessageImpl(v8Str);\n+        Debug::handler(*msgImpl);\n+      }\n+\n+      this->isProcessingDebuggerMsg = false;\n+    }\n+  }\n+\n+  void MessageQueue::ProcessDebugEvent(\n+    JsDiagDebugEvent debugEvent,\n+    JsValueRef eventData) {\n+    JsValueRef debugEventRef;\n+    JsErrorCode errorCode = JsIntToNumber(debugEvent, &debugEventRef);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    JsValueRef args[] = { jsrt::GetUndefined(), debugEventRef, eventData };\n+    JsValueRef result;\n+    errorCode = JsCallFunction(\n+      this->processDebugEventFn, args, _countof(args), &result);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    JsValueType resultType;\n+    errorCode = JsGetValueType(result, &resultType);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    if (resultType == JsString) {\n+      v8::Local<v8::String> v8Str = MessageImpl::JsValueRefToV8String(result);\n+      v8::MessageImpl* msgImpl = new v8::MessageImpl(v8Str);\n+      Debug::handler(*msgImpl);\n+    }\n+  }\n+\n+  bool MessageQueue::ShouldContinue(JsDiagDebugEvent debugEvent) {\n+    JsValueRef debugEventRef;\n+    JsErrorCode errorCode = JsIntToNumber(debugEvent, &debugEventRef);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    JsValueRef args[] = { jsrt::GetUndefined(), debugEventRef };\n+    JsValueRef result;\n+    errorCode = JsCallFunction(\n+      this->processShouldContinueFn, args, _countof(args), &result);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    JsValueType resultType;\n+    errorCode = JsGetValueType(result, &resultType);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    CHAKRA_VERIFY(resultType == JsBoolean);\n+\n+    bool shouldContinue = true;\n+    errorCode = JsBooleanToBool(result, &shouldContinue);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    return shouldContinue;\n+  }\n+\n+  MessageImpl::MessageImpl(Local<String> v8Str) {\n+    this->v8Str = v8Str;\n+  }\n+\n+  Isolate* MessageImpl::GetIsolate() const {\n+    return jsrt::IsolateShim::GetCurrentAsIsolate();\n+  }\n+\n+  Local<String> MessageImpl::JsValueRefToV8String(JsValueRef result) {\n+    JsValueRef scriptRef;\n+    const wchar_t *script;\n+\n+    JsErrorCode errorCode = jsrt::ToString(result, &scriptRef, &script);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+\n+    v8::Local<v8::String> v8Str = v8::String::NewFromTwoByte(\n+      jsrt::IsolateShim::GetCurrentAsIsolate(),\n+      reinterpret_cast<uint16_t*>(const_cast<wchar_t*>(script)));\n+    return v8Str;\n+  }\n+\n+  Local<String> MessageImpl::GetJSON() const {\n+    return this->v8Str;\n+  }\n+\n+  void Debug::EnableDebug() {\n     g_EnableDebug = true;\n+  }\n+\n+  bool Debug::IsDebugEnabled() {\n+    return g_EnableDebug;\n+  }\n+\n+  Local<Context> Debug::GetDebugContext(Isolate* isolate) {\n+    jsrt::IsolateShim* isoShim = jsrt::IsolateShim::FromIsolate(isolate);\n+    JsContextRef debugContextRef = JS_INVALID_REFERENCE;\n+    if (isoShim->debugContext == JS_INVALID_REFERENCE) {\n+      HandleScope scope(isolate);\n+      debugContextRef = *Context::New(isolate);\n+      isoShim->debugContext = isoShim->GetContextShim(\n+        debugContextRef);\n+      JsAddRef(debugContextRef, nullptr);\n+\n+      Local<Object> global = Context::GetCurrent()->Global();\n+\n+      // CHAKRA-TODO: Chakra doesn't fully implement the debugger without\n+      // --debug flag. Add a dummy 'Debug' on global object if it doesn't\n+      // already exist.\n+      {\n+        Context::Scope context_scope(debugContextRef);\n+        jsrt::ContextShim* contextShim = jsrt::ContextShim::GetCurrent();\n+        JsValueRef ensureDebug = contextShim->GetensureDebugFunction();\n+        JsValueRef unused;\n+        if (jsrt::CallFunction(ensureDebug, *global, &unused) != JsNoError) {\n+          return Local<Context>();\n+        }\n+      }\n+    }\n+\n+    return static_cast<Context*>(isoShim->debugContext->GetContextRef());\n+  }\n \n-    Local<Context> currentContext = Context::GetCurrent();\n-    if (!currentContext.IsEmpty()) {\n-      // Turn on debug mode on current Context (script engine), which was\n-      // created before start debugging and not in debug mode.\n-      JsStartDebugging();\n+  void CALLBACK JsDiagDebugEventHandler(\n+    JsDiagDebugEvent debugEvent,\n+    JsValueRef eventData,\n+    void* callbackState) {\n+    if (Debug::handler == nullptr) {\n+      return;\n     }\n+\n+    Debug::messageQueue.debugEventProcessCount++;\n+    bool isMsgToProcess = !Debug::messageQueue.IsEmpty();\n+    bool shouldContinue = true;\n+    do {\n+      if (eventData != nullptr) {\n+        Debug::messageQueue.ProcessDebugEvent(debugEvent, eventData);\n+        eventData = nullptr;\n+      }\n+\n+      // Process all messages received from debugger\n+      if (Debug::messageQueue.debugEventProcessCount <= 1) {\n+        isMsgToProcess = !Debug::messageQueue.IsEmpty();\n+        while (!Debug::messageQueue.isProcessingDebuggerMsg && isMsgToProcess) {\n+          Debug::messageQueue.ProcessDebuggerMessage();\n+          isMsgToProcess = !Debug::messageQueue.IsEmpty();\n+        }\n+      }\n+\n+      shouldContinue = Debug::messageQueue.ShouldContinue(debugEvent);\n+      if (!shouldContinue) {\n+        Debug::messageQueue.WaitForMessage();\n+      }\n+\n+      isMsgToProcess = !Debug::messageQueue.IsEmpty();\n+    } while (isMsgToProcess &&\n+      !Debug::messageQueue.isProcessingDebuggerMsg && !shouldContinue);\n+\n+    Debug::messageQueue.debugEventProcessCount--;\n+  }\n+\n+  void Debug::StartDebugging(JsRuntimeHandle runtime) {\n+    JsErrorCode errorCode = JsDiagStartDebugging(\n+      runtime, JsDiagDebugEventHandler, nullptr);\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n+  }\n+\n+  void Debug::SendCommand(Isolate* isolate,\n+    const uint16_t* command, int length,\n+    ClientData* client_data) {\n+    CHAKRA_ASSERT(client_data == NULL);\n+\n+    // Save command in a queue and when JsDiagDebugEventHandler\n+    // is called we need to process the queue\n+    messageQueue.SaveMessage(command, length);\n+\n+    // Request async break from engine so that we can process\n+    // commands on JsDiagDebugEventAsyncBreak\n+    JsErrorCode errorCode = JsDiagRequestAsyncBreak(\n+      jsrt::IsolateShim::FromIsolate(isolate)->GetRuntimeHandle());\n+    CHAKRA_VERIFY_NOERROR(errorCode);\n   }\n \n-error:\n-#else\n-  hr = E_FAIL;  // ChakraCore does not support JsStartDebugging\n+  static JsValueRef CALLBACK Log(","path":"deps/chakrashim/src/v8debug.cc","position":308,"original_position":308,"commit_id":"e5d1660fbd69a2aa4584a961eee9504e64f8b5b4","original_commit_id":"e5d1660fbd69a2aa4584a961eee9504e64f8b5b4","user":{"login":"agarwal-sandeep","id":12059066,"avatar_url":"https://avatars.githubusercontent.com/u/12059066?v=3","gravatar_id":"","url":"https://api.github.com/users/agarwal-sandeep","html_url":"https://github.com/agarwal-sandeep","followers_url":"https://api.github.com/users/agarwal-sandeep/followers","following_url":"https://api.github.com/users/agarwal-sandeep/following{/other_user}","gists_url":"https://api.github.com/users/agarwal-sandeep/gists{/gist_id}","starred_url":"https://api.github.com/users/agarwal-sandeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agarwal-sandeep/subscriptions","organizations_url":"https://api.github.com/users/agarwal-sandeep/orgs","repos_url":"https://api.github.com/users/agarwal-sandeep/repos","events_url":"https://api.github.com/users/agarwal-sandeep/events{/privacy}","received_events_url":"https://api.github.com/users/agarwal-sandeep/received_events","type":"User","site_admin":false},"body":"Yes","created_at":"2016-10-05T21:15:46Z","updated_at":"2016-10-05T21:15:46Z","html_url":"https://github.com/nodejs/node-chakracore/pull/126#discussion_r82072437","pull_request_url":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126","_links":{"self":{"href":"https://api.github.com/repos/nodejs/node-chakracore/pulls/comments/82072437"},"html":{"href":"https://github.com/nodejs/node-chakracore/pull/126#discussion_r82072437"},"pull_request":{"href":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126"}}},"pull_request":{"url":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126","id":87208419,"html_url":"https://github.com/nodejs/node-chakracore/pull/126","diff_url":"https://github.com/nodejs/node-chakracore/pull/126.diff","patch_url":"https://github.com/nodejs/node-chakracore/pull/126.patch","issue_url":"https://api.github.com/repos/nodejs/node-chakracore/issues/126","number":126,"state":"open","locked":false,"title":"deps: chakrashim enable JavaScript debugging","user":{"login":"agarwal-sandeep","id":12059066,"avatar_url":"https://avatars.githubusercontent.com/u/12059066?v=3","gravatar_id":"","url":"https://api.github.com/users/agarwal-sandeep","html_url":"https://github.com/agarwal-sandeep","followers_url":"https://api.github.com/users/agarwal-sandeep/followers","following_url":"https://api.github.com/users/agarwal-sandeep/following{/other_user}","gists_url":"https://api.github.com/users/agarwal-sandeep/gists{/gist_id}","starred_url":"https://api.github.com/users/agarwal-sandeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agarwal-sandeep/subscriptions","organizations_url":"https://api.github.com/users/agarwal-sandeep/orgs","repos_url":"https://api.github.com/users/agarwal-sandeep/repos","events_url":"https://api.github.com/users/agarwal-sandeep/events{/privacy}","received_events_url":"https://api.github.com/users/agarwal-sandeep/received_events","type":"User","site_admin":false},"body":"<!--\r\nThank you for your pull request. Please review below requirements.\r\n\r\nBug fixes and new features should include tests and possibly benchmarks.\r\n\r\nContributors guide: https://github.com/nodejs/node/blob/master/CONTRIBUTING.md\r\n-->\r\n\r\n##### Checklist\r\n<!-- Remove items that do not apply. For completed items, change [ ] to [x]. -->\r\n\r\n- [x] `make -j4 test` (UNIX), or `vcbuild test nosign` (Windows) passes\r\n- [x] commit message follows commit guidelines\r\n\r\n##### Affected core subsystem(s)\r\n<!-- Provide affected core subsystem(s) (like doc, cluster, crypto, etc). -->\r\nchakrashim, node\r\n\r\n##### Description of change\r\n<!-- Provide a description of the change below this comment. -->\r\n\r\nThis change adds JavaScript debugging support in node-chakracore by using\r\nJsRT debugging apis added in chakracore release 1.3. A shim convert v8\r\ndebugging protocol messages to chakracore debugging apis and visa-versa.\r\n\r\nnode-chakracore only expose the debugging protocol messages and doesn't\r\nshim all the apis which v8 provides, so it is only debuggable using tools\r\nwhich just relies on debugging protocol json and doesn't use internals\r\nof v8 debugging implementations.\r\n\r\n\r\nPR-URL: nodejs/node-chakracore#[To be filled]\r\nReviewed-By: [To be filled]","created_at":"2016-09-28T21:49:49Z","updated_at":"2016-10-05T21:15:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3be586df1a3c11b8e1a01cac0dc091bd812a6130","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126/commits","review_comments_url":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126/comments","review_comment_url":"https://api.github.com/repos/nodejs/node-chakracore/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nodejs/node-chakracore/issues/126/comments","statuses_url":"https://api.github.com/repos/nodejs/node-chakracore/statuses/e5d1660fbd69a2aa4584a961eee9504e64f8b5b4","head":{"label":"agarwal-sandeep:debugging-vscode-pr","ref":"debugging-vscode-pr","sha":"e5d1660fbd69a2aa4584a961eee9504e64f8b5b4","user":{"login":"agarwal-sandeep","id":12059066,"avatar_url":"https://avatars.githubusercontent.com/u/12059066?v=3","gravatar_id":"","url":"https://api.github.com/users/agarwal-sandeep","html_url":"https://github.com/agarwal-sandeep","followers_url":"https://api.github.com/users/agarwal-sandeep/followers","following_url":"https://api.github.com/users/agarwal-sandeep/following{/other_user}","gists_url":"https://api.github.com/users/agarwal-sandeep/gists{/gist_id}","starred_url":"https://api.github.com/users/agarwal-sandeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agarwal-sandeep/subscriptions","organizations_url":"https://api.github.com/users/agarwal-sandeep/orgs","repos_url":"https://api.github.com/users/agarwal-sandeep/repos","events_url":"https://api.github.com/users/agarwal-sandeep/events{/privacy}","received_events_url":"https://api.github.com/users/agarwal-sandeep/received_events","type":"User","site_admin":false},"repo":{"id":53895834,"name":"node-chakracore","full_name":"agarwal-sandeep/node-chakracore","owner":{"login":"agarwal-sandeep","id":12059066,"avatar_url":"https://avatars.githubusercontent.com/u/12059066?v=3","gravatar_id":"","url":"https://api.github.com/users/agarwal-sandeep","html_url":"https://github.com/agarwal-sandeep","followers_url":"https://api.github.com/users/agarwal-sandeep/followers","following_url":"https://api.github.com/users/agarwal-sandeep/following{/other_user}","gists_url":"https://api.github.com/users/agarwal-sandeep/gists{/gist_id}","starred_url":"https://api.github.com/users/agarwal-sandeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agarwal-sandeep/subscriptions","organizations_url":"https://api.github.com/users/agarwal-sandeep/orgs","repos_url":"https://api.github.com/users/agarwal-sandeep/repos","events_url":"https://api.github.com/users/agarwal-sandeep/events{/privacy}","received_events_url":"https://api.github.com/users/agarwal-sandeep/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/agarwal-sandeep/node-chakracore","description":"Node.js on ChakraCore :sparkles::turtle::rocket::sparkles:","fork":true,"url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore","forks_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/forks","keys_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/teams","hooks_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/hooks","issue_events_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/issues/events{/number}","events_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/events","assignees_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/assignees{/user}","branches_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/branches{/branch}","tags_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/tags","blobs_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/git/refs{/sha}","trees_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/statuses/{sha}","languages_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/languages","stargazers_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/stargazers","contributors_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/contributors","subscribers_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/subscribers","subscription_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/subscription","commits_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/commits{/sha}","git_commits_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/git/commits{/sha}","comments_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/comments{/number}","issue_comment_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/issues/comments{/number}","contents_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/contents/{+path}","compare_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/merges","archive_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/downloads","issues_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/issues{/number}","pulls_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/pulls{/number}","milestones_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/milestones{/number}","notifications_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/labels{/name}","releases_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/releases{/id}","deployments_url":"https://api.github.com/repos/agarwal-sandeep/node-chakracore/deployments","created_at":"2016-03-14T22:16:47Z","updated_at":"2016-03-14T22:16:51Z","pushed_at":"2016-09-28T21:48:08Z","git_url":"git://github.com/agarwal-sandeep/node-chakracore.git","ssh_url":"git@github.com:agarwal-sandeep/node-chakracore.git","clone_url":"https://github.com/agarwal-sandeep/node-chakracore.git","svn_url":"https://github.com/agarwal-sandeep/node-chakracore","homepage":"","size":217026,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"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":0,"default_branch":"debugging-ttd-preview"}},"base":{"label":"nodejs:chakracore-master","ref":"chakracore-master","sha":"6b9de405e14c8332ff99a95bb0e6fca481213340","user":{"login":"nodejs","id":9950313,"avatar_url":"https://avatars.githubusercontent.com/u/9950313?v=3","gravatar_id":"","url":"https://api.github.com/users/nodejs","html_url":"https://github.com/nodejs","followers_url":"https://api.github.com/users/nodejs/followers","following_url":"https://api.github.com/users/nodejs/following{/other_user}","gists_url":"https://api.github.com/users/nodejs/gists{/gist_id}","starred_url":"https://api.github.com/users/nodejs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nodejs/subscriptions","organizations_url":"https://api.github.com/users/nodejs/orgs","repos_url":"https://api.github.com/users/nodejs/repos","events_url":"https://api.github.com/users/nodejs/events{/privacy}","received_events_url":"https://api.github.com/users/nodejs/received_events","type":"Organization","site_admin":false},"repo":{"id":46881155,"name":"node-chakracore","full_name":"nodejs/node-chakracore","owner":{"login":"nodejs","id":9950313,"avatar_url":"https://avatars.githubusercontent.com/u/9950313?v=3","gravatar_id":"","url":"https://api.github.com/users/nodejs","html_url":"https://github.com/nodejs","followers_url":"https://api.github.com/users/nodejs/followers","following_url":"https://api.github.com/users/nodejs/following{/other_user}","gists_url":"https://api.github.com/users/nodejs/gists{/gist_id}","starred_url":"https://api.github.com/users/nodejs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nodejs/subscriptions","organizations_url":"https://api.github.com/users/nodejs/orgs","repos_url":"https://api.github.com/users/nodejs/repos","events_url":"https://api.github.com/users/nodejs/events{/privacy}","received_events_url":"https://api.github.com/users/nodejs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nodejs/node-chakracore","description":"Node.js on ChakraCore :sparkles::turtle::rocket::sparkles:","fork":false,"url":"https://api.github.com/repos/nodejs/node-chakracore","forks_url":"https://api.github.com/repos/nodejs/node-chakracore/forks","keys_url":"https://api.github.com/repos/nodejs/node-chakracore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nodejs/node-chakracore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nodejs/node-chakracore/teams","hooks_url":"https://api.github.com/repos/nodejs/node-chakracore/hooks","issue_events_url":"https://api.github.com/repos/nodejs/node-chakracore/issues/events{/number}","events_url":"https://api.github.com/repos/nodejs/node-chakracore/events","assignees_url":"https://api.github.com/repos/nodejs/node-chakracore/assignees{/user}","branches_url":"https://api.github.com/repos/nodejs/node-chakracore/branches{/branch}","tags_url":"https://api.github.com/repos/nodejs/node-chakracore/tags","blobs_url":"https://api.github.com/repos/nodejs/node-chakracore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nodejs/node-chakracore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nodejs/node-chakracore/git/refs{/sha}","trees_url":"https://api.github.com/repos/nodejs/node-chakracore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nodejs/node-chakracore/statuses/{sha}","languages_url":"https://api.github.com/repos/nodejs/node-chakracore/languages","stargazers_url":"https://api.github.com/repos/nodejs/node-chakracore/stargazers","contributors_url":"https://api.github.com/repos/nodejs/node-chakracore/contributors","subscribers_url":"https://api.github.com/repos/nodejs/node-chakracore/subscribers","subscription_url":"https://api.github.com/repos/nodejs/node-chakracore/subscription","commits_url":"https://api.github.com/repos/nodejs/node-chakracore/commits{/sha}","git_commits_url":"https://api.github.com/repos/nodejs/node-chakracore/git/commits{/sha}","comments_url":"https://api.github.com/repos/nodejs/node-chakracore/comments{/number}","issue_comment_url":"https://api.github.com/repos/nodejs/node-chakracore/issues/comments{/number}","contents_url":"https://api.github.com/repos/nodejs/node-chakracore/contents/{+path}","compare_url":"https://api.github.com/repos/nodejs/node-chakracore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nodejs/node-chakracore/merges","archive_url":"https://api.github.com/repos/nodejs/node-chakracore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nodejs/node-chakracore/downloads","issues_url":"https://api.github.com/repos/nodejs/node-chakracore/issues{/number}","pulls_url":"https://api.github.com/repos/nodejs/node-chakracore/pulls{/number}","milestones_url":"https://api.github.com/repos/nodejs/node-chakracore/milestones{/number}","notifications_url":"https://api.github.com/repos/nodejs/node-chakracore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nodejs/node-chakracore/labels{/name}","releases_url":"https://api.github.com/repos/nodejs/node-chakracore/releases{/id}","deployments_url":"https://api.github.com/repos/nodejs/node-chakracore/deployments","created_at":"2015-11-25T19:09:26Z","updated_at":"2016-10-05T13:19:44Z","pushed_at":"2016-10-05T20:22:34Z","git_url":"git://github.com/nodejs/node-chakracore.git","ssh_url":"git@github.com:nodejs/node-chakracore.git","clone_url":"https://github.com/nodejs/node-chakracore.git","svn_url":"https://github.com/nodejs/node-chakracore","homepage":"","size":229002,"stargazers_count":803,"watchers_count":803,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":60,"mirror_url":null,"open_issues_count":30,"forks":60,"open_issues":30,"watchers":803,"default_branch":"chakracore-master"}},"_links":{"self":{"href":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126"},"html":{"href":"https://github.com/nodejs/node-chakracore/pull/126"},"issue":{"href":"https://api.github.com/repos/nodejs/node-chakracore/issues/126"},"comments":{"href":"https://api.github.com/repos/nodejs/node-chakracore/issues/126/comments"},"review_comments":{"href":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126/comments"},"review_comment":{"href":"https://api.github.com/repos/nodejs/node-chakracore/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nodejs/node-chakracore/pulls/126/commits"},"statuses":{"href":"https://api.github.com/repos/nodejs/node-chakracore/statuses/e5d1660fbd69a2aa4584a961eee9504e64f8b5b4"}}}}
{"actor":{"display_login":"agarwal-sandeep"}}