Beiträge: 396
Themen: 8
Registriert seit: Sep 2013
Bewertung:
0
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.
Beiträge: 666
Themen: 77
Registriert seit: Oct 2013
Bewertung:
0
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...
Beiträge: 67
Themen: 5
Registriert seit: Jun 2014
Bewertung:
0
ja hättste mir direkt mailen müssen. ich schaue mal
Beiträge: 67
Themen: 5
Registriert seit: Jun 2014
Bewertung:
0
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
Beiträge: 67
Themen: 5
Registriert seit: Jun 2014
Bewertung:
0
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)
Beiträge: 289
Themen: 10
Registriert seit: Oct 2013
Bewertung:
0
@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 :?:
Beiträge: 67
Themen: 5
Registriert seit: Jun 2014
Bewertung:
0
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 ;+
Beiträge: 289
Themen: 10
Registriert seit: Oct 2013
Bewertung:
0
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 :?:
Beiträge: 67
Themen: 5
Registriert seit: Jun 2014
Bewertung:
0
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
Beiträge: 396
Themen: 8
Registriert seit: Sep 2013
Bewertung:
0
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.
|