template<typename Tok> JS::Result<ParseNode*> BinASTParser<Tok>::parseAux(const uint8_t* start, const size_t length) { tokenizer_.emplace(cx_, start, length); Directives directives(options().strictOption); GlobalSharedContext globalsc(cx_, ScopeKind::Global, directives, options().extraWarningsOption); BinParseContext globalpc(cx_, this, &globalsc, /* newDirectives = */ nullptr); if (!globalpc.init()) return cx_->alreadyReportedError(); ParseContext::VarScope varScope(cx_, &globalpc, usedNames_); if (!varScope.init(&globalpc)) return cx_->alreadyReportedError(); MOZ_TRY(tokenizer_->readHeader()); ParseNode* result(nullptr); MOZ_TRY_VAR(result, parseProgram()); Maybe<GlobalScope::Data*> bindings = NewGlobalScopeData(cx_, varScope, alloc_, parseContext_); if (!bindings) return cx_->alreadyReportedError(); globalsc.bindings = *bindings; return result; // Magic conversion to Ok. }
void varScope1() { varScope("unsigned short foo()\n" "{\n" " test_client CClient;\n" " try\n" " {\n" " if (CClient.Open())\n" " {\n" " return 0;\n" " }\n" " }\n" " catch (...)\n" " {\n" " return 2;\n" " }\n" "\n" " try\n" " {\n" " CClient.Close();\n" " }\n" " catch (...)\n" " {\n" " return 2;\n" " }\n" "\n" " return 1;\n" "}\n"); ASSERT_EQUALS("", errout.str()); }
void varScope4() { varScope("void foo()\n" "{\n" " int i;\n" "}\n"); ASSERT_EQUALS("", errout.str()); }
void varScope2() { varScope("int foo()\n" "{\n" " Error e;\n" " e.SetValue(12);\n" " throw e;\n" "}\n"); ASSERT_EQUALS("", errout.str()); }
void varScope3() { varScope("void foo()\n" "{\n" " int i;\n" " int *p = 0;\n" " if (abc)\n" " {\n" " p = &i;\n" " }\n" " *p = 1;\n" "}\n"); ASSERT_EQUALS("", errout.str()); }