{"action":"created","comment":{"url":"https://api.github.com/repos/dropbox/pyston/pulls/comments/34627682","id":34627682,"diff_hunk":"@@ -0,0 +1,251 @@\n+# Development tips\n+\n+## General\n+\n+### Exceptions and stack unwinding\n+\n+Having a custom unwinder, Pyston has a few special constraints - see [exception safety](EXCEPTION-SAFETY.md) and [unwinding](UNWINDING.md).\n+\n+### Make shortcuts\n+\n+The main Make targets you will use will be\n+- `make`: to compile in debug mode and generate the `pyston_dbg` executable\n+- `make pyston_release`: to compile in release mode and generate the `pyston_release` executable\n+- `make check`: run the tests\n+- `make run`: run the REPL\n+- `make format`: run clang-format over the codebase\n+\n+In addition\n+- We have a number of helpers of the form `make VERB_TESTNAME`, where `TESTNAME` can be any of the tests/benchmarks, and `VERB` can be one of:\n+ - `make quick_check`: run only the cheap-to-run tests.\n+ - `make run_TESTNAME`: runs the file under pyston_dbg.\n+ - `make run_release_TESTNAME`: runs the file under pyston_release.\n+ - `make dbg_TESTNAME`: same as `run`, but runs pyston under gdb.\n+ - `make check_release`: release mode version of `make_check`\n+ - `make check_TESTNAME`: checks that the script has the same behavior under pyston_dbg as it does under CPython.  See tools/tester.py for information about test annotations.\n+ - `make perf_TESTNAME`: runs the script in pyston_release, and uses perf to record and display performance statistics.\n+ - A few lesser used ones; see the Makefile for details.\n+- `make watch_cmd`: meta-command which uses inotifywait to run `make cmd` every time a source file changes.\n+ - For example, `make watch_pyston_dbg` will rebuild pyston_dbg every time you save a source file.  This is handy enough to have the alias `make watch`.\n+ - `make watch_run_TESTNAME` will rebuild pyston_dbg and run TESTNAME every time you change a file.\n+ - `make wdbg_TESTNAME` is mostly an alias for `make watch_dbg_TESTNAME`, but will automatically quit GDB for you.  This is handy if Pyston is crashing and you want to get a C-level stacktrace.\n+\n+There are a number of common flags you can pass to your make invocations:\n+- `V=1` or `VERBOSE=1`: display the full commands being executed\n+- `ARGS=-v`: pass the given args (in this example, `-v`) to the executable.\n+ - Note: these will usually end up before the script name, and so apply to the Pyston runtime as opposed to appearing in sys.argv.  For example, `make run_test ARGS=-v` will execute `./pyston_dbg -v test.py`.\n+- `BR=breakpoint`: when running under gdb, automatically set a breakpoint at the given location.\n+- `SELF_HOST=1`: run all of our Python scripts using pyston_dbg.\n+\n+For a full list, please check out the [Makefile](https://github.com/dropbox/pyston/blob/master/Makefile).\n+\n+### CPython code\n+\n+Pyston was developed with C-extension support in mind. We are making a C API that C extensions should be able to use without any change. Some problematic parts of CPython (such as custom destructors) are \"commented out\" via macros or replaced, and we use ideas like conservative scanning to address the functionality changes.\n+\n+As a fortunate consequence, we are often able to call directly into CPython's code or copy large segments from it. For example, we mostly use all of CPython's existing logic for unicode strings, which would be a terrible idea to reimplement. A large portion of CPython's code resides in our `from_cpython/` directory, which some patches here and there.\n+\n+Where possible and if it can be done cleanly, it can be a good idea to reuse CPython's code rather than rewrite our own. For this reason, it is also useful to have a copy of [CPython's 2.7 branch checked out](https://github.com/python/cpython/tree/2.7) for reference. Certain features have a lot of intricate edge cases like list slicing - it is useful to look at CPython's code to match their behavior.\n+\n+\n+## Performance\n+\n+Pyston's primary reason _raison d'être_ is to have better performance than CPython. That's why it is important to always keep performance in mind when developing Pyston's codebase.\n+\n+### Counters & timers\n+\n+We have a number of counters and timers that were manually written and inserted into the program. To display the results of a run, use the `-s` flag. The result of timer counters is displayed in microseconds.\n+\n+There's two types of timers in the code. The first are `StatCounter`s. They are just counters where we log the time elapsed manually, measured using a `Timer`. The second are `STAT_TIMER`s, which pause the parent `STAT_TIMER` when they are nested.\n+\n+A lot of counters and timers are enabled even in release mode, but others would add too much overhead to include in every run. You can enable them by modifying the macros (e.g. `EXPENSIVE_STAT_TIMERS`) at the top of `src/core/stats.h`.\n+\n+##### Problem: I get slower performance in the first run of a program\n+\n+This is normal and it is best to always run a program at least twice if you are interested in the timer results. Pyston will cache some jitted code from previous runs.\n+\n+### Benchmarks\n+\n+The main benchmarks we use at the moment are in [https://github.com/dropbox/pyston-perf](https://github.com/dropbox/pyston-perf), which you should definitely clone (in the same directory as Pyston) and use.\n+\n+To measure the performance impact of your changes, you will first need to get the latest baseline performance numbers on your machine. Compile `master` with `make pyston_release` and run\n+\n+```\n+python ../pyston-perf/benchmarking/measure_perf.py --save baseline --run-times 3 --take-min\n+```\n+\n+Then switch to your branch, recompile and compare with\n+\n+```\n+python ../pyston-perf/benchmarking/measure_perf.py --compare baseline --run-times 3 --take-min\n+```\n+\n+This will produce output that looks like\n+\n+```\n+              pyston (calibration)                      :    1.0s baseline: 1.0 (-1.8%)\n+              pyston django_template.py                 :    4.6s baseline: 4.5 (+2.2%)\n+              pyston pyxl_bench.py                      :    3.7s baseline: 3.7 (+0.2%)\n+              pyston sqlalchemy_imperative2.py          :    5.2s baseline: 5.1 (+1.1%)\n+              pyston django_migrate.py                  :    1.7s baseline: 1.7 (+1.1%)\n+              pyston virtualenv_bench.py                :    5.3s baseline: 5.2 (+1.6%)\n+              pyston interp2.py                         :    3.9s baseline: 3.9 (-0.4%)\n+              pyston raytrace.py                        :    5.6s baseline: 5.4 (+4.1%)\n+              pyston nbody.py                           :    7.2s baseline: 6.9 (+5.1%)\n+              pyston fannkuch.py                        :    6.1s baseline: 5.8 (+5.6%)\n+              pyston chaos.py                           :   18.2s baseline: 17.3 (+5.2%)\n+              pyston fasta.py                           :    4.4s baseline: 4.1 (+7.8%)\n+              pyston pidigits.py                        :    5.5s baseline: 5.4 (+2.5%)\n+              pyston richards.py                        :    1.5s baseline: 1.5 (+0.6%)\n+              pyston deltablue.py                       :    1.4s baseline: 1.3 (+1.0%)\n+              pyston (geomean-10eb)                     :    4.3s baseline: 4.2 (+2.7%)\n+```\n+\n+The numbers shown is the smallest value obtained after 3 (or more, if you wish) runs. It is recommended to include these outputs in non-trivial pull requests as a way to document the performance impacts, if any.\n+\n+##### Problem: My trivial change just created a 2% reduction in performance\n+\n+Unfortunately, variations in performance can be fairly large across runs, relatively speaking. The variance usually isn't more than 1-2%, but given the breadth of Python code, performance is can sometimes only be achieved via dozens of 0.5% optimizations and it is hard to measure a 0.5% performance change if the variance is 1%. So depending on the machine Pyston is running on, the variance can feel quite large. For small optimizations, it's useful to write a small microbenchmark (e.g. a tight loop).\n+\n+To add to the challenge of precise performance measurements, *adding trivial code or even unreachable code can change the performance characteristics* by moving other hot functions around in the assembly which can help or hinder the effectiveness of the instruction cache. This is something we plan to address in the future, but reducing variance across runs would be a very valuable contribution if you are interested (e.g. by placing large gaps between assemblies of different functions and aligning them to cache lines).\n+\n+Some benchmarks are particularly prone to variations caused by trivial changes. [http://speed.pyston.org/](http://speed.pyston.org/timeline) shows the performance graphs of many of the benchmarks. If a benchmark already shows a fair amount of up and downs, it is not as big a deal if the PR causes a performance drop in that benchmark. For example, [django_template](http://speed.pyston.org/timeline/#/?exe=1,3&base=none&ben=django_template&env=2&revs=1000&equid=off) is a benchmark that performs better and better, but [nbody](http://speed.pyston.org/timeline/#/?exe=1,3&base=none&ben=nbody&env=2&revs=1000&equid=off) has the tendency to be affected by the most unrelated changes.\n+\n+### Profiling tools\n+\n+The general go-to tool for profiling that we use is `perf`, which shows the hot functions in which the program spends the most time and their callers. It can be used as follows:\n+\n+```\n+perf record -g -- ./pyston_release ../pyston-perf/benchmarking/benchmark_suite/django_template.py\n+```\n+\n+This will create a `.perf` file in the same directory that can be viewed using `perf report -n`. We recommend using the `-n` flag which shows the number of samples per function as well as the percentage, which is useful when comparing two perf runs.","path":"docs/TIPS.md","position":122,"original_position":122,"commit_id":"011cb90de0f8c4a0c787117a338cd4e787698425","original_commit_id":"011cb90de0f8c4a0c787117a338cd4e787698425","user":{"login":"toshok","id":24245,"avatar_url":"https://avatars.githubusercontent.com/u/24245?v=3","gravatar_id":"","url":"https://api.github.com/users/toshok","html_url":"https://github.com/toshok","followers_url":"https://api.github.com/users/toshok/followers","following_url":"https://api.github.com/users/toshok/following{/other_user}","gists_url":"https://api.github.com/users/toshok/gists{/gist_id}","starred_url":"https://api.github.com/users/toshok/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/toshok/subscriptions","organizations_url":"https://api.github.com/users/toshok/orgs","repos_url":"https://api.github.com/users/toshok/repos","events_url":"https://api.github.com/users/toshok/events{/privacy}","received_events_url":"https://api.github.com/users/toshok/received_events","type":"User","site_admin":false},"body":"`perf.data` file","created_at":"2015-07-14T22:27:25Z","updated_at":"2015-07-14T22:27:25Z","html_url":"https://github.com/dropbox/pyston/pull/687#discussion_r34627682","pull_request_url":"https://api.github.com/repos/dropbox/pyston/pulls/687","_links":{"self":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/comments/34627682"},"html":{"href":"https://github.com/dropbox/pyston/pull/687#discussion_r34627682"},"pull_request":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/687"}}},"pull_request":{"url":"https://api.github.com/repos/dropbox/pyston/pulls/687","id":39707127,"html_url":"https://github.com/dropbox/pyston/pull/687","diff_url":"https://github.com/dropbox/pyston/pull/687.diff","patch_url":"https://github.com/dropbox/pyston/pull/687.patch","issue_url":"https://api.github.com/repos/dropbox/pyston/issues/687","number":687,"state":"open","locked":false,"title":"Add docs and tips for new contributors","user":{"login":"rudi-c","id":2747897,"avatar_url":"https://avatars.githubusercontent.com/u/2747897?v=3","gravatar_id":"","url":"https://api.github.com/users/rudi-c","html_url":"https://github.com/rudi-c","followers_url":"https://api.github.com/users/rudi-c/followers","following_url":"https://api.github.com/users/rudi-c/following{/other_user}","gists_url":"https://api.github.com/users/rudi-c/gists{/gist_id}","starred_url":"https://api.github.com/users/rudi-c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rudi-c/subscriptions","organizations_url":"https://api.github.com/users/rudi-c/orgs","repos_url":"https://api.github.com/users/rudi-c/repos","events_url":"https://api.github.com/users/rudi-c/events{/privacy}","received_events_url":"https://api.github.com/users/rudi-c/received_events","type":"User","site_admin":false},"body":"The changes are mainly doc changes, so they are easier to read from my fork https://github.com/rudi-c/pyston than the diff itself.\r\n\r\nMostly of the changes are in `CONTRIBUTING.md` and `docs/TIPS.md`","created_at":"2015-07-10T17:43:25Z","updated_at":"2015-07-14T22:27:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cce015d437bf36d81aedccbc577ce636551054a6","assignee":{"login":"toshok","id":24245,"avatar_url":"https://avatars.githubusercontent.com/u/24245?v=3","gravatar_id":"","url":"https://api.github.com/users/toshok","html_url":"https://github.com/toshok","followers_url":"https://api.github.com/users/toshok/followers","following_url":"https://api.github.com/users/toshok/following{/other_user}","gists_url":"https://api.github.com/users/toshok/gists{/gist_id}","starred_url":"https://api.github.com/users/toshok/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/toshok/subscriptions","organizations_url":"https://api.github.com/users/toshok/orgs","repos_url":"https://api.github.com/users/toshok/repos","events_url":"https://api.github.com/users/toshok/events{/privacy}","received_events_url":"https://api.github.com/users/toshok/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/dropbox/pyston/pulls/687/commits","review_comments_url":"https://api.github.com/repos/dropbox/pyston/pulls/687/comments","review_comment_url":"https://api.github.com/repos/dropbox/pyston/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dropbox/pyston/issues/687/comments","statuses_url":"https://api.github.com/repos/dropbox/pyston/statuses/011cb90de0f8c4a0c787117a338cd4e787698425","head":{"label":"rudi-c:docs","ref":"docs","sha":"011cb90de0f8c4a0c787117a338cd4e787698425","user":{"login":"rudi-c","id":2747897,"avatar_url":"https://avatars.githubusercontent.com/u/2747897?v=3","gravatar_id":"","url":"https://api.github.com/users/rudi-c","html_url":"https://github.com/rudi-c","followers_url":"https://api.github.com/users/rudi-c/followers","following_url":"https://api.github.com/users/rudi-c/following{/other_user}","gists_url":"https://api.github.com/users/rudi-c/gists{/gist_id}","starred_url":"https://api.github.com/users/rudi-c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rudi-c/subscriptions","organizations_url":"https://api.github.com/users/rudi-c/orgs","repos_url":"https://api.github.com/users/rudi-c/repos","events_url":"https://api.github.com/users/rudi-c/events{/privacy}","received_events_url":"https://api.github.com/users/rudi-c/received_events","type":"User","site_admin":false},"repo":{"id":35190032,"name":"pyston","full_name":"rudi-c/pyston","owner":{"login":"rudi-c","id":2747897,"avatar_url":"https://avatars.githubusercontent.com/u/2747897?v=3","gravatar_id":"","url":"https://api.github.com/users/rudi-c","html_url":"https://github.com/rudi-c","followers_url":"https://api.github.com/users/rudi-c/followers","following_url":"https://api.github.com/users/rudi-c/following{/other_user}","gists_url":"https://api.github.com/users/rudi-c/gists{/gist_id}","starred_url":"https://api.github.com/users/rudi-c/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rudi-c/subscriptions","organizations_url":"https://api.github.com/users/rudi-c/orgs","repos_url":"https://api.github.com/users/rudi-c/repos","events_url":"https://api.github.com/users/rudi-c/events{/privacy}","received_events_url":"https://api.github.com/users/rudi-c/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rudi-c/pyston","description":"An open-source Python implementation using JIT techniques. ","fork":true,"url":"https://api.github.com/repos/rudi-c/pyston","forks_url":"https://api.github.com/repos/rudi-c/pyston/forks","keys_url":"https://api.github.com/repos/rudi-c/pyston/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rudi-c/pyston/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rudi-c/pyston/teams","hooks_url":"https://api.github.com/repos/rudi-c/pyston/hooks","issue_events_url":"https://api.github.com/repos/rudi-c/pyston/issues/events{/number}","events_url":"https://api.github.com/repos/rudi-c/pyston/events","assignees_url":"https://api.github.com/repos/rudi-c/pyston/assignees{/user}","branches_url":"https://api.github.com/repos/rudi-c/pyston/branches{/branch}","tags_url":"https://api.github.com/repos/rudi-c/pyston/tags","blobs_url":"https://api.github.com/repos/rudi-c/pyston/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rudi-c/pyston/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rudi-c/pyston/git/refs{/sha}","trees_url":"https://api.github.com/repos/rudi-c/pyston/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rudi-c/pyston/statuses/{sha}","languages_url":"https://api.github.com/repos/rudi-c/pyston/languages","stargazers_url":"https://api.github.com/repos/rudi-c/pyston/stargazers","contributors_url":"https://api.github.com/repos/rudi-c/pyston/contributors","subscribers_url":"https://api.github.com/repos/rudi-c/pyston/subscribers","subscription_url":"https://api.github.com/repos/rudi-c/pyston/subscription","commits_url":"https://api.github.com/repos/rudi-c/pyston/commits{/sha}","git_commits_url":"https://api.github.com/repos/rudi-c/pyston/git/commits{/sha}","comments_url":"https://api.github.com/repos/rudi-c/pyston/comments{/number}","issue_comment_url":"https://api.github.com/repos/rudi-c/pyston/issues/comments{/number}","contents_url":"https://api.github.com/repos/rudi-c/pyston/contents/{+path}","compare_url":"https://api.github.com/repos/rudi-c/pyston/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rudi-c/pyston/merges","archive_url":"https://api.github.com/repos/rudi-c/pyston/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rudi-c/pyston/downloads","issues_url":"https://api.github.com/repos/rudi-c/pyston/issues{/number}","pulls_url":"https://api.github.com/repos/rudi-c/pyston/pulls{/number}","milestones_url":"https://api.github.com/repos/rudi-c/pyston/milestones{/number}","notifications_url":"https://api.github.com/repos/rudi-c/pyston/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rudi-c/pyston/labels{/name}","releases_url":"https://api.github.com/repos/rudi-c/pyston/releases{/id}","created_at":"2015-05-07T00:30:38Z","updated_at":"2015-05-07T00:30:47Z","pushed_at":"2015-07-14T17:19:41Z","git_url":"git://github.com/rudi-c/pyston.git","ssh_url":"git@github.com:rudi-c/pyston.git","clone_url":"https://github.com/rudi-c/pyston.git","svn_url":"https://github.com/rudi-c/pyston","homepage":"https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/","size":22674,"stargazers_count":0,"watchers_count":0,"language":"Python","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":"master"}},"base":{"label":"dropbox:master","ref":"master","sha":"649e33f464679d2a02a12a4f8e885c432db4f6cc","user":{"login":"dropbox","id":559357,"avatar_url":"https://avatars.githubusercontent.com/u/559357?v=3","gravatar_id":"","url":"https://api.github.com/users/dropbox","html_url":"https://github.com/dropbox","followers_url":"https://api.github.com/users/dropbox/followers","following_url":"https://api.github.com/users/dropbox/following{/other_user}","gists_url":"https://api.github.com/users/dropbox/gists{/gist_id}","starred_url":"https://api.github.com/users/dropbox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dropbox/subscriptions","organizations_url":"https://api.github.com/users/dropbox/orgs","repos_url":"https://api.github.com/users/dropbox/repos","events_url":"https://api.github.com/users/dropbox/events{/privacy}","received_events_url":"https://api.github.com/users/dropbox/received_events","type":"Organization","site_admin":false},"repo":{"id":18320947,"name":"pyston","full_name":"dropbox/pyston","owner":{"login":"dropbox","id":559357,"avatar_url":"https://avatars.githubusercontent.com/u/559357?v=3","gravatar_id":"","url":"https://api.github.com/users/dropbox","html_url":"https://github.com/dropbox","followers_url":"https://api.github.com/users/dropbox/followers","following_url":"https://api.github.com/users/dropbox/following{/other_user}","gists_url":"https://api.github.com/users/dropbox/gists{/gist_id}","starred_url":"https://api.github.com/users/dropbox/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dropbox/subscriptions","organizations_url":"https://api.github.com/users/dropbox/orgs","repos_url":"https://api.github.com/users/dropbox/repos","events_url":"https://api.github.com/users/dropbox/events{/privacy}","received_events_url":"https://api.github.com/users/dropbox/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dropbox/pyston","description":"An open-source Python implementation using JIT techniques. ","fork":false,"url":"https://api.github.com/repos/dropbox/pyston","forks_url":"https://api.github.com/repos/dropbox/pyston/forks","keys_url":"https://api.github.com/repos/dropbox/pyston/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dropbox/pyston/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dropbox/pyston/teams","hooks_url":"https://api.github.com/repos/dropbox/pyston/hooks","issue_events_url":"https://api.github.com/repos/dropbox/pyston/issues/events{/number}","events_url":"https://api.github.com/repos/dropbox/pyston/events","assignees_url":"https://api.github.com/repos/dropbox/pyston/assignees{/user}","branches_url":"https://api.github.com/repos/dropbox/pyston/branches{/branch}","tags_url":"https://api.github.com/repos/dropbox/pyston/tags","blobs_url":"https://api.github.com/repos/dropbox/pyston/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dropbox/pyston/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dropbox/pyston/git/refs{/sha}","trees_url":"https://api.github.com/repos/dropbox/pyston/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dropbox/pyston/statuses/{sha}","languages_url":"https://api.github.com/repos/dropbox/pyston/languages","stargazers_url":"https://api.github.com/repos/dropbox/pyston/stargazers","contributors_url":"https://api.github.com/repos/dropbox/pyston/contributors","subscribers_url":"https://api.github.com/repos/dropbox/pyston/subscribers","subscription_url":"https://api.github.com/repos/dropbox/pyston/subscription","commits_url":"https://api.github.com/repos/dropbox/pyston/commits{/sha}","git_commits_url":"https://api.github.com/repos/dropbox/pyston/git/commits{/sha}","comments_url":"https://api.github.com/repos/dropbox/pyston/comments{/number}","issue_comment_url":"https://api.github.com/repos/dropbox/pyston/issues/comments{/number}","contents_url":"https://api.github.com/repos/dropbox/pyston/contents/{+path}","compare_url":"https://api.github.com/repos/dropbox/pyston/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dropbox/pyston/merges","archive_url":"https://api.github.com/repos/dropbox/pyston/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dropbox/pyston/downloads","issues_url":"https://api.github.com/repos/dropbox/pyston/issues{/number}","pulls_url":"https://api.github.com/repos/dropbox/pyston/pulls{/number}","milestones_url":"https://api.github.com/repos/dropbox/pyston/milestones{/number}","notifications_url":"https://api.github.com/repos/dropbox/pyston/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dropbox/pyston/labels{/name}","releases_url":"https://api.github.com/repos/dropbox/pyston/releases{/id}","created_at":"2014-04-01T07:17:20Z","updated_at":"2015-07-14T21:12:54Z","pushed_at":"2015-07-14T22:12:53Z","git_url":"git://github.com/dropbox/pyston.git","ssh_url":"git@github.com:dropbox/pyston.git","clone_url":"https://github.com/dropbox/pyston.git","svn_url":"https://github.com/dropbox/pyston","homepage":"https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/","size":31413,"stargazers_count":3024,"watchers_count":3024,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":214,"mirror_url":null,"open_issues_count":70,"forks":214,"open_issues":70,"watchers":3024,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/687"},"html":{"href":"https://github.com/dropbox/pyston/pull/687"},"issue":{"href":"https://api.github.com/repos/dropbox/pyston/issues/687"},"comments":{"href":"https://api.github.com/repos/dropbox/pyston/issues/687/comments"},"review_comments":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/687/comments"},"review_comment":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/687/commits"},"statuses":{"href":"https://api.github.com/repos/dropbox/pyston/statuses/011cb90de0f8c4a0c787117a338cd4e787698425"}}}}