Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Compiler bug in functions >6 parameters
#1
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.
Zitieren
#2
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...
Zitieren
#3
ja hättste mir direkt mailen müssen. ich schaue mal
Zitieren
#4
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:
   ;bsr.w get1bytemain
   !fget
   CMP.b #$7e,d0
   BNE 'noc
   SUBQ.l #1,a5
   BSR get1bytemain

'noc
   CMP.b #"#",d0
   BNE 'ld1
   CMP.b #$22,(a5)
   BNE 'ld1
   JSR addimmi

'ld1
   CMP.b #$22,d0
   BNE 'l11
   ;BTST #$d,vartype
   ;BNE 'ls1
   ;CMP.b #7,d2                                             ;long pointer string error
   ;BEQ 'ls1
   ;TST.b vartype+1
   ;BEQ 'ls1
;BRA error_convert_types

'ls1
   NOT.w instringon
'l11
   TST.b d0
   BPL 'l10
   LSL.w #8,d0
   MOVE.b (a5)+,d0                      ; get blitz instruction with returnvalue
   MOVE.l d0,lasttoken
   MOVE.w d0,lastchar
   CMP.w #5,regnum                      ;+
   BLE 'l4                              ;+
   JMP error_convert_types              ;+
'l4   CLR.l rightsidetype                  ; blitzlibs do currently no type check
Zitieren
#5
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)
Zitieren
#6
@Bernd

Ich habe deine Änderungen eingebaut das funktioniert, nur wird jetzt ein True auch nicht mehr als >6 Parameter akzeptiert Sad

Das ist nicht so toll, es wird bei NTUI davon sehr viel gebrauch gemacht und dient auch der Lesbarkeit, kann man das entschärfen :?:
Zitieren
#7
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 ;+
Zitieren
#8
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 :?:
Zitieren
#9
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
Zitieren
#10
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.
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste