31
31
#include "func-name-inferrer.h"
34
35
namespace internal {
37
FuncNameInferrer::FuncNameInferrer(Isolate* isolate)
37
45
void FuncNameInferrer::PushEnclosingName(Handle<String> name) {
38
46
// Enclosing name is a name of a constructor function. To check
39
47
// that it is really a constructor, we check that it is not empty
40
48
// and starts with a capital letter.
41
if (name->length() > 0 && Runtime::IsUpperCaseChar(name->Get(0))) {
42
names_stack_.Add(name);
49
if (name->length() > 0 && Runtime::IsUpperCaseChar(
50
isolate()->runtime_state(), name->Get(0))) {
51
names_stack_.Add(Name(name, kEnclosingConstructorName));
47
56
void FuncNameInferrer::PushLiteralName(Handle<String> name) {
48
if (IsOpen() && !Heap::prototype_symbol()->Equals(*name)) {
49
names_stack_.Add(name);
57
if (IsOpen() && !isolate()->heap()->prototype_symbol()->Equals(*name)) {
58
names_stack_.Add(Name(name, kLiteralName));
54
63
void FuncNameInferrer::PushVariableName(Handle<String> name) {
55
if (IsOpen() && !Heap::result_symbol()->Equals(*name)) {
56
names_stack_.Add(name);
64
if (IsOpen() && !isolate()->heap()->result_symbol()->Equals(*name)) {
65
names_stack_.Add(Name(name, kVariableName));
61
70
Handle<String> FuncNameInferrer::MakeNameFromStack() {
62
if (names_stack_.is_empty()) {
63
return Factory::empty_string();
65
return MakeNameFromStackHelper(1, names_stack_.at(0));
71
return MakeNameFromStackHelper(0, isolate()->factory()->empty_string());
70
75
Handle<String> FuncNameInferrer::MakeNameFromStackHelper(int pos,
71
76
Handle<String> prev) {
72
if (pos >= names_stack_.length()) {
77
if (pos >= names_stack_.length()) return prev;
78
if (pos < names_stack_.length() - 1 &&
79
names_stack_.at(pos).type == kVariableName &&
80
names_stack_.at(pos + 1).type == kVariableName) {
81
// Skip consecutive variable declarations.
82
return MakeNameFromStackHelper(pos + 1, prev);
75
Handle<String> curr = Factory::NewConsString(dot_, names_stack_.at(pos));
76
return MakeNameFromStackHelper(pos + 1, Factory::NewConsString(prev, curr));
84
if (prev->length() > 0) {
85
Factory* factory = isolate()->factory();
86
Handle<String> curr = factory->NewConsString(
87
factory->dot_symbol(), names_stack_.at(pos).name);
88
return MakeNameFromStackHelper(pos + 1,
89
factory->NewConsString(prev, curr));
91
return MakeNameFromStackHelper(pos + 1, names_stack_.at(pos).name);