Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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, const BasicBlocks &basicBlocks, const InstructionAnnotations &annotations)
 ~QQmlJSShadowCheck ()=default
BlocksAndAnnotations run (const Function *function)
Public Member Functions inherited from QQmlJSCompilePass
 QQmlJSCompilePass (const QV4::Compiler::JSUnitGenerator *jsUnitGenerator, const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger, const BasicBlocks &basicBlocks={}, const 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 , CurrentFunction = QV4::CallData::Function , Context = QV4::CallData::Context , Accumulator = QV4::CallData::Accumulator ,
  This = QV4::CallData::This , NewTarget = QV4::CallData::NewTarget , Argc = QV4::CallData::Argc , 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
bool isQmlScopeObject (QQmlJSRegisterContent content)
State initialState (const Function *function)
State nextStateFromAnnotations (const State &oldState, const InstructionAnnotations &annotations)
QList< SourceLocationTable::Entry >::const_iterator sourceLocationEntry (int instructionOffset) const
QQmlJS::SourceLocation sourceLocation (int instructionOffset) const
QQmlJS::SourceLocation nonEmptySourceLocation (int instructionOffset) const
QQmlJS::SourceLocation currentSourceLocation () const
QQmlJS::SourceLocation currentNonEmptySourceLocation () const
QQmlJS::SourceLocation currentFunctionSourceLocation () const
void addError (const QString &message, int instructionOffset)
void addSkip (const QString &message, int instructionOffset)
void addError (const QString &message)
void addSkip (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
QQmlJSRegisterContentPoolm_pool = nullptr
QQmlJSLoggerm_logger = nullptr
const Functionm_function = nullptr
BasicBlocks m_basicBlocks
InstructionAnnotations m_annotations

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 22 of file qqmljsshadowcheck_p.h.

Constructor & Destructor Documentation

◆ QQmlJSShadowCheck()

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

Definition at line 25 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 144 of file qqmljsshadowcheck.cpp.

◆ generate_CallProperty()

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

Definition at line 122 of file qqmljsshadowcheck.cpp.

◆ generate_CallPropertyLookup()

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

Definition at line 129 of file qqmljsshadowcheck.cpp.

◆ generate_GetLookup()

void QQmlJSShadowCheck::generate_GetLookup ( int index)
overrideprivate

Definition at line 69 of file qqmljsshadowcheck.cpp.

◆ generate_GetOptionalLookup()

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

Definition at line 81 of file qqmljsshadowcheck.cpp.

◆ generate_LoadProperty()

void QQmlJSShadowCheck::generate_LoadProperty ( int nameIndex)
overrideprivate

Definition at line 56 of file qqmljsshadowcheck.cpp.

◆ generate_SetLookup()

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

Definition at line 117 of file qqmljsshadowcheck.cpp.

◆ generate_StoreProperty()

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

Definition at line 112 of file qqmljsshadowcheck.cpp.

◆ run()

QQmlJSCompilePass::BlocksAndAnnotations QQmlJSShadowCheck::run ( const Function * function)

Definition at line 38 of file qqmljsshadowcheck.cpp.

◆ startInstruction()

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

Implements QV4::Moth::ByteCodeHandler.

Definition at line 136 of file qqmljsshadowcheck.cpp.


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