mirror of
https://github.com/irmen/prog8.git
synced 2025-11-01 22:16:16 +00:00
tweak address-of types
This commit is contained in:
@@ -171,20 +171,22 @@ class DataType private constructor(val base: BaseDataType, val sub: BaseDataType
|
|||||||
if (isUndefined)
|
if (isUndefined)
|
||||||
return if(msb) pointer(BaseDataType.UBYTE) else UWORD
|
return if(msb) pointer(BaseDataType.UBYTE) else UWORD
|
||||||
else {
|
else {
|
||||||
// if(isBasic)
|
if(isBasic)
|
||||||
// return pointer(base) // TODO breaks 6502 codegen atm
|
return pointer(base)
|
||||||
// if(isString) // TODO pointer to string == ptr to ubyte? breaks 6502 codegen atm.
|
// if(isString) // TODO return this typed pointer instead, but that breaks 6502 codegen now:
|
||||||
// return pointer(BaseDataType.UBYTE)
|
// return pointer(BaseDataType.UBYTE)
|
||||||
// if(isArray) // TODO pointer to array == ptr to element type? breaks 6502 codegen atm.
|
|
||||||
// return pointer(elementType().base)
|
|
||||||
if (subType != null)
|
if (subType != null)
|
||||||
return pointerToType(subType!!)
|
return pointerToType(subType!!)
|
||||||
else if (isArray) {
|
if (isArray) {
|
||||||
if (msb || isSplitWordArray)
|
if (msb || isSplitWordArray)
|
||||||
return pointer(BaseDataType.UBYTE)
|
return pointer(BaseDataType.UBYTE)
|
||||||
return UWORD
|
return UWORD
|
||||||
} else
|
// TODO return this typed pointer instead, but that breaks 6502 codegen now:
|
||||||
return UWORD // TODO("address-of type for $this")
|
// val elementDt = elementType()
|
||||||
|
// require(elementDt.isBasic)
|
||||||
|
// return pointer(elementDt.base)
|
||||||
|
}
|
||||||
|
return UWORD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,6 +99,10 @@ internal class VerifyFunctionArgTypes(val program: Program, val options: Compila
|
|||||||
TODO("array vs element pointer check")
|
TODO("array vs element pointer check")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if expected is UWORD and actual is any pointer, we allow it (uword is untyped pointer, for backwards compatibility)
|
||||||
|
if(paramDt.isUnsignedWord && argDt.isPointer)
|
||||||
|
return true
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,12 +48,12 @@ STRUCTS and TYPED POINTERS
|
|||||||
- DONE: pointer[0] should be replaced with @(pointer) if pointer is ^^ubyte, so these are now all identical: ptr[0], ptr^^, @(ptr) if ptr is ^^ubyte
|
- DONE: pointer[0] should be replaced with @(pointer) if pointer is ^^ubyte, so these are now all identical: ptr[0], ptr^^, @(ptr) if ptr is ^^ubyte
|
||||||
- DONE: STR should be asssignment compatible with UBYTE^^ but local scoped STR should still be accessed directly using LDA str,Y instead of through the pointer, like arrays.
|
- DONE: STR should be asssignment compatible with UBYTE^^ but local scoped STR should still be accessed directly using LDA str,Y instead of through the pointer, like arrays.
|
||||||
- fix actual _msb/_lsb storage of the split-words pointer-arrays
|
- fix actual _msb/_lsb storage of the split-words pointer-arrays
|
||||||
|
- rather than str or uword parameter types for routines with a string argument, use ^^str (or ^^ubyte maybe? these are more or less identical..?)
|
||||||
|
- allow memory-mapped structs? Something like &Sprite sprite0 = $9000 basically behaves identical to a typed pointer, but the address is immutable as usual
|
||||||
- make typeForAddressOf() be even more specific about the typed pointers it returns for the address-of operator. + unit test. Needs fixes in 6502 codegen too though... (also recheck passing STR and ARRAY types to subroutines)
|
- make typeForAddressOf() be even more specific about the typed pointers it returns for the address-of operator. + unit test. Needs fixes in 6502 codegen too though... (also recheck passing STR and ARRAY types to subroutines)
|
||||||
- fixing the pointer dereferencing issues (cursed hybrid beween IdentifierReference, PtrDereferece and PtrIndexedDereference) may require getting rid of scoped identifiers altogether and treat '.' as a "scope or pointer following operator"
|
- fixing the pointer dereferencing issues (cursed hybrid beween IdentifierReference, PtrDereferece and PtrIndexedDereference) may require getting rid of scoped identifiers altogether and treat '.' as a "scope or pointer following operator"
|
||||||
- (later, nasty parser problem:) support chaining pointer dereference on function calls that return a pointer. (type checking now fails on stuff like func().field and func().next.field)
|
- (later, nasty parser problem:) support chaining pointer dereference on function calls that return a pointer. (type checking now fails on stuff like func().field and func().next.field)
|
||||||
- allow memory-mapped structs? Something like &Sprite sprite0 = $9000 basically behaves identical to a typed pointer, but the address is immutable as usual
|
- add unit tests for all changes (pointers and structs)
|
||||||
- rather than str or uword parameter types for routines with a string argument, use ^^str (or ^^ubyte maybe? these are more or less identical..?)
|
|
||||||
- add more unit tests for all changes (pointers and structs)
|
|
||||||
- 6502 codegen should warn about writing to initialized struct instances when using romable code, like with arrays "can only be used as read-only in ROMable code"
|
- 6502 codegen should warn about writing to initialized struct instances when using romable code, like with arrays "can only be used as read-only in ROMable code"
|
||||||
- 6502 asm symbol name prefixing should work for dereferences too.
|
- 6502 asm symbol name prefixing should work for dereferences too.
|
||||||
- What about static initialization of an array of struct pointers? -> impossible right now because the pointer values are not constants
|
- What about static initialization of an array of struct pointers? -> impossible right now because the pointer values are not constants
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ main {
|
|||||||
^^ubyte @shared ubptr
|
^^ubyte @shared ubptr
|
||||||
|
|
||||||
str name = "irmen"
|
str name = "irmen"
|
||||||
bptr = &name
|
bptr = &name as ^^byte
|
||||||
ubptr = &name
|
ubptr = &name
|
||||||
stringinfo1("hello")
|
stringinfo1("hello")
|
||||||
stringinfo2(name)
|
stringinfo2(name)
|
||||||
@@ -30,6 +30,8 @@ main {
|
|||||||
arrayinfo(values)
|
arrayinfo(values)
|
||||||
arrayinfo(&values[2])
|
arrayinfo(&values[2])
|
||||||
|
|
||||||
|
arrayinfo2(values)
|
||||||
|
|
||||||
|
|
||||||
bptr = name
|
bptr = name
|
||||||
ubptr = name
|
ubptr = name
|
||||||
@@ -108,6 +110,10 @@ main {
|
|||||||
txt.print_w(valueptr^^)
|
txt.print_w(valueptr^^)
|
||||||
txt.nl()
|
txt.nl()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub arrayinfo2(uword ptr) {
|
||||||
|
cx16.r0++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
thing {
|
thing {
|
||||||
|
|||||||
Reference in New Issue
Block a user