diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 625403c88..71d1943ad 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -441,31 +441,56 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor uses; + /** The number of bytes generated by the kick-assembler code. */ + private RValue bytes; + /** The number of cycles used by the generated kick-assembler code. */ + private RValue cycles; + /** Declared clobber for the inline kick-assembler . */ + private AsmClobber declaredClobber; + public KickAsm(String kickAsmCode) { + this.kickAsmCode = kickAsmCode; + this.uses = new ArrayList<>(); + } + } + + @Override + public KickAsm visitDeclKasm(KickCParser.DeclKasmContext ctx) { + String kasmBody = ctx.KICKASM_BODY().getText(); Pattern p = Pattern.compile("\\{\\{[\\s]*(.*)[\\s]*\\}\\}", Pattern.DOTALL); - Matcher m = p.matcher(kasm); + Matcher m = p.matcher(kasmBody); if(m.find()) { String kickAsmCode = m.group(1).replaceAll("\r", ""); - StatementKickAsm statementKickAsm = new StatementKickAsm(kickAsmCode, StatementSource.kickAsm(ctx), ensureUnusedComments(getCommentsSymbol(ctx))); + KickAsm kickAsm = new KickAsm(kickAsmCode); if(ctx.asmDirectives() != null) { List asmDirectives = this.visitAsmDirectives(ctx.asmDirectives()); for(AsmDirective asmDirective : asmDirectives) { if(asmDirective instanceof AsmDirectiveBytes) { - statementKickAsm.setBytes(((AsmDirectiveBytes) asmDirective).getBytes()); + kickAsm.bytes = ((AsmDirectiveBytes) asmDirective).getBytes(); } else if(asmDirective instanceof AsmDirectiveCycles) { - statementKickAsm.setCycles(((AsmDirectiveCycles) asmDirective).getCycles()); + kickAsm.cycles = ((AsmDirectiveCycles) asmDirective).getCycles(); } else if(asmDirective instanceof AsmDirectiveUses) { - statementKickAsm.addUses(((AsmDirectiveUses) asmDirective).getUses()); + kickAsm.uses.add(((AsmDirectiveUses) asmDirective).getUses()); } else if(asmDirective instanceof AsmDirectiveClobber) { - statementKickAsm.setDeclaredClobber(((AsmDirectiveClobber) asmDirective).getClobber()); + kickAsm.declaredClobber = ((AsmDirectiveClobber) asmDirective).getClobber(); } else { - throw new CompileError("kickasm does not support directive " + asmDirective, statementKickAsm); + throw new CompileError("kickasm does not support directive " + asmDirective, StatementSource.kickAsm(ctx)); } } } - addStatement(statementKickAsm); - return statementKickAsm; + return kickAsm; } return null; } @@ -1003,27 +1028,17 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor