1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-12-30 15:31:17 +00:00

Moved strings into chunk method.

This commit is contained in:
jespergravgaard 2019-09-13 21:21:32 +02:00
parent 00d6cad179
commit edb12d8577
3 changed files with 32 additions and 58 deletions

View File

@ -451,59 +451,18 @@ public class Pass4CodeGeneration {
asm.addDataAlignment(alignment);
}
ConstantValue constantValue = constantVar.getValue();
if(constantValue instanceof ConstantArrayList) {
if(constantValue instanceof ConstantArrayList || constantValue instanceof ConstantArrayFilled || constantValue instanceof ConstantArrayKickAsm || constantValue instanceof ConstantString) {
AsmDataChunk asmDataChunk = new AsmDataChunk();
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
asmDataChunk.addToAsm(asmName, asm);
} else if(constantValue instanceof ConstantArrayFilled) {
AsmDataChunk asmDataChunk = new AsmDataChunk();
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
asmDataChunk.addToAsm(asmName, asm);
} else if(constantValue instanceof ConstantArrayKickAsm) {
AsmDataChunk asmDataChunk = new AsmDataChunk();
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
asmDataChunk.addToAsm(asmName, asm);
asmDataChunk.addToAsm(AsmFormat.asmFix(asmName), asm);
} else {
try {
ConstantLiteral literal = constantValue.calculateLiteral(getScope());
if(literal instanceof ConstantString) {
// Ensure encoding is good
ensureEncoding(asm, constantValue);
String asmConstant = AsmFormat.getAsmConstant(program, constantValue, 99, scopeRef);
asm.addDataString(AsmFormat.asmFix(asmName), asmConstant);
if(((ConstantString) literal).isZeroTerminated()) {
asm.addDataNumeric(null, AsmDataNumeric.Type.BYTE, Collections.singletonList(AsmFormat.getAsmNumber(0L)));
}
int dataSize = ((ConstantString) literal).getStringLength();
// Pad output to match declared size (if larger than the data list)
Integer declaredSize = getArrayDeclaredSize(constantVar);
if(declaredSize != null && declaredSize > dataSize) {
int padding = declaredSize - dataSize;
asm.addDataFilled(null, AsmDataNumeric.Type.BYTE, Integer.toString(padding), padding, "0");
}
added.add(asmName);
}
} catch(ConstantNotLiteral e) {
// can't calculate literal value, so it is not data - just return
}
throw new InternalError("Constant Variable not handled " + constantVar.toString(program));
}
added.add(asmName);
}
}
}
/**
* Get the declared size of an array variable.
*
* @param constantVar The array variable
* @return The declared size. Null if the type is not array or no size is declared.
*/
private Integer getArrayDeclaredSize(ConstantVar constantVar) {
SymbolType constantType = constantVar.getType();
Integer declaredSizeVal = getArrayDeclaredSize(constantType);
if(declaredSizeVal != null) return declaredSizeVal;
return null;
}
/**
* Get the declared size of an array type
*
@ -559,17 +518,17 @@ public class Pass4CodeGeneration {
dataNumElements = ((ConstantInteger) arraySizeConst).getInteger().intValue();
int elementSizeBytes = elementType.getSizeBytes();
String totalSizeBytesAsm;
if(elementSizeBytes>1) {
totalSizeBytesAsm = AsmFormat.getAsmConstant(program, new ConstantBinary(new ConstantInteger((long)elementSizeBytes, SymbolType.NUMBER), Operators.MULTIPLY, arraySize), 99, scopeRef);
} else {
if(elementSizeBytes > 1) {
totalSizeBytesAsm = AsmFormat.getAsmConstant(program, new ConstantBinary(new ConstantInteger((long) elementSizeBytes, SymbolType.NUMBER), Operators.MULTIPLY, arraySize), 99, scopeRef);
} else {
totalSizeBytesAsm = AsmFormat.getAsmConstant(program, arraySize, 99, scopeRef);
}
if(elementType instanceof SymbolTypeIntegerFixed || elementType instanceof SymbolTypePointer) {
// Use an ASM type in the fill that matches the element type
dataChunk.addDataFilled(getNumericType(elementType), totalSizeBytesAsm, dataNumElements, "0", null);
} else {
} else {
// Complex fill type - calculate byte size and use that
int totalSizeBytes = elementSizeBytes*dataNumElements;
int totalSizeBytes = elementSizeBytes * dataNumElements;
dataChunk.addDataFilled(AsmDataNumeric.Type.BYTE, totalSizeBytesAsm, totalSizeBytes, "0", null);
}
} else if(value instanceof ConstantArrayKickAsm) {
@ -622,6 +581,20 @@ public class Pass4CodeGeneration {
}
}
}
} else if(value instanceof ConstantString) {
try {
ConstantLiteral literal = value.calculateLiteral(getScope());
if(literal instanceof ConstantString) {
// Ensure encoding is good
String asmConstant = AsmFormat.getAsmConstant(program, literal, 99, scopeRef);
dataChunk.addDataString(asmConstant, getEncoding(literal));
if(((ConstantString) literal).isZeroTerminated()) {
dataChunk.addDataNumeric(AsmDataNumeric.Type.BYTE, "0", null);
}
}
} catch(ConstantNotLiteral e) {
// can't calculate literal value, so it is not data - just return
}
} else if(SymbolType.BYTE.equals(valueType) || SymbolType.SBYTE.equals(valueType)) {
dataChunk.addDataNumeric(AsmDataNumeric.Type.BYTE, AsmFormat.getAsmConstant(program, value, 99, scopeRef), getEncoding(value));
} else if(SymbolType.WORD.equals(valueType) || SymbolType.SWORD.equals(valueType)) {
@ -637,6 +610,7 @@ public class Pass4CodeGeneration {
/**
* Get the numeric data type to use when outputting a value type to ASM
*
* @param valueType The value type
* @return The numeric data type
*/

View File

@ -23,10 +23,10 @@ main: {
rts
jesper_name: .text "jesper"
.byte 0
.fill 57, 0
.fill $39, 0
henriette_name: .text "henriette"
.byte 0
.fill 54, 0
.fill $36, 0
}
// print_person(byte register(X) person_id, byte[$40] zeropage(2) person_name)
print_person: {

View File

@ -473,10 +473,10 @@ main: {
rts
jesper_name: .text "jesper"
.byte 0
.fill 57, 0
.fill $39, 0
henriette_name: .text "henriette"
.byte 0
.fill 54, 0
.fill $36, 0
}
// print_person
// print_person(byte zeropage(2) person_id, byte[$40] zeropage(4) person_name)
@ -653,10 +653,10 @@ main: {
rts
jesper_name: .text "jesper"
.byte 0
.fill 57, 0
.fill $39, 0
henriette_name: .text "henriette"
.byte 0
.fill 54, 0
.fill $36, 0
}
// print_person
// print_person(byte register(X) person_id, byte[$40] zeropage(2) person_name)
@ -857,10 +857,10 @@ main: {
rts
jesper_name: .text "jesper"
.byte 0
.fill 57, 0
.fill $39, 0
henriette_name: .text "henriette"
.byte 0
.fill 54, 0
.fill $36, 0
}
// print_person
// print_person(byte register(X) person_id, byte[$40] zeropage(2) person_name)