     b.stack.length -= method.param_bytes
 
     virtual = @name in ['invokevirtual', 'invokeinterface']
-    invoke_str = "rs.method_lookup(#{JSON.stringify @method_spec}).run(rs, #{virtual}, [#{params.join ","}])"
+    b.add_line "rs.method_lookup(#{JSON.stringify @method_spec}).run(rs, #{virtual}, [#{params.join ","}])"
 
     unless method.return_type.toString() is 'V'
       temp = b.new_temp()
-      invoke_str = "#{temp} = #{invoke_str}"
 
       if method.return_type.toString() in ['D', 'J']
+        b.add_line "#{temp} = rs.pop2()"
         b.push2 temp
       else
+        b.add_line "#{temp} = rs.pop()"
         b.push temp
-
-    b.add_line invoke_str
 
 compile_obj_handlers = {
   aconst_null: { compile: (b) -> b.push "null"; }

  fneg: { compile: (b) -> b.push "-#{b.pop()}" }
  dneg: { compile: (b) -> b.push2 "-#{rs.pop2()}" }

  ireturn: { compile: (b) -> b.add_line "return #{b.pop()}" }
  lreturn: { compile: (b) -> b.add_line "return #{b.pop2()}" }
  freturn: { compile: (b) -> b.add_line "return #{b.pop()}" }

    temp = b.new_temp()
    b.add_line "#{temp} = rs.init_object(#{JSON.stringify @class})"
    b.push temp }

  goto: { compile: (b, idx) -> 
    b.next = [@offset + idx]
    b.compile_epilogue()
    b.add_line "label = #{@offset + idx}; continue"
  }

  goto_w: { compile: (b, idx) ->
    b.next = [@offset + idx]
