{"action":"created","comment":{"url":"https://api.github.com/repos/dropbox/pyston/pulls/comments/30675970","id":30675970,"diff_hunk":"@@ -405,6 +412,54 @@ void BoxedClass::finishInitialization() {\n     commonClassSetup(this);\n }\n \n+LocalShape BoxedClass::computeLocalShape() {\n+    if (local_shape.isUninitialized()) {\n+        std::vector<std::pair<llvm::StringRef, int>> attrs;\n+\n+        // iterate over all class attributes, storing the pairs of name, offset into attrs\n+        auto hcls = getHCAttrsPtr()->hcls;\n+        llvm::StringMap<int>::const_iterator it;\n+        for (it = hcls->getStrAttrOffsets().begin(); it != hcls->getStrAttrOffsets().end(); it++) {\n+            attrs.emplace_back(it->first(), it->second);\n+        }\n+        // sort the vector to hopefully give a deterministic ordering\n+        std::sort(attrs.begin(), attrs.end(), [](std::pair<llvm::StringRef, int> a, std::pair<llvm::StringRef, int> b) {\n+            return a.second < b.second;\n+        });\n+\n+        // compute a hash of all attribute names\n+        SHA256OStream hash_stream;\n+        for (auto& s : attrs) {\n+            hash_stream << s.first;","path":"src/runtime/objmodel.cpp","position":57,"original_position":57,"commit_id":"dec201f95a26f4bc5f829691108588dcce951e71","original_commit_id":"dec201f95a26f4bc5f829691108588dcce951e71","user":{"login":"kmod","id":271916,"avatar_url":"https://avatars.githubusercontent.com/u/271916?v=3","gravatar_id":"","url":"https://api.github.com/users/kmod","html_url":"https://github.com/kmod","followers_url":"https://api.github.com/users/kmod/followers","following_url":"https://api.github.com/users/kmod/following{/other_user}","gists_url":"https://api.github.com/users/kmod/gists{/gist_id}","starred_url":"https://api.github.com/users/kmod/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmod/subscriptions","organizations_url":"https://api.github.com/users/kmod/orgs","repos_url":"https://api.github.com/users/kmod/repos","events_url":"https://api.github.com/users/kmod/events{/privacy}","received_events_url":"https://api.github.com/users/kmod/received_events","type":"User","site_admin":false},"body":"I think this can't distinguish between a class with attributes `[\"a\", \"bc\"]` and `[\"ab\", \"c\"]`.  There might be a better way to create the aggregated hash, but it seems like a simple fix for now is do something like `hash_stream << s.first.size() << s.first()`, which would make unambiguous the mapping from stream -> attribute set.","created_at":"2015-05-20T07:14:54Z","updated_at":"2015-05-20T07:14:54Z","html_url":"https://github.com/dropbox/pyston/pull/538#discussion_r30675970","pull_request_url":"https://api.github.com/repos/dropbox/pyston/pulls/538","_links":{"self":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/comments/30675970"},"html":{"href":"https://github.com/dropbox/pyston/pull/538#discussion_r30675970"},"pull_request":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/538"}}},"pull_request":{"url":"https://api.github.com/repos/dropbox/pyston/pulls/538","id":35689744,"html_url":"https://github.com/dropbox/pyston/pull/538","diff_url":"https://github.com/dropbox/pyston/pull/538.diff","patch_url":"https://github.com/dropbox/pyston/pull/538.patch","issue_url":"https://api.github.com/repos/dropbox/pyston/issues/538","number":538,"state":"open","locked":false,"title":"WIP: add \"shapes\" for BoxedClass","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":"in order to make typeLookup not emit assembly for a given IC slot specialized to\r\na specific class's mro we need something that is shared between classes.\r\n\r\nThat something is a 'shape'.  Each class computes its own \"local shape\", which is\r\njust the sha256 of its attribute names (in ascending order of slot offset).  This\r\nlocal shape, combined with a parent's total shape, gives a subclass's total shape.\r\n\r\nThis is similar to the way hidden classes work, but with shapes we want a single\r\nidentifier (the sha256 hash) that describes multiple attributes, as opposed to a\r\nseparate hidden class for each attribute.\r\n\r\nOnce we've computed this total shape for a class, we can cache in the IC the index\r\nof the class which has this attribute.  We also should know at this point what the\r\noffset of the actual attribute within this class is.","created_at":"2015-05-19T01:51:38Z","updated_at":"2015-05-20T07:14:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d2d53f073f33e2ba7d8d022fbf1eb3de12b13407","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dropbox/pyston/pulls/538/commits","review_comments_url":"https://api.github.com/repos/dropbox/pyston/pulls/538/comments","review_comment_url":"https://api.github.com/repos/dropbox/pyston/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dropbox/pyston/issues/538/comments","statuses_url":"https://api.github.com/repos/dropbox/pyston/statuses/dec201f95a26f4bc5f829691108588dcce951e71","head":{"label":"toshok:type-shapes","ref":"type-shapes","sha":"dec201f95a26f4bc5f829691108588dcce951e71","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},"repo":{"id":26560265,"name":"pyston","full_name":"toshok/pyston","owner":{"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},"private":false,"html_url":"https://github.com/toshok/pyston","description":"An open-source Python implementation using JIT techniques. ","fork":true,"url":"https://api.github.com/repos/toshok/pyston","forks_url":"https://api.github.com/repos/toshok/pyston/forks","keys_url":"https://api.github.com/repos/toshok/pyston/keys{/key_id}","collaborators_url":"https://api.github.com/repos/toshok/pyston/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/toshok/pyston/teams","hooks_url":"https://api.github.com/repos/toshok/pyston/hooks","issue_events_url":"https://api.github.com/repos/toshok/pyston/issues/events{/number}","events_url":"https://api.github.com/repos/toshok/pyston/events","assignees_url":"https://api.github.com/repos/toshok/pyston/assignees{/user}","branches_url":"https://api.github.com/repos/toshok/pyston/branches{/branch}","tags_url":"https://api.github.com/repos/toshok/pyston/tags","blobs_url":"https://api.github.com/repos/toshok/pyston/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/toshok/pyston/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/toshok/pyston/git/refs{/sha}","trees_url":"https://api.github.com/repos/toshok/pyston/git/trees{/sha}","statuses_url":"https://api.github.com/repos/toshok/pyston/statuses/{sha}","languages_url":"https://api.github.com/repos/toshok/pyston/languages","stargazers_url":"https://api.github.com/repos/toshok/pyston/stargazers","contributors_url":"https://api.github.com/repos/toshok/pyston/contributors","subscribers_url":"https://api.github.com/repos/toshok/pyston/subscribers","subscription_url":"https://api.github.com/repos/toshok/pyston/subscription","commits_url":"https://api.github.com/repos/toshok/pyston/commits{/sha}","git_commits_url":"https://api.github.com/repos/toshok/pyston/git/commits{/sha}","comments_url":"https://api.github.com/repos/toshok/pyston/comments{/number}","issue_comment_url":"https://api.github.com/repos/toshok/pyston/issues/comments{/number}","contents_url":"https://api.github.com/repos/toshok/pyston/contents/{+path}","compare_url":"https://api.github.com/repos/toshok/pyston/compare/{base}...{head}","merges_url":"https://api.github.com/repos/toshok/pyston/merges","archive_url":"https://api.github.com/repos/toshok/pyston/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/toshok/pyston/downloads","issues_url":"https://api.github.com/repos/toshok/pyston/issues{/number}","pulls_url":"https://api.github.com/repos/toshok/pyston/pulls{/number}","milestones_url":"https://api.github.com/repos/toshok/pyston/milestones{/number}","notifications_url":"https://api.github.com/repos/toshok/pyston/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/toshok/pyston/labels{/name}","releases_url":"https://api.github.com/repos/toshok/pyston/releases{/id}","created_at":"2014-11-12T22:56:58Z","updated_at":"2015-03-07T07:42:00Z","pushed_at":"2015-05-20T06:02:34Z","git_url":"git://github.com/toshok/pyston.git","ssh_url":"git@github.com:toshok/pyston.git","clone_url":"https://github.com/toshok/pyston.git","svn_url":"https://github.com/toshok/pyston","homepage":"https://tech.dropbox.com/2014/04/introducing-pyston-an-upcoming-jit-based-python-implementation/","size":20592,"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":"8802a933d6015a5b534b44084af0ddcdf921e3a0","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-05-20T02:22:12Z","pushed_at":"2015-05-20T06:16:05Z","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":29272,"stargazers_count":2957,"watchers_count":2957,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":211,"mirror_url":null,"open_issues_count":59,"forks":211,"open_issues":59,"watchers":2957,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/538"},"html":{"href":"https://github.com/dropbox/pyston/pull/538"},"issue":{"href":"https://api.github.com/repos/dropbox/pyston/issues/538"},"comments":{"href":"https://api.github.com/repos/dropbox/pyston/issues/538/comments"},"review_comments":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/538/comments"},"review_comment":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dropbox/pyston/pulls/538/commits"},"statuses":{"href":"https://api.github.com/repos/dropbox/pyston/statuses/dec201f95a26f4bc5f829691108588dcce951e71"}}}}