|
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
} |
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 bool | instructionManipulatesContext (QV4::Moth::Instr::Type type) |
const QV4::Compiler::JSUnitGenerator * | m_jsUnitGenerator = nullptr |
const QQmlJSTypeResolver * | m_typeResolver = nullptr |
QQmlJSRegisterContentPool * | m_pool = nullptr |
QQmlJSLogger * | m_logger = nullptr |
const Function * | m_function = nullptr |
BasicBlocks | m_basicBlocks |
InstructionAnnotations | m_annotations |
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:
- 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.
- 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.
- The property is declared final.
- 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.