| Index: src/func-name-inferrer.cc
|
| ===================================================================
|
| --- src/func-name-inferrer.cc (revision 8618)
|
| +++ src/func-name-inferrer.cc (working copy)
|
| @@ -34,48 +34,62 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +FuncNameInferrer::FuncNameInferrer(Isolate* isolate)
|
| + : isolate_(isolate),
|
| + entries_stack_(10),
|
| + names_stack_(5),
|
| + funcs_to_infer_(4) {
|
| +}
|
|
|
| +
|
| void FuncNameInferrer::PushEnclosingName(Handle<String> name) {
|
| // Enclosing name is a name of a constructor function. To check
|
| // that it is really a constructor, we check that it is not empty
|
| // and starts with a capital letter.
|
| if (name->length() > 0 && Runtime::IsUpperCaseChar(
|
| - Isolate::Current()->runtime_state(), name->Get(0))) {
|
| - names_stack_.Add(name);
|
| + isolate()->runtime_state(), name->Get(0))) {
|
| + names_stack_.Add(Name(name, kEnclosingConstructorName));
|
| }
|
| }
|
|
|
|
|
| void FuncNameInferrer::PushLiteralName(Handle<String> name) {
|
| - if (IsOpen() && !HEAP->prototype_symbol()->Equals(*name)) {
|
| - names_stack_.Add(name);
|
| + if (IsOpen() && !isolate()->heap()->prototype_symbol()->Equals(*name)) {
|
| + names_stack_.Add(Name(name, kLiteralName));
|
| }
|
| }
|
|
|
|
|
| void FuncNameInferrer::PushVariableName(Handle<String> name) {
|
| - if (IsOpen() && !HEAP->result_symbol()->Equals(*name)) {
|
| - names_stack_.Add(name);
|
| + if (IsOpen() && !isolate()->heap()->result_symbol()->Equals(*name)) {
|
| + names_stack_.Add(Name(name, kVariableName));
|
| }
|
| }
|
|
|
|
|
| Handle<String> FuncNameInferrer::MakeNameFromStack() {
|
| - if (names_stack_.is_empty()) {
|
| - return FACTORY->empty_string();
|
| - } else {
|
| - return MakeNameFromStackHelper(1, names_stack_.at(0));
|
| - }
|
| + return MakeNameFromStackHelper(0, isolate()->factory()->empty_string());
|
| }
|
|
|
|
|
| Handle<String> FuncNameInferrer::MakeNameFromStackHelper(int pos,
|
| Handle<String> prev) {
|
| - if (pos >= names_stack_.length()) {
|
| - return prev;
|
| + if (pos >= names_stack_.length()) return prev;
|
| + if (pos < names_stack_.length() - 1 &&
|
| + names_stack_.at(pos).type == kVariableName &&
|
| + names_stack_.at(pos + 1).type == kVariableName) {
|
| + // Skip consecutive variable declarations.
|
| + return MakeNameFromStackHelper(pos + 1, prev);
|
| } else {
|
| - Handle<String> curr = FACTORY->NewConsString(dot_, names_stack_.at(pos));
|
| - return MakeNameFromStackHelper(pos + 1, FACTORY->NewConsString(prev, curr));
|
| + if (prev->length() > 0) {
|
| + Factory* factory = isolate()->factory();
|
| + Handle<String> curr = factory->NewConsString(
|
| + factory->dot_symbol(), names_stack_.at(pos).name);
|
| + return MakeNameFromStackHelper(pos + 1,
|
| + factory->NewConsString(prev, curr));
|
| + } else {
|
| + return MakeNameFromStackHelper(pos + 1, names_stack_.at(pos).name);
|
| + }
|
| }
|
| }
|
|
|
|
|