[Bug]: `complex(real, imag)` converts `imag` before rejecting a non-number `real`
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 78/100
Piste de recherche
Lisez ComplexBuiltins.java, en particulier complexFromComplexObject autour des lignes citées et complexFromComplexLong pour les vérifications d’arguments existantes. Reproduisez le problème avec l’exemple Python fourni, puis exécutez les tests pertinents du constructeur complex. Le travail est terminé lorsque real invalide est rejeté avant la conversion de imag, conformément à l’erreur et à l’ordre de conversion de CPython.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Describe the bug
When imag is a user object, complex(real, imag) calls its __float__ or __index__ before checking that real is a number. An exception from that conversion replaces the TypeError CPython raises for the first argument, and CPython never calls the method at all.
Operating system
Linux
CPU architecture
ARM64
GraalPy version
25.0.2 (Python 3.12.8); also reproduced on 25.4.4.1.1 (Python 3.13.14)
JDK version
No response
Context configuration
No response
Steps to reproduce
class RaisingFloat:
def __float__(self):
raise Exception()
complex({}, RaisingFloat())
GraalPy 25.0.2 raises the Exception from RaisingFloat.__float__:
Exception
Expected behavior
CPython 3.12.13 (same on 3.13.16):
TypeError: complex() first argument must be a string or a number, not 'dict'
Stack trace
Additional context
The conversion order is reversed too: with both arguments defining a raising __float__, GraalPy calls only imag.__float__ and CPython calls only real.__float__. When imag is an int or float, another specialization checks real first, so complex({1: 2}, 0) already matches CPython.
Root Cause
ComplexNewNode.complexFromComplexObject, taken when imag is neither complex nor a string, converts two at ComplexBuiltins.java#L621-L622 and only then checks one (#L623-L630). CPython's complex_new_impl checks the type of real and then imag (complexobject.c#L945-L972) before converting either (#L995, #L1018).
Fix Suggestion
Reorder complexFromComplexObject to raise the first-argument error, then the second-argument error, and only then convert one and two, as complexFromComplexLong (#L532-L539) already checks one first.
- Langage dominant
- Python
- Étoiles
- 1.7k
- Forks
- 158
- Merge moyen
- 8 h 58 min
- PR mergées (30 j)
- 44
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de oracle/graalpython
-
[Bug]: `reversed()` on a dict or dict view returns the forward iterator type instead of `dict_reverse*iterator`Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
oracle/graalpython#1226 ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: sys.flags.debug is 1 whenever optimization is offPeut-être pris @hippi345 l’a pris il y a 3 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
oracle/graalpython#1213 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
oracle/graalpython#1105 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
oracle/graalpython#1102 ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug]: `compile()` checks the source before `mode`, raising `TypeError` instead of `ValueError`Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouvertebug
Difficulté 3/5 1-2 jours Accessibilité débutants 76/100
oracle/graalpython#1224 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de oracle/graalpython
Issues similaires
-
idxmax/idxmin raise ValueError when a single partition is all-NAPeut-être pris @Jason10191019999 l’a pris aujourd’hui. Ouverteneeds triage
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 3 jours
-
Old versions of datamodelsOuvertebug
Difficulté 2/5 1-3 heures Accessibilité débutants 64/100
-
[BUG]: Windows GUI package of v1.17.0-rc3 has no GTK DLLsPeut-être pris @andrut-ds l’a pris aujourd’hui. Ouvertebug CI/CD Pactus-GUI Windows
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
pactus-project/pactus#2428 ·
Les mainteneurs répondent en général sous 1 jour
-
DiskDataset.reshard() can hang with a zero or negative shard sizePeut-être pris @Programmer-Develops l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 19 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 66/100
GNS3/gns3-server#3017 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour