1fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 6d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/ast-value-factory.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/func-name-inferrer.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/list-inl.h" 11d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 1271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 14d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 1508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgFuncNameInferrer::FuncNameInferrer(AstValueFactory* ast_value_factory, 1608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Zone* zone) 1708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org : ast_value_factory_(ast_value_factory), 187028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org entries_stack_(10, zone), 197028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org names_stack_(5, zone), 207028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org funcs_to_infer_(4, zone), 217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org zone_(zone) { 2204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org} 2304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 24d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 2508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid FuncNameInferrer::PushEnclosingName(const AstRawString* name) { 26d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // Enclosing name is a name of a constructor function. To check 27d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // that it is really a constructor, we check that it is not empty 28d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org // and starts with a capital letter. 2908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (!name->IsEmpty() && unibrow::Uppercase::Is(name->FirstCharacter())) { 307028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org names_stack_.Add(Name(name, kEnclosingConstructorName), zone()); 31d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 32d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 33d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 34d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 3508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid FuncNameInferrer::PushLiteralName(const AstRawString* name) { 3608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (IsOpen() && name != ast_value_factory_->prototype_string()) { 377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org names_stack_.Add(Name(name, kLiteralName), zone()); 3865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org } 3965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org} 4065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid FuncNameInferrer::PushVariableName(const AstRawString* name) { 4308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (IsOpen() && name != ast_value_factory_->dot_result_string()) { 447028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org names_stack_.Add(Name(name, kVariableName), zone()); 4565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org } 4665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org} 4765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 4908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstString* FuncNameInferrer::MakeNameFromStack() { 5008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return MakeNameFromStackHelper(0, ast_value_factory_->empty_string()); 513ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org} 523ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org 5308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstString* FuncNameInferrer::MakeNameFromStackHelper( 5408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int pos, const AstString* prev) { 553ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org if (pos >= names_stack_.length()) return prev; 563ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org if (pos < names_stack_.length() - 1 && 573ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org names_stack_.at(pos).type == kVariableName && 583ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org names_stack_.at(pos + 1).type == kVariableName) { 593ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org // Skip consecutive variable declarations. 603ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org return MakeNameFromStackHelper(pos + 1, prev); 61d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } else { 623ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org if (prev->length() > 0) { 6308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* name = names_stack_.at(pos).name; 643ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org if (prev->length() + name->length() + 1 > String::kMaxLength) return prev; 6508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstConsString* curr = ast_value_factory_->NewConsString( 6608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ast_value_factory_->dot_string(), name); 6708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org curr = ast_value_factory_->NewConsString(prev, curr); 683ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org return MakeNameFromStackHelper(pos + 1, curr); 693ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org } else { 703ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org return MakeNameFromStackHelper(pos + 1, names_stack_.at(pos).name); 7104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 72d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 73d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 74d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 75d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 7665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgvoid FuncNameInferrer::InferFunctionsNames() { 7708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstString* func_name = MakeNameFromStack(); 7865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org for (int i = 0; i < funcs_to_infer_.length(); ++i) { 7908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org funcs_to_infer_[i]->set_raw_inferred_name(func_name); 80d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 8165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org funcs_to_infer_.Rewind(0); 82d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} 83d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 84d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 85d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org} } // namespace v8::internal 86