![]() |
Compiler bug in functions >6 parameters - Druckversion +- AmiBlitz³ (https://www.amiblitz.de/community) +-- Forum: AmiBlitz³ (https://www.amiblitz.de/community/forum-3.html) +--- Forum: AB³ Development (https://www.amiblitz.de/community/forum-16.html) +--- Thema: Compiler bug in functions >6 parameters (/thread-54.html) Seiten:
1
2
|
Compiler bug in functions >6 parameters - Der Wanderer - 05.01.2014 If you define a function with more than 6 parameters, and the argument evaluation for argument >6 includes a Blitz-Token, it gurus with "Illegal Instruction". e.g. [ab3]Statement Call7{param1.l,param2.l,param3.l,param4.l,param5.l,param6.l,param7.l} : End Statement Call7{1,2,3,4,5,6,7} ; ok Call7{1,2,3,4,5,6,Int(7)} ; guru! End[/ab3] @Bernd Pleeease fix! Thanks. Re: Compiler bug in functions >6 parameters - Blackbird - 05.01.2014 Thilo, bernd are not here on amiblitz.de, he was only on amiforce registered. You should mail him the problem... Or you can say he should registered here also... I heard nothing from him for a long time... Re: Compiler bug in functions >6 parameters - Berndroesch - 11.07.2014 ja hättste mir direkt mailen müssen. ich schaue mal Re: Compiler bug in functions >6 parameters - Berndroesch - 11.07.2014 Das man in den parameter über 6 auch Funktionen aufrufen kann, ist nicht implementiert. Int(xxx) braucht man sowieso nicht, das wird automatisch konvertiert. aber ne fehlermeldung sollte natürlich kommmen, On parameternumber >6 no function calls allowed. mit ;+ habe ich die Codezeilen markiert die neu rein müssen. das geht aber nur bei den blitz func calls. Ich habe es auch mit Funktionen probiert, erzeugt auch falschen code. dass muss ich noch einbauen, dass auch ein Call7{1,2,3,4,5,6,Call1{7}} ne fehlermeldung bringt. Dass müsst ihr dann noch ändern, damit ne passende Fehlermeldung erzeugt wird(neu erstellen) JMP error_convert_types ;+ Code: JL_0_A6B4: Re: Compiler bug in functions >6 parameters - Berndroesch - 12.07.2014 Und damit Functionscalls bei mehr als 6 Parameter einen error erzeugen die 2 asm Zeilen eingeben mit passenden Text in error_ isfunction: ;called when do var = function {} CMP.w #5,regnum ;+ BGT error_xxxxxx ;+ Und am source zur besseren doku dass so schreiben isfunction: ;called when do var = function {} or called when call a function in a function(must be recursive safe) Re: Compiler bug in functions >6 parameters - tomsmart1 - 14.07.2014 @Bernd Ich habe deine Änderungen eingebaut das funktioniert, nur wird jetzt ein True auch nicht mehr als >6 Parameter akzeptiert ![]() Das ist nicht so toll, es wird bei NTUI davon sehr viel gebrauch gemacht und dient auch der Lesbarkeit, kann man das entschärfen :?: Re: Compiler bug in functions >6 parameters - Berndroesch - 15.07.2014 Das geht, ich habe die beiden Befehle mit den 4 Zeilen aktiviert. JL_0_A6B4: ...... CMP.w #5,regnum ;+ BLE 'l4 ;+ + CMP.w #$BC0E,d0 ; allow true in more 6 parameters + BEQ 'l4 + CMP.w #$BC0F,d0 ; allow false in more 6 parameters + BEQ 'l4 JMP error_xxxxxxxx ;+ Re: Compiler bug in functions >6 parameters - tomsmart1 - 15.07.2014 Danke Bernd das funktioniert ich habe es eingecheckt als r468. Ups ich sehe gerade es gibt da noch ein Problem und zwar wenn jetzt für den 6 Parameter eine Kombination wie z.B.: [ab3]test{...,...,...,...,...,test\test1+Flen(test)}[/ab3] verwendet wird erscheint auch die Fehlermeldung :?: Re: Compiler bug in functions >6 parameters - Berndroesch - 17.07.2014 da fällt mir auf die schnelle keine Lösung ein. Problem ist, dass blitzbasic immer die register hochzählt. schriebt man einen Term werden je nach klammer mehrere Register benötigt. Da es nur 8 gibt, gehen bei komplexen termen mit klammern die Register aus. Dass war schon bei blitz der fall, aber fiel da nicht auf, weil man ja nur 6 Parameter hatte. Der Term benutzt dann für flen(test) register d7. also das letzte. gibt es denn viele solche aufrufe ?.ansonsten müsste ich suchen, warum es genau mit dem 7. Parameter nicht geht, denn test\test1+Flen(test) wenn man den Term umstellt kann man die Meldung umgehen. also das würde gehen Flen(test)+test\test1 ansonsten den kürzesten und schnellsten code bekommt man, wenn man temp = Flen(test)+test\test1 vor dem funktioncall macht. Denn es müssen wenn man den term in dem functioncall macht, 5 Register auf dem stack gespeichert und geladen werden. Call7{1,2,3,4,5,FLen(a$)+x.l,7,False,8,True} ; gibt den asm code move.l #1,d1 MOVE.L #2,D1 MOVE.L #3,D2 MOVE.L #4,D3 MOVE.L #5,D4 ; flen(a$) +x MOVEM.L D0-D4,-(A7) MOVEA.L -$7FF8(A5),A2 MOVE.L A2,D0 BEQ $43547F38 ;43547F38 MOVEA.L D0,A2 MOVE.L -4(A2),D0 MOVE.L D0,D5 MOVEM.L (A7)+,D0-D4 MOVE.L -$7FF4(A5),D6 ADD.L D6,D5 MOVE.L #7,D6 MOVE.L D6,$43553E68 ;43553E68 MOVEQ #0,D6 MOVE.L D6,$43553E6C ;43553E6C MOVE.L #8,D6 MOVE.L D6,$43553E70 ;43553E70 MOVEQ #-1,D6 MOVE.L D6,$43553E74 ;43553E74 temp.l =FLen(a$)+x.l Call7{1,2,3,4,5,temp,7,False,8,True} ; ok gibt den asm code temp.=flen(a$)+x MOVEA.L -$7FF4(A5),A2 MOVE.L A2,D0 BEQ $435A602A ;435A602A MOVEA.L D0,A2 MOVE.L -4(A2),D0 MOVE.L -$7FF0(A5),D1 ADD.L D1,D0 MOVE.L D0,-$7FF8(A5) ;functioncall move.l #0,d0 MOVE.L #2,D1 MOVE.L #3,D2 MOVE.L #4,D3 MOVE.L #5,D4 MOVE.L -$7FF8(A5),D5 MOVE.L #7,D6 MOVE.L D6,$435B1F88 ;435B1F88 MOVEQ #0,D6 MOVE.L D6,$435B1F8C ;435B1F8C MOVE.L #8,D6 MOVE.L D6,$435B1F90 ;435B1F90 MOVEQ #-1,D6 MOVE.L D6,$435B1F94 ;435B1F94 beim 7. Parameter macht der Compiler totalen Mist, der functioncall steht hinter dem register restore und hat ne illegale adresse. dass ist aber halt schon mehr arbeit rauszufinden, was da schief geht. vielleicht tuts die einfache Lösung. immerhin ist der Fehler 10 Jahre unentdeckt geblieben. MOVEM.L D0-D5,-(A7) MOVEA.L -$7FF4(A5),A2 MOVE.L A2,D0 BEQ $42DED08C ;42DE MOVEA.L D0,A2 MOVE.L -4(A2),D0 MOVE.L D0,D6 MOVEM.L (A7)+,D0-D5 JSR $B565C80 ;0B56 <----- der ganze Befehl gehört da garnicht hin und ist überflüssig. wäre der befehl nicht da, würde es richtig laufen Re: Compiler bug in functions >6 parameters - Der Wanderer - 17.07.2014 Der Compiler darf keinen inkorrekten Code erzeugen. Im Zweifelsfall sollte er eine Fehlermeldung bringen. Wenn >6 params nicht richtig machbar ist, würde ich bevorzugen das Limit wieder auf 6 zu setzen. Ich muss dann zwar eine Menge Code ändern, bin aber sicher, dass es läuft. |