blob: b3a64b26f826d6a3f13116745f37792fe05e1dfb [file] [log] [blame]
Ben Murdoch257744e2011-11-30 15:57:28 +00001// Copyright 2011 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#include "src/v8.h"
Steve Blocka7e24c12009-10-30 11:49:00 +00006
Ben Murdochb8a8cc12014-11-26 15:28:44 +00007#include "src/ast.h"
8#include "src/ast-value-factory.h"
9#include "src/func-name-inferrer.h"
10#include "src/list-inl.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000011
12namespace v8 {
13namespace internal {
14
Ben Murdochb8a8cc12014-11-26 15:28:44 +000015FuncNameInferrer::FuncNameInferrer(AstValueFactory* ast_value_factory,
16 Zone* zone)
17 : ast_value_factory_(ast_value_factory),
18 entries_stack_(10, zone),
19 names_stack_(5, zone),
20 funcs_to_infer_(4, zone),
21 zone_(zone) {
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000022}
23
Steve Blocka7e24c12009-10-30 11:49:00 +000024
Ben Murdochb8a8cc12014-11-26 15:28:44 +000025void FuncNameInferrer::PushEnclosingName(const AstRawString* name) {
Steve Blocka7e24c12009-10-30 11:49:00 +000026 // Enclosing name is a name of a constructor function. To check
27 // that it is really a constructor, we check that it is not empty
28 // and starts with a capital letter.
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029 if (!name->IsEmpty() && unibrow::Uppercase::Is(name->FirstCharacter())) {
30 names_stack_.Add(Name(name, kEnclosingConstructorName), zone());
Steve Blocka7e24c12009-10-30 11:49:00 +000031 }
32}
33
34
Ben Murdochb8a8cc12014-11-26 15:28:44 +000035void FuncNameInferrer::PushLiteralName(const AstRawString* name) {
36 if (IsOpen() && name != ast_value_factory_->prototype_string()) {
37 names_stack_.Add(Name(name, kLiteralName), zone());
Kristian Monsen80d68ea2010-09-08 11:05:35 +010038 }
39}
40
41
Ben Murdochb8a8cc12014-11-26 15:28:44 +000042void FuncNameInferrer::PushVariableName(const AstRawString* name) {
43 if (IsOpen() && name != ast_value_factory_->dot_result_string()) {
44 names_stack_.Add(Name(name, kVariableName), zone());
Kristian Monsen80d68ea2010-09-08 11:05:35 +010045 }
46}
47
48
Ben Murdochb8a8cc12014-11-26 15:28:44 +000049const AstString* FuncNameInferrer::MakeNameFromStack() {
50 return MakeNameFromStackHelper(0, ast_value_factory_->empty_string());
Steve Blocka7e24c12009-10-30 11:49:00 +000051}
52
Ben Murdochb8a8cc12014-11-26 15:28:44 +000053const AstString* FuncNameInferrer::MakeNameFromStackHelper(
54 int pos, const AstString* prev) {
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000055 if (pos >= names_stack_.length()) return prev;
56 if (pos < names_stack_.length() - 1 &&
57 names_stack_.at(pos).type == kVariableName &&
58 names_stack_.at(pos + 1).type == kVariableName) {
59 // Skip consecutive variable declarations.
60 return MakeNameFromStackHelper(pos + 1, prev);
Steve Blocka7e24c12009-10-30 11:49:00 +000061 } else {
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000062 if (prev->length() > 0) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000063 const AstRawString* name = names_stack_.at(pos).name;
64 if (prev->length() + name->length() + 1 > String::kMaxLength) return prev;
65 const AstConsString* curr = ast_value_factory_->NewConsString(
66 ast_value_factory_->dot_string(), name);
67 curr = ast_value_factory_->NewConsString(prev, curr);
68 return MakeNameFromStackHelper(pos + 1, curr);
Ben Murdoch3fb3ca82011-12-02 17:19:32 +000069 } else {
70 return MakeNameFromStackHelper(pos + 1, names_stack_.at(pos).name);
71 }
Steve Blocka7e24c12009-10-30 11:49:00 +000072 }
73}
74
75
76void FuncNameInferrer::InferFunctionsNames() {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000077 const AstString* func_name = MakeNameFromStack();
Steve Blocka7e24c12009-10-30 11:49:00 +000078 for (int i = 0; i < funcs_to_infer_.length(); ++i) {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000079 funcs_to_infer_[i]->set_raw_inferred_name(func_name);
Steve Blocka7e24c12009-10-30 11:49:00 +000080 }
81 funcs_to_infer_.Rewind(0);
82}
83
84
85} } // namespace v8::internal