#include #include #include #include "solver.h" static void handleAccess( QualSolver &solver, const TypeNode *outer, const TypeNode &inner, const TypeNode &result ) { inner.weaklySubsumedBy( result, solver ); if (outer) solver.subsumedBy( *outer, result ); } void ArrayAccessNode::inferLocal( const LocalContext &context ) { const TypeNode &outer = *array()->type(); const TypeNode &inner = *outer.elementType(); handleAccess( context.solver, &outer, inner, *type() ); } void ObjectFieldAccessNode::inferLocal( const LocalContext &context ) { const TypeNode * const outer = (decl()->modifiers() & Common::Static) ? 0 : accessedObjectType(); const TypeNode & inner = *decl()->type(); const TypeNode & result = *type(); handleAccess( context.solver, outer, inner, result ); if (fieldChainEnd() && result.isImmutable() && !result.isTitaniumArrayType()) context.solver.subsumedBy( result, *decl()->source()->dtype() ); } void TypeFieldAccessNode::inferLocal( const LocalContext &context ) { assert( decl()->modifiers() & Static ); const TypeNode * const outer = 0; const TypeNode & inner = *decl()->type(); handleAccess( context.solver, outer, inner, *type() ); }