mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-31 11:37:30 +09:00
1325157 - Implement a ParserBase class that holds functionality that's identical between syntax parsing and full parsing.
This commit is contained in:
parent
baab6a6ca9
commit
94c6eea52b
2 changed files with 181 additions and 170 deletions
|
|
@ -734,8 +734,138 @@ class UsedNameTracker
|
|||
}
|
||||
};
|
||||
|
||||
class ParserBase : public StrictModeGetter
|
||||
{
|
||||
private:
|
||||
ParserBase* thisForCtor() { return this; }
|
||||
|
||||
public:
|
||||
ExclusiveContext* const context;
|
||||
|
||||
LifoAlloc& alloc;
|
||||
|
||||
TokenStream tokenStream;
|
||||
LifoAlloc::Mark tempPoolMark;
|
||||
|
||||
/* list of parsed objects for GC tracing */
|
||||
ObjectBox* traceListHead;
|
||||
|
||||
/* innermost parse context (stack-allocated) */
|
||||
ParseContext* pc;
|
||||
|
||||
// For tracking used names in this parsing session.
|
||||
UsedNameTracker& usedNames;
|
||||
|
||||
/* Compression token for aborting. */
|
||||
SourceCompressionTask* sct;
|
||||
|
||||
ScriptSource* ss;
|
||||
|
||||
/* Root atoms and objects allocated for the parsed tree. */
|
||||
AutoKeepAtoms keepAtoms;
|
||||
|
||||
/* Perform constant-folding; must be true when interfacing with the emitter. */
|
||||
const bool foldConstants:1;
|
||||
|
||||
protected:
|
||||
#if DEBUG
|
||||
/* Our fallible 'checkOptions' member function has been called. */
|
||||
bool checkOptionsCalled:1;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Not all language constructs can be handled during syntax parsing. If it
|
||||
* is not known whether the parse succeeds or fails, this bit is set and
|
||||
* the parse will return false.
|
||||
*/
|
||||
bool abortedSyntaxParse:1;
|
||||
|
||||
/* Unexpected end of input, i.e. TOK_EOF not at top-level. */
|
||||
bool isUnexpectedEOF_:1;
|
||||
|
||||
public:
|
||||
ParserBase(ExclusiveContext* cx, LifoAlloc& alloc, const ReadOnlyCompileOptions& options,
|
||||
const char16_t* chars, size_t length, bool foldConstants,
|
||||
UsedNameTracker& usedNames, Parser<SyntaxParseHandler>* syntaxParser,
|
||||
LazyScript* lazyOuterFunction);
|
||||
~ParserBase();
|
||||
|
||||
const char* getFilename() const { return tokenStream.getFilename(); }
|
||||
JSVersion versionNumber() const { return tokenStream.versionNumber(); }
|
||||
TokenPos pos() const { return tokenStream.currentToken().pos; }
|
||||
|
||||
// Determine whether |yield| is a valid name in the current context, or
|
||||
// whether it's prohibited due to strictness, JS version, or occurrence
|
||||
// inside a star generator.
|
||||
bool yieldExpressionsSupported() {
|
||||
return (versionNumber() >= JSVERSION_1_7 || pc->isGenerator()) && !pc->isAsync();
|
||||
}
|
||||
|
||||
virtual bool strictMode() { return pc->sc()->strict(); }
|
||||
bool setLocalStrictMode(bool strict) {
|
||||
MOZ_ASSERT(tokenStream.debugHasNoLookahead());
|
||||
return pc->sc()->setLocalStrictMode(strict);
|
||||
}
|
||||
|
||||
const ReadOnlyCompileOptions& options() const {
|
||||
return tokenStream.options();
|
||||
}
|
||||
|
||||
bool hadAbortedSyntaxParse() {
|
||||
return abortedSyntaxParse;
|
||||
}
|
||||
void clearAbortedSyntaxParse() {
|
||||
abortedSyntaxParse = false;
|
||||
}
|
||||
|
||||
bool isUnexpectedEOF() const { return isUnexpectedEOF_; }
|
||||
|
||||
bool reportNoOffset(ParseReportKind kind, bool strict, unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given error at the current offset. */
|
||||
void error(unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given error at the given offset. */
|
||||
void errorAt(uint32_t offset, unsigned errorNumber, ...);
|
||||
|
||||
/*
|
||||
* Handle a strict mode error at the current offset. Report an error if in
|
||||
* strict mode code, or warn if not, using the given error number and
|
||||
* arguments.
|
||||
*/
|
||||
MOZ_MUST_USE bool strictModeError(unsigned errorNumber, ...);
|
||||
|
||||
/*
|
||||
* Handle a strict mode error at the given offset. Report an error if in
|
||||
* strict mode code, or warn if not, using the given error number and
|
||||
* arguments.
|
||||
*/
|
||||
MOZ_MUST_USE bool strictModeErrorAt(uint32_t offset, unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given warning at the current offset. */
|
||||
MOZ_MUST_USE bool warning(unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given warning at the given offset. */
|
||||
MOZ_MUST_USE bool warningAt(uint32_t offset, unsigned errorNumber, ...);
|
||||
|
||||
/*
|
||||
* If extra warnings are enabled, report the given warning at the current
|
||||
* offset.
|
||||
*/
|
||||
MOZ_MUST_USE bool extraWarning(unsigned errorNumber, ...);
|
||||
|
||||
bool isValidStrictBinding(PropertyName* name);
|
||||
|
||||
bool warnOnceAboutExprClosure();
|
||||
bool warnOnceAboutForEach();
|
||||
|
||||
protected:
|
||||
enum InvokedPrediction { PredictUninvoked = false, PredictInvoked = true };
|
||||
enum ForInitLocation { InForInit, NotInForInit };
|
||||
};
|
||||
|
||||
template <typename ParseHandler>
|
||||
class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
||||
class Parser final : public ParserBase, private JS::AutoGCRooter
|
||||
{
|
||||
private:
|
||||
using Node = typename ParseHandler::Node;
|
||||
|
|
@ -852,50 +982,6 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
void transferErrorsTo(PossibleError* other);
|
||||
};
|
||||
|
||||
public:
|
||||
ExclusiveContext* const context;
|
||||
|
||||
LifoAlloc& alloc;
|
||||
|
||||
TokenStream tokenStream;
|
||||
LifoAlloc::Mark tempPoolMark;
|
||||
|
||||
/* list of parsed objects for GC tracing */
|
||||
ObjectBox* traceListHead;
|
||||
|
||||
/* innermost parse context (stack-allocated) */
|
||||
ParseContext* pc;
|
||||
|
||||
// For tracking used names in this parsing session.
|
||||
UsedNameTracker& usedNames;
|
||||
|
||||
/* Compression token for aborting. */
|
||||
SourceCompressionTask* sct;
|
||||
|
||||
ScriptSource* ss;
|
||||
|
||||
/* Root atoms and objects allocated for the parsed tree. */
|
||||
AutoKeepAtoms keepAtoms;
|
||||
|
||||
/* Perform constant-folding; must be true when interfacing with the emitter. */
|
||||
const bool foldConstants:1;
|
||||
|
||||
private:
|
||||
#if DEBUG
|
||||
/* Our fallible 'checkOptions' member function has been called. */
|
||||
bool checkOptionsCalled:1;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Not all language constructs can be handled during syntax parsing. If it
|
||||
* is not known whether the parse succeeds or fails, this bit is set and
|
||||
* the parse will return false.
|
||||
*/
|
||||
bool abortedSyntaxParse:1;
|
||||
|
||||
/* Unexpected end of input, i.e. TOK_EOF not at top-level. */
|
||||
bool isUnexpectedEOF_:1;
|
||||
|
||||
public:
|
||||
/* State specific to the kind of parse being performed. */
|
||||
ParseHandler handler;
|
||||
|
|
@ -904,40 +990,6 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
void freeTree(Node node) { handler.freeTree(node); }
|
||||
|
||||
public:
|
||||
bool reportNoOffset(ParseReportKind kind, bool strict, unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given error at the current offset. */
|
||||
void error(unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given error at the given offset. */
|
||||
void errorAt(uint32_t offset, unsigned errorNumber, ...);
|
||||
|
||||
/*
|
||||
* Handle a strict mode error at the current offset. Report an error if in
|
||||
* strict mode code, or warn if not, using the given error number and
|
||||
* arguments.
|
||||
*/
|
||||
MOZ_MUST_USE bool strictModeError(unsigned errorNumber, ...);
|
||||
|
||||
/*
|
||||
* Handle a strict mode error at the given offset. Report an error if in
|
||||
* strict mode code, or warn if not, using the given error number and
|
||||
* arguments.
|
||||
*/
|
||||
MOZ_MUST_USE bool strictModeErrorAt(uint32_t offset, unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given warning at the current offset. */
|
||||
MOZ_MUST_USE bool warning(unsigned errorNumber, ...);
|
||||
|
||||
/* Report the given warning at the given offset. */
|
||||
MOZ_MUST_USE bool warningAt(uint32_t offset, unsigned errorNumber, ...);
|
||||
|
||||
/*
|
||||
* If extra warnings are enabled, report the given warning at the current
|
||||
* offset.
|
||||
*/
|
||||
MOZ_MUST_USE bool extraWarning(unsigned errorNumber, ...);
|
||||
|
||||
Parser(ExclusiveContext* cx, LifoAlloc& alloc, const ReadOnlyCompileOptions& options,
|
||||
const char16_t* chars, size_t length, bool foldConstants, UsedNameTracker& usedNames,
|
||||
Parser<SyntaxParseHandler>* syntaxParser, LazyScript* lazyOuterFunction);
|
||||
|
|
@ -967,9 +1019,6 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
|
||||
friend void js::frontend::MarkParser(JSTracer* trc, JS::AutoGCRooter* parser);
|
||||
|
||||
const char* getFilename() const { return tokenStream.getFilename(); }
|
||||
JSVersion versionNumber() const { return tokenStream.versionNumber(); }
|
||||
|
||||
/*
|
||||
* Parse a top-level JS script.
|
||||
*/
|
||||
|
|
@ -995,15 +1044,6 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
|
||||
void trace(JSTracer* trc);
|
||||
|
||||
bool hadAbortedSyntaxParse() {
|
||||
return abortedSyntaxParse;
|
||||
}
|
||||
void clearAbortedSyntaxParse() {
|
||||
abortedSyntaxParse = false;
|
||||
}
|
||||
|
||||
bool isUnexpectedEOF() const { return isUnexpectedEOF_; }
|
||||
|
||||
bool checkUnescapedName();
|
||||
|
||||
private:
|
||||
|
|
@ -1072,34 +1112,12 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
Node pn, FunctionSyntaxKind kind,
|
||||
mozilla::Maybe<uint32_t> parameterListEnd = mozilla::Nothing(),
|
||||
bool isStandaloneFunction = false);
|
||||
|
||||
|
||||
// Determine whether |yield| is a valid name in the current context, or
|
||||
// whether it's prohibited due to strictness, JS version, or occurrence
|
||||
// inside a star generator.
|
||||
bool yieldExpressionsSupported() {
|
||||
return (versionNumber() >= JSVERSION_1_7 || pc->isGenerator()) && !pc->isAsync();
|
||||
}
|
||||
|
||||
// Match the current token against the BindingIdentifier production with
|
||||
// the given Yield parameter. If there is no match, report a syntax
|
||||
// error.
|
||||
PropertyName* bindingIdentifier(YieldHandling yieldHandling);
|
||||
|
||||
virtual bool strictMode() { return pc->sc()->strict(); }
|
||||
bool setLocalStrictMode(bool strict) {
|
||||
MOZ_ASSERT(tokenStream.debugHasNoLookahead());
|
||||
return pc->sc()->setLocalStrictMode(strict);
|
||||
}
|
||||
|
||||
const ReadOnlyCompileOptions& options() const {
|
||||
return tokenStream.options();
|
||||
}
|
||||
|
||||
private:
|
||||
enum InvokedPrediction { PredictUninvoked = false, PredictInvoked = true };
|
||||
enum ForInitLocation { InForInit, NotInForInit };
|
||||
|
||||
private:
|
||||
/*
|
||||
* JS parsers, from lowest to highest precedence.
|
||||
|
|
@ -1375,8 +1393,6 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
|
||||
bool hasValidSimpleStrictParameterNames();
|
||||
|
||||
bool isValidStrictBinding(PropertyName* name);
|
||||
|
||||
void reportRedeclaration(HandlePropertyName name, DeclarationKind kind, TokenPos pos);
|
||||
bool notePositionalFormalParameter(Node fn, HandlePropertyName name,
|
||||
bool disallowDuplicateParams, bool* duplicatedParam);
|
||||
|
|
@ -1432,12 +1448,7 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter
|
|||
|
||||
JSAtom* prefixAccessorName(PropertyType propType, HandleAtom propAtom);
|
||||
|
||||
TokenPos pos() const { return tokenStream.currentToken().pos; }
|
||||
|
||||
bool asmJS(Node list);
|
||||
|
||||
bool warnOnceAboutExprClosure();
|
||||
bool warnOnceAboutForEach();
|
||||
};
|
||||
|
||||
} /* namespace frontend */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue