From: <fwi...@us...> - 2008-09-03 15:24:37
|
Revision: 5287 http://jython.svn.sourceforge.net/jython/?rev=5287&view=rev Author: fwierzbicki Date: 2008-09-03 15:24:20 +0000 (Wed, 03 Sep 2008) Log Message: ----------- Small cleanup of compiler package. Mainly remove unused imports and rename local vars that shadow member vars. Modified Paths: -------------- trunk/jython/src/org/python/compiler/AdapterMaker.java trunk/jython/src/org/python/compiler/ArgListCompiler.java trunk/jython/src/org/python/compiler/ClassFile.java trunk/jython/src/org/python/compiler/Code.java trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/Constant.java trunk/jython/src/org/python/compiler/JavaMaker.java trunk/jython/src/org/python/compiler/Module.java trunk/jython/src/org/python/compiler/ProxyMaker.java trunk/jython/src/org/python/compiler/ScopeInfo.java trunk/jython/src/org/python/compiler/ScopesCompiler.java Modified: trunk/jython/src/org/python/compiler/AdapterMaker.java =================================================================== --- trunk/jython/src/org/python/compiler/AdapterMaker.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/AdapterMaker.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -4,11 +4,9 @@ import java.io.OutputStream; import java.lang.reflect.Method; -import java.util.Set; import java.util.HashSet; import org.python.objectweb.asm.Label; -import org.python.objectweb.asm.MethodVisitor; import org.python.objectweb.asm.Opcodes; @@ -41,12 +39,14 @@ return pm.myClass; } + @Override public void doConstants() throws Exception { for (String name : names) { classfile.addField(name, "Lorg/python/core/PyObject;", Opcodes.ACC_PUBLIC); } } + @Override public void addMethod(Method method, int access) throws Exception { Class<?>[] parameters = method.getParameterTypes(); Class<?> ret = method.getReturnType(); Modified: trunk/jython/src/org/python/compiler/ArgListCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/ArgListCompiler.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/ArgListCompiler.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -79,6 +79,7 @@ } } + @Override public Object visitName(Name node) throws Exception { //FIXME: do we need Store and Param, or just Param? if (node.ctx != expr_contextType.Store && node.ctx != expr_contextType.Param) { @@ -93,6 +94,7 @@ return node.id; } + @Override public Object visitTuple(Tuple node) throws Exception { StringBuffer name = new StringBuffer("("); int n = node.elts.length; Modified: trunk/jython/src/org/python/compiler/ClassFile.java =================================================================== --- trunk/jython/src/org/python/compiler/ClassFile.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/ClassFile.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -2,7 +2,6 @@ package org.python.compiler; import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -11,7 +10,6 @@ import java.util.List; import org.python.objectweb.asm.AnnotationVisitor; -import org.python.objectweb.asm.Attribute; import org.python.objectweb.asm.ClassWriter; import org.python.objectweb.asm.FieldVisitor; import org.python.objectweb.asm.MethodVisitor; Modified: trunk/jython/src/org/python/compiler/Code.java =================================================================== --- trunk/jython/src/org/python/compiler/Code.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/Code.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -211,7 +211,7 @@ } break; case 'L': - while (c[++i] != ';') {;} + while (c[++i] != ';') {} default: if (ret) stack++; else stack--; Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -69,12 +69,9 @@ import org.python.antlr.ast.TryFinally; import org.python.antlr.ast.Tuple; import org.python.antlr.ast.UnaryOp; -import org.python.antlr.ast.Unicode; import org.python.antlr.ast.While; import org.python.antlr.ast.With; import org.python.antlr.ast.Yield; -import org.python.antlr.ast.aliasType; -import org.python.antlr.ast.argumentsType; import org.python.antlr.ast.cmpopType; import org.python.antlr.ast.comprehensionType; import org.python.antlr.ast.excepthandlerType; @@ -83,10 +80,7 @@ import org.python.antlr.ast.keywordType; import org.python.antlr.ast.modType; import org.python.antlr.ast.operatorType; -import org.python.antlr.ast.sliceType; import org.python.antlr.ast.stmtType; -import org.python.antlr.ast.unaryopType; -import org.python.core.PyFrame; public class CodeCompiler extends Visitor implements Opcodes, ClassConstants //, PythonGrammarTreeConstants { @@ -288,11 +282,13 @@ } } + @Override public Object visitInteractive(Interactive node) throws Exception { traverse(node); return null; } + @Override public Object visitModule(org.python.antlr.ast.Module suite) throws Exception { @@ -315,6 +311,7 @@ return null; } + @Override public Object visitExpression(Expression node) throws Exception { if (my_scope.generator && node.body != null) { module.error("'return' with argument inside generator", @@ -389,6 +386,7 @@ return true; } + @Override public Object visitFunctionDef(FunctionDef node) throws Exception { String name = getName(node.name); @@ -788,15 +786,15 @@ loadFrame(); code.invokestatic("org/python/core/imp", "importAll", "(" + $str + $pyFrame + ")V"); } else { - String[] names = new String[node.names.length]; + String[] fromNames = new String[node.names.length]; String[] asnames = new String[node.names.length]; for (int i = 0; i < node.names.length; i++) { - names[i] = node.names[i].name; + fromNames[i] = node.names[i].name; asnames[i] = node.names[i].asname; if (asnames[i] == null) - asnames[i] = names[i]; + asnames[i] = fromNames[i]; } - makeStrings(code, names, names.length); + makeStrings(code, fromNames, fromNames.length); loadFrame(); code.invokestatic("org/python/core/imp", "importFrom", "(" + $str + $strArr + $pyFrame + ")" + $pyObjArr); @@ -1353,6 +1351,7 @@ return null; } + @Override public Object visitUnaryOp(UnaryOp node) throws Exception { visit(node.operand); String name = null; @@ -1366,6 +1365,7 @@ return null; } + @Override public Object visitAugAssign(AugAssign node) throws Exception { setline(node); @@ -1466,6 +1466,7 @@ } + @Override public Object visitCall(Call node) throws Exception { String[] keys = new String[node.keywords.length]; exprType[] values = new exprType[node.args.length + keys.length]; @@ -1582,6 +1583,7 @@ } + @Override public Object visitSubscript(Subscript node) throws Exception { if (node.slice instanceof Slice) { return Slice(node, (Slice) node.slice); @@ -1617,11 +1619,13 @@ return null; } + @Override public Object visitIndex(Index node) throws Exception { traverse(node); return null; } + @Override public Object visitExtSlice(ExtSlice node) throws Exception { code.new_("org/python/core/PyTuple"); code.dup(); @@ -1630,6 +1634,7 @@ return null; } + @Override public Object visitAttribute(Attribute node) throws Exception { expr_contextType ctx = node.ctx; @@ -1688,6 +1693,7 @@ return null; } + @Override public Object visitTuple(Tuple node) throws Exception { /* if (mode ==AUGSET) throw new ParseException( @@ -1703,6 +1709,7 @@ return null; } + @Override public Object visitList(List node) throws Exception { if (node.ctx == expr_contextType.Store) return seqSet(node.elts); if (node.ctx == expr_contextType.Del) return seqDel(node.elts); @@ -1714,6 +1721,7 @@ return null; } + @Override public Object visitListComp(ListComp node) throws Exception { code.new_("org/python/core/PyList"); @@ -1747,6 +1755,7 @@ return null; } + @Override public Object visitDict(Dict node) throws Exception { code.new_("org/python/core/PyDictionary"); @@ -1761,12 +1770,14 @@ return null; } + @Override public Object visitRepr(Repr node) throws Exception { visit(node.value); code.invokevirtual("org/python/core/PyObject", "__repr__", "()" + $pyStr); return null; } + @Override public Object visitLambda(Lambda node) throws Exception { String name = "<lambda>"; @@ -1801,11 +1812,13 @@ } + @Override public Object visitEllipsis(Ellipsis node) throws Exception { code.getstatic("org/python/core/Py", "Ellipsis", "Lorg/python/core/PyObject;"); return null; } + @Override public Object visitSlice(Slice node) throws Exception { code.new_("org/python/core/PySlice"); @@ -1817,6 +1830,7 @@ return null; } + @Override public Object visitClassDef(ClassDef node) throws Exception { setline(node); @@ -1881,6 +1895,7 @@ code.invokevirtual("org/python/core/PyFrame", "getglobal", "(" + $str + ")" + $pyObj); } + @Override public Object visitName(Name node) throws Exception { String name; if (fast_locals) @@ -1985,6 +2000,7 @@ return null; } + @Override public Object visitStr(Str node) throws Exception { PyString s = (PyString)node.s; if (s instanceof PyUnicode) { @@ -1995,6 +2011,7 @@ return null; } + @Override public Object visitGeneratorExp(GeneratorExp node) throws Exception { String bound_exp = "_(x)"; String tmp_append ="_(" + node.getLine() + "_" + node.getCharPositionInLine() + ")"; @@ -2170,6 +2187,7 @@ return null; } + @Override protected Object unhandled_node(PythonTree node) throws Exception { throw new Exception("Unhandled node " + node); } Modified: trunk/jython/src/org/python/compiler/Constant.java =================================================================== --- trunk/jython/src/org/python/compiler/Constant.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/Constant.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -4,7 +4,6 @@ import java.io.IOException; -import org.python.objectweb.asm.MethodVisitor; import org.python.objectweb.asm.Opcodes; abstract class Constant implements Opcodes{ Modified: trunk/jython/src/org/python/compiler/JavaMaker.java =================================================================== --- trunk/jython/src/org/python/compiler/JavaMaker.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/JavaMaker.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -4,7 +4,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import org.python.objectweb.asm.Opcodes; import org.python.core.PyObject; public class JavaMaker extends ProxyMaker implements ClassConstants { @@ -25,6 +24,7 @@ this.methods = methods; } + @Override public void addConstructor(String name, Class<?>[] parameters, Class<?> ret, @@ -40,6 +40,7 @@ code.visitInsn(RETURN); } + @Override public void addProxy() throws Exception { if (methods != null) super.addProxy(); @@ -58,6 +59,7 @@ } + @Override public void addMethod(Method method, int access) throws Exception { if (Modifier.isAbstract(access)) { // Maybe throw an exception here??? Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/Module.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -37,10 +37,12 @@ c.putstatic(module.classfile.name, name, $pyInteger); } + @Override public int hashCode() { return value; } + @Override public boolean equals(Object o) { if (o instanceof PyIntegerConstant) return ((PyIntegerConstant)o).value == value; @@ -68,10 +70,12 @@ c.putstatic(module.classfile.name, name, $pyFloat); } + @Override public int hashCode() { return (int)value; } + @Override public boolean equals(Object o) { if (o instanceof PyFloatConstant) return ((PyFloatConstant)o).value == value; @@ -99,10 +103,12 @@ c.putstatic(module.classfile.name, name, $pyComplex); } + @Override public int hashCode() { return (int)value; } + @Override public boolean equals(Object o) { if (o instanceof PyComplexConstant) return ((PyComplexConstant)o).value == value; @@ -130,10 +136,12 @@ c.putstatic(module.classfile.name, name, $pyStr); } + @Override public int hashCode() { return value.hashCode(); } + @Override public boolean equals(Object o) { if (o instanceof PyStringConstant) return ((PyStringConstant)o).value.equals(value); @@ -161,10 +169,12 @@ c.putstatic(module.classfile.name, name, $pyUnicode); } + @Override public int hashCode() { return value.hashCode(); } + @Override public boolean equals(Object o) { if (o instanceof PyUnicodeConstant) return ((PyUnicodeConstant)o).value.equals(value); @@ -192,10 +202,12 @@ c.putstatic(module.classfile.name, name, $pyLong); } + @Override public int hashCode() { return value.hashCode(); } + @Override public boolean equals(Object o) { if (o instanceof PyLongConstant) return ((PyLongConstant)o).value.equals(value); @@ -220,7 +232,7 @@ public int moreflags; - public PyCodeConstant() { ; + public PyCodeConstant() { } public void get(Code c) throws IOException { Modified: trunk/jython/src/org/python/compiler/ProxyMaker.java =================================================================== --- trunk/jython/src/org/python/compiler/ProxyMaker.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/ProxyMaker.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -34,17 +34,17 @@ public static Map<Class<?>, Integer> types=fillTypes(); public static Map<Class<?>, Integer> fillTypes() { - Map<Class<?>, Integer> types = new HashMap<Class<?>, Integer>(); - types.put(Boolean.TYPE, tBoolean); - types.put(Byte.TYPE, tByte); - types.put(Short.TYPE, tShort); - types.put(Integer.TYPE, tInteger); - types.put(Long.TYPE, tLong); - types.put(Float.TYPE, tFloat); - types.put(Double.TYPE, tDouble); - types.put(Character.TYPE, tCharacter); - types.put(Void.TYPE, tVoid); - return types; + Map<Class<?>, Integer> typeMap = new HashMap<Class<?>, Integer>(); + typeMap.put(Boolean.TYPE, tBoolean); + typeMap.put(Byte.TYPE, tByte); + typeMap.put(Short.TYPE, tShort); + typeMap.put(Integer.TYPE, tInteger); + typeMap.put(Long.TYPE, tLong); + typeMap.put(Float.TYPE, tFloat); + typeMap.put(Double.TYPE, tDouble); + typeMap.put(Character.TYPE, tCharacter); + typeMap.put(Void.TYPE, tVoid); + return typeMap; } public static int getType(Class<?> c) { @@ -440,14 +440,14 @@ Label callPython = new Label(); code.ifnonnull(callPython); - String superclass = mapClass(method.getDeclaringClass()); + String superClass = mapClass(method.getDeclaringClass()); - callSuper(code, name, superclass, parameters, ret, sig); + callSuper(code, name, superClass, parameters, ret, sig); code.label(callPython); code.aload(tmp); callMethod(code, name, parameters, ret, method.getExceptionTypes()); - addSuperMethod("super__"+name, name, superclass, parameters, + addSuperMethod("super__"+name, name, superClass, parameters, ret, sig, access); } else { if (!isAdapter) { @@ -512,9 +512,9 @@ if (sc != null) addMethods(sc, t); - Class<?>[] interfaces = c.getInterfaces(); - for (int j=0; j<interfaces.length; j++) { - addMethods(interfaces[j], t); + Class<?>[] ifaces = c.getInterfaces(); + for (int j=0; j<ifaces.length; j++) { + addMethods(ifaces[j], t); } } @@ -562,14 +562,14 @@ Class<?>[] parameters = method.getParameterTypes(); Class<?> ret = method.getReturnType(); String sig = makeSignature(parameters, ret); - String superclass = mapClass(method.getDeclaringClass()); + String superClass = mapClass(method.getDeclaringClass()); String superName = method.getName(); String methodName = superName; if (Modifier.isFinal(access)) { methodName = "super__" + superName; access &= ~Modifier.FINAL; } - addSuperMethod(methodName, superName, superclass, parameters, + addSuperMethod(methodName, superName, superClass, parameters, ret, sig, access); } @@ -656,8 +656,8 @@ code.aload(0); code.ldc("__supernames__"); - String[] names = supernames.toArray(new String[n]); - CodeCompiler.makeStrings(code, names, n); + String[] nameArray = supernames.toArray(new String[n]); + CodeCompiler.makeStrings(code, nameArray, n); code.invokestatic("org/python/core/Py", "java2py", "(" + $obj + ")" + $pyObj); code.invokevirtual("org/python/core/PyObject", "__setitem__", "(" + $str + $pyObj + ")V"); code.return_(); Modified: trunk/jython/src/org/python/compiler/ScopeInfo.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopeInfo.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/ScopeInfo.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -2,7 +2,9 @@ package org.python.compiler; -import java.util.*; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; import org.python.antlr.PythonTree; public class ScopeInfo extends Object implements ScopeConstants { @@ -257,6 +259,7 @@ } + @Override public String toString() { return "ScopeInfo[" + scope_name + " " + kind + "]@" + System.identityHashCode(this); Modified: trunk/jython/src/org/python/compiler/ScopesCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopesCompiler.java 2008-09-03 09:21:25 UTC (rev 5286) +++ trunk/jython/src/org/python/compiler/ScopesCompiler.java 2008-09-03 15:24:20 UTC (rev 5287) @@ -66,6 +66,7 @@ } } + @Override public Object visitInteractive(Interactive node) throws Exception { beginScope("<single-top>", TOPSCOPE, node, null); suite(node.body); @@ -73,6 +74,7 @@ return null; } + @Override public Object visitModule(org.python.antlr.ast.Module node) throws Exception { @@ -82,6 +84,7 @@ return null; } + @Override public Object visitExpression(Expression node) throws Exception { beginScope("<eval-top>", TOPSCOPE, node, null); visit(new Return(node, node.body)); @@ -93,6 +96,7 @@ cur.addBound(name); } + @Override public Object visitFunctionDef(FunctionDef node) throws Exception { def(node.name); ArgListCompiler ac = new ArgListCompiler(); @@ -117,6 +121,7 @@ return null; } + @Override public Object visitLambda(Lambda node) throws Exception { ArgListCompiler ac = new ArgListCompiler(); ac.visitArgs(node.args); @@ -144,6 +149,7 @@ visit(stmts[i]); } + @Override public Object visitImport(Import node) throws Exception { for (int i = 0; i < node.names.length; i++) { if (node.names[i].asname != null) { @@ -159,6 +165,7 @@ return null; } + @Override public Object visitImportFrom(ImportFrom node) throws Exception { Future.checkFromFuture(node); // future stmt support int n = node.names.length; @@ -176,6 +183,7 @@ return null; } + @Override public Object visitGlobal(Global node) throws Exception { int n = node.names.length; for (int i = 0; i < n; i++) { @@ -202,6 +210,7 @@ return null; } + @Override public Object visitExec(Exec node) throws Exception { cur.exec = true; if (node.globals == null && node.locals == null) { @@ -211,6 +220,7 @@ return null; } + @Override public Object visitClassDef(ClassDef node) throws Exception { def(node.name); int n = node.bases.length; @@ -223,6 +233,7 @@ return null; } + @Override public Object visitName(Name node) throws Exception { String name = node.id; if (node.ctx != expr_contextType.Load) { @@ -236,6 +247,7 @@ return null; } + @Override public Object visitListComp(ListComp node) throws Exception { String tmp ="_[" + node.getLine() + "_" + node.getCharPositionInLine() + "]"; cur.addBound(tmp); @@ -243,6 +255,7 @@ return null; } + @Override public Object visitYield(Yield node) throws Exception { cur.generator = true; cur.yield_count++; @@ -250,6 +263,7 @@ return null; } + @Override public Object visitGeneratorExp(GeneratorExp node) throws Exception { String bound_exp = "_(x)"; String tmp ="_(" + node.getLine() + "_" + node.getCharPositionInLine() + ")"; @@ -269,6 +283,7 @@ return null; } + @Override public Object visitWith(With node) throws Exception { cur.max_with_count++; traverse(node); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-17 18:15:54
|
Revision: 5454 http://jython.svn.sourceforge.net/jython/?rev=5454&view=rev Author: thobes Date: 2008-10-17 18:15:50 +0000 (Fri, 17 Oct 2008) Log Message: ----------- Modifying the generated bytecode so that yield as an expression does not empty the stack. Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/Module.java trunk/jython/src/org/python/compiler/ProxyMaker.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-17 07:06:39 UTC (rev 5453) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-17 18:15:50 UTC (rev 5454) @@ -7,19 +7,6 @@ import java.util.Stack; import java.util.Vector; -import org.python.objectweb.asm.ClassWriter; -import org.python.objectweb.asm.Label; -import org.python.objectweb.asm.Opcodes; -import org.python.objectweb.asm.Type; -import org.python.objectweb.asm.commons.Method; -import org.python.core.CompilerFlags; -import org.python.core.PyComplex; -import org.python.core.PyFloat; -import org.python.core.PyInteger; -import org.python.core.PyLong; -import org.python.core.PyObject; -import org.python.core.PyString; -import org.python.core.PyUnicode; import org.python.antlr.ParseException; import org.python.antlr.PythonTree; import org.python.antlr.Visitor; @@ -81,6 +68,19 @@ import org.python.antlr.ast.modType; import org.python.antlr.ast.operatorType; import org.python.antlr.ast.stmtType; +import org.python.core.CompilerFlags; +import org.python.core.PyComplex; +import org.python.core.PyFloat; +import org.python.core.PyInteger; +import org.python.core.PyLong; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyUnicode; +import org.python.objectweb.asm.ClassWriter; +import org.python.objectweb.asm.Label; +import org.python.objectweb.asm.Opcodes; +import org.python.objectweb.asm.Type; +import org.python.objectweb.asm.commons.Method; public class CodeCompiler extends Visitor implements Opcodes, ClassConstants //, PythonGrammarTreeConstants { @@ -131,7 +131,8 @@ public int bcfLevel = 0; int yield_count = 0; - int with_count = 0; + + private int stackDepth = 0; public CodeCompiler(Module module, boolean print_results) { this.module = module; @@ -199,18 +200,18 @@ private void saveAugTmps(PythonTree node, int count) throws Exception { if (count >= 4) { - augtmp4 = code.getLocal("org/python/core/PyObject"); + augtmp4 = code.getLocal("Lorg/python/core/PyObject;"); code.astore(augtmp4); } if (count >= 3) { - augtmp3 = code.getLocal("org/python/core/PyObject"); + augtmp3 = code.getLocal("Lorg/python/core/PyObject;"); code.astore(augtmp3); } if (count >= 2) { - augtmp2 = code.getLocal("org/python/core/PyObject"); + augtmp2 = code.getLocal("Lorg/python/core/PyObject;"); code.astore(augtmp2); } - augtmp1 = code.getLocal("org/python/core/PyObject"); + augtmp1 = code.getLocal("Lorg/python/core/PyObject;"); code.astore(augtmp1); code.aload(augtmp1); @@ -320,7 +321,7 @@ return visitReturn(new Return(node, node.body), true); } - public void makeArray(PythonTree[] nodes) throws Exception { + public int makeArray(PythonTree[] nodes) throws Exception { int n; if (nodes == null) @@ -328,25 +329,25 @@ else n = nodes.length; + int array = code.getLocal("[Lorg/python/core/PyObject;"); if (n == 0) { code.getstatic("org/python/core/Py", "EmptyObjects", $pyObjArr); + code.astore(array); } else { - int tmp = code.getLocal("[Lorg/python/core/PyObject;"); code.iconst(n); code.anewarray("org/python/core/PyObject"); - code.astore(tmp); + code.astore(array); for(int i=0; i<n; i++) { visit(nodes[i]); - code.aload(tmp); + code.aload(array); code.swap(); code.iconst(i); code.swap(); code.aastore(); } - code.aload(tmp); - code.freeLocal(tmp); } + return array; } public void getDocString(stmtType[] suite) throws Exception { @@ -364,7 +365,7 @@ int n = scope.freevars.size(); if (n == 0) return false; - int tmp = code.getLocal("[org/python/core/PyObject"); + int tmp = code.getLocal("[Lorg/python/core/PyObject;"); code.iconst(n); code.anewarray("org/python/core/PyObject"); code.astore(tmp); @@ -394,15 +395,17 @@ setline(node); + ScopeInfo scope = module.getScopeInfo(node); + + int defaults = makeArray(scope.ac.getDefaults()); + code.new_("org/python/core/PyFunction"); code.dup(); loadFrame(); code.getfield("org/python/core/PyFrame", "f_globals", $pyObj); + code.aload(defaults); + code.freeLocal(defaults); - ScopeInfo scope = module.getScopeInfo(node); - - makeArray(scope.ac.getDefaults()); - scope.setup_closure(); scope.dump(); module.PyCode(new Suite(node, node.body), name, true, @@ -570,6 +573,7 @@ getNone(); } setLastI(++yield_count); + int stackState = saveStack(); saveLocals(); code.areturn(); @@ -577,6 +581,7 @@ yields.addElement(restart); code.label(restart); restoreLocals(); + restoreStack(stackState); loadFrame(); code.invokevirtual("org/python/core/PyFrame", "getGeneratorInput", "()" + $obj); @@ -591,7 +596,54 @@ return null; } + + private void stackProduce() { + stackDepth++; + } + + private void stackConsume() { + stackDepth--; + } + + private void stackConsume(int numItems) { + stackDepth -= numItems; + } + private int saveStack() throws Exception { + if (stackDepth > 0) { + int array = code.getLocal("[Lorg/python/core/PyObject;"); + code.iconst(stackDepth); + code.anewarray("org/python/core/PyObject"); + code.astore(array); + for (int i = 0; i < stackDepth; i++) { + code.aload(array); + // Stack: |- ... value array + code.swap(); + code.iconst(i); + code.swap(); + // Stack: |- ... array index value + code.aastore(); + // Stack: |- ... + } + return array; + } else { + return -1; + } + } + + private void restoreStack(int array) throws Exception { + if (stackDepth > 0) { + for (int i = stackDepth - 1; i >= 0; i--) { + code.aload(array); + // Stack: |- ... array + code.iconst(i); + code.aaload(); + // Stack: |- ... value + } + code.freeLocal(array); + } + } + private boolean inFinallyBody() { for (int i = 0; i < exceptionHandlers.size(); ++i) { ExceptionHandler handler = @@ -605,13 +657,13 @@ private void restoreLocals() throws Exception { endExceptionHandlers(); - + Vector v = code.getActiveLocals(); loadFrame(); code.getfield("org/python/core/PyFrame", "f_savedlocals", "[Ljava/lang/Object;"); - int locals = code.getLocal("[java/lang/Object"); + int locals = code.getLocal("[Ljava/lang/Object;"); code.astore(locals); for (int i = 0; i < v.size(); i++) { @@ -662,7 +714,7 @@ Vector v = code.getActiveLocals(); code.iconst(v.size()); code.anewarray("java/lang/Object"); - int locals = code.getLocal("[java/lang/Object"); + int locals = code.getLocal("[Ljava/lang/Object;"); code.astore(locals); for (int i = 0; i < v.size(); i++) { @@ -721,14 +773,19 @@ @Override public Object visitRaise(Raise node) throws Exception { setline(node); - traverse(node); + if (node.type != null) { visit(node.type); stackProduce(); } + if (node.inst != null) { visit(node.inst); stackProduce(); } + if (node.tback != null) { visit(node.tback); stackProduce(); } if (node.type == null) { code.invokestatic("org/python/core/Py", "makeException", "()" + $pyExc); } else if (node.inst == null) { + stackConsume(); code.invokestatic("org/python/core/Py", "makeException", "(" + $pyObj + ")" + $pyExc); } else if (node.tback == null) { + stackConsume(2); code.invokestatic("org/python/core/Py", "makeException", "(" + $pyObj + $pyObj + ")" + $pyExc); } else { + stackConsume(3); code.invokestatic("org/python/core/Py", "makeException", "(" + $pyObj + $pyObj + $pyObj + ")" + $pyExc); } code.athrow(); @@ -799,7 +856,9 @@ if (asnames[i] == null) asnames[i] = fromNames[i]; } - makeStrings(code, fromNames, fromNames.length); + int strArray = makeStrings(code, fromNames, fromNames.length); + code.aload(strArray); + code.freeLocal(strArray); loadFrame(); @@ -834,20 +893,24 @@ public Object visitExec(Exec node) throws Exception { setline(node); visit(node.body); + stackProduce(); if (node.globals != null) { visit(node.globals); } else { code.aconst_null(); } + stackProduce(); if (node.locals != null) { visit(node.locals); } else { code.aconst_null(); } + stackProduce(); //do the real work here + stackConsume(3); code.invokestatic("org/python/core/Py", "exec", "(" + $pyObj + $pyObj + $pyObj + ")V"); return null; } @@ -873,9 +936,6 @@ /* If evaluation is false, then branch to end of method */ code.ifne(end_of_assert); - - /* Push exception type onto stack(Py.AssertionError) */ - code.getstatic("org/python/core/Py", "AssertionError", "Lorg/python/core/PyObject;"); /* Visit the message part of the assertion, or pass Py.None */ if( node.msg != null ) { @@ -883,6 +943,12 @@ } else { getNone(); } + + /* Push exception type onto stack(Py.AssertionError) */ + code.getstatic("org/python/core/Py", "AssertionError", "Lorg/python/core/PyObject;"); + + code.swap(); // The type is the first argument, but the message could be a yield + code.invokestatic("org/python/core/Py", "makeException", "(" + $pyObj + $pyObj + ")" + $pyExc); /* Raise assertion error. Only executes this logic if assertion @@ -1290,35 +1356,39 @@ @Override public Object visitCompare(Compare node) throws Exception { - int tmp1 = code.getLocal("org/python/core/PyObject"); - int tmp2 = code.getLocal("org/python/core/PyObject"); + int last = code.getLocal("org/python/core/PyObject"); + int result = code.getLocal("org/python/core/PyObject"); Label end = new Label(); visit(node.left); + code.astore(last); int n = node.ops.length; for(int i = 0; i < n - 1; i++) { visit(node.comparators[i]); + code.aload(last); + code.swap(); code.dup(); - code.astore(tmp1); + code.astore(last); visitCmpop(node.ops[i]); code.dup(); - code.astore(tmp2); + code.astore(result); code.invokevirtual("org/python/core/PyObject", "__nonzero__", "()Z"); code.ifeq(end); - code.aload(tmp1); } visit(node.comparators[n-1]); + code.aload(last); + code.swap(); visitCmpop(node.ops[n-1]); if (n > 1) { - code.astore(tmp2); + code.astore(result); code.label(end); - code.aload(tmp2); + code.aload(result); } - code.freeLocal(tmp1); - code.freeLocal(tmp2); + code.freeLocal(last); + code.freeLocal(result); return null; } @@ -1342,7 +1412,9 @@ @Override public Object visitBinOp(BinOp node) throws Exception { visit(node.left); + stackProduce(); visit(node.right); + stackConsume(); String name = null; switch (node.op) { case Add: name = "_add"; break; @@ -1384,13 +1456,14 @@ public Object visitAugAssign(AugAssign node) throws Exception { setline(node); - visit(node.value); - int tmp = storeTop(); - augmode = expr_contextType.Load; visit(node.target); + int target = storeTop(); - code.aload(tmp); + visit(node.value); + + code.aload(target); + code.swap(); String name = null; switch (node.op) { case Add: name = "_iadd"; break; @@ -1410,7 +1483,7 @@ name = "_itruediv"; } code.invokevirtual("org/python/core/PyObject", name, "(" + $pyObj + ")" + $pyObj); - code.freeLocal(tmp); + code.freeLocal(target); temporary = storeTop(); augmode = expr_contextType.Store; @@ -1421,12 +1494,12 @@ } - public static void makeStrings(Code c, String[] names, int n) + public static int makeStrings(Code c, String[] names, int n) throws IOException { c.iconst(n); c.anewarray("java/lang/String"); - int strings = c.getLocal("[java/lang/String"); + int strings = c.getLocal("[Ljava/lang/String;"); c.astore(strings); for (int i=0; i<n; i++) { c.aload(strings); @@ -1434,46 +1507,53 @@ c.ldc(names[i]); c.aastore(); } - c.aload(strings); - c.freeLocal(strings); + return strings; } public Object invokeNoKeywords(Attribute node, PythonTree[] values) throws Exception { String name = getName(node.attr); - visit(node.value); + visit(node.value); stackProduce(); code.ldc(name); code.invokevirtual("org/python/core/PyObject", "__getattr__", "(" + $str + ")" + $pyObj); switch (values.length) { case 0: + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "()" + $pyObj); break; case 1: visit(values[0]); + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + ")" + $pyObj); break; case 2: - visit(values[0]); + visit(values[0]); stackProduce(); visit(values[1]); + stackConsume(2); // target + arguments code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + $pyObj + ")" + $pyObj); break; case 3: - visit(values[0]); - visit(values[1]); + visit(values[0]); stackProduce(); + visit(values[1]); stackProduce(); visit(values[2]); + stackConsume(3); // target + arguments code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + $pyObj + $pyObj + ")" + $pyObj); break; case 4: - visit(values[0]); - visit(values[1]); - visit(values[2]); + visit(values[0]); stackProduce(); + visit(values[1]); stackProduce(); + visit(values[2]); stackProduce(); visit(values[3]); + stackConsume(4); // target + arguments code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + $pyObj + $pyObj + $pyObj + ")" + $pyObj); break; default: - makeArray(values); + int argArray = makeArray(values); + code.aload(argArray); + code.freeLocal(argArray); + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObjArr + ")" + $pyObj); break; } @@ -1499,54 +1579,76 @@ return invokeNoKeywords((Attribute) node.func, values); } - visit(node.func); + visit(node.func); stackProduce(); if (node.starargs != null || node.kwargs != null) { - makeArray(values); - makeStrings(code, keys, keys.length); + int argArray = makeArray(values); + int strArray = makeStrings(code, keys, keys.length); if (node.starargs == null) code.aconst_null(); else visit(node.starargs); + stackProduce(); if (node.kwargs == null) code.aconst_null(); else visit(node.kwargs); + stackProduce(); + + code.aload(argArray); + code.aload(strArray); + code.dup2_x2(); + code.pop2(); + + stackConsume(3); // target + starargs + kwargs code.invokevirtual("org/python/core/PyObject", "_callextra", "(" + $pyObjArr + $strArr + $pyObj + $pyObj + ")" + $pyObj); } else if (keys.length > 0) { - makeArray(values); - makeStrings(code, keys, keys.length); + int argArray = makeArray(values); + int strArray = makeStrings(code, keys, keys.length); + code.aload(argArray); + code.aload(strArray); + code.freeLocal(argArray); + code.freeLocal(strArray); + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObjArr + $strArr + ")" + $pyObj); } else { switch (values.length) { case 0: + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "()" + $pyObj); break; case 1: visit(values[0]); + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + ")" + $pyObj); break; case 2: - visit(values[0]); + visit(values[0]); stackProduce(); visit(values[1]); + stackConsume(2); // target + arguments code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + $pyObj + ")" + $pyObj); break; case 3: - visit(values[0]); - visit(values[1]); + visit(values[0]); stackProduce(); + visit(values[1]); stackProduce(); visit(values[2]); + stackConsume(3); // target + arguments code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + $pyObj + $pyObj + ")" + $pyObj); break; case 4: - visit(values[0]); - visit(values[1]); - visit(values[2]); + visit(values[0]); stackProduce(); + visit(values[1]); stackProduce(); + visit(values[2]); stackProduce(); visit(values[3]); + stackConsume(4); // target + arguments code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + $pyObj + $pyObj + $pyObj + ")" + $pyObj); break; default: - makeArray(values); + int argArray = makeArray(values); + code.aload(argArray); + code.freeLocal(argArray); + stackConsume(); // target code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObjArr + ")" + $pyObj); break; } @@ -1562,18 +1664,22 @@ ctx = expr_contextType.Store; } else { visit(node.value); + stackProduce(); if (slice.lower != null) visit(slice.lower); else code.aconst_null(); + stackProduce(); if (slice.upper != null) visit(slice.upper); else code.aconst_null(); + stackProduce(); if (slice.step != null) visit(slice.step); else code.aconst_null(); + stackProduce(); if (node.ctx == expr_contextType.AugStore && augmode == expr_contextType.Load) { saveAugTmps(node, 4); @@ -1581,6 +1687,7 @@ } } + stackConsume(4); switch (ctx) { case Del: code.invokevirtual("org/python/core/PyObject", "__delslice__", "(" + $pyObj + $pyObj + $pyObj + ")V"); @@ -1610,7 +1717,7 @@ restoreAugTmps(node, 2); ctx = expr_contextType.Store; } else { - visit(node.value); + visit(node.value); stackProduce(); visit(node.slice); if (node.ctx == expr_contextType.AugStore && augmode == expr_contextType.Load) { @@ -1619,6 +1726,7 @@ } } + stackConsume(); switch (ctx) { case Del: code.invokevirtual("org/python/core/PyObject", "__delitem__", "(" + $pyObj + ")V"); @@ -1643,9 +1751,11 @@ @Override public Object visitExtSlice(ExtSlice node) throws Exception { + int dims = makeArray(node.dims); code.new_("org/python/core/PyTuple"); code.dup(); - makeArray(node.dims); + code.aload(dims); + code.freeLocal(dims); code.invokespecial("org/python/core/PyTuple", "<init>", "(" + $pyObjArr + ")V"); return null; } @@ -1716,11 +1826,14 @@ "augmented assign to tuple not possible", node); */ if (node.ctx == expr_contextType.Store) return seqSet(node.elts); if (node.ctx == expr_contextType.Del) return seqDel(node.elts); + + int content = makeArray(node.elts); code.new_("org/python/core/PyTuple"); code.dup(); - makeArray(node.elts); + code.aload(content); + code.freeLocal(content); code.invokespecial("org/python/core/PyTuple", "<init>", "(" + $pyObjArr + ")V"); return null; } @@ -1729,10 +1842,13 @@ public Object visitList(List node) throws Exception { if (node.ctx == expr_contextType.Store) return seqSet(node.elts); if (node.ctx == expr_contextType.Del) return seqDel(node.elts); + + int content = makeArray(node.elts); code.new_("org/python/core/PyList"); code.dup(); - makeArray(node.elts); + code.aload(content); + code.freeLocal(content); code.invokespecial("org/python/core/PyList", "<init>", "(" + $pyObjArr + ")V"); return null; } @@ -1773,15 +1889,17 @@ @Override public Object visitDict(Dict node) throws Exception { - code.new_("org/python/core/PyDictionary"); - - code.dup(); PythonTree[] elts = new PythonTree[node.keys.length * 2]; for (int i = 0; i < node.keys.length; i++) { elts[i * 2] = node.keys[i]; elts[i * 2 + 1] = node.values[i]; } - makeArray(elts); + int content = makeArray(elts); + + code.new_("org/python/core/PyDictionary"); + code.dup(); + code.aload(content); + code.freeLocal(content); code.invokespecial("org/python/core/PyDictionary", "<init>", "(" + $pyObjArr + ")V"); return null; } @@ -1805,12 +1923,13 @@ ScopeInfo scope = module.getScopeInfo(node); - makeArray(scope.ac.getDefaults()); + int defaultsArray = makeArray(scope.ac.getDefaults()); code.new_("org/python/core/PyFunction"); - code.dup_x1(); - code.swap(); + code.dup(); + code.aload(defaultsArray); + code.freeLocal(defaultsArray); loadFrame(); code.getfield("org/python/core/PyFrame", "f_globals", $pyObj); @@ -1840,12 +1959,20 @@ @Override public Object visitSlice(Slice node) throws Exception { + if (node.lower == null) getNone(); else visit(node.lower); stackProduce(); + if (node.upper == null) getNone(); else visit(node.upper); stackProduce(); + if (node.step == null) getNone(); else visit(node.step); + int step = storeTop(); + stackConsume(2); + code.new_("org/python/core/PySlice"); - code.dup(); - if (node.lower == null) getNone(); else visit(node.lower); - if (node.upper == null) getNone(); else visit(node.upper); - if (node.step == null) getNone(); else visit(node.step); + code.dup2_x2(); + code.pop2(); + + code.aload(step); + code.freeLocal(step); + code.invokespecial("org/python/core/PySlice", "<init>", "(" + $pyObj + $pyObj + $pyObj + ")V"); return null; } @@ -1854,12 +1981,15 @@ public Object visitClassDef(ClassDef node) throws Exception { setline(node); + int baseArray = makeArray(node.bases); + //Get class name String name = getName(node.name); code.ldc(name); + + code.aload(baseArray); + code.freeLocal(baseArray); - makeArray(node.bases); - ScopeInfo scope = module.getScopeInfo(node); scope.setup_closure(); @@ -2045,7 +2175,9 @@ ScopeInfo scope = module.getScopeInfo(node); - makeArray(new exprType[0]); + int emptyArray = makeArray(new exprType[0]); + code.aload(emptyArray); + code.freeLocal(emptyArray); scope.setup_closure(); scope.dump(); @@ -2079,8 +2211,9 @@ set(new Name(node, tmp_append, expr_contextType.Store)); + visit(iter); visit(new Name(node, tmp_append, expr_contextType.Load)); - visit(iter); + code.swap(); code.invokevirtual("org/python/core/PyObject", "__iter__", "()Lorg/python/core/PyObject;"); code.invokevirtual("org/python/core/PyObject", "__call__", "(" + $pyObj + ")" + $pyObj); @@ -2095,9 +2228,6 @@ throw new ParseException("'with' will become a reserved keyword in Python 2.6", node); } - int my_with_count = with_count; - with_count++; - Label label_body_start = new Label(); Label label_body_end = new Label(); Label label_catch = new Label(); @@ -2110,21 +2240,14 @@ // mgr = (EXPR) visit(node.context_expr); - int mgr_tmp = code.getLocal("org/python/core/PyObject"); - code.astore(mgr_tmp); - - // exit = mgr.__exit__ # Not calling it yet, so storing in the frame - loadFrame(); - code.getfield("org/python/core/PyFrame", "f_exits", $pyObjArr); - code.iconst(my_with_count); - code.aload(mgr_tmp); + code.dup(); + code.ldc("__exit__"); code.invokevirtual(Type.getType(PyObject.class).getInternalName(), getattr.getName(), getattr.getDescriptor()); - code.aastore(); + int __exit__ = code.getLocal("org/python/core/PyObject"); + code.astore(__exit__); // value = mgr.__enter__() - code.aload(mgr_tmp); - code.freeLocal(mgr_tmp); code.ldc("__enter__"); code.invokevirtual(Type.getType(PyObject.class).getInternalName(), getattr.getName(), getattr.getDescriptor()); code.invokevirtual(Type.getType(PyObject.class).getInternalName(), call.getName(), call.getDescriptor()); @@ -2166,10 +2289,7 @@ // # The exceptional case is handled here // exc = False # implicit // if not exit(*sys.exc_info()): - loadFrame(); - code.getfield("org/python/core/PyFrame", "f_exits", $pyObjArr); - code.iconst(my_with_count); - code.aaload(); + code.aload(__exit__); code.aload(ts_tmp); code.getfield("org/python/core/PyException", "type", $pyObj); code.aload(ts_tmp); @@ -2198,10 +2318,7 @@ code.label(label_finally); - loadFrame(); - code.getfield("org/python/core/PyFrame", "f_exits", $pyObjArr); - code.iconst(my_with_count); - code.aaload(); + code.aload(__exit__); getNone(); code.dup(); code.dup(); @@ -2209,7 +2326,7 @@ code.pop(); code.label(label_end); - with_count--; + code.freeLocal(__exit__); return null; } Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2008-10-17 07:06:39 UTC (rev 5453) +++ trunk/jython/src/org/python/compiler/Module.java 2008-10-17 18:15:50 UTC (rev 5454) @@ -244,11 +244,14 @@ c.iconst(argcount); //Make all names + int nameArray; if (names != null) { - CodeCompiler.makeStrings(c, names, names.length); + nameArray = CodeCompiler.makeStrings(c, names, names.length); } else { // classdef - CodeCompiler.makeStrings(c, null, 0); + nameArray = CodeCompiler.makeStrings(c, null, 0); } + c.aload(nameArray); + c.freeLocal(nameArray); c.aload(1); c.ldc(co_name); c.iconst(co_firstlineno); @@ -260,13 +263,17 @@ c.iconst(id); - if (cellvars != null) - CodeCompiler.makeStrings(c, cellvars, cellvars.length); - else + if (cellvars != null) { + int strArray = CodeCompiler.makeStrings(c, cellvars, cellvars.length); + c.aload(strArray); + c.freeLocal(strArray); + } else c.aconst_null(); - if (freevars != null) - CodeCompiler.makeStrings(c, freevars, freevars.length); - else + if (freevars != null) { + int strArray = CodeCompiler.makeStrings(c, freevars, freevars.length); + c.aload(strArray); + c.freeLocal(strArray); + } else c.aconst_null(); c.iconst(jy_npurecell); Modified: trunk/jython/src/org/python/compiler/ProxyMaker.java =================================================================== --- trunk/jython/src/org/python/compiler/ProxyMaker.java 2008-10-17 07:06:39 UTC (rev 5453) +++ trunk/jython/src/org/python/compiler/ProxyMaker.java 2008-10-17 18:15:50 UTC (rev 5454) @@ -657,7 +657,9 @@ code.ldc("__supernames__"); String[] nameArray = supernames.toArray(new String[n]); - CodeCompiler.makeStrings(code, nameArray, n); + int strArray = CodeCompiler.makeStrings(code, nameArray, n); + code.aload(strArray); + code.freeLocal(strArray); code.invokestatic("org/python/core/Py", "java2py", "(" + $obj + ")" + $pyObj); code.invokevirtual("org/python/core/PyObject", "__setitem__", "(" + $str + $pyObj + ")V"); code.return_(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-17 20:46:49
|
Revision: 5456 http://jython.svn.sourceforge.net/jython/?rev=5456&view=rev Author: thobes Date: 2008-10-17 20:46:47 +0000 (Fri, 17 Oct 2008) Log Message: ----------- Improved the scope analysis for generator expressions. Also fixed a bug in my recent commit where the fix for yield as an expression accidentially reordered the value to be yielded on the stack. Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/ScopesCompiler.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-17 19:28:20 UTC (rev 5455) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-17 20:46:47 UTC (rev 5456) @@ -555,13 +555,16 @@ throw new ParseException("'yield' outside function", node); } + int stackState = saveStack(); + if (node.value != null) { visit(node.value); } else { getNone(); } + setLastI(++yield_count); - int stackState = saveStack(); + saveLocals(); code.areturn(); Modified: trunk/jython/src/org/python/compiler/ScopesCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopesCompiler.java 2008-10-17 19:28:20 UTC (rev 5455) +++ trunk/jython/src/org/python/compiler/ScopesCompiler.java 2008-10-17 20:46:47 UTC (rev 5456) @@ -271,9 +271,9 @@ @Override public Object visitGeneratorExp(GeneratorExp node) throws Exception { // The first iterator is evaluated in the outer scope - /*if (node.generators != null && node.generators.length > 0) { + if (node.generators != null && node.generators.length > 0) { visit(node.generators[0].iter); - }*/ + } String bound_exp = "_(x)"; String tmp = "_(" + node.getLine() + "_" + node.getCharPositionInLine() + ")"; @@ -289,7 +289,7 @@ cur.generator = true; cur.yield_count++; // The reset of the iterators are evaluated in the inner scope - /*if (node.elt != null) { + if (node.elt != null) { visit(node.elt); } if (node.generators != null) { @@ -310,9 +310,6 @@ } } } - /*/ - traverse(node); - //*/ endScope(); return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-17 21:21:41
|
Revision: 5457 http://jython.svn.sourceforge.net/jython/?rev=5457&view=rev Author: thobes Date: 2008-10-17 21:21:36 +0000 (Fri, 17 Oct 2008) Log Message: ----------- Added a check for return and yield in the same scope in ScopesCompiler, There are cases that can be missed in CodeCompiler due to dead code elimination, this gets around that. Modified Paths: -------------- trunk/jython/src/org/python/compiler/ScopeInfo.java trunk/jython/src/org/python/compiler/ScopesCompiler.java Modified: trunk/jython/src/org/python/compiler/ScopeInfo.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopeInfo.java 2008-10-17 20:46:47 UTC (rev 5456) +++ trunk/jython/src/org/python/compiler/ScopeInfo.java 2008-10-17 21:21:36 UTC (rev 5457) @@ -5,7 +5,11 @@ import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; + +import org.python.antlr.ParseException; import org.python.antlr.PythonTree; +import org.python.antlr.ast.Return; +import org.python.antlr.ast.exprType; public class ScopeInfo extends Object implements ScopeConstants { @@ -56,6 +60,7 @@ public boolean from_import_star; public boolean contains_ns_free_vars; public boolean generator; + private boolean hasReturnWithValue; public int yield_count; public int max_with_count; @@ -264,4 +269,20 @@ return "ScopeInfo[" + scope_name + " " + kind + "]@" + System.identityHashCode(this); } + + public void defineAsGenerator(exprType node) { + generator = true; + if (hasReturnWithValue) { + throw new ParseException("'return' with argument " + + "inside generator", node); + } + } + + public void noteReturnValue(Return node) { + if (generator) { + throw new ParseException("'return' with argument " + + "inside generator", node); + } + hasReturnWithValue = true; + } } Modified: trunk/jython/src/org/python/compiler/ScopesCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopesCompiler.java 2008-10-17 20:46:47 UTC (rev 5456) +++ trunk/jython/src/org/python/compiler/ScopesCompiler.java 2008-10-17 21:21:36 UTC (rev 5457) @@ -4,6 +4,7 @@ import org.python.antlr.*; import org.python.antlr.ast.*; + import java.util.*; public class ScopesCompiler extends Visitor implements ScopeConstants { @@ -262,11 +263,20 @@ @Override public Object visitYield(Yield node) throws Exception { - cur.generator = true; + cur.defineAsGenerator(node); cur.yield_count++; traverse(node); return null; } + + @Override + public Object visitReturn(Return node) throws Exception { + if (node.value != null) { + cur.noteReturnValue(node); + } + traverse(node); + return null; + } @Override public Object visitGeneratorExp(GeneratorExp node) throws Exception { @@ -286,7 +296,7 @@ cur.addParam(bound_exp); cur.markFromParam(); - cur.generator = true; + cur.defineAsGenerator(node); cur.yield_count++; // The reset of the iterators are evaluated in the inner scope if (node.elt != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pj...@us...> - 2008-10-18 01:58:37
|
Revision: 5460 http://jython.svn.sourceforge.net/jython/?rev=5460&view=rev Author: pjenvey Date: 2008-10-18 01:58:29 +0000 (Sat, 18 Oct 2008) Log Message: ----------- store the symbol name info in a LinkedHashMap to maintain the order they're encountered in. fixes test_code technically this should bump the bytecode magic but it's not that important Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/Module.java trunk/jython/src/org/python/compiler/ScopeInfo.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-17 23:56:07 UTC (rev 5459) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2008-10-18 01:58:29 UTC (rev 5460) @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.Hashtable; +import java.util.Map; import java.util.Stack; import java.util.Vector; @@ -109,7 +110,7 @@ public boolean fast_locals, print_results; - public Hashtable tbl; + public Map<String, SymInfo> tbl; public ScopeInfo my_scope; boolean optimizeGlobals = true; @@ -369,7 +370,7 @@ code.iconst(n); code.anewarray("org/python/core/PyObject"); code.astore(tmp); - Hashtable upTbl = scope.up.tbl; + Map<String, SymInfo> upTbl = scope.up.tbl; for(int i=0; i<n; i++) { code.aload(tmp); code.iconst(i); @@ -377,7 +378,7 @@ for(int j = 1; j < scope.distance; j++) { loadf_back(); } - SymInfo symInfo = (SymInfo)upTbl.get(scope.freevars.elementAt(i)); + SymInfo symInfo = upTbl.get(scope.freevars.elementAt(i)); code.iconst(symInfo.env_index); code.invokevirtual("org/python/core/PyFrame", "getclosure", "(I)" + $pyObj); code.aastore(); @@ -2044,7 +2045,7 @@ else name = getName(node.id); - SymInfo syminf = (SymInfo)tbl.get(name); + SymInfo syminf = tbl.get(name); expr_contextType ctx = node.ctx; if (ctx == expr_contextType.AugStore) { Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2008-10-17 23:56:07 UTC (rev 5459) +++ trunk/jython/src/org/python/compiler/Module.java 2008-10-18 01:58:29 UTC (rev 5460) @@ -6,6 +6,7 @@ import java.io.OutputStream; import java.util.Enumeration; import java.util.Hashtable; +import java.util.Map; import java.util.Vector; import org.python.objectweb.asm.Label; @@ -460,11 +461,11 @@ } int nparamcell = scope.jy_paramcells.size(); if(nparamcell > 0) { - Hashtable tbl = scope.tbl; + Map<String, SymInfo> tbl = scope.tbl; Vector paramcells = scope.jy_paramcells; for(int i = 0; i < nparamcell; i++) { c.aload(1); - SymInfo syminf = (SymInfo)tbl.get(paramcells.elementAt(i)); + SymInfo syminf = tbl.get(paramcells.elementAt(i)); c.iconst(syminf.locals_index); c.iconst(syminf.env_index); c.invokevirtual("org/python/core/PyFrame", "to_cell", "(II)V"); Modified: trunk/jython/src/org/python/compiler/ScopeInfo.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopeInfo.java 2008-10-17 23:56:07 UTC (rev 5459) +++ trunk/jython/src/org/python/compiler/ScopeInfo.java 2008-10-18 01:58:29 UTC (rev 5460) @@ -3,6 +3,8 @@ package org.python.compiler; import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Hashtable; import java.util.Vector; @@ -24,9 +26,9 @@ for(int i=0; i<level; i++) System.err.print(' '); System.err.print(((kind != CLASSSCOPE)?scope_name:"class "+ scope_name)+": "); - for (Enumeration e = tbl.keys(); e.hasMoreElements(); ) { - String name = (String)e.nextElement(); - SymInfo info = (SymInfo)tbl.get(name); + for (Map.Entry<String, SymInfo> entry : tbl.entrySet()) { + String name = entry.getKey(); + SymInfo info = entry.getValue(); int flags = info.flags; System.err.print(name); if ((flags&BOUND) != 0) System.err.print('='); @@ -66,13 +68,13 @@ public ArgListCompiler ac; - public Hashtable tbl = new Hashtable(); + public Map<String, SymInfo> tbl = new LinkedHashMap<String, SymInfo>(); public Vector names = new Vector(); public int addGlobal(String name) { // global kind = func vs. class int global = kind==CLASSSCOPE?CLASS_GLOBAL:NGLOBAL; - SymInfo info = (SymInfo)tbl.get(name); + SymInfo info = tbl.get(name); if (info == null) { tbl.put(name,new SymInfo(global|BOUND)); return -1; @@ -91,14 +93,13 @@ } public void markFromParam() { - for (Enumeration e=tbl.elements(); e.hasMoreElements(); ) { - SymInfo info = (SymInfo)e.nextElement(); + for (SymInfo info : tbl.values()) { info.flags |= FROM_PARAM; } } public void addBound(String name) { - SymInfo info = (SymInfo)tbl.get(name); + SymInfo info = tbl.get(name); if (info == null) { tbl.put(name, new SymInfo(BOUND)); return; @@ -140,7 +141,7 @@ for (Enumeration e = inner_free.keys(); e.hasMoreElements(); ) { String name = (String)e.nextElement(); - SymInfo info = (SymInfo)tbl.get(name); + SymInfo info = tbl.get(name); if (info == null) { tbl.put(name,new SymInfo(FREE)); continue; @@ -164,9 +165,9 @@ boolean some_free = false; boolean nested = up.kind != TOPSCOPE; - for (Enumeration e = tbl.keys(); e.hasMoreElements(); ) { - String name = (String)e.nextElement(); - SymInfo info = (SymInfo)tbl.get(name); + for (Map.Entry<String, SymInfo> entry : tbl.entrySet()) { + String name = entry.getKey(); + SymInfo info = entry.getValue(); int flags = info.flags; if (nested && (flags&FREE) != 0) up.inner_free.put(name,PRESENT); if ((flags&(GLOBAL|PARAM|CELL)) == 0) { @@ -236,14 +237,14 @@ */ public void setup_closure(ScopeInfo up){ int free = cell; // env = cell...,free... - Hashtable up_tbl = up.tbl; + Map<String, SymInfo> up_tbl = up.tbl; boolean nested = up.kind != TOPSCOPE; - for (Enumeration e = tbl.keys(); e.hasMoreElements(); ) { - String name = (String)e.nextElement(); - SymInfo info = (SymInfo)tbl.get(name); + for (Map.Entry<String, SymInfo> entry : tbl.entrySet()) { + String name = entry.getKey(); + SymInfo info = entry.getValue(); int flags = info.flags; if ((flags&FREE) != 0) { - SymInfo up_info = (SymInfo)up_tbl.get(name); + SymInfo up_info = up_tbl.get(name); // ?? differs from CPython -- what is the intended behaviour? if (up_info != null) { int up_flags = up_info.flags; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-07-30 03:38:50
|
Revision: 6601 http://jython.svn.sourceforge.net/jython/?rev=6601&view=rev Author: fwierzbicki Date: 2009-07-30 03:38:40 +0000 (Thu, 30 Jul 2009) Log Message: ----------- Fix compiler warnings. Note that I am not replacing Vectors with Lists, etc (as much as I'd like to) since this is a minor release and most of these are public fields (yuck). Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/ScopeInfo.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-07-30 03:12:37 UTC (rev 6600) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-07-30 03:38:40 UTC (rev 6601) @@ -120,12 +120,12 @@ public ScopeInfo my_scope; boolean optimizeGlobals = true; - public Vector names; + public Vector<String> names; public String className; - public Stack continueLabels, breakLabels; - public Stack exceptionHandlers; - public Vector yields = new Vector(); + public Stack<Label> continueLabels, breakLabels; + public Stack<ExceptionHandler> exceptionHandlers; + public Vector<Label> yields = new Vector<Label>(); /* break/continue finally's level. * This is the lowest level in the exceptionHandlers which should @@ -148,9 +148,9 @@ mrefs = this; cw = module.classfile.cw; - continueLabels = new Stack(); - breakLabels = new Stack(); - exceptionHandlers = new Stack(); + continueLabels = new Stack<Label>(); + breakLabels = new Stack<Label>(); + exceptionHandlers = new Stack<ExceptionHandler>(); } public void getNone() throws IOException { @@ -682,7 +682,7 @@ private void restoreLocals() throws Exception { endExceptionHandlers(); - Vector v = code.getActiveLocals(); + Vector<String> v = code.getActiveLocals(); loadFrame(); code.getfield("org/python/core/PyFrame", "f_savedlocals", "[Ljava/lang/Object;"); @@ -735,7 +735,7 @@ } private void saveLocals() throws Exception { - Vector v = code.getActiveLocals(); + Vector<String> v = code.getActiveLocals(); code.iconst(v.size()); code.anewarray("java/lang/Object"); int locals = code.getLocal("[Ljava/lang/Object;"); @@ -1278,7 +1278,7 @@ * all the handlers above level temporarily. */ private void doFinallysDownTo(int level) throws Exception { - Stack poppedHandlers = new Stack(); + Stack<ExceptionHandler> poppedHandlers = new Stack<ExceptionHandler>(); while (exceptionHandlers.size() > level) { ExceptionHandler handler = (ExceptionHandler)exceptionHandlers.pop(); @@ -2414,8 +2414,8 @@ * We also need to stop coverage for the recovery of the locals after * a yield. */ - public Vector exceptionStarts = new Vector(); - public Vector exceptionEnds = new Vector(); + public Vector<Label> exceptionStarts = new Vector<Label>(); + public Vector<Label> exceptionEnds = new Vector<Label>(); public boolean bodyDone = false; @@ -2434,13 +2434,13 @@ public void addExceptionHandlers(Label handlerStart) throws Exception { for (int i = 0; i < exceptionStarts.size(); ++i) { - Label start = (Label)exceptionStarts.elementAt(i); - Label end = (Label)exceptionEnds.elementAt(i); + Label start = exceptionStarts.elementAt(i); + Label end = exceptionEnds.elementAt(i); //FIXME: not at all sure that getOffset() test is correct or necessary. if (start.getOffset() != end.getOffset()) { code.trycatch( - (Label)exceptionStarts.elementAt(i), - (Label)exceptionEnds.elementAt(i), + exceptionStarts.elementAt(i), + exceptionEnds.elementAt(i), handlerStart, "java/lang/Throwable"); } Modified: trunk/jython/src/org/python/compiler/ScopeInfo.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopeInfo.java 2009-07-30 03:12:37 UTC (rev 6600) +++ trunk/jython/src/org/python/compiler/ScopeInfo.java 2009-07-30 03:38:40 UTC (rev 6601) @@ -69,7 +69,7 @@ public ArgListCompiler ac; public Map<String, SymInfo> tbl = new LinkedHashMap<String, SymInfo>(); - public Vector names = new Vector(); + public Vector<String> names = new Vector<String>(); public int addGlobal(String name) { // global kind = func vs. class @@ -116,11 +116,11 @@ private final static Object PRESENT = new Object(); - public Hashtable inner_free = new Hashtable(); + public Hashtable<String,Object> inner_free = new Hashtable<String,Object>(); - public Vector cellvars = new Vector(); + public Vector<String> cellvars = new Vector<String>(); - public Vector jy_paramcells = new Vector(); + public Vector<String> jy_paramcells = new Vector<String>(); public int jy_npurecell; @@ -135,7 +135,7 @@ this.up = up; this.distance = distance; boolean func = kind == FUNCSCOPE; - Vector purecells = new Vector(); + Vector<String> purecells = new Vector<String>(); cell = 0; boolean some_inner_free = inner_free.size() > 0; @@ -223,7 +223,7 @@ ctxt.error(illegal.toString(), true, scope_node); } - public Vector freevars = new Vector(); + public Vector<String> freevars = new Vector<String>(); /** * setup the closure on this scope using the scope passed into cook as up as This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-07-30 04:12:01
|
Revision: 6602 http://jython.svn.sourceforge.net/jython/?rev=6602&view=rev Author: fwierzbicki Date: 2009-07-30 04:11:55 +0000 (Thu, 30 Jul 2009) Log Message: ----------- Finished warnings in compiler package. Again, being extra careful to avoid messing with public interfaces. Deprecated LineNumberTable instead of deleting, even though I'm sure it isn't used. Modified Paths: -------------- trunk/jython/src/org/python/compiler/LineNumberTable.java trunk/jython/src/org/python/compiler/Module.java trunk/jython/src/org/python/compiler/ScopesCompiler.java Modified: trunk/jython/src/org/python/compiler/LineNumberTable.java =================================================================== --- trunk/jython/src/org/python/compiler/LineNumberTable.java 2009-07-30 03:38:40 UTC (rev 6601) +++ trunk/jython/src/org/python/compiler/LineNumberTable.java 2009-07-30 04:11:55 UTC (rev 6602) @@ -2,18 +2,19 @@ package org.python.compiler; -import java.io.*; -import java.util.*; +import java.util.Vector; +import java.io.DataOutputStream; +import java.io.IOException; +/** + * @Deprecated Not used. + */ public class LineNumberTable { int attName; - //ConstantPool pool; - Vector lines; + Vector<Short> lines; public LineNumberTable() throws IOException { - //this.pool = pool; - //attName = pool.UTF8("LineNumberTable"); - lines = new Vector(); + lines = new Vector<Short>(); } public void write(DataOutputStream stream) throws IOException { @@ -22,8 +23,8 @@ stream.writeInt(n * 2 + 2); stream.writeShort(n / 2); for (int i = 0; i < n; i += 2) { - Short startpc = (Short) lines.elementAt(i); - Short lineno = (Short) lines.elementAt(i+1); + Short startpc = lines.elementAt(i); + Short lineno = lines.elementAt(i+1); stream.writeShort(startpc.shortValue()); stream.writeShort(lineno.shortValue()); } Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2009-07-30 03:38:40 UTC (rev 6601) +++ trunk/jython/src/org/python/compiler/Module.java 2009-07-30 04:11:55 UTC (rev 6602) @@ -301,7 +301,7 @@ public Constant mainCode; public boolean linenumbers; Future futures; - Hashtable scopes; + Hashtable<PythonTree,ScopeInfo> scopes; long mtime; public Module(String name, String filename, boolean linenumbers) { @@ -313,15 +313,15 @@ this.mtime = mtime; classfile = new ClassFile(name, "org/python/core/PyFunctionTable", ACC_SYNCHRONIZED | ACC_PUBLIC, mtime); - constants = new Hashtable(); + constants = new Hashtable<Constant,Constant>(); sfilename = filename; if (filename != null) this.filename = PyString(filename); else this.filename = null; - codes = new ArrayList(); + codes = new ArrayList<PyCodeConstant>(); futures = new Future(); - scopes = new Hashtable(); + scopes = new Hashtable<PythonTree,ScopeInfo>(); } public Module(String name) { @@ -329,7 +329,7 @@ } // This block of code handles the pool of Python Constants - Hashtable constants; + Hashtable<Constant,Constant> constants; private Constant findConstant(Constant c) { Constant ret = (Constant)constants.get(c); @@ -365,10 +365,10 @@ return findConstant(new PyLongConstant(value)); } - List codes; + List<PyCodeConstant> codes; //XXX: this can probably go away now that we can probably just copy the list. - private List<String> toNameAr(List names,boolean nullok) { + private List<String> toNameAr(List<String> names,boolean nullok) { int sz = names.size(); if (sz == 0 && nullok) return null; List<String> nameArray = new ArrayList<String>(); @@ -562,7 +562,7 @@ } for(int i=0; i<codes.size(); i++) { - PyCodeConstant pyc = (PyCodeConstant)codes.get(i); + PyCodeConstant pyc = codes.get(i); pyc.put(c); } @@ -589,7 +589,7 @@ code.tableswitch(0, labels.length - 1, def, labels); for(i=0; i<labels.length; i++) { code.label(labels[i]); - code.invokevirtual(classfile.name, ((PyCodeConstant)codes.get(i)).fname, "(" + $pyFrame + $threadState + ")" + $pyObj); + code.invokevirtual(classfile.name, (codes.get(i)).fname, "(" + $pyFrame + $threadState + ")" + $pyObj); code.areturn(); } code.label(def); Modified: trunk/jython/src/org/python/compiler/ScopesCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/ScopesCompiler.java 2009-07-30 03:38:40 UTC (rev 6601) +++ trunk/jython/src/org/python/compiler/ScopesCompiler.java 2009-07-30 04:11:55 UTC (rev 6602) @@ -34,17 +34,17 @@ private CompilationContext code_compiler; - private Stack scopes; + private Stack<ScopeInfo> scopes; private ScopeInfo cur = null; - private Hashtable nodeScopes; + private Hashtable<PythonTree,ScopeInfo> nodeScopes; private int level = 0; private int func_level = 0; - public ScopesCompiler(CompilationContext code_compiler, Hashtable nodeScopes) { + public ScopesCompiler(CompilationContext code_compiler, Hashtable<PythonTree,ScopeInfo> nodeScopes) { this.code_compiler = code_compiler; this.nodeScopes = nodeScopes; - scopes = new Stack(); + scopes = new Stack<ScopeInfo>(); } public void beginScope(String name, int kind, PythonTree node, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-07-31 15:33:32
|
Revision: 6614 http://jython.svn.sourceforge.net/jython/?rev=6614&view=rev Author: fwierzbicki Date: 2009-07-31 15:33:23 +0000 (Fri, 31 Jul 2009) Log Message: ----------- Add @Overides, remove unused import, fix a shadowed variable. Modified Paths: -------------- trunk/jython/src/org/python/compiler/ClassFile.java trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/LineNumberTable.java trunk/jython/src/org/python/compiler/Module.java trunk/jython/src/org/python/compiler/SymInfo.java Modified: trunk/jython/src/org/python/compiler/ClassFile.java =================================================================== --- trunk/jython/src/org/python/compiler/ClassFile.java 2009-07-31 14:41:13 UTC (rev 6613) +++ trunk/jython/src/org/python/compiler/ClassFile.java 2009-07-31 15:33:23 UTC (rev 6614) @@ -2,7 +2,6 @@ package org.python.compiler; import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-07-31 14:41:13 UTC (rev 6613) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-07-31 15:33:23 UTC (rev 6614) @@ -841,10 +841,10 @@ Future.checkFromFuture(node); // future stmt support setline(node); code.ldc(node.getInternalModule()); - java.util.List<alias> names = node.getInternalNames(); - if (names == null || names.size() == 0) { + java.util.List<alias> aliases = node.getInternalNames(); + if (aliases == null || aliases.size() == 0) { throw new ParseException("Internel parser error", node); - } else if (names.size() == 1 && names.get(0).getInternalName().equals("*")) { + } else if (aliases.size() == 1 && aliases.get(0).getInternalName().equals("*")) { if (node.getInternalLevel() > 0) { throw new ParseException("'import *' not allowed with 'from .'", node); } @@ -870,9 +870,9 @@ } else { java.util.List<String> fromNames = new ArrayList<String>();//[names.size()]; java.util.List<String> asnames = new ArrayList<String>();//[names.size()]; - for (int i = 0; i < names.size(); i++) { - fromNames.add(names.get(i).getInternalName()); - asnames.add(names.get(i).getInternalAsname()); + for (int i = 0; i < aliases.size(); i++) { + fromNames.add(aliases.get(i).getInternalName()); + asnames.add(aliases.get(i).getInternalAsname()); if (asnames.get(i) == null) asnames.set(i, fromNames.get(i)); } @@ -893,11 +893,11 @@ } code.invokestatic("org/python/core/imp", "importFrom", "(" + $str + $strArr + $pyFrame + "I" + ")" + $pyObjArr); int tmp = storeTop(); - for (int i = 0; i < names.size(); i++) { + for (int i = 0; i < aliases.size(); i++) { code.aload(tmp); code.iconst(i); code.aaload(); - set(new Name(names.get(i), asnames.get(i), expr_contextType.Store)); + set(new Name(aliases.get(i), asnames.get(i), expr_contextType.Store)); } code.freeLocal(tmp); } Modified: trunk/jython/src/org/python/compiler/LineNumberTable.java =================================================================== --- trunk/jython/src/org/python/compiler/LineNumberTable.java 2009-07-31 14:41:13 UTC (rev 6613) +++ trunk/jython/src/org/python/compiler/LineNumberTable.java 2009-07-31 15:33:23 UTC (rev 6614) @@ -7,7 +7,7 @@ import java.io.IOException; /** - * @Deprecated Not used. + * @Deprecated Not used. Delete in 2.6. */ public class LineNumberTable { int attName; Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2009-07-31 14:41:13 UTC (rev 6613) +++ trunk/jython/src/org/python/compiler/Module.java 2009-07-31 15:33:23 UTC (rev 6614) @@ -451,7 +451,7 @@ int nparamcell = scope.jy_paramcells.size(); if(nparamcell > 0) { Map<String, SymInfo> tbl = scope.tbl; - List paramcells = scope.jy_paramcells; + List<String> paramcells = scope.jy_paramcells; for(int i = 0; i < nparamcell; i++) { c.aload(1); SymInfo syminf = tbl.get(paramcells.get(i)); Modified: trunk/jython/src/org/python/compiler/SymInfo.java =================================================================== --- trunk/jython/src/org/python/compiler/SymInfo.java 2009-07-31 14:41:13 UTC (rev 6613) +++ trunk/jython/src/org/python/compiler/SymInfo.java 2009-07-31 15:33:23 UTC (rev 6614) @@ -17,6 +17,7 @@ public int env_index; + @Override public String toString() { return "SymInfo[" + flags + " " + locals_index + " " + env_index + "]"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-10-06 20:33:08
|
Revision: 6843 http://jython.svn.sourceforge.net/jython/?rev=6843&view=rev Author: fwierzbicki Date: 2009-10-06 20:32:55 +0000 (Tue, 06 Oct 2009) Log Message: ----------- Make constants more.... constant in the compiler package. Changed confusing method names of the form Py*() that return constants to *constant. For example PyInteger() -> integerConstant(). Also reduced public interface of compiler package, especially around compiler constants. Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/Constant.java trunk/jython/src/org/python/compiler/Module.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-10-06 13:11:06 UTC (rev 6842) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-10-06 20:32:55 UTC (rev 6843) @@ -434,7 +434,7 @@ scope.setup_closure(); scope.dump(); - module.PyCode(new Suite(node,node.getInternalBody()), name, true, + module.codeConstant(new Suite(node,node.getInternalBody()), name, true, className, false, false, node.getLine(), scope, cflags).get(code); @@ -2029,7 +2029,7 @@ scope.setup_closure(); scope.dump(); - module.PyCode(retSuite, name, true, className, + module.codeConstant(retSuite, name, true, className, false, false, node.getLine(), scope, cflags).get(code); if (!makeClosure(scope)) { @@ -2087,7 +2087,7 @@ scope.setup_closure(); scope.dump(); //Make code object out of suite - module.PyCode(new Suite(node,node.getInternalBody()), name, false, name, + module.codeConstant(new Suite(node,node.getInternalBody()), name, false, name, true, false, node.getLine(), scope, cflags).get(code); //Get doc string (if there) @@ -2114,13 +2114,13 @@ @Override public Object visitNum(Num node) throws Exception { if (node.getInternalN() instanceof PyInteger) { - module.PyInteger(((PyInteger) node.getInternalN()).getValue()).get(code); + module.integerConstant(((PyInteger) node.getInternalN()).getValue()).get(code); } else if (node.getInternalN() instanceof PyLong) { - module.PyLong(((PyObject)node.getInternalN()).__str__().toString()).get(code); + module.longConstant(((PyObject)node.getInternalN()).__str__().toString()).get(code); } else if (node.getInternalN() instanceof PyFloat) { - module.PyFloat(((PyFloat) node.getInternalN()).getValue()).get(code); + module.floatConstant(((PyFloat) node.getInternalN()).getValue()).get(code); } else if (node.getInternalN() instanceof PyComplex) { - module.PyComplex(((PyComplex) node.getInternalN()).imag).get(code); + module.complexConstant(((PyComplex) node.getInternalN()).imag).get(code); } return null; } @@ -2257,9 +2257,9 @@ public Object visitStr(Str node) throws Exception { PyString s = (PyString)node.getInternalS(); if (s instanceof PyUnicode) { - module.PyUnicode(s.asString()).get(code); + module.unicodeConstant(s.asString()).get(code); } else { - module.PyString(s.asString()).get(code); + module.stringConstant(s.asString()).get(code); } return null; } @@ -2304,7 +2304,7 @@ java.util.List<stmt> bod = new ArrayList<stmt>(); bod.add(n); - module.PyCode(new Suite(node, bod), "<genexpr>", true, + module.codeConstant(new Suite(node, bod), "<genexpr>", true, className, false, false, node.getLine(), scope, cflags).get(code); Modified: trunk/jython/src/org/python/compiler/Constant.java =================================================================== --- trunk/jython/src/org/python/compiler/Constant.java 2009-10-06 13:11:06 UTC (rev 6842) +++ trunk/jython/src/org/python/compiler/Constant.java 2009-10-06 20:32:55 UTC (rev 6843) @@ -7,11 +7,11 @@ import org.objectweb.asm.Opcodes; abstract class Constant implements Opcodes{ - public Module module; - public static int access = ACC_STATIC | ACC_FINAL; - public String name; + Module module; + static int access = ACC_STATIC | ACC_FINAL; + String name; - public abstract void get(Code mv) throws IOException; + abstract void get(Code mv) throws IOException; - public abstract void put(Code mv) throws IOException; + abstract void put(Code mv) throws IOException; } Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2009-10-06 13:11:06 UTC (rev 6842) +++ trunk/jython/src/org/python/compiler/Module.java 2009-10-06 20:32:55 UTC (rev 6843) @@ -38,19 +38,18 @@ import org.python.antlr.base.mod; import static org.python.util.CodegenUtils.*; -class PyIntegerConstant extends Constant implements ClassConstants, Opcodes -{ - int value; +class PyIntegerConstant extends Constant implements ClassConstants, Opcodes { + final int value; - public PyIntegerConstant(int value) { + PyIntegerConstant(int value) { this.value = value; } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyInteger.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyInteger.class), access); c.iconst(value); c.invokestatic(p(Py.class), "newInteger", sig(PyInteger.class, Integer.TYPE)); @@ -74,17 +73,17 @@ class PyFloatConstant extends Constant implements ClassConstants, Opcodes { - double value; + final double value; - public PyFloatConstant(double value) { + PyFloatConstant(double value) { this.value = value; } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyFloat.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyFloat.class), access); c.ldc(new Double(value)); c.invokestatic(p(Py.class), "newFloat", sig(PyFloat.class, Double.TYPE)); @@ -108,17 +107,17 @@ class PyComplexConstant extends Constant implements ClassConstants, Opcodes { - double value; + final double value; - public PyComplexConstant(double value) { + PyComplexConstant(double value) { this.value = value; } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyComplex.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyComplex.class), access); c.ldc(new Double(value)); c.invokestatic(p(Py.class), "newImaginary", sig(PyComplex.class, Double.TYPE)); @@ -142,17 +141,17 @@ class PyStringConstant extends Constant implements ClassConstants, Opcodes { - String value; + final String value; - public PyStringConstant(String value) { + PyStringConstant(String value) { this.value = value; } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyString.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyString.class), access); c.ldc(value); c.invokestatic(p(PyString.class), "fromInterned", sig(PyString.class, String.class)); @@ -176,17 +175,17 @@ class PyUnicodeConstant extends Constant implements ClassConstants, Opcodes { - String value; + final String value; - public PyUnicodeConstant(String value) { + PyUnicodeConstant(String value) { this.value = value; } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyUnicode.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyUnicode.class), access); c.ldc(value); c.invokestatic(p(PyUnicode.class), "fromInterned", sig(PyUnicode.class, String.class)); @@ -210,17 +209,17 @@ class PyLongConstant extends Constant implements ClassConstants, Opcodes { - String value; + final String value; - public PyLongConstant(String value) { + PyLongConstant(String value) { this.value = value; } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyLong.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyLong.class), access); c.ldc(value); c.invokestatic(p(Py.class), "newLong", sig(PyLong.class, String.class)); @@ -244,29 +243,29 @@ class PyCodeConstant extends Constant implements ClassConstants, Opcodes { - public String co_name; - public int argcount; - public List<String> names; - public int id; - public int co_firstlineno; - public boolean arglist, keywordlist; + String co_name; + int argcount; + List<String> names; + int id; + int co_firstlineno; + boolean arglist, keywordlist; String fname; // for nested scopes - public List<String> cellvars; - public List<String> freevars; - public int jy_npurecell; + List<String> cellvars; + List<String> freevars; + int jy_npurecell; - public int moreflags; + int moreflags; - public PyCodeConstant() { + PyCodeConstant() { } - public void get(Code c) throws IOException { + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyCode.class)); } - public void put(Code c) throws IOException { + void put(Code c) throws IOException { module.classfile.addField(name, ci(PyCode.class), access); c.iconst(argcount); @@ -320,7 +319,7 @@ ClassFile classfile; Constant filename; String sfilename; - public Constant mainCode; + Constant mainCode; public boolean linenumbers; Future futures; Hashtable<PythonTree,ScopeInfo> scopes; @@ -338,7 +337,7 @@ constants = new Hashtable<Constant,Constant>(); sfilename = filename; if (filename != null) { - this.filename = PyString(filename); + this.filename = stringConstant(filename); } else { this.filename = null; } @@ -367,27 +366,27 @@ return ret; } - public Constant PyInteger(int value) { + Constant integerConstant(int value) { return findConstant(new PyIntegerConstant(value)); } - public Constant PyFloat(double value) { + Constant floatConstant(double value) { return findConstant(new PyFloatConstant(value)); } - public Constant PyComplex(double value) { + Constant complexConstant(double value) { return findConstant(new PyComplexConstant(value)); } - public Constant PyString(String value) { + Constant stringConstant(String value) { return findConstant(new PyStringConstant(value)); } - public Constant PyUnicode(String value) { + Constant unicodeConstant(String value) { return findConstant(new PyUnicodeConstant(value)); } - public Constant PyLong(String value) { + Constant longConstant(String value) { return findConstant(new PyLongConstant(value)); } @@ -420,20 +419,18 @@ return nameArray; } - private int to_cell; - - public PyCodeConstant PyCode(mod tree, String name, + PyCodeConstant codeConstant(mod tree, String name, boolean fast_locals, String className, boolean classBody, boolean printResults, int firstlineno, ScopeInfo scope) throws Exception { - return PyCode(tree,name,fast_locals,className,classBody, + return codeConstant(tree,name,fast_locals,className,classBody, printResults,firstlineno,scope,null); } - public PyCodeConstant PyCode(mod tree, String name, + PyCodeConstant codeConstant(mod tree, String name, boolean fast_locals, String className, boolean classBody, boolean printResults, int firstlineno, @@ -589,7 +586,7 @@ c.areturn(); } - public void addConstants(Code c) throws IOException { + void addConstants(Code c) throws IOException { classfile.addField("self", "L"+classfile.name+";", ACC_STATIC|ACC_FINAL); c.aload(0); c.putstatic(classfile.name, "self", "L"+classfile.name+";"); @@ -701,7 +698,7 @@ //Add __doc__ if it exists - Constant main = module.PyCode(node, "<module>", false, null, false, + Constant main = module.codeConstant(node, "<module>", false, null, false, printResults, 0, module.getScopeInfo(node), cflags); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-10-07 19:17:06
|
Revision: 6846 http://jython.svn.sourceforge.net/jython/?rev=6846&view=rev Author: fwierzbicki Date: 2009-10-07 19:16:54 +0000 (Wed, 07 Oct 2009) Log Message: ----------- Make PyCodeConstant an actual constant. Move construction details into PyCodeConstant constructor. Hide more implementation details by making public fields package private. Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/Module.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-10-07 02:50:46 UTC (rev 6845) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-10-07 19:16:54 UTC (rev 6846) @@ -103,20 +103,20 @@ public class CodeCompiler extends Visitor implements Opcodes, ClassConstants { - public static final Object Exit=new Integer(1); - public static final Object NoExit=null; + static final Object Exit=new Integer(1); + static final Object NoExit=null; - public static final int GET=0; - public static final int SET=1; - public static final int DEL=2; - public static final int AUGGET=3; - public static final int AUGSET=4; + static final int GET=0; + static final int SET=1; + static final int DEL=2; + static final int AUGGET=3; + static final int AUGSET=4; - public Module module; - public ClassWriter cw; - public Code code; - public CodeCompiler mrefs; - public CompilerFlags cflags; + Module module; + ClassWriter cw; + Code code; + CodeCompiler mrefs; + CompilerFlags cflags; int temporary; expr_contextType augmode; @@ -125,18 +125,18 @@ int augtmp3; int augtmp4; - public boolean fast_locals, print_results; + boolean fast_locals, print_results; - public Map<String, SymInfo> tbl; - public ScopeInfo my_scope; + Map<String, SymInfo> tbl; + ScopeInfo my_scope; boolean optimizeGlobals = true; - public Vector<String> names; - public String className; + Vector<String> names; + String className; - public Stack<Label> continueLabels, breakLabels; - public Stack<ExceptionHandler> exceptionHandlers; - public Vector<Label> yields = new Vector<Label>(); + Stack<Label> continueLabels, breakLabels; + Stack<ExceptionHandler> exceptionHandlers; + Vector<Label> yields = new Vector<Label>(); /* * break/continue finally's level. This is the lowest level in the @@ -258,8 +258,11 @@ return; code.aload(augtmp4); code.freeLocal(augtmp4); - } + } + static boolean checkOptimizeGlobals(boolean fast_locals, ScopeInfo scope) { + return fast_locals&&!scope.exec&&!scope.from_import_star; + } public void parse(mod node, Code code, boolean fast_locals, String className, @@ -275,7 +278,7 @@ names = scope.names; tbl = scope.tbl; - optimizeGlobals = fast_locals&&!scope.exec&&!scope.from_import_star; + optimizeGlobals = checkOptimizeGlobals(fast_locals, scope); if (scope.max_with_count > 0) { // allocate for all the with-exits we will have in the frame; Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2009-10-07 02:50:46 UTC (rev 6845) +++ trunk/jython/src/org/python/compiler/Module.java 2009-10-07 19:16:54 UTC (rev 6846) @@ -243,24 +243,118 @@ class PyCodeConstant extends Constant implements ClassConstants, Opcodes { - String co_name; - int argcount; - List<String> names; - int id; - int co_firstlineno; - boolean arglist, keywordlist; - String fname; + final String co_name; + final int argcount; + final List<String> names; + final int id; + final int co_firstlineno; + final boolean arglist, keywordlist; + final String fname; // for nested scopes - List<String> cellvars; - List<String> freevars; - int jy_npurecell; + final List<String> cellvars; + final List<String> freevars; + final int jy_npurecell; - int moreflags; + final int moreflags; - PyCodeConstant() { + PyCodeConstant(mod tree, String name, boolean fast_locals, String + className, boolean classBody, boolean printResults, int + firstlineno, ScopeInfo scope, org.python.core.CompilerFlags cflags, + Module module) + throws Exception { + + this.co_name = name; + this.co_firstlineno = firstlineno; + this.module = module; + + //Needed so that moreflags can be final. + int _moreflags = 0; + + if (scope.ac != null) { + arglist = scope.ac.arglist; + keywordlist = scope.ac.keywordlist; + argcount = scope.ac.names.size(); + + //Do something to add init_code to tree + //XXX: not sure we should be modifying scope.ac in a PyCodeConstant + //constructor. + if (scope.ac.init_code.size() > 0) { + scope.ac.appendInitCode((Suite) tree); + } + } else { + arglist = false; + keywordlist = false; + argcount = 0; + } + + id = module.codes.size(); + + //Better names in the future? + if (isJavaIdentifier(name)) { + fname = name+"$"+id; + } else { + fname = "f$"+id; + } + //XXX: is fname needed at all, or should we just use "name"? + this.name = fname; + + // !classdef only + if (!classBody) { + names = toNameAr(scope.names,false); + } else { + names = null; + } + + cellvars = toNameAr(scope.cellvars, true); + freevars = toNameAr(scope.freevars, true); + jy_npurecell = scope.jy_npurecell; + + if (CodeCompiler.checkOptimizeGlobals(fast_locals, scope)) { + _moreflags |= org.python.core.CodeFlag.CO_OPTIMIZED.flag; + } + if (scope.generator) { + _moreflags |= org.python.core.CodeFlag.CO_GENERATOR.flag; + } + if (cflags != null) { + if (cflags.isFlagSet(CodeFlag.CO_GENERATOR_ALLOWED)) { + _moreflags |= org.python.core.CodeFlag.CO_GENERATOR_ALLOWED.flag; + } + if (cflags.isFlagSet(CodeFlag.CO_FUTURE_DIVISION)) { + _moreflags |= org.python.core.CodeFlag.CO_FUTURE_DIVISION.flag; + } + } + moreflags = _moreflags; } + //XXX: this can probably go away now that we can probably just copy the list. + private List<String> toNameAr(List<String> names,boolean nullok) { + int sz = names.size(); + if (sz == 0 && nullok) { + return null; + } + List<String> nameArray = new ArrayList<String>(); + nameArray.addAll(names); + return nameArray; + } + + private boolean isJavaIdentifier(String s) { + char[] chars = s.toCharArray(); + if (chars.length == 0) { + return false; + } + if (!Character.isJavaIdentifierStart(chars[0])) { + return false; + } + + for(int i=1; i<chars.length; i++) { + if (!Character.isJavaIdentifierPart(chars[i])) { + return false; + } + } + return true; + } + void get(Code c) throws IOException { c.getstatic(module.classfile.name, name, ci(PyCode.class)); } @@ -320,7 +414,7 @@ Constant filename; String sfilename; Constant mainCode; - public boolean linenumbers; + boolean linenumbers; Future futures; Hashtable<PythonTree,ScopeInfo> scopes; long mtime; @@ -391,34 +485,6 @@ } List<PyCodeConstant> codes; - private boolean isJavaIdentifier(String s) { - char[] chars = s.toCharArray(); - if (chars.length == 0) { - return false; - } - if (!Character.isJavaIdentifierStart(chars[0])) { - return false; - } - - for(int i=1; i<chars.length; i++) { - if (!Character.isJavaIdentifierPart(chars[i])) { - return false; - } - } - return true; - } - - //XXX: this can probably go away now that we can probably just copy the list. - private List<String> toNameAr(List<String> names,boolean nullok) { - int sz = names.size(); - if (sz == 0 && nullok) { - return null; - } - List<String> nameArray = new ArrayList<String>(); - nameArray.addAll(names); - return nameArray; - } - PyCodeConstant codeConstant(mod tree, String name, boolean fast_locals, String className, boolean classBody, boolean printResults, @@ -429,7 +495,6 @@ printResults,firstlineno,scope,null); } - PyCodeConstant codeConstant(mod tree, String name, boolean fast_locals, String className, boolean classBody, boolean printResults, @@ -438,34 +503,18 @@ org.python.core.CompilerFlags cflags) throws Exception { - PyCodeConstant code = new PyCodeConstant(); - ArgListCompiler ac = (scope != null)?scope.ac:null; + PyCodeConstant code = new PyCodeConstant(tree, name, fast_locals, + className, classBody, printResults, firstlineno, scope, cflags, + this); + codes.add(code); - if (ac != null) { - code.arglist = ac.arglist; - code.keywordlist = ac.keywordlist; - code.argcount = ac.names.size(); - } + CodeCompiler compiler = new CodeCompiler(this, printResults); - code.co_name = name; - code.co_firstlineno = firstlineno; - code.id = codes.size(); - - //Better names in the future? - if (isJavaIdentifier(name)) - code.fname = name+"$"+code.id; - else - code.fname = "f$"+code.id; - - codes.add(code); - Code c = classfile.addMethod( code.fname, sig(PyObject.class, PyFrame.class, ThreadState.class), ACC_PUBLIC); - CodeCompiler compiler = new CodeCompiler(this, printResults); - if (classBody) { // Set the class's __module__ to __name__. fails when there's no __name__ c.aload(1); @@ -485,10 +534,6 @@ Label start = new Label(); c.label(start); - //Do something to add init_code to tree - if (ac != null && ac.init_code.size() > 0) { - ac.appendInitCode((Suite) tree); - } int nparamcell = scope.jy_paramcells.size(); if(nparamcell > 0) { Map<String, SymInfo> tbl = scope.tbl; @@ -504,7 +549,6 @@ } compiler.parse(tree, c, fast_locals, className, classBody, scope, cflags); - // similar to visitResume code in pyasm.py if (scope.generator) { c.label(genswitch); @@ -520,30 +564,6 @@ c.tableswitch(0, yields.length - 1, start, yields); } - // !classdef only - if (!classBody) code.names = toNameAr(compiler.names,false); - - code.cellvars = toNameAr(scope.cellvars, true); - code.freevars = toNameAr(scope.freevars, true); - code.jy_npurecell = scope.jy_npurecell; - - if (compiler.optimizeGlobals) { - code.moreflags |= org.python.core.CodeFlag.CO_OPTIMIZED.flag; - } - if (compiler.my_scope.generator) { - code.moreflags |= org.python.core.CodeFlag.CO_GENERATOR.flag; - } - if (cflags != null) { - if (cflags.isFlagSet(CodeFlag.CO_GENERATOR_ALLOWED)) { - code.moreflags |= org.python.core.CodeFlag.CO_GENERATOR_ALLOWED.flag; - } - if (cflags.isFlagSet(CodeFlag.CO_FUTURE_DIVISION)) { - code.moreflags |= org.python.core.CodeFlag.CO_FUTURE_DIVISION.flag; - } - } - - code.module = this; - code.name = code.fname; return code; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2009-10-27 03:00:27
|
Revision: 6912 http://jython.svn.sourceforge.net/jython/?rev=6912&view=rev Author: fwierzbicki Date: 2009-10-27 03:00:16 +0000 (Tue, 27 Oct 2009) Log Message: ----------- Code from Module reaching into internals of CodeCompiler moved to CodeCompiler Modified Paths: -------------- trunk/jython/src/org/python/compiler/CodeCompiler.java trunk/jython/src/org/python/compiler/Module.java Modified: trunk/jython/src/org/python/compiler/CodeCompiler.java =================================================================== --- trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-10-27 02:56:41 UTC (rev 6911) +++ trunk/jython/src/org/python/compiler/CodeCompiler.java 2009-10-27 03:00:16 UTC (rev 6912) @@ -259,6 +259,41 @@ this.code = code; this.cflags = cflags; + //BEGIN preparse + if (classBody) { + // Set the class's __module__ to __name__. fails when there's no __name__ + code.aload(1); + code.ldc("__module__"); + + code.aload(1); + code.ldc("__name__"); + code.invokevirtual(p(PyFrame.class), "getname", sig(PyObject.class, String.class)); + code.invokevirtual(p(PyFrame.class), "setlocal", sig(Void.TYPE, String.class, + PyObject.class)); + } + + Label genswitch = new Label(); + if (scope.generator) { + code.goto_(genswitch); + } + Label start = new Label(); + code.label(start); + + int nparamcell = scope.jy_paramcells.size(); + if (nparamcell > 0) { + Map<String, SymInfo> tbl = scope.tbl; + java.util.List<String> paramcells = scope.jy_paramcells; + for (int i = 0; i < nparamcell; i++) { + code.aload(1); + SymInfo syminf = tbl.get(paramcells.get(i)); + code.iconst(syminf.locals_index); + code.iconst(syminf.env_index); + code.invokevirtual(p(PyFrame.class), "to_cell", sig(Void.TYPE, Integer.TYPE, + Integer.TYPE)); + } + } + //END preparse + my_scope = scope; tbl = scope.tbl; @@ -287,6 +322,24 @@ code.areturn(); } } + + //BEGIN postparse + + // similar to visitResume code in pyasm.py + if (scope.generator) { + code.label(genswitch); + + code.aload(1); + code.getfield(p(PyFrame.class), "f_lasti", "I"); + Label[] y = new Label[yields.size() + 1]; + + y[0] = start; + for (int i = 1; i < y.length; i++) { + y[i] = yields.get(i - 1); + } + code.tableswitch(0, y.length - 1, start, y); + } + //END postparse } @Override Modified: trunk/jython/src/org/python/compiler/Module.java =================================================================== --- trunk/jython/src/org/python/compiler/Module.java 2009-10-27 02:56:41 UTC (rev 6911) +++ trunk/jython/src/org/python/compiler/Module.java 2009-10-27 03:00:16 UTC (rev 6912) @@ -507,55 +507,7 @@ sig(PyObject.class, PyFrame.class, ThreadState.class), ACC_PUBLIC); - if (classBody) { - // Set the class's __module__ to __name__. fails when there's no __name__ - c.aload(1); - c.ldc("__module__"); - - c.aload(1); - c.ldc("__name__"); - c.invokevirtual(p(PyFrame.class), "getname", sig(PyObject.class, String.class)); - c.invokevirtual(p(PyFrame.class), "setlocal", sig(Void.TYPE, String.class, - PyObject.class)); - } - - Label genswitch = new Label(); - if (scope.generator) { - c.goto_(genswitch); - } - Label start = new Label(); - c.label(start); - - int nparamcell = scope.jy_paramcells.size(); - if (nparamcell > 0) { - Map<String, SymInfo> tbl = scope.tbl; - List<String> paramcells = scope.jy_paramcells; - for (int i = 0; i < nparamcell; i++) { - c.aload(1); - SymInfo syminf = tbl.get(paramcells.get(i)); - c.iconst(syminf.locals_index); - c.iconst(syminf.env_index); - c.invokevirtual(p(PyFrame.class), "to_cell", sig(Void.TYPE, Integer.TYPE, - Integer.TYPE)); - } - } - compiler.parse(tree, c, fast_locals, className, classBody, scope, cflags); - // similar to visitResume code in pyasm.py - if (scope.generator) { - c.label(genswitch); - - c.aload(1); - c.getfield(p(PyFrame.class), "f_lasti", "I"); - Label[] yields = new Label[compiler.yields.size() + 1]; - - yields[0] = start; - for (int i = 1; i < yields.length; i++) { - yields[i] = compiler.yields.get(i - 1); - } - c.tableswitch(0, yields.length - 1, start, yields); - } - return code; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |