diff options
author | Shigeru Chiba <chibash@users.noreply.github.com> | 2024-05-03 19:01:47 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-03 19:01:47 +0900 |
commit | bb261b443831e52409eeed6e49ddfb24db2c4d08 (patch) | |
tree | 3f8189ef73984d71ad0b8fe595c0e3a2a425e6bb /src/main/javassist/compiler/CodeGen.java | |
parent | 204d67844433c9b781054154695eeb14c2291847 (diff) | |
parent | 9777bae93cc84249fe08a7e81b2101c415bd55e5 (diff) | |
download | javassist-bb261b443831e52409eeed6e49ddfb24db2c4d08.tar.gz javassist-bb261b443831e52409eeed6e49ddfb24db2c4d08.zip |
Merge pull request #484 from kuznet1/master
Line numbers support
Diffstat (limited to 'src/main/javassist/compiler/CodeGen.java')
-rw-r--r-- | src/main/javassist/compiler/CodeGen.java | 88 |
1 files changed, 44 insertions, 44 deletions
diff --git a/src/main/javassist/compiler/CodeGen.java b/src/main/javassist/compiler/CodeGen.java index e3115617..e7e274b9 100644 --- a/src/main/javassist/compiler/CodeGen.java +++ b/src/main/javassist/compiler/CodeGen.java @@ -121,8 +121,8 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { typeChecker = checker; } - protected static void fatal() throws CompileError { - throw new CompileError("fatal"); + protected static void fatal(int lineNumber) throws CompileError { + throw new CompileError("fatal", lineNumber); } public static boolean is2word(int type, int dim) { @@ -184,7 +184,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { /* Expands a simple class name to java.lang.*. * For example, this converts Object into java/lang/Object. */ - protected abstract String resolveClassName(String jvmClassName) + protected abstract String resolveClassName(String jvmClassName, int lineNumber) throws CompileError; /** @@ -267,13 +267,13 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { } @Override - public void atASTList(ASTList n) throws CompileError { fatal(); } + public void atASTList(ASTList n) throws CompileError { fatal(n.getLineNumber()); } @Override - public void atPair(Pair n) throws CompileError { fatal(); } + public void atPair(Pair n) throws CompileError { fatal(n.getLineNumber()); } @Override - public void atSymbol(Symbol n) throws CompileError { fatal(); } + public void atSymbol(Symbol n) throws CompileError { fatal(n.getLineNumber()); } @Override public void atFieldDecl(FieldDecl field) throws CompileError { @@ -325,7 +325,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { hasReturned = true; } else - throw new CompileError("no return statement"); + throw new CompileError("no return statement", s.getLineNumber()); } private boolean needsSuperCall(Stmnt body) throws CompileError { @@ -403,7 +403,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { // LABEL, SWITCH label stament might be null?. hasReturned = false; throw new CompileError( - "sorry, not supported statement: TokenId " + op); + "sorry, not supported statement: TokenId " + op, st.getLineNumber()); } } @@ -590,7 +590,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { if (op == DEFAULT) defaultPc = bytecode.currentPc(); else if (op != CASE) - fatal(); + fatal(st.getLineNumber()); else { int curPos = bytecode.currentPc(); long caseLabel; @@ -638,7 +638,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { expr = TypeChecker.stripPlusExpr(expr); if (expr instanceof IntConst) return (int)((IntConst)expr).get(); - throw new CompileError("bad case label"); + throw new CompileError("bad case label", expr.getLineNumber()); } private int computeStringLabel(ASTree expr, int tmpVar, List<Integer> gotoDefaults) @@ -658,7 +658,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { gotoDefaults.add(pc); return (int)label.hashCode(); } - throw new CompileError("bad case label"); + throw new CompileError("bad case label", expr.getLineNumber()); } private void atBreakStmnt(Stmnt st, boolean notCont) @@ -666,7 +666,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { { if (st.head() != null) throw new CompileError( - "sorry, not support labeled break or continue"); + "sorry, not support labeled break or continue", st.getLineNumber()); bytecode.addOpcode(Opcode.GOTO); Integer pc = Integer.valueOf(bytecode.currentPc()); @@ -718,7 +718,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { ASTree e = st.getLeft(); compileExpr(e); if (exprType != CLASS || arrayDim > 0) - throw new CompileError("bad throw statement"); + throw new CompileError("bad throw statement", st.getLineNumber()); bytecode.addOpcode(ATHROW); hasReturned = true; @@ -736,7 +736,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { compileExpr(st.head()); if (exprType != CLASS && arrayDim == 0) - throw new CompileError("bad type expr for synchronized block"); + throw new CompileError("bad type expr for synchronized block", st.getLineNumber()); Bytecode bc = bytecode; final int var = bc.getMaxLocals(); @@ -783,7 +783,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { if (getListSize(breakList) != nbreaks || getListSize(continueList) != ncontinues) throw new CompileError( - "sorry, cannot break/continue in synchronized block"); + "sorry, cannot break/continue in synchronized block", st.getLineNumber()); } private static int getListSize(List<Integer> list) { @@ -802,7 +802,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { @Override public void atDeclarator(Declarator d) throws CompileError { d.setLocalVar(getMaxLocals()); - d.setClassName(resolveClassName(d.getClassName())); + d.setClassName(resolveClassName(d.getClassName(), d.getLineNumber())); int size; if (is2word(d.getType(), d.getArrayDim())) @@ -863,7 +863,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { else msg = "incompatible type for " + expr.getName(); - throw new CompileError(msg); + throw new CompileError(msg, expr.getLineNumber()); } /* op is either =, %=, &=, *=, /=, +=, -=, ^=, |=, <<=, >>=, or >>>=. @@ -962,7 +962,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { int token = assignOps[op - MOD_E]; int k = lookupBinOp(token); if (k < 0) - fatal(); + fatal(right.getLineNumber()); atArithBinExpr(expr, token, k, type); } @@ -981,9 +981,9 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { if (!jvmJavaLangString.equals(cname)) badAssign(expr); - convToString(type, dim); // the value might be null. + convToString(type, dim, expr.getLineNumber()); // the value might be null. right.accept(this); - convToString(exprType, arrayDim); + convToString(exprType, arrayDim, expr.getLineNumber()); bytecode.addInvokevirtual(javaLangString, "concat", "(Ljava/lang/String;)Ljava/lang/String;"); exprType = CLASS; @@ -1025,7 +1025,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { bytecode.write16bit(pc, bytecode.currentPc() - pc + 1); expr.elseExpr().accept(this); if (dim1 != arrayDim) - throw new CompileError("type mismatch in ?:"); + throw new CompileError("type mismatch in ?:", expr.getLineNumber()); bytecode.write16bit(pc2, bytecode.currentPc() - pc2 + 1); } @@ -1072,7 +1072,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { String cname1 = className; right.accept(this); if (dim1 != arrayDim) - throw new CompileError("incompatible array types"); + throw new CompileError("incompatible array types", expr.getLineNumber()); if (token == '+' && dim1 == 0 && (type1 == CLASS || exprType == CLASS)) @@ -1139,7 +1139,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { = (type2 == CLASS && jvmJavaLangString.equals(className)); if (type2Is2) - convToString(type2, dim2); + convToString(type2, dim2, expr.getLineNumber()); if (is2word(type1, dim1)) { bytecode.addOpcode(DUP_X2); @@ -1149,11 +1149,11 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { bytecode.addOpcode(SWAP); // even if type1 is String, the left operand might be null. - convToString(type1, dim1); + convToString(type1, dim1, expr.getLineNumber()); bytecode.addOpcode(SWAP); if (!type2Is2 && !type2IsString) - convToString(type2, dim2); + convToString(type2, dim2, expr.getLineNumber()); bytecode.addInvokevirtual(javaLangString, "concat", "(Ljava/lang/String;)Ljava/lang/String;"); @@ -1162,7 +1162,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { className = jvmJavaLangString; } - private void convToString(int type, int dim) throws CompileError { + private void convToString(int type, int dim, int lineNumber) throws CompileError { final String method = "valueOf"; if (isRefType(type) || dim > 0) @@ -1184,7 +1184,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { bytecode.addInvokestatic(javaLangString, method, "(C)Ljava/lang/String;"); else if (type == VOID) - throw new CompileError("void type expression"); + throw new CompileError("void type expression", lineNumber); else /* INT, BYTE, SHORT */ bytecode.addInvokestatic(javaLangString, method, "(I)Ljava/lang/String;"); @@ -1237,7 +1237,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { else { // others expr.accept(this); if (exprType != BOOLEAN || arrayDim != 0) - throw new CompileError("boolean expr is required"); + throw new CompileError("boolean expr is required", expr.getLineNumber()); bytecode.addOpcode(branchIf ? IFNE : IFEQ); } @@ -1280,7 +1280,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { expr.oprand2().accept(this); if (dim1 != arrayDim) if (type1 != NULL && exprType != NULL) - throw new CompileError("incompatible array types"); + throw new CompileError("incompatible array types", expr.getLineNumber()); else if (exprType == NULL) arrayDim = dim1; @@ -1348,7 +1348,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { else if (p == P_LONG) bytecode.addOpcode(LCMP); // 1: >, 0: =, -1: < else - fatal(); + fatal(expr.getLineNumber()); int[] op = ifOp2; for (int i = 0; i < op.length; i += 3) @@ -1362,7 +1362,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { } protected static void badTypes(Expr expr) throws CompileError { - throw new CompileError("invalid types for " + expr.getName()); + throw new CompileError("invalid types for " + expr.getName(), expr.getLineNumber()); } private static final int P_DOUBLE = 0; @@ -1462,7 +1462,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { bytecode.addOpcode(SWAP); } else - fatal(); + fatal(expr.getLineNumber()); } else if (op != NOP) bytecode.addOpcode(op); @@ -1503,11 +1503,11 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { int srcDim = arrayDim; if (invalidDim(srcType, arrayDim, className, type, dim, name, true) || srcType == VOID || type == VOID) - throw new CompileError(msg); + throw new CompileError(msg, expr.getLineNumber()); if (type == CLASS) { if (!isRefType(srcType) && srcDim == 0) - throw new CompileError(msg); + throw new CompileError(msg, expr.getLineNumber()); return toJvmArrayName(name, dim); } @@ -1591,7 +1591,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { bytecode.addIconst(0); } else if (token == CALL) // method call - fatal(); + fatal(expr.getLineNumber()); else { expr.oprand1().accept(this); int type = typePrecedence(exprType); @@ -1633,12 +1633,12 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { // do nothing. ignore. } else - fatal(); + fatal(expr.getLineNumber()); } } protected static void badType(Expr expr) throws CompileError { - throw new CompileError("invalid type for " + expr.getName()); + throw new CompileError("invalid type for " + expr.getName(), expr.getLineNumber()); } @Override @@ -1649,14 +1649,14 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { public void atClassObject(Expr expr) throws CompileError { ASTree op1 = expr.oprand1(); if (!(op1 instanceof Symbol)) - throw new CompileError("fatal error: badly parsed .class expr"); + throw new CompileError("fatal error: badly parsed .class expr", expr.getLineNumber()); String cname = ((Symbol)op1).get(); if (cname.startsWith("[")) { int i = cname.indexOf("[L"); if (i >= 0) { String name = cname.substring(i + 2, cname.length() - 1); - String name2 = resolveClassName(name); + String name2 = resolveClassName(name, expr.getLineNumber()); if (!name.equals(name2)) { /* For example, to obtain String[].class, * "[Ljava.lang.String;" (not "[Ljava/lang/String"!) @@ -1673,7 +1673,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { } } else { - cname = resolveClassName(MemberResolver.javaToJvmName(cname)); + cname = resolveClassName(MemberResolver.javaToJvmName(cname), expr.getLineNumber()); cname = MemberResolver.jvmToJavaName(cname); } @@ -1736,13 +1736,13 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { int type = exprType; int dim = arrayDim; if (dim == 0) - throw new CompileError("bad array access"); + throw new CompileError("bad array access", array.getLineNumber()); String cname = className; index.accept(this); if (typePrecedence(exprType) != P_INT || arrayDim > 0) - throw new CompileError("bad array index"); + throw new CompileError("bad array index", array.getLineNumber()); exprType = type; arrayDim = dim - 1; @@ -1992,7 +1992,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { case SUPER : if (inStaticMethod) throw new CompileError("not-available: " - + (token == THIS ? "this" : "super")); + + (token == THIS ? "this" : "super"), k.getLineNumber()); bytecode.addAload(0); exprType = CLASS; @@ -2002,7 +2002,7 @@ public abstract class CodeGen extends Visitor implements Opcode, TokenId { className = getSuperName(); break; default : - fatal(); + fatal(k.getLineNumber()); } } |