137
137
import com .oracle .graal .python .builtins .objects .str .StringNodes .StringMaterializeNode ;
138
138
import com .oracle .graal .python .builtins .objects .tuple .PTuple ;
139
139
import com .oracle .graal .python .builtins .objects .type .PythonAbstractClass ;
140
+ import com .oracle .graal .python .builtins .objects .type .PythonClass ;
140
141
import com .oracle .graal .python .builtins .objects .type .PythonManagedClass ;
142
+ import com .oracle .graal .python .builtins .objects .type .TypeBuiltins ;
141
143
import com .oracle .graal .python .builtins .objects .type .TypeNodes ;
142
144
import com .oracle .graal .python .builtins .objects .type .TypeNodes .GetMroStorageNode ;
143
145
import com .oracle .graal .python .builtins .objects .type .TypeNodes .GetNameNode ;
210
212
import com .oracle .truffle .api .nodes .EncapsulatingNodeReference ;
211
213
import com .oracle .truffle .api .nodes .ExplodeLoop ;
212
214
import com .oracle .truffle .api .nodes .Node ;
215
+ import com .oracle .truffle .api .object .HiddenKey ;
213
216
import com .oracle .truffle .api .profiles .BranchProfile ;
214
217
import com .oracle .truffle .api .profiles .ConditionProfile ;
215
218
import com .oracle .truffle .api .source .Source ;
@@ -1737,20 +1740,25 @@ public static GetTypeMemberNode getUncached() {
1737
1740
@ GenerateUncached
1738
1741
public abstract static class LookupNativeMemberInMRONode extends Node {
1739
1742
1740
- public abstract Object execute (Object cls , NativeMember nativeMemberName , Object managedMemberName );
1743
+ public abstract Object execute (Object cls , NativeMember nativeMemberName , HiddenKey managedMemberName );
1741
1744
1742
- @ Specialization
1743
- static Object doSingleContext (Object cls , NativeMember nativeMemberName , Object managedMemberName ,
1744
- @ Cached GetMroStorageNode getMroNode ,
1745
- @ Cached SequenceStorageNodes .GetItemDynamicNode getItemNode ,
1746
- @ Cached ("createForceType()" ) ReadAttributeFromObjectNode readAttrNode ,
1747
- @ Cached GetTypeMemberNode getTypeMemberNode ) {
1745
+ static boolean isTpAlloc (Object cls , HiddenKey key ) {
1746
+ return cls instanceof PythonClass && key == TypeBuiltins .TYPE_ALLOC ;
1747
+ }
1748
+
1749
+ @ Specialization (guards = "!isTpAlloc(cls, managedMemberName)" )
1750
+ static Object doSingleContext (Object cls , NativeMember nativeMemberName , HiddenKey managedMemberName ,
1751
+ @ Cached GetMroStorageNode getMroNode ,
1752
+ @ Cached SequenceStorageNodes .GetItemDynamicNode getItemNode ,
1753
+ @ Cached ("createForceType()" ) ReadAttributeFromObjectNode readAttrNode ,
1754
+ @ Cached GetTypeMemberNode getTypeMemberNode ) {
1748
1755
1749
1756
MroSequenceStorage mroStorage = getMroNode .execute (cls );
1750
1757
int n = mroStorage .length ();
1751
1758
1752
1759
for (int i = 0 ; i < n ; i ++) {
1753
1760
PythonAbstractClass mroCls = (PythonAbstractClass ) getItemNode .execute (mroStorage , i );
1761
+
1754
1762
Object result ;
1755
1763
if (PGuards .isManagedClass (mroCls )) {
1756
1764
result = readAttrNode .execute (mroCls , managedMemberName );
@@ -1763,7 +1771,22 @@ static Object doSingleContext(Object cls, NativeMember nativeMemberName, Object
1763
1771
}
1764
1772
}
1765
1773
1766
- return PNone .NO_VALUE ;
1774
+ return readAttrNode .execute (PythonContext .get (readAttrNode ).lookupType (PythonBuiltinClassType .PythonObject ), managedMemberName );
1775
+ }
1776
+
1777
+ @ Specialization (guards = "isTpAlloc(cls, managedMemberName)" )
1778
+ static Object doToAllocManaged (Object cls , @ SuppressWarnings ("unused" ) NativeMember nativeMemberName , HiddenKey managedMemberName ,
1779
+ @ Cached ("createForceType()" ) ReadAttributeFromObjectNode readAttrNode ,
1780
+ @ Cached WriteAttributeToObjectNode writeAttrNode ) {
1781
+
1782
+ Object alloc = readAttrNode .execute (cls , managedMemberName );
1783
+ if (alloc == PNone .NO_VALUE ) {
1784
+ PythonObject object = PythonContext .get (readAttrNode ).lookupType (PythonBuiltinClassType .PythonObject );
1785
+ Object pyTypeGenericAlloc = readAttrNode .execute (object , managedMemberName );
1786
+ writeAttrNode .execute (cls , managedMemberName , pyTypeGenericAlloc );
1787
+ alloc = pyTypeGenericAlloc ;
1788
+ }
1789
+ return alloc ;
1767
1790
}
1768
1791
}
1769
1792
0 commit comments