@@ -737,7 +737,6 @@ class CaptureVisitor final : public VNVisitor {
737
737
AstClass* m_targetp; // Module of inner context (for symbol lookup)
738
738
std::map<const AstVar*, AstVar*> m_varCloneMap; // Map original var nodes to their clones
739
739
std::set<AstNode*> m_ignore; // Nodes to ignore for capturing
740
- std::set<AstNodeModule*> m_visibleModules; // Modules whose scopes are visible
741
740
AstVar* m_thisp = nullptr ; // Variable for outer context's object, if necessary
742
741
743
742
// METHODS
@@ -792,21 +791,20 @@ class CaptureVisitor final : public VNVisitor {
792
791
}
793
792
794
793
CaptureMode getVarRefCaptureMode (AstNodeVarRef* varRefp) {
795
- AstNodeModule* const modp = VN_AS (varRefp->varp ()->user2p (), NodeModule);
794
+ AstNodeModule* const varModp = VN_AS (varRefp->varp ()->user2p (), NodeModule);
795
+ AstClass* const varClassp = VN_CAST (varModp, Class);
796
+ AstClass* const callerClassp = VN_CAST (m_callerp, Class);
796
797
797
- const bool callerIsClass = VN_IS (m_callerp, Class) ;
798
+ const bool callerIsClass = callerClassp ;
798
799
const bool refIsXref = VN_IS (varRefp, VarXRef);
799
800
const bool varIsFuncLocal = varRefp->varp ()->isFuncLocal ();
800
801
const bool varHasAutomaticLifetime = varRefp->varp ()->lifetime ().isAutomatic ();
801
- const bool varIsDeclaredInCaller = modp == m_callerp;
802
802
const bool varIsFieldOfCaller
803
- = modp ? m_visibleModules.find (modp) != m_visibleModules.end () : false ;
804
-
803
+ = callerClassp && varClassp ? isSuperClassOf (varClassp, callerClassp) : false ;
805
804
if (refIsXref) return CaptureMode::CAP_VALUE | CaptureMode::CAP_F_XREF;
806
805
if (varIsFuncLocal && varHasAutomaticLifetime) return CaptureMode::CAP_VALUE;
807
806
// Static var in function (will not be inlined, because it's in class)
808
807
if (callerIsClass && varIsFuncLocal) return CaptureMode::CAP_VALUE;
809
- if (callerIsClass && varIsDeclaredInCaller) return CaptureMode::CAP_THIS;
810
808
if (callerIsClass && varIsFieldOfCaller) return CaptureMode::CAP_THIS;
811
809
UASSERT_OBJ (!callerIsClass, varRefp, " Invalid reference?" );
812
810
return CaptureMode::CAP_VALUE;
@@ -845,13 +843,15 @@ class CaptureVisitor final : public VNVisitor {
845
843
m_ignore.emplace (memberSelp);
846
844
}
847
845
848
- void fetchVisibleModules (AstClass* classp) {
849
- for (AstClassExtends* extendsp = classp->extendsp (); extendsp;
846
+ // Returns true if the first class is a superclass of the second class
847
+ bool isSuperClassOf (AstClass* const classIsp, AstClass* const classOfp) {
848
+ if (classIsp == classOfp) return true ;
849
+ for (AstClassExtends* extendsp = classOfp->extendsp (); extendsp;
850
850
extendsp = VN_AS (extendsp->nextp (), ClassExtends)) {
851
851
AstClass* const superClassp = VN_AS (extendsp->childDTypep (), ClassRefDType)->classp ();
852
- m_visibleModules.insert (superClassp);
853
- fetchVisibleModules (superClassp);
852
+ if (isSuperClassOf (classIsp, superClassp)) return true ;
854
853
}
854
+ return false ;
855
855
}
856
856
857
857
// VISITORS
@@ -936,7 +936,6 @@ class CaptureVisitor final : public VNVisitor {
936
936
: m_argsp(nullptr )
937
937
, m_callerp(callerp)
938
938
, m_targetp(targetp) {
939
- if (AstClass* classp = VN_CAST (callerp, Class)) fetchVisibleModules (classp);
940
939
iterateAndNextNull (nodep);
941
940
}
942
941
0 commit comments