Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
QQmlJSShadowCheck Class Reference

#include <qqmljsshadowcheck_p.h>

+ Inheritance diagram for QQmlJSShadowCheck:
+ Collaboration diagram for QQmlJSShadowCheck:

Public Member Functions

 QQmlJSShadowCheck (const QV4::Compiler::JSUnitGenerator *jsUnitGenerator, const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger, BasicBlocks basicBlocks, InstructionAnnotations annotations)
 
 ~QQmlJSShadowCheck ()=default
 
BlocksAndAnnotations run (const Function *function, QQmlJS::DiagnosticMessage *error)
 
- Public Member Functions inherited from QQmlJSCompilePass
 QQmlJSCompilePass (const QV4::Compiler::JSUnitGenerator *jsUnitGenerator, const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger, BasicBlocks basicBlocks={}, InstructionAnnotations annotations={})
 
- Public Member Functions inherited from QV4::Moth::ByteCodeHandler
 ByteCodeHandler ()=default
 
virtual ~ByteCodeHandler ()
 
void decode (const char *code, uint len)
 
void reset ()
 
int currentInstructionOffset () const
 
int nextInstructionOffset () const
 
int absoluteOffset (int relativeOffset) const
 

Private Member Functions

void generate_LoadProperty (int nameIndex) override
 
void generate_GetLookup (int index) override
 
void generate_GetOptionalLookup (int index, int offset) override
 
void generate_StoreProperty (int nameIndex, int base) override
 
void generate_SetLookup (int index, int base) override
 
void generate_CallProperty (int nameIndex, int base, int argc, int argv) override
 
void generate_CallPropertyLookup (int nameIndex, int base, int argc, int argv) override
 
QV4::Moth::ByteCodeHandler::Verdict startInstruction (QV4::Moth::Instr::Type) override
 
void endInstruction (QV4::Moth::Instr::Type) override
 

Additional Inherited Members

- Public Types inherited from QQmlJSCompilePass
enum  RegisterShortcuts { InvalidRegister = -1 , Accumulator = QV4::CallData::Accumulator , This = QV4::CallData::This , FirstArgument = QV4::CallData::OffsetCount }
 
using SourceLocationTable = QV4::Compiler::Context::SourceLocationTable
 
using VirtualRegisters = QFlatMap<int, VirtualRegister>
 
using BasicBlocks = QFlatMap<int, BasicBlock>
 
using InstructionAnnotations = QFlatMap<int, InstructionAnnotation>
 
- Protected Types inherited from QV4::Moth::ByteCodeHandler
enum  Verdict { ProcessInstruction , SkipInstruction }
 
- Protected Member Functions inherited from QQmlJSCompilePass
int firstRegisterIndex () const
 
bool isArgument (int registerIndex) const
 
QQmlJSRegisterContent argumentType (int registerIndex) const
 
State initialState (const Function *function)
 
State nextStateFromAnnotations (const State &oldState, const InstructionAnnotations &annotations)
 
QQmlJS::SourceLocation sourceLocation (int instructionOffset) const
 
QQmlJS::SourceLocation currentSourceLocation () const
 
void setError (const QString &message, int instructionOffset)
 
void setError (const QString &message)
 
void generate_Add (int) override
 
void generate_As (int) override
 
void generate_BitAnd (int) override
 
void generate_BitAndConst (int) override
 
void generate_BitOr (int) override
 
void generate_BitOrConst (int) override
 
void generate_BitXor (int) override
 
void generate_BitXorConst (int) override
 
void generate_CallGlobalLookup (int, int, int) override
 
void generate_CallName (int, int, int) override
 
void generate_CallPossiblyDirectEval (int, int) override
 
void generate_CallProperty (int, int, int, int) override
 
void generate_CallPropertyLookup (int, int, int, int) override
 
void generate_CallQmlContextPropertyLookup (int, int, int) override
 
void generate_CallValue (int, int, int) override
 
void generate_CallWithReceiver (int, int, int, int) override
 
void generate_CallWithSpread (int, int, int, int) override
 
void generate_CheckException () override
 
void generate_CloneBlockContext () override
 
void generate_CmpEq (int) override
 
void generate_CmpEqInt (int) override
 
void generate_CmpEqNull () override
 
void generate_CmpGe (int) override
 
void generate_CmpGt (int) override
 
void generate_CmpIn (int) override
 
void generate_CmpInstanceOf (int) override
 
void generate_CmpLe (int) override
 
void generate_CmpLt (int) override
 
void generate_CmpNe (int) override
 
void generate_CmpNeInt (int) override
 
void generate_CmpNeNull () override
 
void generate_CmpStrictEqual (int) override
 
void generate_CmpStrictNotEqual (int) override
 
void generate_Construct (int, int, int) override
 
void generate_ConstructWithSpread (int, int, int) override
 
void generate_ConvertThisToObject () override
 
void generate_CreateCallContext () override
 
void generate_CreateClass (int, int, int) override
 
void generate_CreateMappedArgumentsObject () override
 
void generate_CreateRestParameter (int) override
 
void generate_CreateUnmappedArgumentsObject () override
 
void generate_DeadTemporalZoneCheck (int) override
 
void generate_Debug () override
 
void generate_DeclareVar (int, int) override
 
void generate_Decrement () override
 
void generate_DefineArray (int, int) override
 
void generate_DefineObjectLiteral (int, int, int) override
 
void generate_DeleteName (int) override
 
void generate_DeleteProperty (int, int) override
 
void generate_DestructureRestElement () override
 
void generate_Div (int) override
 
void generate_Exp (int) override
 
void generate_GetException () override
 
void generate_GetIterator (int) override
 
void generate_GetLookup (int) override
 
void generate_GetOptionalLookup (int, int) override
 
void generate_GetTemplateObject (int) override
 
void generate_Increment () override
 
void generate_InitializeBlockDeadTemporalZone (int, int) override
 
void generate_IteratorClose () override
 
void generate_IteratorNext (int, int) override
 
void generate_IteratorNextForYieldStar (int, int, int) override
 
void generate_Jump (int) override
 
void generate_JumpFalse (int) override
 
void generate_JumpNoException (int) override
 
void generate_JumpNotUndefined (int) override
 
void generate_JumpTrue (int) override
 
void generate_LoadClosure (int) override
 
void generate_LoadConst (int) override
 
void generate_LoadElement (int) override
 
void generate_LoadFalse () override
 
void generate_LoadGlobalLookup (int) override
 
void generate_LoadImport (int) override
 
void generate_LoadInt (int) override
 
void generate_LoadLocal (int) override
 
void generate_LoadName (int) override
 
void generate_LoadNull () override
 
void generate_LoadOptionalProperty (int, int) override
 
void generate_LoadProperty (int) override
 
void generate_LoadQmlContextPropertyLookup (int) override
 
void generate_LoadReg (int) override
 
void generate_LoadRuntimeString (int) override
 
void generate_LoadScopedLocal (int, int) override
 
void generate_LoadSuperConstructor () override
 
void generate_LoadSuperProperty (int) override
 
void generate_LoadTrue () override
 
void generate_LoadUndefined () override
 
void generate_LoadZero () override
 
void generate_Mod (int) override
 
void generate_MoveConst (int, int) override
 
void generate_MoveReg (int, int) override
 
void generate_MoveRegExp (int, int) override
 
void generate_Mul (int) override
 
void generate_PopContext () override
 
void generate_PopScriptContext () override
 
void generate_PushBlockContext (int) override
 
void generate_PushCatchContext (int, int) override
 
void generate_PushScriptContext (int) override
 
void generate_PushWithContext () override
 
void generate_Resume (int) override
 
void generate_Ret () override
 
void generate_SetException () override
 
void generate_SetLookup (int, int) override
 
void generate_SetUnwindHandler (int) override
 
void generate_Shl (int) override
 
void generate_ShlConst (int) override
 
void generate_Shr (int) override
 
void generate_ShrConst (int) override
 
void generate_StoreElement (int, int) override
 
void generate_StoreLocal (int) override
 
void generate_StoreNameSloppy (int) override
 
void generate_StoreNameStrict (int) override
 
void generate_StoreProperty (int, int) override
 
void generate_StoreReg (int) override
 
void generate_StoreScopedLocal (int, int) override
 
void generate_StoreSuperProperty (int) override
 
void generate_Sub (int) override
 
void generate_TailCall (int, int, int, int) override
 
void generate_ThrowException () override
 
void generate_ThrowOnNullOrUndefined () override
 
void generate_ToObject () override
 
void generate_TypeofName (int) override
 
void generate_TypeofValue () override
 
void generate_UCompl () override
 
void generate_UMinus () override
 
void generate_UNot () override
 
void generate_UPlus () override
 
void generate_UShr (int) override
 
void generate_UShrConst (int) override
 
void generate_UnwindDispatch () override
 
void generate_UnwindToLabel (int, int) override
 
void generate_Yield () override
 
void generate_YieldStar () override
 
- Static Protected Member Functions inherited from QQmlJSCompilePass
static bool instructionManipulatesContext (QV4::Moth::Instr::Type type)
 
- Protected Attributes inherited from QQmlJSCompilePass
const QV4::Compiler::JSUnitGeneratorm_jsUnitGenerator = nullptr
 
const QQmlJSTypeResolverm_typeResolver = nullptr
 
QQmlJSLoggerm_logger = nullptr
 
const Functionm_function = nullptr
 
BasicBlocks m_basicBlocks
 
InstructionAnnotations m_annotations
 
QQmlJS::DiagnosticMessagem_error = nullptr
 

Detailed Description

This pass looks for possible shadowing when accessing members of QML-exposed types. A member can be shadowed if a non-final property is re-declared in a derived class. As the QML engine will always pick up the most derived variant of that property, we cannot rely on any property of a type to be actually accessible, unless one of a few special cases holds:

  1. We are dealing with a direct scope lookup, without an intermediate object. Such lookups are protected from shadowing. For example "property int a: b" always works.
  2. The object we are retrieving the property from is identified by an ID, or an attached property or a singleton. Such objects cannot be replaced. Therefore we can be sure to see all the type information at compile time.
  3. The property is declared final.
  4. The object we are retrieving the property from is a value type. Value types cannot be used polymorphically.

If the property is potentially shadowed, we can still retrieve it, but we don't know its type. We should assume "var" then.

All of the above also holds for methods. There we have to transform the arguments and return types into "var".

Definition at line 21 of file qqmljsshadowcheck_p.h.

Constructor & Destructor Documentation

◆ QQmlJSShadowCheck()

QQmlJSShadowCheck::QQmlJSShadowCheck ( const QV4::Compiler::JSUnitGenerator * jsUnitGenerator,
const QQmlJSTypeResolver * typeResolver,
QQmlJSLogger * logger,
BasicBlocks basicBlocks,
InstructionAnnotations annotations )
inline

Definition at line 24 of file qqmljsshadowcheck_p.h.

◆ ~QQmlJSShadowCheck()

QQmlJSShadowCheck::~QQmlJSShadowCheck ( )
default

Member Function Documentation

◆ endInstruction()

void QQmlJSShadowCheck::endInstruction ( QV4::Moth::Instr::Type )
overrideprivatevirtual

Implements QV4::Moth::ByteCodeHandler.

Definition at line 145 of file qqmljsshadowcheck.cpp.

◆ generate_CallProperty()

void QQmlJSShadowCheck::generate_CallProperty ( int nameIndex,
int base,
int argc,
int argv )
overrideprivate

Definition at line 123 of file qqmljsshadowcheck.cpp.

References base, QV4::Compiler::JSUnitGenerator::lookupName(), QQmlJSCompilePass::m_jsUnitGenerator, Q_UNUSED, and QQmlJSCompilePass::State::registers.

+ Here is the call graph for this function:

◆ generate_CallPropertyLookup()

void QQmlJSShadowCheck::generate_CallPropertyLookup ( int nameIndex,
int base,
int argc,
int argv )
overrideprivate

Definition at line 130 of file qqmljsshadowcheck.cpp.

References base, QV4::Compiler::JSUnitGenerator::lookupName(), QQmlJSCompilePass::m_jsUnitGenerator, Q_UNUSED, and QQmlJSCompilePass::State::registers.

+ Here is the call graph for this function:

◆ generate_GetLookup()

void QQmlJSShadowCheck::generate_GetLookup ( int index)
overrideprivate

Definition at line 70 of file qqmljsshadowcheck.cpp.

References QQmlJSCompilePass::Accumulator, QFlatMap< Key, T, Compare, KeyContainer, MappedContainer >::end(), QFlatMap< Key, T, Compare, KeyContainer, MappedContainer >::find(), QV4::Compiler::JSUnitGenerator::lookupName(), QQmlJSCompilePass::m_jsUnitGenerator, QQmlJSCompilePass::State::readsRegister(), and QQmlJSCompilePass::State::registers.

Referenced by generate_GetOptionalLookup().

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

◆ generate_GetOptionalLookup()

void QQmlJSShadowCheck::generate_GetOptionalLookup ( int index,
int offset )
overrideprivate

Definition at line 82 of file qqmljsshadowcheck.cpp.

References generate_GetLookup(), and Q_UNUSED.

+ Here is the call graph for this function:

◆ generate_LoadProperty()

void QQmlJSShadowCheck::generate_LoadProperty ( int nameIndex)
overrideprivate

◆ generate_SetLookup()

void QQmlJSShadowCheck::generate_SetLookup ( int index,
int base )
overrideprivate

Definition at line 118 of file qqmljsshadowcheck.cpp.

References base, QV4::Compiler::JSUnitGenerator::lookupName(), and QQmlJSCompilePass::m_jsUnitGenerator.

+ Here is the call graph for this function:

◆ generate_StoreProperty()

void QQmlJSShadowCheck::generate_StoreProperty ( int nameIndex,
int base )
overrideprivate

Definition at line 113 of file qqmljsshadowcheck.cpp.

References base, QQmlJSCompilePass::m_jsUnitGenerator, and QV4::Compiler::JSUnitGenerator::stringForIndex().

+ Here is the call graph for this function:

◆ run()

QQmlJSCompilePass::BlocksAndAnnotations QQmlJSShadowCheck::run ( const Function * function,
QQmlJS::DiagnosticMessage * error )

Definition at line 37 of file qqmljsshadowcheck.cpp.

References base, QQmlJSCompilePass::Function::code, QByteArray::constData(), decode, error, function, QQmlJSCompilePass::initialState(), QQmlJSCompilePass::m_annotations, QQmlJSCompilePass::m_basicBlocks, QQmlJSCompilePass::m_error, QQmlJSCompilePass::m_function, and QByteArray::size().

+ Here is the call graph for this function:

◆ startInstruction()

QV4::Moth::ByteCodeHandler::Verdict QQmlJSShadowCheck::startInstruction ( QV4::Moth::Instr::Type )
overrideprivatevirtual

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