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