mirror of
https://gitlab.com/camelot/kickc.git
synced 2025-02-17 10:30:43 +00:00
Moved kickasm data to data chunk.
This commit is contained in:
parent
d0a9d81abf
commit
00d6cad179
@ -84,7 +84,7 @@ public class AsmDataChunk {
|
||||
}
|
||||
}
|
||||
|
||||
/** A string data elements. */
|
||||
/** A string data element. */
|
||||
public static class AsmDataStringElement implements AsmDataElement {
|
||||
/** The string value. */
|
||||
String value;
|
||||
@ -105,6 +105,35 @@ public class AsmDataChunk {
|
||||
}
|
||||
}
|
||||
|
||||
/** A kickasm data element. */
|
||||
public static class AsmDataKickAsmElement implements AsmDataElement {
|
||||
|
||||
/** The size in bytes. */
|
||||
int byteSize;
|
||||
/** The kickasm code initializing the value. */
|
||||
String kickAsmCode;
|
||||
/** The string encoding used in the string value */
|
||||
Set<ConstantString.Encoding> encoding;
|
||||
|
||||
public AsmDataKickAsmElement(int byteSize, String kickAsmCode, Set<ConstantString.Encoding> encoding) {
|
||||
this.byteSize = byteSize;
|
||||
this.kickAsmCode = kickAsmCode;
|
||||
this.encoding = encoding;
|
||||
}
|
||||
|
||||
public int getByteSize() {
|
||||
return byteSize;
|
||||
}
|
||||
|
||||
public String getKickAsmCode() {
|
||||
return kickAsmCode;
|
||||
}
|
||||
|
||||
public Set<ConstantString.Encoding> getEncoding() {
|
||||
return encoding;
|
||||
}
|
||||
}
|
||||
|
||||
/** A sequence of data elements. */
|
||||
private List<AsmDataElement> elements;
|
||||
|
||||
@ -124,6 +153,11 @@ public class AsmDataChunk {
|
||||
elements.add(new AsmDataStringElement(string, encoding));
|
||||
}
|
||||
|
||||
public void addDataKickAsm(int byteSize, String kickAsmCode, Set<ConstantString.Encoding> encoding) {
|
||||
elements.add(new AsmDataKickAsmElement(byteSize, kickAsmCode, encoding));
|
||||
}
|
||||
|
||||
|
||||
public List<AsmDataElement> getElements() {
|
||||
return elements;
|
||||
}
|
||||
@ -139,24 +173,25 @@ public class AsmDataChunk {
|
||||
AsmDataNumeric.Type currentNumericType = null;
|
||||
List<String> currentNumericElements = null;
|
||||
for(AsmDataChunk.AsmDataElement element : this.getElements()) {
|
||||
if(element instanceof AsmDataFilledElement) {
|
||||
if(currentNumericElements!=null && currentNumericElements.size() > 0) {
|
||||
if(element instanceof AsmDataFilledElement || element instanceof AsmDataStringElement || element instanceof AsmDataKickAsmElement) {
|
||||
if(currentNumericElements != null && currentNumericElements.size() > 0) {
|
||||
asm.addDataNumeric(label, currentNumericType, currentNumericElements);
|
||||
label = null; // Only output label once
|
||||
currentNumericElements = null;
|
||||
currentNumericType = null;
|
||||
}
|
||||
}
|
||||
if(element instanceof AsmDataFilledElement) {
|
||||
AsmDataFilledElement filledElement = (AsmDataFilledElement) element;
|
||||
asm.ensureEncoding(filledElement.getEncoding());
|
||||
asm.addDataFilled(label, filledElement.getType(), filledElement.getTotalSizeBytesAsm(), filledElement.getNumElements(), filledElement.getFillValue());
|
||||
label = null; // Only output label once
|
||||
} else if(element instanceof AsmDataKickAsmElement) {
|
||||
AsmDataKickAsmElement kickAsmElement = (AsmDataKickAsmElement) element;
|
||||
asm.ensureEncoding(kickAsmElement.getEncoding());
|
||||
asm.addDataKickAsm(label, kickAsmElement.getByteSize(), kickAsmElement.getKickAsmCode());
|
||||
label = null; // Only output label once
|
||||
} else if(element instanceof AsmDataStringElement) {
|
||||
if(currentNumericElements!=null && currentNumericElements.size() > 0) {
|
||||
asm.addDataNumeric(label, currentNumericType, currentNumericElements);
|
||||
label = null; // Only output label once
|
||||
currentNumericElements = null;
|
||||
currentNumericType = null;
|
||||
}
|
||||
AsmDataStringElement stringElement = (AsmDataStringElement) element;
|
||||
asm.ensureEncoding(stringElement.getEncoding());
|
||||
asm.addDataString(label, stringElement.getValue());
|
||||
|
@ -460,21 +460,9 @@ public class Pass4CodeGeneration {
|
||||
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
|
||||
asmDataChunk.addToAsm(asmName, asm);
|
||||
} else if(constantValue instanceof ConstantArrayKickAsm) {
|
||||
ConstantArrayKickAsm kickAsm = (ConstantArrayKickAsm) constantValue;
|
||||
SymbolType type = constantVar.getType();
|
||||
// default - larger then 256
|
||||
int bytes = 1023;
|
||||
if(type instanceof SymbolTypeArray) {
|
||||
SymbolType elementType = ((SymbolTypeArray) type).getElementType();
|
||||
RValue size = ((SymbolTypeArray) type).getSize();
|
||||
if(size instanceof ConstantValue) {
|
||||
ConstantLiteral sizeLiteral = ((ConstantValue) size).calculateLiteral(getScope());
|
||||
if(sizeLiteral instanceof ConstantInteger) {
|
||||
bytes = (int) (((ConstantInteger) sizeLiteral).getInteger() * elementType.getSizeBytes());
|
||||
}
|
||||
}
|
||||
}
|
||||
asm.addDataKickAsm(AsmFormat.asmFix(asmName), bytes, kickAsm.getKickAsmCode());
|
||||
AsmDataChunk asmDataChunk = new AsmDataChunk();
|
||||
addChunkData(asmDataChunk, constantValue, constantVar.getType(), scopeRef);
|
||||
asmDataChunk.addToAsm(asmName, asm);
|
||||
} else {
|
||||
try {
|
||||
ConstantLiteral literal = constantValue.calculateLiteral(getScope());
|
||||
@ -584,6 +572,19 @@ public class Pass4CodeGeneration {
|
||||
int totalSizeBytes = elementSizeBytes*dataNumElements;
|
||||
dataChunk.addDataFilled(AsmDataNumeric.Type.BYTE, totalSizeBytesAsm, totalSizeBytes, "0", null);
|
||||
}
|
||||
} else if(value instanceof ConstantArrayKickAsm) {
|
||||
ConstantArrayKickAsm kickAsm = (ConstantArrayKickAsm) value;
|
||||
// default - larger then 256
|
||||
int bytes = 1023;
|
||||
RValue size = constTypeArray.getSize();
|
||||
if(size instanceof ConstantValue) {
|
||||
ConstantLiteral sizeLiteral = ((ConstantValue) size).calculateLiteral(getScope());
|
||||
if(sizeLiteral instanceof ConstantInteger) {
|
||||
bytes = (int) (((ConstantInteger) sizeLiteral).getInteger() * elementType.getSizeBytes());
|
||||
}
|
||||
}
|
||||
dataChunk.addDataKickAsm(bytes, kickAsm.getKickAsmCode(), getEncoding(value));
|
||||
dataNumElements = bytes;
|
||||
} else if(dataType.equals(SymbolType.STRING)) {
|
||||
try {
|
||||
ConstantLiteral literal = value.calculateLiteral(getScope());
|
||||
|
Loading…
x
Reference in New Issue
Block a user