0
+ attr_accessor :argc, :nlocals, :stacksize, :flags, :consts, :bytecode,
0
+ :filename, :lineno, :name, :symbols, :stacknow, :varsyms, :jumps, :labels
0
+ def initialize(fname, name = "<module>")
0
+ @argc, @nlocals, @stacksize, @flags, @filename, @lineno, @name, @stack, @nopop =
0
+ 0, 0, 1, 0x40, fname, 1, name, [], 0
0
+ @bytecode, @varsyms, @labels, @jumps = [], [], {}, {}
0
+ @consts << obj unless @consts.include? obj
0
+ @symbols << name unless @symbols.include? name
0
+ @varsyms << name unless @varsyms.include? name
0
+ @stacksize = @stack.length if @stack.length > @stacksize
0
+ def pop_top; bc 0x01; dump_stack end
0
+ def ret_val; bc 0x53 end
0
+ def build_class; bc 0x59 end
0
+ bc 0x5a, add_sym(name), 0x0
0
+ bc 0x5f, add_sym(name), 0x0
0
+ stack_push obj, bc(0x64, add_const(obj), 0x0)
0
+ stack_push name, bc(0x65, add_sym(name), 0x0)
0
+ @stack.slice! -(n-1), (n-1)
0
+ @stack.slice! -(n-1), (n-1)
0
+ stack_push name, bc(0x69, add_sym(name), 0x0)
0
+ bc 0x6b, add_sym(name), 0x0
0
+ bc 0x6c, add_sym(name), 0x0
0
+ mark_jump n, bc(0x6f, n, 0x0)
0
+ stack_push Object.new, bc(0x7c, n, 0x0)
0
+ stack_push Object.new, bc(0x83, arity, 0x0)
0
+ @nopop -= 1 if @nopop > 0
0
+ @labels[l] = @bytecode.flatten.length
0
+ return [mod[/^(.+?)(\.|$)/, 1].intern, mod.intern]
0
+ def getinlinecache ic, dst
0
+ def setinlinecache dst
0
+ def import(mod, inner = nil)
0
+ mod_in, mod = import_split(mod)
0
+ inner_in, inner = import_split(inner)
0
+ load_const(tuple(inner))
0
+ import_from(inner) if inner
0
+ def kernel_send(meth, *args)
0
+ call_func(args.length)
0
+ load_const(nil) if @stack.empty?
0
+ str = @filename if str == "<compiled>"
0
+ def message(meth, op_argc, blockiseq, op_flag, ic)
0
+ # args = @stack.slice! -op_argc, op_argc
0
+ # bytes = @bytecode.slice! -op_argc, op_argc
0
+ receiver, recbytes = @stack[-argc]
0
+ args = @stack[-op_argc, op_argc].map { |o,_| o }
0
+ idx = @bytecode.index { |x| x.object_id == recbytes.object_id }
0
+ bytes = @bytecode.slice! idx..-1
0
+ return load_const(tuple(*args))
0
+ @bytecode << bytes.shift
0
+ idx = @bytecode.index { |x| x.object_id == @stack[-op_argc][1].object_id }
0
+ bytes = @bytecode.slice! idx..-1
0
+ pop_top unless @nopop > 0
0
+ def defineclass klass, iseq, is_singleton
0
+ define :class, klass, iseq, is_singleton
0
+ def definemethod meth, iseq, is_singleton
0
+ define :method, meth, iseq, is_singleton
0
+ def define type, id, iseq, is_singleton
0
+ c = (type == :class) ? -2 : -1
0
+ receiver, recbytes = @stack[c]
0
+ idx = @bytecode.index { |x| x.object_id == recbytes.object_id }
0
+ bytes = @bytecode.slice! idx..-1
0
+ bytes.shift unless receiver
0
+ asm = Pyasm.new(@filename, id.to_s)
0
+ # this is a bit redundant, but decompyle requires it
0
+ def branchunless label
0
+ @varsyms += iseq[8].reverse
0
+ iseq.last.each do |inst|
0
+ when Integer # line no
0
+ inst[0] = :message if inst[0] == :send
0
+ iseq = VM::InstructionSequence.compile(src)
0
+ # rewrite jumps to use python bytecode ordering
0
+ @jumps.each do |n, jset|
0
+ idx = @bytecode.index(jump)
0
+ pos = @bytecode[0,idx].flatten.length
0
+ jump[1] = (@labels[n] - pos) - jump.length
0
+ # @jumps[1] = @labels[n]
0
+ f << [@argc, @nlocals, @stacksize, @flags].pack("LLLL")
0
+ bytes = @bytecode.flatten
0
+ f << "s" << bytes.length.to_plong
0
+ f << "(" << @consts.length.to_plong
0
+ f << "(" << @symbols.length.to_plong
0
+ f << "(" << @varsyms.length.to_plong
0
+ f << "(" << 0.to_plong
0
+ f << "(" << 0.to_plong
0
+ f << @filename.to_pickle
0
+ File.open(fname, "wb") do |f|
0
+ f << "\xB3\xF2\r\n" # magic number for python 2.5
0
+ f << Time.now.to_i.to_plong
Comments
No one has commented yet.