From: <th...@us...> - 2007-08-05 00:49:02
|
Revision: 3393 http://jython.svn.sourceforge.net/jython/?rev=3393&view=rev Author: thobes Date: 2007-08-04 17:48:58 -0700 (Sat, 04 Aug 2007) Log Message: ----------- Structured and cleaned up the source tree. Added Paths: ----------- branches/newcompiler/sandbox/ branches/newcompiler/src/org/python/antlr/ Removed Paths: ------------- branches/newcompiler/sandbox/grammar/src/ branches/newcompiler/src/org/python/antlr/ASTFrame$1.class branches/newcompiler/src/org/python/antlr/ASTFrame.class branches/newcompiler/src/org/python/antlr/ASTtoTreeModelAdapter.class branches/newcompiler/src/org/python/antlr/Main$MyLexer.class branches/newcompiler/src/org/python/antlr/Main.class branches/newcompiler/src/org/python/antlr/PythonLexer$DFA12.class branches/newcompiler/src/org/python/antlr/PythonLexer$DFA13.class branches/newcompiler/src/org/python/antlr/PythonLexer$DFA35.class branches/newcompiler/src/org/python/antlr/PythonLexer$DFA36.class branches/newcompiler/src/org/python/antlr/PythonLexer$DFA37.class branches/newcompiler/src/org/python/antlr/PythonLexer.class branches/newcompiler/src/org/python/antlr/PythonParser$and_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$and_test_return.class branches/newcompiler/src/org/python/antlr/PythonParser$arglist_return.class branches/newcompiler/src/org/python/antlr/PythonParser$argument_return.class branches/newcompiler/src/org/python/antlr/PythonParser$arith_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$assert_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$atom_return.class branches/newcompiler/src/org/python/antlr/PythonParser$augassign_return.class branches/newcompiler/src/org/python/antlr/PythonParser$break_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$classdef_return.class branches/newcompiler/src/org/python/antlr/PythonParser$comp_op_return.class branches/newcompiler/src/org/python/antlr/PythonParser$comparison_return.class branches/newcompiler/src/org/python/antlr/PythonParser$compound_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$continue_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$decorator_return.class branches/newcompiler/src/org/python/antlr/PythonParser$decorators_return.class branches/newcompiler/src/org/python/antlr/PythonParser$defparameter_return.class branches/newcompiler/src/org/python/antlr/PythonParser$del_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$dictmaker_return.class branches/newcompiler/src/org/python/antlr/PythonParser$dot_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$dotted_as_name_return.class branches/newcompiler/src/org/python/antlr/PythonParser$dotted_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$dotted_name_return.class branches/newcompiler/src/org/python/antlr/PythonParser$eval_input_return.class branches/newcompiler/src/org/python/antlr/PythonParser$except_clause_return.class branches/newcompiler/src/org/python/antlr/PythonParser$except_clauses_return.class branches/newcompiler/src/org/python/antlr/PythonParser$exec_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$expr_dotted_return.class branches/newcompiler/src/org/python/antlr/PythonParser$expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$expr_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$exprlist_return.class branches/newcompiler/src/org/python/antlr/PythonParser$factor_return.class branches/newcompiler/src/org/python/antlr/PythonParser$file_input_return.class branches/newcompiler/src/org/python/antlr/PythonParser$flow_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$for_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$fpdef_return.class branches/newcompiler/src/org/python/antlr/PythonParser$fplist_return.class branches/newcompiler/src/org/python/antlr/PythonParser$funccall_return.class branches/newcompiler/src/org/python/antlr/PythonParser$funcdef_return.class branches/newcompiler/src/org/python/antlr/PythonParser$genexp_return.class branches/newcompiler/src/org/python/antlr/PythonParser$global_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$if_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$import_as_name_return.class branches/newcompiler/src/org/python/antlr/PythonParser$import_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$lambdef_return.class branches/newcompiler/src/org/python/antlr/PythonParser$list_for_return.class branches/newcompiler/src/org/python/antlr/PythonParser$list_if_return.class branches/newcompiler/src/org/python/antlr/PythonParser$list_iter_return.class branches/newcompiler/src/org/python/antlr/PythonParser$listcomp_return.class branches/newcompiler/src/org/python/antlr/PythonParser$listmaker_return.class branches/newcompiler/src/org/python/antlr/PythonParser$long_integer_return.class branches/newcompiler/src/org/python/antlr/PythonParser$module_return.class branches/newcompiler/src/org/python/antlr/PythonParser$not_test_return.class branches/newcompiler/src/org/python/antlr/PythonParser$parameters_return.class branches/newcompiler/src/org/python/antlr/PythonParser$pass_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$power_return.class branches/newcompiler/src/org/python/antlr/PythonParser$print_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$raise_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$return_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$shift_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$simple_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$single_input_return.class branches/newcompiler/src/org/python/antlr/PythonParser$sliceop_return.class branches/newcompiler/src/org/python/antlr/PythonParser$small_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$subscript_return.class branches/newcompiler/src/org/python/antlr/PythonParser$subscriptlist_return.class branches/newcompiler/src/org/python/antlr/PythonParser$suite_return.class branches/newcompiler/src/org/python/antlr/PythonParser$term_return.class branches/newcompiler/src/org/python/antlr/PythonParser$test_return.class branches/newcompiler/src/org/python/antlr/PythonParser$testlist_return.class branches/newcompiler/src/org/python/antlr/PythonParser$trailer_return.class branches/newcompiler/src/org/python/antlr/PythonParser$try_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$unary_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$varargslist_return.class branches/newcompiler/src/org/python/antlr/PythonParser$while_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$with_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser$xor_expr_return.class branches/newcompiler/src/org/python/antlr/PythonParser$yield_stmt_return.class branches/newcompiler/src/org/python/antlr/PythonParser.class branches/newcompiler/src/org/python/antlr/PythonTokenSource.class branches/newcompiler/src/org/python/parser/sandbox/ Copied: branches/newcompiler/sandbox (from rev 3392, branches/newcompiler/src/org/python/parser/sandbox) Copied: branches/newcompiler/src/org/python/antlr (from rev 3392, branches/newcompiler/src/org/python/parser/sandbox/grammar/src/org/python/antlr) Deleted: branches/newcompiler/src/org/python/antlr/ASTFrame$1.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/ASTFrame.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/ASTtoTreeModelAdapter.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/Main$MyLexer.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/Main.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonLexer$DFA12.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonLexer$DFA13.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonLexer$DFA35.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonLexer$DFA36.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonLexer$DFA37.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonLexer.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$and_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$and_test_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$arglist_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$argument_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$arith_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$assert_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$atom_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$augassign_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$break_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$classdef_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$comp_op_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$comparison_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$compound_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$continue_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$decorator_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$decorators_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$defparameter_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$del_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$dictmaker_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$dot_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$dotted_as_name_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$dotted_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$dotted_name_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$eval_input_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$except_clause_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$except_clauses_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$exec_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$expr_dotted_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$expr_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$exprlist_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$factor_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$file_input_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$flow_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$for_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$fpdef_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$fplist_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$funccall_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$funcdef_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$genexp_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$global_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$if_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$import_as_name_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$import_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$lambdef_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$list_for_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$list_if_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$list_iter_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$listcomp_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$listmaker_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$long_integer_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$module_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$not_test_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$parameters_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$pass_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$power_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$print_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$raise_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$return_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$shift_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$simple_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$single_input_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$sliceop_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$small_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$subscript_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$subscriptlist_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$suite_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$term_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$test_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$testlist_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$trailer_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$try_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$unary_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$varargslist_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$while_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$with_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$xor_expr_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser$yield_stmt_return.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonParser.class =================================================================== (Binary files differ) Deleted: branches/newcompiler/src/org/python/antlr/PythonTokenSource.class =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2007-08-20 18:11:17
|
Revision: 3440 http://jython.svn.sourceforge.net/jython/?rev=3440&view=rev Author: thobes Date: 2007-08-20 11:11:16 -0700 (Mon, 20 Aug 2007) Log Message: ----------- GSoC is officially over. This is an upload of the PyASM compiler, an ASM powered compiler framework that compiles python bytecode to java bytecode. The compiler is able to bootstrap itself. The next step is to document, fix bugs, document, invent test cases and document. I will continue working on this and on the Jython project after the summer of code. Modified Paths: -------------- branches/newcompiler/src/org/python/core/NewCompilerResources.java branches/newcompiler/src/org/python/core/PyFrame.java branches/newcompiler/src/org/python/core/PyGenerator.java branches/newcompiler/src/org/python/newcompiler/pyasm/CodeFlags.java branches/newcompiler/src/org/python/newcompiler/pyasm/CodeReader.java branches/newcompiler/src/org/python/newcompiler/pyasm/CodeVisitor.java Added Paths: ----------- branches/newcompiler/PyASM/ branches/newcompiler/PyASM/marshal.py branches/newcompiler/PyASM/opcode.py branches/newcompiler/PyASM/pyasm.py branches/newcompiler/PyASM/test/ branches/newcompiler/PyASM/test/assign.py branches/newcompiler/PyASM/test/builtins.py branches/newcompiler/PyASM/test/call.py branches/newcompiler/PyASM/test/call_return.py branches/newcompiler/PyASM/test/class_simple.py branches/newcompiler/PyASM/test/constants.py branches/newcompiler/PyASM/test/exception.py branches/newcompiler/PyASM/test/for.py branches/newcompiler/PyASM/test/generator.py branches/newcompiler/PyASM/test/generator_comprehension.py branches/newcompiler/PyASM/test/generator_finally.py branches/newcompiler/PyASM/test/generator_state.py branches/newcompiler/PyASM/test/generator_state2.py branches/newcompiler/PyASM/test/import.py branches/newcompiler/PyASM/test/import_from.py branches/newcompiler/PyASM/test/import_star.py branches/newcompiler/PyASM/test/list.py branches/newcompiler/PyASM/test/list_comprehension.py branches/newcompiler/PyASM/test/print.py branches/newcompiler/PyASM/test/return.py branches/newcompiler/PyASM/test/simple_decorator.py branches/newcompiler/PyASM/test/simple_decorator2.py branches/newcompiler/PyASM/test/simple_decorator_scopes.py branches/newcompiler/PyASM/test/simple_decorator_scopes1.py branches/newcompiler/PyASM/test/simple_decorator_scopes2.py branches/newcompiler/PyASM/test/simple_func.py branches/newcompiler/PyASM/test/strings.py branches/newcompiler/PyASM/test/try.py branches/newcompiler/PyASM/test/try_except.py branches/newcompiler/PyASM/test/try_finally.py branches/newcompiler/PyASM/test/try_finally_function.py branches/newcompiler/PyASM/test/varargs.py branches/newcompiler/PyASM/test/while.py branches/newcompiler/PyASM/test/with.py branches/newcompiler/PyASM/test.py branches/newcompiler/src/org/python/newcompiler/asm/ branches/newcompiler/src/org/python/newcompiler/asm/OffsetTracer.java branches/newcompiler/src/org/python/newcompiler/pyasm/BytecodeError.java branches/newcompiler/src/org/python/newcompiler/pyasm/BytecodeVisitor.java branches/newcompiler/src/org/python/newcompiler/pyasm/ConstantStore.java branches/newcompiler/src/org/python/newcompiler/pyasm/util/ branches/newcompiler/src/org/python/newcompiler/pyasm/util/CodeAdapter.java branches/newcompiler/src/org/python/newcompiler/pyasm/util/PythonDis.java branches/newcompiler/src/org/python/newcompiler/pyasm/util/SimpleConstantStore.java Added: branches/newcompiler/PyASM/marshal.py =================================================================== --- branches/newcompiler/PyASM/marshal.py (rev 0) +++ branches/newcompiler/PyASM/marshal.py 2007-08-20 18:11:16 UTC (rev 3440) @@ -0,0 +1,469 @@ +"""Marshal module written in Python. + +Written by Tobias Ivarsson <to...@th...> for the Jython project. + +""" + +__all__ = ('dump','dumps','load','loads',) + +from StringIO import StringIO +import string +import struct +from types import *#NoneType, EllipsisType, CodeType +from org.python.newcompiler.pyasm import CodeReader +from org.python.newcompiler.pyasm.util import PythonDis +from pyasm import ASMVisitor as CodeVisitor +from jarray import array +from java.io import PrintWriter +from java.lang.System import out +stdout = PrintWriter(out) +try: + import new +except ImportError: + new = None + +def byteArray(string): + return array(list(string),'c') + +# marshal types +mappings = dict( + TYPE_NULL = ('0', 0), + TYPE_NONE = ('N', NoneType), + TYPE_FALSE = ('F', 0), + TYPE_TRUE = ('T', 0), + TYPE_STOPITER = ('S', 0), + TYPE_ELLIPSIS = ('.', EllipsisType), + TYPE_INT = ('i', int), + TYPE_INT64 = ('I', 0), + TYPE_FLOAT = ('f', float), + TYPE_BINARY_FLOAT = ('g', 0), + TYPE_COMPLEX = ('x', complex), + TYPE_BINARY_COMPLEX = ('y', 0), + TYPE_LONG = ('l', long), + TYPE_STRING = ('s', str), + TYPE_INTERNED = ('t', 0), + TYPE_STRINGREF = ('R', 0), + TYPE_TUPLE = ('(', tuple), + TYPE_LIST = ('[', list), + TYPE_DICT = ('{', dict), + TYPE_CODE = ('c', CodeType), + TYPE_UNICODE = ('u', unicode), + TYPE_UNKNOWN = ('?', 0), + TYPE_SET = ('<', set), + TYPE_FROZENSET = ('>', frozenset), + ) + +class Marshaller: + + dispatch = {} + + def __init__(self, f): + self.f = f + + def dump(self, x): + self.dispatch[type(x)](self, x) + + def w_long64(self, x): + self.w_long(x) + self.w_long(x>>32) + + def w_long(self, x): + write = self.f.write + write(chr((x) & 0xff)) + write(chr((x>> 8) & 0xff)) + write(chr((x>>16) & 0xff)) + write(chr((x>>24) & 0xff)) + + def w_short(self, x): + write = self.f.write + write(chr((x) & 0xff)) + write(chr((x>> 8) & 0xff)) + + def dump_none(self, x): + self.f.write(TYPE_NONE) + dispatch[NoneType] = dump_none + + def dump_bool(self, x): + if x: + self.f.write(TYPE_TRUE) + else: + self.f.write(TYPE_FALSE) + dispatch[BooleanType] = dump_bool + + def dump_ellipsis(self, x): + self.f.write(TYPE_ELLIPSIS) + try: + dispatch[EllipsisType] = dump_ellipsis + except NameError: + pass + + def dump_int(self, x): + y = x>>31 + if y and y != -1: + self.f.write(TYPE_INT64) + self.w_long64(x) + else: + self.f.write(TYPE_INT) + self.w_long(x) + dispatch[IntType] = dump_int + + def dump_long(self, x): + self.f.write(TYPE_LONG) + sign = 1 + if x < 0: + sign = -1 + x = -x + digits = [] + while x: + digits.append(x & 0x7FFF) + x = x>>15 + self.w_long(len(digits) * sign) + for d in digits: + self.w_short(d) + dispatch[LongType] = dump_long + + def dump_float(self, x): + write = self.f.write + write(TYPE_FLOAT) + s = `x` + write(chr(len(s))) + write(s) + dispatch[FloatType] = dump_float + + def dump_complex(self, x): + write = self.f.write + write(TYPE_COMPLEX) + s = `x.real` + write(chr(len(s))) + write(s) + s = `x.imag` + write(chr(len(s))) + write(s) + try: + dispatch[ComplexType] = dump_complex + except NameError: + pass + + def dump_string(self, x): + self.f.write(TYPE_STRING) + self.w_long(len(x)) + self.f.write(x) + dispatch[StringType] = dump_string + + def dump_tuple(self, x): + self.f.write(TYPE_TUPLE) + self.w_long(len(x)) + for item in x: + self.dump(item) + dispatch[TupleType] = dump_tuple + + def dump_list(self, x): + self.f.write(TYPE_LIST) + self.w_long(len(x)) + for item in x: + self.dump(item) + dispatch[ListType] = dump_list + + def dump_dict(self, x): + self.f.write(TYPE_DICT) + for key, value in x.items(): + self.dump(key) + self.dump(value) + self.f.write(TYPE_NULL) + dispatch[DictionaryType] = dump_dict + + def dump_code(self, x): + self.f.write(TYPE_CODE) + self.w_short(x.co_argcount) + self.w_short(x.co_nlocals) + self.w_short(x.co_stacksize) + self.w_short(x.co_flags) + self.dump(x.co_code) + self.dump(x.co_consts) + self.dump(x.co_names) + self.dump(x.co_varnames) + self.dump(x.co_filename) + self.dump(x.co_name) + self.w_short(x.co_firstlineno) + self.dump(x.co_lnotab) + try: + dispatch[CodeType] = dump_code + except NameError: + pass + + +class NULL: + pass + +class Unmarshaller: + + def __init__(self, f, magic=None): + self.magic = magic + self.strings = [] + self.__visitor = None + self.f = f + + def load(self): + ident = self.f.read(1) + if not ident: + raise EOFError + return self.dispatch[ident](self) + + def read_long(self): + a = long( self.read_byte() ) + b = long( self.read_byte() ) + c = long( self.read_byte() ) + d = long( self.read_byte() ) + res = a | (b<<8) | (c<<16) | (d<<24) + if res & 0x80000000 and res > 0: + res = res - 0x100000000L + return int(res) + + def read_long64(self): + a = long( self.read_byte() ) + b = long( self.read_byte() ) + c = long( self.read_byte() ) + d = long( self.read_byte() ) + e = long( self.read_byte() ) + f = long( self.read_byte() ) + g = long( self.read_byte() ) + h = long( self.read_byte() ) + res = a | (b<<8) | (c<<16) | (d<<24) + res |= (e<<32) | (f<<40) | (g<<48) | (h<<56) + if res & (0x8<<60L) and res > 0: + res = res - (1<<64L) + return res + + def read_short(self): + lo = self.read_byte() + hi = self.read_byte() + res = lo | (hi<<8) + if res & 0x8000: + res = res - 0x10000 + return res + + def read_byte(self): + res = self.f.read(1) + if not res: + raise EOFError + return ord(res) + + def read_string(self, size): + res = self.f.read(size) + if len(res) != size: + raise EOFError + return res + + def load_null(self): + return NULL + + def load_none(self): + return None + + def load_false(self): + return False + + def load_true(self): + return True + + def load_stopiter(self): + return StopIteration + + def load_ellipsis(self): + return Ellipsis + + def load_int(self): + return self.read_long() + + def load_int64(self): + return self.read_long64() + + def load_float(self): + size = self.read_byte() + return string.atof( self.read_string(size) ) + + def load_binary_float(self): + # There is a bug in the Jython struct module, it produces and reads + # packed strings reversed. This method compensates for that. + def reverse(lizt): + while lizt: + yield lizt.pop() + data = "".join(reverse(list(self.read_string(8)))) + # had the struct module woked correctly, this would just be a matter of + # data = self.read_string(8) + return struct.unpack('d', data)[0] + + def load_complex(self): + real = self.load_float() + imag = self.load_float() + return complex(real, imag) + + def load_binary_complex(self): + real = self.load_binary_float() + imag = self.load_binary_float() + return complex(real, imag) + + def load_long(self): + size = self.read_long() + sign = 1 + if size < 0: + sign = -1 + size = -size + res = 0L + for i in xrange(size): + x = self.read_short() + res = res | (x<<(i*15L)) + return res * sign + + def load_string(self): + size = self.read_long() + return self.read_string(size) + + def load_interned(self): + string = self.load_string() + self.strings.append(string) + return string + + def load_stringref(self): + return self.strings[self.read_long()] + + def load_tuple(self): + return tuple(self.load_list()) + + def load_list(self): + size = self.read_long() + res = [] + for i in xrange(size): + res.append(self.load()) + return res + + def load_dict(self): + res = {} + while True: + key = self.load() + if key is NULL: + break + value = self.load() + res[key] = value + return res + + + def load_code(self): + lastVisitor = self.__visitor + visitor= _visitor= self.__visitor= CodeVisitor(self.magic, lastVisitor) + #visitor = PythonDis(visitor, stdout, False) + try: + argcount = self.read_long() + nlocals = self.read_long() + stacksize = self.read_long() + flags = self.read_long() + code = self.load() + constants = self.load() + names = self.load() + varnames = self.load() + freevars = self.load() + cellvars = self.load() + filename = self.load() + name = self.load() + firstlineno = self.read_long() + lnotab = self.load() + + visitor.visitCode( + argcount, + nlocals, + stacksize, + flags, + constants, + names, + varnames, + freevars, + cellvars, + filename, + name, + firstlineno,) + CodeReader(byteArray(code), firstlineno, + byteArray(lnotab)).accept(visitor) + + return _visitor.getCode() + finally: + self.__visitor = lastVisitor + + def load_unicode(self): + size = self.read_long() + return EncodedFile(StringIO(self.read_string(size)),'utf8').read() + + def load_unknown(self): + raise TypeError("Unknown type in unmarshalling") + + def load_set(self): + return set(self.load_list()) + + def load_frozenset(self): + return frozenset(self.load_list()) + + dispatch=dict([(i,locals()['load'+n[4:].lower()]) for n,(i,t) in mappings.items()]) + + + def load(self): + c = self.f.read(1) + if not c: + raise EOFError + return self.dispatch[c](self) + + + def r_short(self): + read = self.f.read + lo = ord(read(1)) + hi = ord(read(1)) + x = lo | (hi<<8) + if x & 0x8000: + x = x - 0x10000 + return x + + def r_long(self): + read = self.f.read + a = ord(read(1)) + b = ord(read(1)) + c = ord(read(1)) + d = ord(read(1)) + x = a | (b<<8) | (c<<16) | (d<<24) + if x & 0x80000000 and x > 0: + x = string.atoi(x - 0x100000000L) + return x + + def r_long64(self): + a = self.r_long() + b = self.r_long() + return a | (b<<32) + + +def dump(x, f): + Marshaller(f).dump(x) + +def load(f): + return Unmarshaller(f).load() + +def dumps(x): + f = StringIO() + dump(x, f) + return f.getvalue() + +def loads(s): + f = StringIO(s) + return load(f) + +def _makeModule(code): + # TODO + return code + +def _readPyc(filename): + f = open(filename, 'rb') + def read(): + return ord(f.read(1)) + magic = read() | (read()<<8) + if not ( f.read(1) == '\r' and f.read(1) == '\n' ): + raise TypeError("The file is not a valid pyc file.") + mtime = read() | (read()<<8) | (read()<<16) | (read()<<24) + # TODO: when this is used for loading, the mtime needs to be considered. + return _makeModule( Unmarshaller(f, magic=magic).load() ) + Added: branches/newcompiler/PyASM/opcode.py =================================================================== --- branches/newcompiler/PyASM/opcode.py (rev 0) +++ branches/newcompiler/PyASM/opcode.py 2007-08-20 18:11:16 UTC (rev 3440) @@ -0,0 +1,185 @@ + +""" +opcode module - potentially shared between dis and other modules which +operate on bytecodes (e.g. peephole optimizers). +""" + +__all__ = ["cmp_op", "hasconst", "hasname", "hasjrel", "hasjabs", + "haslocal", "hascompare", "hasfree", "opname", "opmap", + "HAVE_ARGUMENT", "EXTENDED_ARG"] + +cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', + 'is not', 'exception match', 'BAD') + +hasconst = [] +hasname = [] +hasjrel = [] +hasjabs = [] +haslocal = [] +hascompare = [] +hasfree = [] + +opmap = {} +opname = [''] * 256 +for op in range(256): opname[op] = '<%r>' % (op,) +del op + +def def_op(name, op): + opname[op] = name + opmap[name] = op + +def name_op(name, op): + def_op(name, op) + hasname.append(op) + +def jrel_op(name, op): + def_op(name, op) + hasjrel.append(op) + +def jabs_op(name, op): + def_op(name, op) + hasjabs.append(op) + +# Instruction opcodes for compiled code +# Blank lines correspond to available opcodes + +def_op('STOP_CODE', 0) +def_op('POP_TOP', 1) +def_op('ROT_TWO', 2) +def_op('ROT_THREE', 3) +def_op('DUP_TOP', 4) +def_op('ROT_FOUR', 5) + +def_op('NOP', 9) +def_op('UNARY_POSITIVE', 10) +def_op('UNARY_NEGATIVE', 11) +def_op('UNARY_NOT', 12) +def_op('UNARY_CONVERT', 13) + +def_op('UNARY_INVERT', 15) + +def_op('LIST_APPEND', 18) +def_op('BINARY_POWER', 19) +def_op('BINARY_MULTIPLY', 20) +def_op('BINARY_DIVIDE', 21) +def_op('BINARY_MODULO', 22) +def_op('BINARY_ADD', 23) +def_op('BINARY_SUBTRACT', 24) +def_op('BINARY_SUBSCR', 25) +def_op('BINARY_FLOOR_DIVIDE', 26) +def_op('BINARY_TRUE_DIVIDE', 27) +def_op('INPLACE_FLOOR_DIVIDE', 28) +def_op('INPLACE_TRUE_DIVIDE', 29) +def_op('SLICE+0', 30) +def_op('SLICE+1', 31) +def_op('SLICE+2', 32) +def_op('SLICE+3', 33) + +def_op('STORE_SLICE+0', 40) +def_op('STORE_SLICE+1', 41) +def_op('STORE_SLICE+2', 42) +def_op('STORE_SLICE+3', 43) + +def_op('DELETE_SLICE+0', 50) +def_op('DELETE_SLICE+1', 51) +def_op('DELETE_SLICE+2', 52) +def_op('DELETE_SLICE+3', 53) + +def_op('INPLACE_ADD', 55) +def_op('INPLACE_SUBTRACT', 56) +def_op('INPLACE_MULTIPLY', 57) +def_op('INPLACE_DIVIDE', 58) +def_op('INPLACE_MODULO', 59) +def_op('STORE_SUBSCR', 60) +def_op('DELETE_SUBSCR', 61) +def_op('BINARY_LSHIFT', 62) +def_op('BINARY_RSHIFT', 63) +def_op('BINARY_AND', 64) +def_op('BINARY_XOR', 65) +def_op('BINARY_OR', 66) +def_op('INPLACE_POWER', 67) +def_op('GET_ITER', 68) + +def_op('PRINT_EXPR', 70) +def_op('PRINT_ITEM', 71) +def_op('PRINT_NEWLINE', 72) +def_op('PRINT_ITEM_TO', 73) +def_op('PRINT_NEWLINE_TO', 74) +def_op('INPLACE_LSHIFT', 75) +def_op('INPLACE_RSHIFT', 76) +def_op('INPLACE_AND', 77) +def_op('INPLACE_XOR', 78) +def_op('INPLACE_OR', 79) +def_op('BREAK_LOOP', 80) +def_op('WITH_CLEANUP', 81) +def_op('LOAD_LOCALS', 82) +def_op('RETURN_VALUE', 83) +def_op('IMPORT_STAR', 84) +def_op('EXEC_STMT', 85) +def_op('YIELD_VALUE', 86) +def_op('POP_BLOCK', 87) +def_op('END_FINALLY', 88) +def_op('BUILD_CLASS', 89) + +HAVE_ARGUMENT = 90 # Opcodes from here have an argument: + +name_op('STORE_NAME', 90) # Index in name list +name_op('DELETE_NAME', 91) # "" +def_op('UNPACK_SEQUENCE', 92) # Number of tuple items +jrel_op('FOR_ITER', 93) + +name_op('STORE_ATTR', 95) # Index in name list +name_op('DELETE_ATTR', 96) # "" +name_op('STORE_GLOBAL', 97) # "" +name_op('DELETE_GLOBAL', 98) # "" +def_op('DUP_TOPX', 99) # number of items to duplicate +def_op('LOAD_CONST', 100) # Index in const list +hasconst.append(100) +name_op('LOAD_NAME', 101) # Index in name list +def_op('BUILD_TUPLE', 102) # Number of tuple items +def_op('BUILD_LIST', 103) # Number of list items +def_op('BUILD_MAP', 104) # Always zero for now +name_op('LOAD_ATTR', 105) # Index in name list +def_op('COMPARE_OP', 106) # Comparison operator +hascompare.append(106) +name_op('IMPORT_NAME', 107) # Index in name list +name_op('IMPORT_FROM', 108) # Index in name list + +jrel_op('JUMP_FORWARD', 110) # Number of bytes to skip +jrel_op('JUMP_IF_FALSE', 111) # "" +jrel_op('JUMP_IF_TRUE', 112) # "" +jabs_op('JUMP_ABSOLUTE', 113) # Target byte offset from beginning of code + +name_op('LOAD_GLOBAL', 116) # Index in name list + +jabs_op('CONTINUE_LOOP', 119) # Target address +jrel_op('SETUP_LOOP', 120) # Distance to target address +jrel_op('SETUP_EXCEPT', 121) # "" +jrel_op('SETUP_FINALLY', 122) # "" + +def_op('LOAD_FAST', 124) # Local variable number +haslocal.append(124) +def_op('STORE_FAST', 125) # Local variable number +haslocal.append(125) +def_op('DELETE_FAST', 126) # Local variable number +haslocal.append(126) + +def_op('RAISE_VARARGS', 130) # Number of raise arguments (1, 2, or 3) +def_op('CALL_FUNCTION', 131) # #args + (#kwargs << 8) +def_op('MAKE_FUNCTION', 132) # Number of args with default values +def_op('BUILD_SLICE', 133) # Number of items +def_op('MAKE_CLOSURE', 134) +def_op('LOAD_CLOSURE', 135) +hasfree.append(135) +def_op('LOAD_DEREF', 136) +hasfree.append(136) +def_op('STORE_DEREF', 137) +hasfree.append(137) + +def_op('CALL_FUNCTION_VAR', 140) # #args + (#kwargs << 8) +def_op('CALL_FUNCTION_KW', 141) # #args + (#kwargs << 8) +def_op('CALL_FUNCTION_VAR_KW', 142) # #args + (#kwargs << 8) +def_op('EXTENDED_ARG', 143) +EXTENDED_ARG = 143 + +del def_op, name_op, jrel_op, jabs_op Added: branches/newcompiler/PyASM/pyasm.py =================================================================== --- branches/newcompiler/PyASM/pyasm.py (rev 0) +++ branches/newcompiler/PyASM/pyasm.py 2007-08-20 18:11:16 UTC (rev 3440) @@ -0,0 +1,1852 @@ +# Open issues: +# * Line number reporting on exceptions does not wor, jython uses a separate +# system for line numbers, and not javas debug-info. It should be possible +# to replace this though. + +import opcode, re +try: + from org.python.newcompiler.pyasm import BytecodeVisitor as Visitor,\ + Operator, CodeFlags as Flags + from org.python.newcompiler.asm import OffsetTracer, InlineingClassVisitor + from org.python.core.BytecodeLoader import makeCode + from org.objectweb import asm + from org.objectweb.asm import Type, Opcodes as Op + from org.objectweb.asm.commons import GeneratorAdapter, Method,\ + TableSwitchGenerator + from org.objectweb.asm.tree import analysis + from org.python import core + from jarray import array + import java + from java.io import PrintWriter + from java.lang.System import out + stdout = PrintWriter(out) +except: + # mock code to be able to import the module from CPython, an easy way + # to compile it... + Visitor = object + class ArrantPrac(object): + def __getattr__(self,attr): + return self + Operator = Method = Type = java = core = ArrantPrac() + mirror = lambda *x: x + Type.getObjectType = mirror + Type.getType = mirror + Method.getMethod = mirror + TableSwitchGenerator = object + + del ArrantPrac + +def printFlags(flags): + for id in dir(Flags): + flag = getattr(Flags,id) + if flag & flags == flag: + print id, hex(flag) + flags ^= flag + return flags + +def reallyContains(dct, item): + if item in dct: + keys = list(dct.keys()) + return item is keys[keys.index(item)] + return False + +def getType(clazz): + if isinstance(clazz,(str,unicode)): + return Type.getObjectType(clazz) + else: + return Type.getType(clazz) +def getArrayType(typ): + if not isinstance(typ,Type): + typ = getType(typ) + return Type.getType("[%s" % typ.getDescriptor()) + +def stringArray(*lst): + return array(lst,java.lang.String) + +pyObjectType = getType(object) +pyFrameType = getType(core.PyFrame) +pyCodeType = getType(core.PyCode) +pyType = getType(core.Py) +pySysType = getType(core.PySystemState) +pyExceptionType = getType(core.PyException) +pyBooleanType = getType(bool) +pyTupleType = getType(tuple) +pyListType = getType(list) +pyDictType = getType(dict) +pyStringType = getType(str) +pyBuiltin = getType(core.__builtin__) +imp = getType(core.imp) +compilerResources = getType(core.NewCompilerResources) +objectType = getType(java.lang.Object) +stringType = getType(java.lang.String) +throwableType = getType(java.lang.Throwable) + +class Switch(TableSwitchGenerator): + def __init__(self, generator): + self.__generator = generator + def generateCase(self, key, end): + self.__generator(key, end) + def generateDefault(self): + self.__generator(None, None) + +class CodeReference(object): + def __init__(self, name, index): + self.__name = name + self.index = index + + def getName(self): + return self.__name + + def __repr__(self): + return "CodeReference(%s, %s)" % (self.__name, self.index) + +magicNumbers = { + '1.5': 20121, + '1.5.1': 20121, + '1.5.2': 20121, + '1.6': 50428, + '2.0': 50823, + '2.0.1': 50823, + '2.1': 60202, + '2.1.1': 60202, + '2.1.2': 60202, + '2.2': 60717, + '2.3a0': 62011, + '2.3a0': 62021, + '2.3a0': 62011, # OBS! + '2.4a0': 62041, + '2.4a3': 62051, + '2.4b1': 62061, + '2.5a0': 62071, + '2.5a0': 62081, + '2.5a0': 62091, + '2.5a0': 62092, + '2.5b3': 62101, + '2.5b3': 62111, + '2.5c1': 62121, + '2.5c2': 62131, + '2.6a0': 62141, + } + +class ClassKeeper(object): + asType = property(lambda self: Type.getType( + "L%s;" % self.__name.replace('.','/'))) + def __init__(self, name): + self.__name = name + self.__cw = asm.ClassWriter(asm.ClassWriter.COMPUTE_MAXS + #+ asm.ClassWriter.COMPUTE_FRAMES + ) + self.cv = self.__cw + #self.cv = InlineingClassVisitor(self.cv) + #self.cv = asm.util.TraceClassVisitor(self.cv, stdout) + #self.cv = OffsetTracer(self.cv, stdout) + self.cv = asm.util.CheckClassAdapter(self.cv) + self.cv.visit(Op.V1_4, Op.ACC_PUBLIC, name, None, + "org/python/core/PyFunctionTable", + stringArray("org/python/core/PyRunnable")) + self.__filename = None + self.__const = 0 + self.__constantPool = {} + self.__complexConstants = {} + self.__constantOrder = [] + self.__func = 0 + self.__functionTable = [] + + self.clinit = GeneratorAdapter(Op.ACC_STATIC, Method.getMethod( + "void <clinit> ()"), None, None, self.cv) + self.clinit.visitCode() + self.init = GeneratorAdapter(Op.ACC_PUBLIC, Method.getMethod( + "void <init> (String)"), None, None, self.cv) + self.init.visitCode() + self.init.loadThis() + self.init.invokeConstructor(Type.getType(core.PyFunctionTable), + Method.getMethod("void <init> ()")) + + + def isCodeConstant(self, name): + return name in self.__functionTable + + def func2method(self, name): + if name == '?': + return 'main$code' + return name.replace('<','').replace('>','') + + def codeField(self, id, name): + return "%s$%s" % (self.func2method(name), id) + + def newFunction(self, name): + name = self.codeField(self.__func, name) + self.__functionTable.append(name) + self.__lastCode = CodeReference(name, self.__func) + self.__func += 1 + self.cv.visitField(Op.ACC_STATIC + Op.ACC_PRIVATE, + name, getType(core.PyCode).getDescriptor(), + None, None) + ## generate a field for the constants of the code object + #self.cv.visitField(Op.ACC_STATIC + Op.ACC_PUBLIC, name + "$co_consts", + # getArrayType(core.PyObject).getDescriptor(), + # None, None) + return GeneratorAdapter(Op.ACC_PRIVATE, Method.getMethod( + "org.python.core.PyObject %s (org.python.core.PyFrame)"%name), + None, None, self.cv) + + def getCodeReference(self): + return self.__lastCode + + def getConstant(self, value): + if value in self.__constantPool: + return self.__constantPool[value] + if isinstance(value,(list,dict,set)): + raise TypeError("PyASM cannot handle mutable constants (yet).") + if isinstance(value,(tuple,frozenset)): + parts = [] + for part in value: + if reallyContains(self.constants,part): + parts.append(part) + else: + parts.append(self.getConstant(part)) + self.__complexConstants[value] = parts + name = "c$$%s" % self.__const + self.__const += 1 + self.cv.visitField(Op.ACC_PRIVATE + Op.ACC_STATIC + Op.ACC_FINAL, + name, pyObjectType.getDescriptor(), None, None) + self.__constantPool[value] = name + self.__constantOrder.append(value) + return name + + def getCode(self, mainName): + self.generateSupport(mainName) + self.cv.visitEnd() + byteArray = self.__cw.toByteArray() + cn = asm.tree.ClassNode() + #asm.ClassReader(byteArray).accept(OffsetTracer(cn, stdout), 0) + #asm.ClassReader(byteArray).accept(cn, 0) + + error = False + + #analyzer = analysis.Analyzer(analysis.BasicInterpreter()) + analyzer = analysis.Analyzer(analysis.BasicVerifier()) + ###analyzer = analysis.Analyzer(analysis.SimpleVerifier()) + ###analyzer = analysis.Analyzer(analysis.SourceInterpreter()) + for m in cn.methods: + try: + analyzer.analyze(self.__name, m) + except analysis.AnalyzerException, ae: + print 'Error in "%s %s": %s' % (m.name, m.desc, ae) + mp = OffsetTracer.createTMV(len(str(m.instructions.size()))) + m.accept(mp) + getattr(mp,'print')( stdout ) + stdout.flush() + error = True + if error: + raise RuntimeError, "An error occured, see output" + + return makeCode(self.__name, byteArray, self.__filename) + + def setFilename(self, filename): + if self.__filename is not None: + assert filename == self.__filename + else: + self.__filename = filename + self.cv.visitSource(filename, None) + + def generateSupport(self, mainName): + self.initConstants() + + self.clinit.returnValue() + self.clinit.endMethod() + self.init.returnValue() + self.init.endMethod() + + getMain = GeneratorAdapter(Op.ACC_PUBLIC, Method.getMethod( + "org.python.core.PyCode getMain ()"), + None, None, self.cv) + getMain.visitCode() + getMain.getStatic(self.asType, mainName, pyCodeType) + getMain.returnValue() + getMain.endMethod() + + call_function = GeneratorAdapter( Op.ACC_PUBLIC, Method.getMethod( + "org.python.core.PyObject call_function (%s)" % ", ".join( + ['int', 'org.python.core.PyFrame'])), + None, None, self.cv) + call_function.visitCode() + call_function.loadThis() + call_function.loadArg(1) # the frame + call_function.loadArg(0) # the function id + def switch(key, end): + if key is not None: + call_function.invokeVirtual(self.asType, Method.getMethod( + "org.python.core.PyObject %s (org.python.core.PyFrame)" + % self.__functionTable[key])) + call_function.returnValue() + else: + call_function.visitInsn(Op.ACONST_NULL) + call_function.returnValue() + call_function.tableSwitch(range(self.__func), Switch(switch)) + call_function.endMethod() + + constants = { + None: ("None", pyObjectType), + False: ("False", pyBooleanType), + True: ("True", pyBooleanType), + StopIteration: ("StopIteration", pyObjectType), + Ellipsis: ("Ellipsis", pyObjectType), + (): ("EmptyTuple", pyTupleType), + "": ("EmptyString", pyStringType), + } + __compositTypes = { + tuple: pyTupleType, + list: pyListType, + dict: pyDictType, + set: pyTupleType, + frozenset: pyTupleType, + } + __compositConstructor = Method.getMethod( + "void <init> (org.python.core.PyObject[])") + __setConstructor = Method.getMethod( + "void <init> (org.python.core.PyObject)") + __constantFactory = { + int: Method.getMethod( + "org.python.core.PyObject newInteger (long)"), + float: Method.getMethod( + "org.python.core.PyFloat newFloat (double)"), + str: Method.getMethod( + "org.python.core.PyString newString (String)"), + unicode: Method.getMethod( + "org.python.core.PyUnicode newUnicode (String)"), + } + def initConstants(self): + # Possible constants that marshal loads: + # NULL - raise error, not valid outside of marshal + # None - simple singleton => can even be optimized at load time + # boolean values: True/False - simple singleton + # StopIteration - simple singleton + # Ellipsis - simple singleton + # int - immutable + # float - immutable + # complex - immutable + # long - immutable + # string - immutable + # unicode - immutable + # code - allready in place... + # tuple - build from other constants + # list - !MUTABLE! - build from other constants + # dict - !MUTABLE! - build from other constants + # set - !MUTABLE! - build from other constants + # frozenset - build from other constants + for value in self.__constantOrder: + name = self.__constantPool[value] + if reallyContains(self.constants, value): + raise ValueError("Constant %s:%s slipped through!" % + (name,value)) + if type(value) in self.__compositTypes: + if isinstance(value, (set,frozenset)): + self.clinit.newInstance(getType(type(value))) + self.clinit.dup() + self.clinit.newInstance(self.__compositTypes[type(value)]) + self.clinit.dup() + self.clinit.push(java.lang.Integer(len(value))) + self.clinit.newArray(pyObjectType) + i = 0 + for part in self.__complexConstants[value]: + self.clinit.dup() # array + self.clinit.push(java.lang.Integer(i)) # index + if reallyContains(self.constants, part): + partName, partType = self.constants[part] + self.clinit.getStatic(pyType, partName, partType) + else: + self.clinit.getStatic(self.asType, part, pyObjectType) + self.clinit.arrayStore(pyObjectType) # store + i += 1 + self.clinit.invokeConstructor( + self.__compositTypes[type(value)], + self.__compositConstructor) + if isinstance(value, (set,frozenset)): + self.clinit.invokeConstructor(getType(type(value)), + self.__setConstructor) + elif isinstance(value, complex): + self.clinit.newInstance(getType(complex)) + self.clinit.dup() + self.clinit.push(value.real) + self.clinit.push(value.imag) + self.clinit.invokeConstructor( + getType(complex), Method.getMethod( + "void <init> (double, double)")) + elif isinstance(value, long): + self.clinit.push(str(value)) + self.clinit.invokeStatic(pyType, Method.getMethod( + "org.python.core.PyObject newLong (String)")) + elif type(value) in self.__constantFactory: + self.clinit.push(value) + self.clinit.invokeStatic( + pyType, self.__constantFactory[type(value)]) + else: + raise TypeError("Invalid constant type %s (%s)" % + (type(value), value)) + self.clinit.putStatic(self.asType, name, pyObjectType) + + +class Block(object): + def __init__(self, asm, stackSize=0, *stateVariables): + self.asm = asm + self.stackSize = stackSize + self.stateVariables = stateVariables + nestingStackSize = property(lambda self: self.stackSize) + def end(self): + """Called when the block scope ends.""" + for variable in self.stateVariables: + variable.end() + def exit(self,hasState=None): + """Called when a return, yeild, continue or break instruction + terminates the block. + hasState is True when there is a variable on the stack""" + return False + def loadState(self): + """load the stack state that this block has persisted into variables + onto the stack.""" + pass + def storeState(self): + """store the stack state that this block persists into variables from + the stack into the persistance variables.""" + pass + def exclude(self,start,end): + pass + +class LoopBlock(Block): + def __init__(self, asm, endLabel): + # endLabel is an ASM label + Block.__init__(self, asm) + self.endLabel = endLabel + def end(self): + #self.asm.visitLabel(self.endLabel) + Block.end(self) + +class ForBlock(Block): + def __init__(self, asm): + Block.__init__(self, asm, 1) + def exit(self, hasState=None): + self.asm.pop() # pop the iterator from the stack. + return Block.exit(self, hasState) + +class TryBlock(Block): + def __init__(self, asm, catch, endLabel, handlerBlock, stackPersistence, + stackSize=0, *stateVariables): + # endLabel is an ASM label + Block.__init__(self, asm, stackSize, *stateVariables) + self.__catch = catch + self.endLabel = endLabel + self.handlerBlock = handlerBlock + self.__stackPersistence = stackPersistence + surroundingStackSize = property(lambda self: len(self.__stackPersistence)) + nestingStackSize = property(lambda self: (self.stackSize - + self.surroundingStackSize)) + def end(self): + self.asm.visitLabel(self.endLabel) + Block.end(self) + def endVariables(self): + for variable in self.__stackPersistence: + variable.end() + def loadState(self): + for variable in self.__stackPersistence: + variable.load() + def storeState(self): + for i in xrange(len(self.__stackPersistence) -1,-1,-1): + variable = self.__stackPersistence[i] + variable.store() + def exclude(self, start, end): + self.__catch.exclude(start, end) + +class HandlerBlock(Block): + def __init__(self, asm, sourceBlock, stackSize=0, *stateVariables): + Block.__init__(self, asm, stackSize, *stateVariables) + self.sourceBlock = sourceBlock + def end(self): + self.sourceBlock.loadState() + self.sourceBlock.endVariables() + +class TryExceptBlock(TryBlock): + def __init__(self, asm, catch, endLabel, stackPersistence): + # endLabel is an ASM label + TryBlock.__init__( + self, asm, catch, endLabel, ExceptBlock(asm, self), + stackPersistence) + def end(self): + TryBlock.end(self) + self.loadState() + +class ExceptBlock(HandlerBlock): + def __init__(self, asm, sourceBlock): + HandlerBlock.__init__(self, asm, sourceBlock, 3) + def end(self): + """stack is: ... exc_traceback exc_value exc_type""" + self.asm.dupX2() + self.asm.pop() + self.asm.swap() + self.asm.invokeStatic(pyType, Method.getMethod( + "org.python.core.PyException makeException (%s)" % ", ".join([ + "org.python.core.PyObject"]*3))) + self.asm.throwException() + HandlerBlock.end(self) + +class TryFinallyBlock(TryBlock): + def __init__(self, asm, catch, endLabel, handlerLabel, afterLabel, + retVariable, stackPersistence): + # Labels are ASM labels + TryBlock.__init__( + self, asm, catch, endLabel, + FinallyBlock(asm,self,afterLabel,retVariable), + stackPersistence, 0, retVariable) + self.handlerLabel = handlerLabel + retVariable = property(lambda self: self.handlerBlock.retVariable) + resumeLabels = property(lambda self: self.handlerBlock.resumeLabels) + def end(self): + self.exit(False) + TryBlock.end(self) + def exit(self,hasState=True): + """hasState is True if there is a (return-) variable on the stack.""" + self.asm.push(java.lang.Integer(len(self.resumeLabels))) + self.retVariable.store() + if not hasState: + self.asm.visitInsn(Op.ACONST_NULL) + label = self.asm.newLabel() + self.resumeLabels.append(label) + self.asm.goTo(self.handlerLabel) + self.asm.visitLabel(label) + if not hasState: + self.asm.pop() + return True + +class FinallyBlock(HandlerBlock): + def __init__(self, asm, sourceBlock, afterLabel, retVariable): + HandlerBlock.__init__(self, asm, sourceBlock, 1, retVariable) + self.afterLabel = afterLabel + self.retVariable = retVariable + self.resumeLabels = [] + nestingStackSize = property( + lambda self: self.stackSize - self.sourceBlock.surroundingStackSize) + def end(self): + throw = self.asm.newLabel() + if self.resumeLabels: + reRaise = self.asm.newLabel() + self.retVariable.load() + self.retVariable.end() + self.asm.visitTableSwitchInsn(0, len(self.resumeLabels)-1, reRaise, + array(self.resumeLabels, asm.Label)) + self.asm.visitLabel(reRaise) + self.asm.dup() + self.asm.instanceOf(throwableType) + self.asm.visitJumpInsn(Op.IFNE, throw) + self.asm.pop() + self.asm.goTo(self.afterLabel) + self.asm.visitLabel(throw) + self.asm.checkCast(throwableType) + self.asm.throwException() + self.asm.visitLabel(self.afterLabel) + HandlerBlock.end(self) + + +class LocalVariable(object): + def __init__(self, asm, varType, name): + self.asm = asm + self.varType = varType + self.name = name + varno = self.__varno = asm.newLocal(varType) + #start = self.__start = asm.newLabel() + #end = self.__end = asm.newLabel() + #asm.visitLabel(start) + def store(self): + self.asm.storeLocal(self.__varno, self.varType) + def load(self): + self.asm.loadLocal(self.__varno, self.varType) + def __iadd__(self, value): + self.asm.iinc(self.__varno, value) + def __int__(self): + return self.__varno + def end(self): + #self.asm.visitLabel(self.__end) + #self.asm.visitLocalVariable(self.name, self.varType.getDescriptor(), + # None,self.__start,self.__end,self.__varno) + pass + def ret(self): + self.asm.ret(self.__varno) + self.end() + +class TryCatch(object): + def __init__(self, start, end, handle, excType): + self.start = start + self.end = end + self.handle = handle + self.excType = excType + self.exclusions = [] + def exclude(self, start, end): + self.exclusions.append((start,end)) + def accept(self, asm): + start = self.start + for exStart, exEnd in self.exclusions: + asm.visitTryCatchBlock(start, exStart, self.handle, self.excType) + start = exEnd + asm.visitTryCatchBlock(start, self.end, self.handle, self.excType) + +class ASMVisitor(Visitor): + def __init__(self, magic, parent=None): # FIXME: change contract? + if magic is None: + magic = magicNumbers['2.5c2'] + self.__magic = magic + self.__blocks = [] + self.__parent = parent + if parent is None: + self.__class = ClassKeeper("MODULE") + else: + self.__class = parent.__class + self.__labels = {} + self.__codeSchedule = {} + self.__tryBlocks = [] + + def visitCode(self, argcount, nlocals, stacksize, flags, constants, names, + varnames, freevars, cellvars, filename, name, firstlineno): + # FIXME: change contract? + self.__argcount = argcount # long + self.__nlocals = nlocals # long -- ignored ? + self.__stacksize = stacksize # long -- ignored ? + self.__flags = flags # long + self.__constants = constants # (Py)Object[] - PyObject or coderef + self.__names = names # String[] + self.__varnames = list(varnames) # String[] + self.__freevars = list(freevars) # String[] + self.__cellvars = list(cellvars) # String[] + self.__filename = filename # String + self.__name = name # String + self.__firstlineno = firstlineno # long + + self.__class.setFilename(filename) + + self.asm = self.__class.newFunction(name) + self.asm.visitCode() + self.__code = self.__class.getCodeReference() + + def label(self, pyLabel=None): + if pyLabel is None: + return self.asm.newLabel() + elif pyLabel in self.__labels: + return self.__labels[pyLabel] + else: + label = self.asm.newLabel() + self.__labels[pyLabel] = label + return label + + def newLocal(self, varType, name): + return LocalVariable(self.asm, varType, name) + + def scheduleCode(self, label, code=None): + """Schedule a code generating function to be executed after visiting + a particular label. + If code is None, this method returns a decorator...""" + def addCode(code): + if label.visited: + raise RuntimeError("The label '%s' has already been visited." + " Cannot schedule code." % label) + self.__codeSchedule.setdefault(label, []).append(code) + if code is None: + return addCode + else: + addCode(code) + + def push(self, value): + if isinstance(value, int): + value = java.lang.Integer(value) + self.asm.push(value) + + def loadFrame(self): + self.asm.loadArg(0) + + + def getCode(self): # FIXME: change contract? + if self.__parent is None: + return self.__class.getCode(self.__code.getName()) + else: + return self.__code + + def getName(self, index): + return self.__names[index] + + def getVariableName(self, index): + return self.__varnames[index] + + def getOuterName(self, index): + if index < len(self.__cellvars): + return self.__cellvars[index] + else: + return self.__freevars[index - len(self.__cellvars)] + + def getConstant(self, index): + return self.__constants[index] + + binaryOperator = {Operator.ADD: '_add', + Operator.SUBTRACT: '_sub', + Operator.MULTIPLY: '_mul', + Operator.DIVIDE: '_div', + Operator.FLOOR_DIVIDE: '_floordiv', + Operator.TRUE_DIVIDE: '_truediv', + Operator.MODULO: '_mod', + Operator.POWER: '_pow', + Operator.LSHIFT: '_lshift', + Operator.RSHIFT: '_rshift', + Operator.AND: '_and', + Operator.OR: '_or', + Operator.XOR: '_xor', + Operator.SUBSCRIPT: '__getitem__',} + def visitBinaryOperator(self, operator): + """TOS1, TOS -- TOS1 op TOS""" + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "org.python.core.PyObject %s (org.python.core.PyObject)" % + self.binaryOperator[operator])) + + inplaceOperator = {Operator.ADD: '__iadd__', + Operator.SUBTRACT: '__isub__', + Operator.MULTIPLY: '__imul__', + Operator.DIVIDE: '__idiv__', + Operator.FLOOR_DIVIDE: '__ifloordiv__', + Operator.TRUE_DIVIDE: '__itruediv__', + Operator.MODULO: '__imod__', + Operator.POWER: '__ipow__', + Operator.LSHIFT: '__ilshift__', + Operator.RSHIFT: '__irshift__', + Operator.AND: '__iand__', + Operator.OR: '__ior__', + Operator.XOR: '__ixor__',} + def visitInplaceOperator(self, operator): + """ -- """ + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "org.python.core.PyObject %s (org.python.core.PyObject)" % + self.inplaceOperator[operator])) + + unaryOperator = {Operator.INVERT: '__invert__', + Operator.POSITIVE: '__pos__', + Operator.NEGATIVE: '__neg__', + Operator.NOT: '__not__', + Operator.CONVERT: '__repr__',} + def visitUnaryOperator(self, operator): + """value -- (op value)""" + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "org.python.core.PyObject %s ()" % + self.unaryOperator[operator])) + + compareOperator = {Operator.LESS_THAN: '_lt', + Operator.LESS_THAN_OR_EQUAL: '_le', + Operator.EQUAL: '_eq', + Operator.NOT_EQUAL: '_ne', + Operator.GREATER_THAN: '_gt', + Operator.GREATER_THAN_OR_EQUAL: '_ge', + Operator.IN: '_in', + Operator.NOT_IN: '_notin', + Operator.IS: '_is', + Operator.IS_NOT: '_isnot',} + def visitCompareOperator(self, operator): + """element, element -- bool""" + if operator == Operator.EXCEPTION_MATCH: + self.asm.swap() + self.asm.invokeStatic(pyType, Method.getMethod( + "org.python.core.PyException makeException (%s)"%", ".join( + ['org.python.core.PyObject']))) + self.asm.swap() + self.asm.invokeStatic(pyType, Method.getMethod( + "boolean matchException (%s)" % ", ".join( + ['org.python.core.PyException', + 'org.python.core.PyObject']))) + self.asm.invokeStatic(pyType, Method.getMethod( + "org.python.core.PyBoolean newBoolean (boolean)")) + else: + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "org.python.core.PyObject %s (org.python.core.PyObject)" % + self.compareOperator[operator])) + + def visitBuildClass(self): + """name, bases, dict -- class""" + sequenceType = getType(core.PySequenceList) + bases = self.newLocal(getArrayType(pyObjectType), "bases") + dict = self.newLocal(pyObjectType, "dict") + dict.store() + self.asm.checkCast(sequenceType) + self.asm.invokeVirtual(sequenceType, Method.getMethod( + "org.python.core.PyObject[] getArray ()")) + bases.store() + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "String toString ()")) + bases.load(); bases.end() + dict.load(); dict.end() + self.asm.invokeStatic(compilerResources, Method.getMethod( + "org.python.core.PyObject makeClass (%s)" % ", ".join( + ["String", "org.python.core.PyObject[]", + "org.python.core.PyObject"]))) + + def buildArray(self, size, array): + """helper method for buildSequence. + Expects `size` elements on the stack, produces an array, + returns the local value index for the array (NOT on stack)""" + # store the values in the array + for i in range(size -1,-1,-1): + array.load() + self.asm.swap() + self.push(i) + self.asm.swap() + self.asm.arrayStore(pyObjectType) + + def visitUnpackSequence(self, count): + """sequence -- (element, )*count""" + sequenceType = getType(core.PySequenceList) + self.asm.checkCast(sequenceType) # FIXME: could generate better error + self.asm.dup() + self.asm.invokeVirtual(sequenceType, Method.getMethod( + "int size ()")) + self.push(count) + ok = self.label() + self.asm.ifICmp(self.asm.EQ, ok) + self.push("Incompatible lengths for unpack") + self.asm.invokeStatic(pyType, Method.getMethod( + "org.python.core.PyException ValueError (String)")) + self.asm.throwException() + self.asm.visitLabel(ok) + method = Method.getMethod("org.python.core.PyObject pyget (int)") + sequence = self.newLocal(sequenceType, "sequence") + sequence.store() + for i in range(count -1, -1, -1): + sequence.load() + self.push(i) + self.asm.invokeVirtual(sequenceType, method) + sequence.end() + + def buildSequence(self, seqType, size): + """helper method for BuildTuple and BuildList""" + # create an array + self.push(size) + self.asm.newArray(pyObjectType) + # store it for reference + array = self.newLocal(getArrayType(pyObjectType),"array") + array.store() + self.buildArray(size, array) + # create a PyList/PyTuple from the array + self.asm.newInstance(seqType) + self.asm.dup() + array.load() + array.end() + self.asm.invokeConstructor(seqType, Method.getMethod( + "void <init> (org.python.core.PyObject[])")) + + def visitBuildTuple(self, size): + """(element,) * size -- tuple""" + self.buildSequence(getType(core.PyTuple), size) + + def visitBuildList(self, size): + """(element,) * size -- list""" + self.buildSequence(getType(core.PyList), size) + + def visitBuildMap(self, zero): + """ -- dict""" + assert zero == 0 + self.asm.newInstance(pyDictType) + self.asm.dup() + self.asm.invokeConstructor(Type.getType(core.PyDictionary), + Method.getMethod("void <init> ()")) + + def visitBuildSlice(self, numargs): + """start, stop[, step] -- slice""" + if numargs == 3: + pass + elif numargs == 2: + self.push(None) + #elif numargs == 1: + # self.push(None) + # self.asm.swap() + # self.push(None) + else: + raise TypeError("Can only build slices from 2 or 3 arguments.") + #start = self.newLocal(pyObjectType,"start") + #stop = self.newLocal(pyObjectType,"stop") + #step = self.newLocal(pyObjectType,"step") + #step.store() + #stop.store() + #start.store() + step = self.newLocal(pyObjectType,"step") + step.store() + self.asm.newInstance(Type.getType(core.PySlice)) + self.asm.dup() + self.asm.dup2X2() + self.asm.pop() + self.asm.pop() + #start.load() + #stop.load() + step.load() + #start.end() + #stop.end() + step.end() + self.asm.invokeConstructor( + Type.getType(core.PySlice), Method.getMehtod( + "void <init> (%s)" % ", ".join(["org.python.core.PyObject"]*3))) + + def setupCallParameters(self, num_pos, num_keyword, arguments, keywords): + """helper for the various CallFunction methods.""" + for i in range(num_keyword -1,-1,-1): + arguments.load() + self.asm.swap() + self.push(num_pos + i) + self.asm.swap() + self.asm.arrayStore(pyObjectType) + keywords.load() + self.asm.swap() + self.push(i) + self.asm.swap() + self.asm.arrayStore(getType(java.lang.String)) + self.buildArray(num_pos, arguments) + + def visitCallFunction(self, num_pos, num_keyword): + """(arg,) * num_pos, (name, arg) * num_keyword -- value""" + arguments = self.newLocal(getArrayType(pyObjectType),"arguments") + keywords = self.newLocal(getArrayType(getType(java.lang.String)),"kw") + self.push(num_pos + num_keyword) + self.asm.newArray(pyObjectType) + arguments.store() + self.push(num_keyword) + self.asm.newArray(getType(java.lang.String)) + keywords.store() + self.setupCallParameters(num_pos, num_keyword, arguments, keywords) + arguments.load() + keywords.load() + arguments.end() + keywords.end() + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "org.python.core.PyObject __call__ (%s)" % ", ".join([ + "org.python.core.PyObject[]", "String[]" + ]))) + + def visitCallFunctionKeyword(self, num_pos, num_keyword): + """(arg,) * num_pos, (name, arg) * num_keyword, dict -- value""" + self.push(None) + self.asm.swap() + self.visitCallFunctionVarargKeyword(num_pos, num_keyword) + + def visitCallFunctionVararg(self, num_pos, num_keyword): + """(arg,) * num_pos, (name, arg) * num_keyword, list -- value""" + self.push(None) + self.visitCallFunctionVarargKeyword(num_pos, num_keyword) + + def visitCallFunctionVarargKeyword(self, num_pos, num_keyword): + """(arg,) * num_pos, (name, arg) * num_keyword, list, dict -- value""" + args = self.newLocal(pyObjectType,"args") + kwargs = self.newLocal(pyObjectType,"kwargs") + kwargs.store() + args.store() + arguments = self.newLocal(getArrayType(pyObjectType),"arguments") + keywords = self.newLocal(getArrayType(getType(java.lang.String)),"kw") + self.push(num_pos + num_keyword) + self.asm.newArray(pyObjectType) + arguments.store() + self.push(num_keyword) + self.asm.newArray(getType(java.lang.String)) + keywords.store() + self.setupCallParameters(num_pos, num_keyword, arguments, keywords) + arguments.load() + keywords.load() + args.load() + kwargs.load() + args.end() + kwargs.end() + arguments.end() + keywords.end() + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "org.python.core.PyObject _callextra (%s)" % ", ".join([ + "org.python.core.PyObject[]", "String[]", + "org.python.core.PyObject", "org.python.core.PyObject", + ]))) + + def visitBreakLoop(self): + """ -- """ + for i in xrange(len(self.__blocks) -1,-1,-1): + block = self.__blocks[i] + block.exit(False) + if isinstance(block, LoopBlock): + self.asm.goTo(block.endLabel) + break + else: # No surrounding LoopBlock was found + raise SyntaxError("break not properly nested in loop.") + + def visitContinueLoop(self, loopStart): + """ -- """ + for i in xrange(len(self.__blocks) -1,-1,-1): + block = self.__blocks[i] + if isinstance(block, LoopBlock): + break + else: + block.exit(False) + self.asm.goTo(self.label(loopStart)) + + def visitDeleteAttribute(self, attributeName): + """object -- """ + self.push(attributeName) + self.asm.invokeVirtual(pyObjectType, Method.getMethod( + "void __del... [truncated message content] |
From: <th...@us...> - 2007-08-22 18:04:23
|
Revision: 3445 http://jython.svn.sourceforge.net/jython/?rev=3445&view=rev Author: thobes Date: 2007-08-22 11:04:21 -0700 (Wed, 22 Aug 2007) Log Message: ----------- Documentation added on how PyASM is used and external requirements. Modified Paths: -------------- branches/newcompiler/PyASM/pyasm.py branches/newcompiler/README.txt branches/newcompiler/build.xml branches/newcompiler/src/org/python/newcompiler/pyasm/util/PythonDis.java Added Paths: ----------- branches/newcompiler/PyASM/README.txt Property Changed: ---------------- branches/newcompiler/PyASM/ Property changes on: branches/newcompiler/PyASM ___________________________________________________________________ Name: svn:ignore + *.pyc *.class Added: branches/newcompiler/PyASM/README.txt =================================================================== --- branches/newcompiler/PyASM/README.txt (rev 0) +++ branches/newcompiler/PyASM/README.txt 2007-08-22 18:04:21 UTC (rev 3445) @@ -0,0 +1,77 @@ +About the ASM based bytecode generation framework for Jython +============================================================ + +Table of Contents +----------------- + + 1. What does it do? + 1.1 What it does not do + 2. Useing PyASM + 3. The parts of PyASM + 4. How PyASM works + 5. Mappings from Python Bytecode to Java Bytecode + 5.1 Explanation of python and java bytecode features, and their differences + 6. Future extensions + + + 1. What does it do? + =================== + +PyASM is a framework based around Python bytecode. Combined with the ASM +library this is used to convert Python bytecode to Java bytecode. + + 1.1 What it does not do + ----------------------- + + * PyASM does not expose all features of ASM to python. Although some of these + aspects might be interesting to expose in some way in future extensions. + * PyASM does not generate pure java classes, It generates PyCode objects by + subclassing PyFunctionTable. + + + 2. Useing PyASM + =============== + +PyASM operates on python bytecode, and therefore depends on the C +implementation of python to generate bytecode. For instructions on how to +generate python bytecode from your python code, please refere to the python +documentaion. +To read python bytecode from .pyc-files and generate PyCode-objects from that +via generation of java bytecode there is a extra function called _readPyc in +the implementation of the marshal library included in this distribution. This +function accepts a filename as input and reads the bytecode from that file. +To simplify the process of generating python bytecode there is a script called +test.py that reads a python source file (specified by a command line argument) +and invokes the CPython implementation to compile it to bytecode and then uses +that bytecode to generate the java bytecode. test.py expects python 2.5 to be +available as "python" on the system path. +Example use of test.py: +$ jython test.py <your_python_file_here>.py + + + 3. The parts of PyASM + ===================== + +TODO + + + 4. How PyASM works + ================== + +TODO + + + 5. Mappings from Python Bytecode to Java Bytecode + ================================================= + + 5.1 Explanation of python and java bytecode features, and their differences + --------------------------------------------------------------------------- + +TODO + + + 6. Future extensions + ==================== + +TODO + Modified: branches/newcompiler/PyASM/pyasm.py =================================================================== --- branches/newcompiler/PyASM/pyasm.py 2007-08-22 08:26:49 UTC (rev 3444) +++ branches/newcompiler/PyASM/pyasm.py 2007-08-22 18:04:21 UTC (rev 3445) @@ -1,8 +1,3 @@ -# Open issues: -# * Line number reporting on exceptions does not wor, jython uses a separate -# system for line numbers, and not javas debug-info. It should be possible -# to replace this though. - import opcode, re try: from org.python.newcompiler.pyasm import BytecodeVisitor as Visitor,\ Modified: branches/newcompiler/README.txt =================================================================== --- branches/newcompiler/README.txt 2007-08-22 08:26:49 UTC (rev 3444) +++ branches/newcompiler/README.txt 2007-08-22 18:04:21 UTC (rev 3445) @@ -1,28 +1,38 @@ -Welcome to Jython 2.2b2 -======================= +Welcome to Jython NewCompiler branch +==================================== -This is the second beta release towards the 2.2 version of Jython. It -contains all of the new features for the 2.2 release: - - new-style classes - - Java List integration - - a PEP 302 implementation - - iterators - - generators - - __future__ division - - support for running on modern JVMs - - a new installer +This branch is forked from the 2.3 branch (at revision 3287) of Jython. -In addition to these major features, many bugs have been fixed from 2.2b1. See -the NEWS file for a more complete list of changes. +The new features in this branch has been developed by Damien Lejeune and +Tobias Ivarsson during the Google Summer of Code 2007. -The release was compiled on Windows XP with JDK 6 but it should run on -1.4.2+. +External Dependancis +-------------------- -This release exists to solicit feedback about any bugs or missing -features; if you can provide it, it is greatly appreciated. Bug -reports can be created at http://jython.org/bugs whereas more general -questions can be sent to the Jython-dev mailing list, -jy...@li.... +The changes in this branch introduce dependancies on some external libraries. +These have to be installed prior to building this branch of Jython. -The current plan calls for a release candiate in a few weeks, and if it proves -stable, the final release of 2.2 a few weeks after that. + * ASM 3.0 - The new bytecode generation framework depends on the main ASM jar + and the asm-commons jar from version 3 of the ASM project. It also depends + on the asm-tree jar and the asm-util jar for debugging. + These jars can be obtained from the ASM website: http://asm.objectweb.org/ + There is also one jar (asm-all) that contains all the various parts of ASM. + + +QuickStart for PyASM +-------------------- + +1. Add asm-all-3.0.jar from http://asm.objectweb.org/ to your java classpath +2. Build Jython useing ant +3. Try PyASM on <your_python_source_file>.py with: +.../JythonNewcompilerBranch/PyASM $ jython test.py <your_python_source_file>.py + + +Further Documentation +--------------------- + +For further reading about how to use the new ASM based bytecode generation +framework (PyASM), and how this framework works, please refer to the file +PyASM/README.txt + + Modified: branches/newcompiler/build.xml =================================================================== --- branches/newcompiler/build.xml 2007-08-22 08:26:49 UTC (rev 3444) +++ branches/newcompiler/build.xml 2007-08-22 18:04:21 UTC (rev 3445) @@ -455,6 +455,8 @@ deprecation="${deprecation}" nowarn="${nowarn}" > + <exclude name="org/python/antlr/**" /><!-- this should be removed +once the antlr dependancies are included or documented --> <exclude name="org/python/parser/python.java" /> <exclude name="**/PyServlet.java" unless="servlet.present" /> <exclude name="**/ReadlineConsole.java" unless="readline.present" /> Modified: branches/newcompiler/src/org/python/newcompiler/pyasm/util/PythonDis.java =================================================================== --- branches/newcompiler/src/org/python/newcompiler/pyasm/util/PythonDis.java 2007-08-22 08:26:49 UTC (rev 3444) +++ branches/newcompiler/src/org/python/newcompiler/pyasm/util/PythonDis.java 2007-08-22 18:04:21 UTC (rev 3445) @@ -163,7 +163,7 @@ public void visitBuildList(int size) { super.visitBuildList(size); - instruction("BUILD LIST", 3, size); + instruction("BUILD LIST", 3, new Integer(size)); } public void visitBuildMap(int zero) { @@ -173,19 +173,19 @@ throw new RuntimeException("BUILD MAP received non-zero argument " + zero); } - instruction("BUILD MAP", 3, zero); + instruction("BUILD MAP", 3, new Integer(zero)); } public void visitBuildSlice(int numargs) { super.visitBuildSlice(numargs); - instruction("BUILD SLICE", 3, numargs); + instruction("BUILD SLICE", 3, new Integer(numargs)); } public void visitBuildTuple(int size) { super.visitBuildTuple(size); - instruction("BUILD TUPLE", 3, size); + instruction("BUILD TUPLE", 3, new Integer(size)); } public void visitCallFunction(int num_positional, int num_keyword) { @@ -309,7 +309,7 @@ if (num_elements == 1) { instruction("DUP TOP"); } else { - instruction("DUP TOPX", 3, num_elements); + instruction("DUP TOPX", 3, new Integer(num_elements)); } } @@ -556,7 +556,7 @@ public void visitRaiseVarargs(int count) { super.visitRaiseVarargs(count); - instruction("RAISE VARARGS", 3, count); + instruction("RAISE VARARGS", 3, new Integer(count)); } public void visitReturnValue() { @@ -676,7 +676,7 @@ public void visitUnpackSequence(int count) { super.visitUnpackSequence(count); - instruction("UNPACK SEQUENCE", 3, count); + instruction("UNPACK SEQUENCE", 3, new Integer(count)); } public void visitWithCleanup() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2007-08-26 11:13:04
|
Revision: 3455 http://jython.svn.sourceforge.net/jython/?rev=3455&view=rev Author: thobes Date: 2007-08-26 04:13:00 -0700 (Sun, 26 Aug 2007) Log Message: ----------- A fix for the problem with sending exceptions to a generator. Modified Paths: -------------- branches/newcompiler/PyASM/pyasm.py branches/newcompiler/PyASM/test/generator_state2.py branches/newcompiler/PyASM/test/scoped_exceptions.py branches/newcompiler/src/org/python/core/PyFrame.java branches/newcompiler/src/org/python/core/PyGenerator.java Modified: branches/newcompiler/PyASM/pyasm.py =================================================================== --- branches/newcompiler/PyASM/pyasm.py 2007-08-24 10:03:10 UTC (rev 3454) +++ branches/newcompiler/PyASM/pyasm.py 2007-08-26 11:13:00 UTC (rev 3455) @@ -1681,7 +1681,14 @@ into the generator at the beginning works as expected.""" self.loadFrame() self.asm.invokeVirtual(pyFrameType, Method.getMethod( - "org.python.core.PyObject getGeneratorInput ()")) + "Object getGeneratorInput ()")) + self.asm.dup() + self.asm.instanceOf(pyExceptionType) + done = self.label() + self.asm.visitJumpInsn(Op.IFEQ, done) + self.asm.checkCast(throwableType) + self.asm.throwException() + self.asm.visitLabel(done) self.asm.pop() self.scheduleCode(start, code) @@ -1702,7 +1709,15 @@ self.asm.visitLabel(end) self.loadFrame() self.asm.invokeVirtual(pyFrameType, Method.getMethod( - "org.python.core.PyObject getGeneratorInput ()")) + "Object getGeneratorInput ()")) + self.asm.dup() + self.asm.instanceOf(pyExceptionType) + done = self.label() + self.asm.visitJumpInsn(Op.IFEQ, done) + self.asm.checkCast(throwableType) + self.asm.throwException() + self.asm.visitLabel(done) + self.asm.checkCast(pyObjectType) def storeStackState(self): count = 0 Modified: branches/newcompiler/PyASM/test/generator_state2.py =================================================================== --- branches/newcompiler/PyASM/test/generator_state2.py 2007-08-24 10:03:10 UTC (rev 3454) +++ branches/newcompiler/PyASM/test/generator_state2.py 2007-08-26 11:13:00 UTC (rev 3455) @@ -2,8 +2,8 @@ for x in xrange(l): try: yield x - except: - print "err" + except Exception, e: + print "err:", e it = gen(4) print it.next() Modified: branches/newcompiler/PyASM/test/scoped_exceptions.py =================================================================== --- branches/newcompiler/PyASM/test/scoped_exceptions.py 2007-08-24 10:03:10 UTC (rev 3454) +++ branches/newcompiler/PyASM/test/scoped_exceptions.py 2007-08-26 11:13:00 UTC (rev 3455) @@ -1,4 +1,5 @@ from __future__ import with_statement +import sys class FooException(Exception): pass class BarException(Exception): pass @@ -105,6 +106,3 @@ # for now we just observe that FooException has been rethrown # as BarException print FooException, 'was rethrown as ', type(err) - - - Modified: branches/newcompiler/src/org/python/core/PyFrame.java =================================================================== --- branches/newcompiler/src/org/python/core/PyFrame.java 2007-08-24 10:03:10 UTC (rev 3454) +++ branches/newcompiler/src/org/python/core/PyFrame.java 2007-08-26 11:13:00 UTC (rev 3455) @@ -1,13 +1,11 @@ // Copyright (c) Corporation for National Research Initiatives package org.python.core; - /** * A python frame object. */ -public class PyFrame extends PyObject -{ +public class PyFrame extends PyObject { public PyFrame f_back; public PyTableCode f_code; public PyObject f_locals; @@ -20,20 +18,19 @@ public int f_nfreevars; public int f_lasti; public Object[] f_savedlocals; - public PyObject[] f_stackstate; // newcompiler uses this to allow yield in loops - public int[] f_blockstate; // newcompiler uses this to allow yield in finally + public PyObject[] f_stackstate; // newcompiler uses this to allow yield in + // loops + public int[] f_blockstate; // newcompiler uses this to allow yield in + // finally // an interface to functions suitable for tracing, e.g. via sys.settrace() public TraceFunction tracefunc; - private static final String[] __members__ = { - "f_back", "f_code", "f_locals", "f_globals", "f_lineno", - "f_builtins", "f_trace" - }; + private static final String[] __members__ = { "f_back", "f_code", + "f_locals", "f_globals", "f_lineno", "f_builtins", "f_trace" }; public PyFrame(PyTableCode code, PyObject locals, PyObject globals, - PyObject builtins) - { + PyObject builtins) { f_code = code; f_locals = locals; f_globals = globals; @@ -41,12 +38,12 @@ // This needs work to be efficient with multiple interpreter states if (locals == null && code != null) { // ! f_fastlocals needed for arg passing too - if ((code.co_flags&PyTableCode.CO_OPTIMIZED)!=0 || - code.nargs > 0) { + if ((code.co_flags & PyTableCode.CO_OPTIMIZED) != 0 + || code.nargs > 0) { if (code.co_nlocals > 0) { // internal: may change - f_fastlocals = new PyObject[ - code.co_nlocals-code.jy_npurecell]; + f_fastlocals = new PyObject[code.co_nlocals + - code.jy_npurecell]; } } else f_locals = new PyStringMap(); @@ -68,9 +65,10 @@ public String toString() { if (f_code == null) { - return "<frame (unknown code) at line "+f_lineno+">"; + return "<frame (unknown code) at line " + f_lineno + ">"; } else { - return "<frame in \""+f_code.co_name+"\" at line "+f_lineno+">"; + return "<frame in \"" + f_code.co_name + "\" at line " + f_lineno + + ">"; } } @@ -80,33 +78,23 @@ members[i] = new PyString(__members__[i]); return new PyList(members); } - + // begin newcompiler - - private PyException generatorException = null; - private PyObject generatorInput = Py.None; - - public void setGeneratorException(PyException ex) { - generatorException = ex; - } - - public void setGeneratorInput(PyObject value) { - generatorException = null; + + private Object generatorInput = Py.None; + + void setGeneratorInput(Object value) { generatorInput = value; } - - public PyObject getGeneratorInput() { - if( generatorException != null ) { - throw Py.setException(generatorException, this); - } else { - PyObject input = generatorInput; - generatorInput = Py.None; - return input; - } + + public Object getGeneratorInput() { + Object input = generatorInput; + generatorInput = Py.None; + return input; } // end newcompiler - + private void throwReadonly(String name) { for (int i = 0; i < __members__.length; i++) if (__members__[i] == name) @@ -122,7 +110,8 @@ // f_exc_type // f_exc_value // f_exc_traceback - else throwReadonly(name); + else + throwReadonly(name); } public void __delattr__(String name) { @@ -132,7 +121,8 @@ // f_exc_type // f_exc_value // f_exc_traceback - else throwReadonly(name); + else + throwReadonly(name); } public PyObject __findattr__(String name) { @@ -140,7 +130,7 @@ return getf_locals(); else if (name == "f_trace") { if (tracefunc instanceof PythonTraceFunction) { - return ((PythonTraceFunction)tracefunc).tracefunc; + return ((PythonTraceFunction) tracefunc).tracefunc; } return Py.None; } @@ -150,25 +140,27 @@ public PyObject getf_locals() { if (f_locals == null) f_locals = new PyStringMap(); - if (f_code!=null && (f_code.co_nlocals>0 || f_nfreevars > 0)) { + if (f_code != null && (f_code.co_nlocals > 0 || f_nfreevars > 0)) { int i; if (f_fastlocals != null) { - for (i=0; i<f_fastlocals.length; i++) { + for (i = 0; i < f_fastlocals.length; i++) { PyObject o = f_fastlocals[i]; if (o != null) f_locals.__setitem__(f_code.co_varnames[i], o); } - if ((f_code.co_flags&PyTableCode.CO_OPTIMIZED) == 0) + if ((f_code.co_flags & PyTableCode.CO_OPTIMIZED) == 0) f_fastlocals = null; } int j = 0; - for (i=0; i<f_ncells; i++,j++) { + for (i = 0; i < f_ncells; i++, j++) { PyObject v = f_env[j].ob_ref; - if (v != null) f_locals.__setitem__(f_code.co_cellvars[i],v); + if (v != null) + f_locals.__setitem__(f_code.co_cellvars[i], v); } - for (i=0; i<f_nfreevars; i++,j++) { + for (i = 0; i < f_nfreevars; i++, j++) { PyObject v = f_env[j].ob_ref; - if (v != null) f_locals.__setitem__(f_code.co_freevars[i],v); + if (v != null) + f_locals.__setitem__(f_code.co_freevars[i], v); } } return f_locals; @@ -201,16 +193,19 @@ if (ret != null) return ret; - throw Py.UnboundLocalError("local: '"+index+"'"); - //return getglobal(index); + throw Py.UnboundLocalError("local: '" + index + "'"); + // return getglobal(index); } public PyObject getname(String index) { - if (f_locals == null) getf_locals(); - if (f_locals == f_globals) return getglobal(index); + if (f_locals == null) + getf_locals(); + if (f_locals == f_globals) + return getglobal(index); PyObject ret = f_locals.__finditem__(index); - if (ret != null) return ret; + if (ret != null) + return ret; return getglobal(index); } @@ -225,7 +220,8 @@ f_builtins = Py.getSystemState().builtins; } ret = f_builtins.__finditem__(index); - if (ret != null) return ret; + if (ret != null) + return ret; throw Py.NameError(index); } @@ -250,8 +246,8 @@ public void dellocal(int index) { if (f_fastlocals != null) { if (f_fastlocals[index] == null) { - throw Py.UnboundLocalError("local: '"+ - f_code.co_varnames[index]+"'"); + throw Py.UnboundLocalError("local: '" + + f_code.co_varnames[index] + "'"); } f_fastlocals[index] = null; } else @@ -263,9 +259,10 @@ getf_locals(); try { f_locals.__delitem__(index); - } catch(PyException e) { - if (!Py.matchException(e,Py.KeyError)) throw e; - throw Py.UnboundLocalError("local: '"+index+"'"); + } catch (PyException e) { + if (!Py.matchException(e, Py.KeyError)) + throw e; + throw Py.UnboundLocalError("local: '" + index + "'"); } } @@ -280,19 +277,22 @@ } public PyObject getderef(int index) { - PyObject obj=f_env[index].ob_ref; - if (obj != null) return obj; + PyObject obj = f_env[index].ob_ref; + if (obj != null) + return obj; String name; - if (index >= f_ncells) name = f_code.co_freevars[index-f_ncells]; - else name = f_code.co_cellvars[index]; - throw Py.UnboundLocalError("local: '"+name+"'"); + if (index >= f_ncells) + name = f_code.co_freevars[index - f_ncells]; + else + name = f_code.co_cellvars[index]; + throw Py.UnboundLocalError("local: '" + name + "'"); } - public void setderef(int index,PyObject value) { + public void setderef(int index, PyObject value) { f_env[index].ob_ref = value; } - public void to_cell(int parm_index,int env_index) { - f_env[env_index].ob_ref=f_fastlocals[parm_index]; + public void to_cell(int parm_index, int env_index) { + f_env[env_index].ob_ref = f_fastlocals[parm_index]; } } Modified: branches/newcompiler/src/org/python/core/PyGenerator.java =================================================================== --- branches/newcompiler/src/org/python/core/PyGenerator.java 2007-08-24 10:03:10 UTC (rev 3454) +++ branches/newcompiler/src/org/python/core/PyGenerator.java 2007-08-26 11:13:00 UTC (rev 3455) @@ -47,7 +47,7 @@ } private PyObject raiseException(PyException ex) { - gi_frame.setGeneratorException(ex); + gi_frame.setGeneratorInput(ex); return next(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2007-12-17 06:25:33
|
Revision: 3827 http://jython.svn.sourceforge.net/jython/?rev=3827&view=rev Author: thobes Date: 2007-12-16 22:25:29 -0800 (Sun, 16 Dec 2007) Log Message: ----------- Some fixes with credit to Nicholas Riley. Plus some cleanup. Modified Paths: -------------- branches/newcompiler/PyASM/marshal.py branches/newcompiler/PyASM/pyasm.py branches/newcompiler/README.txt Added Paths: ----------- branches/newcompiler/PyASM/test/global.py branches/newcompiler/PyASM/test/print_chevron.py Modified: branches/newcompiler/PyASM/marshal.py =================================================================== --- branches/newcompiler/PyASM/marshal.py 2007-12-17 05:15:44 UTC (rev 3826) +++ branches/newcompiler/PyASM/marshal.py 2007-12-17 06:25:29 UTC (rev 3827) @@ -451,19 +451,3 @@ def loads(s): f = StringIO(s) return load(f) - -def _makeModule(code): - # TODO - return code - -def _readPyc(filename): - f = open(filename, 'rb') - def read(): - return ord(f.read(1)) - magic = read() | (read()<<8) - if not ( f.read(1) == '\r' and f.read(1) == '\n' ): - raise TypeError("The file is not a valid pyc file.") - mtime = read() | (read()<<8) | (read()<<16) | (read()<<24) - # TODO: when this is used for loading, the mtime needs to be considered. - return _makeModule( Unmarshaller(f, magic=magic).load() ) - Modified: branches/newcompiler/PyASM/pyasm.py =================================================================== --- branches/newcompiler/PyASM/pyasm.py 2007-12-17 05:15:44 UTC (rev 3826) +++ branches/newcompiler/PyASM/pyasm.py 2007-12-17 06:25:29 UTC (rev 3827) @@ -1,45 +1,23 @@ import opcode, re -try: - from org.python.newcompiler.pyasm import BytecodeVisitor as Visitor,\ - Operator, CodeFlags as Flags - from org.python.newcompiler.asm import OffsetTracer - from org.python.core.BytecodeLoader import makeCode - from org.objectweb import asm - from org.objectweb.asm import Type, Opcodes as Op - from org.objectweb.asm.commons import GeneratorAdapter, Method,\ - TableSwitchGenerator - from org.objectweb.asm.tree import analysis - from org.python import core - from jarray import array - import java - from java.io import PrintWriter - from java.lang.System import out - stdout = PrintWriter(out) -except Exception, err: - # print err - # mock code to be able to import the module from CPython, an easy way - # to compile it... - Visitor = object - class ArrantPrac(object): - def __getattr__(self,attr): - return self - Operator = Method = Type = java = core = ArrantPrac() - mirror = lambda *x: x - Type.getObjectType = mirror - Type.getType = mirror - Method.getMethod = mirror - TableSwitchGenerator = object - del ArrantPrac +from org.python.newcompiler.pyasm import BytecodeVisitor as Visitor,\ + Operator, CodeFlags as Flags +from org.python.newcompiler.asm import OffsetTracer +from org.python.core.BytecodeLoader import makeCode +from org.objectweb import asm +from org.objectweb.asm import Type, Opcodes as Op +from org.objectweb.asm.commons import GeneratorAdapter, Method,\ + TableSwitchGenerator +from org.objectweb.asm.tree import analysis +from org.python import core -def printFlags(flags): - for id in dir(Flags): - flag = getattr(Flags,id) - if flag & flags == flag: - print id, hex(flag) - flags ^= flag - return flags - +from jarray import array +import java + +from java.io import PrintWriter +from java.lang.System import out +stdout = PrintWriter(out) + def reallyContains(dct, item): if item in dct: keys = list(dct.keys()) @@ -1399,9 +1377,10 @@ def visitPrintItemTo(self): """object, object -- """ + self.asm.swap() self.asm.invokeStatic(pyType, Method.getMethod( "void printComma (%s)" % ", ".join( - ["org.python.core.PyObject)"]*2))) + ["org.python.core.PyObject"]*2))) def visitPrintNewline(self): """ -- """ @@ -1609,10 +1588,10 @@ """object -- """ self.loadFrame() self.asm.swap() - self.push(self.__varnames.index(globalName)) + self.push(globalName) self.asm.swap() self.asm.invokeVirtual(pyFrameType, Method.getMethod( - "void setglobal (int, org.python.core.PyObject)")) + "void setglobal (String, org.python.core.PyObject)")) def visitStoreName(self, name): """object -- """ @@ -1865,17 +1844,3 @@ 'String[]', 'String[]', 'int', 'int']))) init.putStatic(self.__class.asType, self.__code.getName(), pyCodeType) self.asm.endMethod() - -if __name__ == '__main__': - import os - import sys - args = list(sys.argv[1:]) - if os.name == 'java': - from marshal import _readPyc as readPyc - args.append("pyasm.pyc") - print readPyc(args[0]) - #print readPyc("pyasm.pyc") - else: - from parser import kompilera - args.append("pyasm.py") - kompilera(open(args[0]).read()) Added: branches/newcompiler/PyASM/test/global.py =================================================================== --- branches/newcompiler/PyASM/test/global.py (rev 0) +++ branches/newcompiler/PyASM/test/global.py 2007-12-17 06:25:29 UTC (rev 3827) @@ -0,0 +1,8 @@ +g = 5 +def f(): + global g + g = 7 + +print g +f() +print g Added: branches/newcompiler/PyASM/test/print_chevron.py =================================================================== --- branches/newcompiler/PyASM/test/print_chevron.py (rev 0) +++ branches/newcompiler/PyASM/test/print_chevron.py 2007-12-17 06:25:29 UTC (rev 3827) @@ -0,0 +1,3 @@ +import sys + +print >> sys.stderr, 'hello world' Modified: branches/newcompiler/README.txt =================================================================== --- branches/newcompiler/README.txt 2007-12-17 05:15:44 UTC (rev 3826) +++ branches/newcompiler/README.txt 2007-12-17 06:25:29 UTC (rev 3827) @@ -14,7 +14,7 @@ * ASM 3.0 - The new bytecode generation framework depends on the main ASM jar and the asm-commons jar from version 3 of the ASM project. It also depends - on the asm-tree jar and the asm-util jar for debugging. + on the asm-tree, asm-analysis, and the asm-util jar for debugging. These jars can be obtained from the ASM website: http://asm.objectweb.org/ There is also one jar (asm-all) that contains all the various parts of ASM. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |