V8 Project
v8::internal::ParserBase< Traits >::ObjectLiteralChecker Class Reference

#include <preparser.h>

+ Collaboration diagram for v8::internal::ParserBase< Traits >::ObjectLiteralChecker:

Public Member Functions

 ObjectLiteralChecker (ParserBase *parser, StrictMode strict_mode)
 
void CheckProperty (Token::Value property, PropertyKind type, bool *ok)
 

Private Member Functions

ParserBaseparser () const
 
Scannerscanner () const
 
bool HasConflict (PropertyKind type1, PropertyKind type2)
 
bool IsDataDataConflict (PropertyKind type1, PropertyKind type2)
 
bool IsDataAccessorConflict (PropertyKind type1, PropertyKind type2)
 
bool IsAccessorAccessorConflict (PropertyKind type1, PropertyKind type2)
 

Private Attributes

ParserBaseparser_
 
DuplicateFinder finder_
 
StrictMode strict_mode_
 

Detailed Description

template<typename Traits>
class v8::internal::ParserBase< Traits >::ObjectLiteralChecker

Definition at line 539 of file preparser.h.

Constructor & Destructor Documentation

◆ ObjectLiteralChecker()

template<typename Traits >
v8::internal::ParserBase< Traits >::ObjectLiteralChecker::ObjectLiteralChecker ( ParserBase parser,
StrictMode  strict_mode 
)
inline

Member Function Documentation

◆ CheckProperty()

template<typename Traits >
void v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty ( Token::Value  property,
PropertyKind  type,
bool ok 
)

Definition at line 2811 of file preparser.h.

2812  {
2813  int old;
2814  if (property == Token::NUMBER) {
2815  old = scanner()->FindNumber(&finder_, type);
2816  } else {
2817  old = scanner()->FindSymbol(&finder_, type);
2818  }
2819  PropertyKind old_type = static_cast<PropertyKind>(old);
2820  if (HasConflict(old_type, type)) {
2821  if (IsDataDataConflict(old_type, type)) {
2822  // Both are data properties.
2823  if (strict_mode_ == SLOPPY) return;
2824  parser()->ReportMessage("strict_duplicate_property");
2825  } else if (IsDataAccessorConflict(old_type, type)) {
2826  // Both a data and an accessor property with the same name.
2827  parser()->ReportMessage("accessor_data_property");
2828  } else {
2829  DCHECK(IsAccessorAccessorConflict(old_type, type));
2830  // Both accessors of the same type.
2831  parser()->ReportMessage("accessor_get_set");
2832  }
2833  *ok = false;
2834  }
2835 }
bool HasConflict(PropertyKind type1, PropertyKind type2)
Definition: preparser.h:553
bool IsAccessorAccessorConflict(PropertyKind type1, PropertyKind type2)
Definition: preparser.h:562
bool IsDataDataConflict(PropertyKind type1, PropertyKind type2)
Definition: preparser.h:556
bool IsDataAccessorConflict(PropertyKind type1, PropertyKind type2)
Definition: preparser.h:559
void ReportMessage(const char *message, const char *arg=NULL, bool is_reference_error=false)
Definition: preparser.h:444
int FindNumber(DuplicateFinder *finder, int value)
Definition: scanner.cc:1220
int FindSymbol(DuplicateFinder *finder, int value)
Definition: scanner.cc:1225
#define DCHECK(condition)
Definition: logging.h:205

References DCHECK, v8::internal::ParserBase< Traits >::ObjectLiteralChecker::finder_, v8::internal::Scanner::FindNumber(), v8::internal::Scanner::FindSymbol(), v8::internal::ParserBase< Traits >::ObjectLiteralChecker::HasConflict(), v8::internal::ParserBase< Traits >::ObjectLiteralChecker::IsAccessorAccessorConflict(), v8::internal::ParserBase< Traits >::ObjectLiteralChecker::IsDataAccessorConflict(), v8::internal::ParserBase< Traits >::ObjectLiteralChecker::IsDataDataConflict(), v8::internal::ParserBase< Traits >::ObjectLiteralChecker::parser(), v8::internal::ParserBase< Traits >::ReportMessage(), v8::internal::ParserBase< Traits >::ObjectLiteralChecker::scanner(), v8::internal::SLOPPY, and v8::internal::ParserBase< Traits >::ObjectLiteralChecker::strict_mode_.

Referenced by v8::internal::ParserBase< Traits >::ParsePropertyDefinition().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ HasConflict()

template<typename Traits >
bool v8::internal::ParserBase< Traits >::ObjectLiteralChecker::HasConflict ( PropertyKind  type1,
PropertyKind  type2 
)
inlineprivate

Definition at line 553 of file preparser.h.

553  {
554  return (type1 & type2) != 0;
555  }

Referenced by v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty().

+ Here is the caller graph for this function:

◆ IsAccessorAccessorConflict()

template<typename Traits >
bool v8::internal::ParserBase< Traits >::ObjectLiteralChecker::IsAccessorAccessorConflict ( PropertyKind  type1,
PropertyKind  type2 
)
inlineprivate

Definition at line 562 of file preparser.h.

562  {
563  return ((type1 | type2) & kValueFlag) == 0;
564  }

References v8::internal::ParserBase< Traits >::kValueFlag.

Referenced by v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty().

+ Here is the caller graph for this function:

◆ IsDataAccessorConflict()

template<typename Traits >
bool v8::internal::ParserBase< Traits >::ObjectLiteralChecker::IsDataAccessorConflict ( PropertyKind  type1,
PropertyKind  type2 
)
inlineprivate

Definition at line 559 of file preparser.h.

559  {
560  return ((type1 ^ type2) & kValueFlag) != 0;
561  }

References v8::internal::ParserBase< Traits >::kValueFlag.

Referenced by v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty().

+ Here is the caller graph for this function:

◆ IsDataDataConflict()

template<typename Traits >
bool v8::internal::ParserBase< Traits >::ObjectLiteralChecker::IsDataDataConflict ( PropertyKind  type1,
PropertyKind  type2 
)
inlineprivate

Definition at line 556 of file preparser.h.

556  {
557  return ((type1 & type2) & kValueFlag) != 0;
558  }

References v8::internal::ParserBase< Traits >::kValueFlag.

Referenced by v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty().

+ Here is the caller graph for this function:

◆ parser()

template<typename Traits >
ParserBase* v8::internal::ParserBase< Traits >::ObjectLiteralChecker::parser ( ) const
inlineprivate

Definition at line 549 of file preparser.h.

549 { return parser_; }

References v8::internal::ParserBase< Traits >::ObjectLiteralChecker::parser_.

Referenced by v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty().

+ Here is the caller graph for this function:

◆ scanner()

template<typename Traits >
Scanner* v8::internal::ParserBase< Traits >::ObjectLiteralChecker::scanner ( ) const
inlineprivate

Definition at line 550 of file preparser.h.

550 { return parser_->scanner(); }
Scanner * scanner() const
Definition: preparser.h:285

References v8::internal::ParserBase< Traits >::ObjectLiteralChecker::parser_, and v8::internal::ParserBase< Traits >::scanner().

Referenced by v8::internal::ParserBase< Traits >::ObjectLiteralChecker::CheckProperty().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Member Data Documentation

◆ finder_

template<typename Traits >
DuplicateFinder v8::internal::ParserBase< Traits >::ObjectLiteralChecker::finder_
private

◆ parser_

template<typename Traits >
ParserBase* v8::internal::ParserBase< Traits >::ObjectLiteralChecker::parser_
private

◆ strict_mode_

template<typename Traits >
StrictMode v8::internal::ParserBase< Traits >::ObjectLiteralChecker::strict_mode_
private

The documentation for this class was generated from the following file: