106
106
import com .oracle .graal .python .builtins .objects .cext .hpy .GraalHPyNodesFactory .HPyVarargsHandleCloseNodeGen ;
107
107
import com .oracle .graal .python .builtins .objects .cext .hpy .GraalHPyObjectBuiltins .HPyObjectNewNode ;
108
108
import com .oracle .graal .python .builtins .objects .cext .hpy .HPyExternalFunctionNodes .HPyGetSetDescriptorGetterRootNode ;
109
- import com .oracle .graal .python .builtins .objects .cext .hpy .HPyExternalFunctionNodes .HPyGetSetDescriptorNotWritableRootNode ;
110
109
import com .oracle .graal .python .builtins .objects .cext .hpy .HPyExternalFunctionNodes .HPyGetSetDescriptorSetterRootNode ;
111
110
import com .oracle .graal .python .builtins .objects .cext .hpy .HPyExternalFunctionNodes .HPyLegacyGetSetDescriptorGetterRoot ;
112
111
import com .oracle .graal .python .builtins .objects .cext .hpy .HPyExternalFunctionNodes .HPyLegacyGetSetDescriptorSetterRoot ;
@@ -516,17 +515,19 @@ static GetSetDescriptor doGeneric(GraalHPyContext context, Object owner, Object
516
515
Object getterFunPtr ;
517
516
Object setterFunPtr ;
518
517
Object closurePtr ;
519
- boolean readOnly ;
518
+ boolean hasGetter ;
519
+ boolean hasSetter ;
520
520
try {
521
521
getterFunPtr = interopLibrary .readMember (legacyGetSetDef , "get" );
522
- if (!(resultLib .isNull (getterFunPtr ) || resultLib .isExecutable (getterFunPtr ))) {
522
+ hasGetter = !resultLib .isNull (getterFunPtr );
523
+ if (hasGetter && !resultLib .isExecutable (getterFunPtr )) {
523
524
LOGGER .warning (() -> String .format ("get of %s is not callable" , getSetDescrName ));
524
525
}
525
526
setterFunPtr = interopLibrary .readMember (legacyGetSetDef , "set" );
526
- if (!(resultLib .isNull (setterFunPtr ) || resultLib .isExecutable (setterFunPtr ))) {
527
+ hasSetter = !resultLib .isNull (setterFunPtr );
528
+ if (hasSetter && !resultLib .isExecutable (setterFunPtr )) {
527
529
LOGGER .warning (() -> String .format ("set of %s is not callable" , getSetDescrName ));
528
530
}
529
- readOnly = resultLib .isNull (setterFunPtr );
530
531
closurePtr = interopLibrary .readMember (legacyGetSetDef , "closure" );
531
532
} catch (UnknownIdentifierException e ) {
532
533
CompilerDirectives .transferToInterpreterAndInvalidate ();
@@ -537,15 +538,21 @@ static GetSetDescriptor doGeneric(GraalHPyContext context, Object owner, Object
537
538
}
538
539
539
540
PythonLanguage lang = PythonLanguage .get (raiseNode );
540
- PBuiltinFunction getterObject = HPyLegacyGetSetDescriptorGetterRoot .createLegacyFunction (context , lang , owner , getSetDescrName , getterFunPtr , closurePtr );
541
- Object setterObject ;
542
- if (readOnly ) {
543
- setterObject = HPyGetSetDescriptorNotWritableRootNode .createFunction (context .getContext (), owner , getSetDescrName );
541
+ PBuiltinFunction getterObject ;
542
+ if (hasGetter ) {
543
+ getterObject = HPyLegacyGetSetDescriptorGetterRoot .createLegacyFunction (context , lang , owner , getSetDescrName , getterFunPtr , closurePtr );
544
544
} else {
545
+ getterObject = null ;
546
+ }
547
+
548
+ PBuiltinFunction setterObject ;
549
+ if (hasSetter ) {
545
550
setterObject = HPyLegacyGetSetDescriptorSetterRoot .createLegacyFunction (context , lang , owner , getSetDescrName , setterFunPtr , closurePtr );
551
+ } else {
552
+ setterObject = null ;
546
553
}
547
554
548
- GetSetDescriptor getSetDescriptor = factory .createGetSetDescriptor (getterObject , setterObject , getSetDescrName , owner , ! readOnly );
555
+ GetSetDescriptor getSetDescriptor = factory .createGetSetDescriptor (getterObject , setterObject , getSetDescrName , owner , hasSetter );
549
556
writeDocNode .execute (getSetDescriptor , SpecialAttributeNames .T___DOC__ , getSetDescrDoc );
550
557
return getSetDescriptor ;
551
558
}
@@ -797,26 +804,33 @@ static GetSetDescriptor doIt(GraalHPyContext context, Object type, Object member
797
804
798
805
// signature: self, closure
799
806
Object getterFunctionPtr = memberDefLib .readMember (memberDef , "getter_impl" );
800
- if (context .isDebugMode () || !valueLib .isExecutable (getterFunctionPtr )) {
807
+ boolean hasGetter = !valueLib .isNull (getterFunctionPtr );
808
+ if (hasGetter && (context .isDebugMode () || !valueLib .isExecutable (getterFunctionPtr ))) {
801
809
getterFunctionPtr = attachFunctionTypeNode .execute (context , getterFunctionPtr , LLVMType .HPyFunc_getter );
802
810
}
803
811
804
812
// signature: self, value, closure
805
813
Object setterFunctionPtr = memberDefLib .readMember (memberDef , "setter_impl" );
806
- boolean readOnly = valueLib .isNull (setterFunctionPtr );
807
- if (! readOnly && (context .isDebugMode () || !valueLib .isExecutable (setterFunctionPtr ))) {
814
+ boolean hasSetter = ! valueLib .isNull (setterFunctionPtr );
815
+ if (hasSetter && (context .isDebugMode () || !valueLib .isExecutable (setterFunctionPtr ))) {
808
816
setterFunctionPtr = attachFunctionTypeNode .execute (context , setterFunctionPtr , LLVMType .HPyFunc_setter );
809
817
}
810
818
811
- PBuiltinFunction getterObject = HPyGetSetDescriptorGetterRootNode .createFunction (context , type , name , getterFunctionPtr , closurePtr );
812
- Object setterObject ;
813
- if (readOnly ) {
814
- setterObject = HPyGetSetDescriptorNotWritableRootNode .createFunction (context .getContext (), type , name );
819
+ PBuiltinFunction getterObject ;
820
+ if (hasGetter ) {
821
+ getterObject = HPyGetSetDescriptorGetterRootNode .createFunction (context , type , name , getterFunctionPtr , closurePtr );
815
822
} else {
823
+ getterObject = null ;
824
+ }
825
+
826
+ PBuiltinFunction setterObject ;
827
+ if (hasSetter ) {
816
828
setterObject = HPyGetSetDescriptorSetterRootNode .createFunction (context , type , name , setterFunctionPtr , closurePtr );
829
+ } else {
830
+ setterObject = null ;
817
831
}
818
832
819
- GetSetDescriptor getSetDescriptor = factory .createGetSetDescriptor (getterObject , setterObject , name , type , !readOnly );
833
+ GetSetDescriptor getSetDescriptor = factory .createGetSetDescriptor (getterObject , setterObject , name , type , !hasSetter );
820
834
writeDocNode .execute (getSetDescriptor , SpecialAttributeNames .T___DOC__ , memberDoc );
821
835
return getSetDescriptor ;
822
836
} catch (UnsupportedMessageException | UnknownIdentifierException e ) {
0 commit comments