def __init__(self, _class_path="."): logger.debug("Creating VM") # Major memory structures self.perm_gen = {} self.heap = {} self.heap_next_id = 1 # todo clean up self.cache_klass_klass = {} self.global_strings = {} # Handle for linked list of threads self.threads_queue = deque() self.threads = [] self.non_daemons = 0 self.top_group = None self.top_thread = None self.top_group_ref = None self.top_thread_ref = None self.class_path = read_class_path(_class_path) self.init_default_thread() # Load System and init major fields system_class = self.get_class("java/lang/System") # Set System.props to vm owned object system_class.static_fields["props"][1] = ( "vm_ref", VM_OBJECTS["System.Properties"]) # STDout initialization using vm owned object ps_class = self.get_class("java/io/PrintStream") ps_object = ps_class.get_instance(self) ps_ref = self.add_to_heap(ps_object) method = ps_class.find_method("<init>", "(Ljava/io/OutputStream;)V") std_out_ref = ("vm_ref", VM_OBJECTS["Stdout.OutputStream"]) thread = Thread(self, None) frame = Frame(thread, ps_class, method, [ps_ref, std_out_ref], "PrintStream init") thread.frame_stack.append(frame) logger.debug("Run PrintStream init") self.run_thread(thread) # Run exclusive thread # <--thread added to the VM at this point system_class.static_fields["out"][1] = ps_ref system_class.static_fields["in"][1] = \ ("vm_ref", VM_OBJECTS["Stdin.InputputStream"]) # Additional parameters system_class.static_fields["lineSeparator"][1] = \ self.make_heap_string("\n") # Load additional classes to speed up booting self.touch_classes() self.initialized = True logger.debug("VM created")
def __init__(self, _class_path="."): logger.debug("Creating VM") # Major memory structures self.perm_gen = {} self.heap = {} self.heap_next_id = 1 #todo clean up self.cache_klass_klass = {} self.global_strings = {} # Handle for linked list of threads self.threads_queue = deque() self.non_daemons = 0 self.top_group = None self.top_thread = None self.top_group_ref = None self.top_thread_ref = None self.class_path = read_class_path(_class_path) self.init_default_thread() # Load System and init major fields system_class = self.get_class("java/lang/System") # Set System.props to vm owned object system_class.static_fields["props"][1] = ("vm_ref", VM_OBJECTS[ "System.Properties"]) # STDout initialization using vm owned object ps_class = self.get_class("java/io/PrintStream") ps_object = ps_class.get_instance(self) ps_ref = self.add_to_heap(ps_object) method = ps_class.find_method("<init>", "(Ljava/io/OutputStream;)V") std_out_ref = ("vm_ref", VM_OBJECTS["Stdout.OutputStream"]) thread = Thread(self, None) frame = Frame(thread, ps_class, method, [ps_ref, std_out_ref], "PrintStream init") thread.frame_stack.append(frame) logger.debug("Run PrintStream init") self.run_thread(thread) # Run exclusive thread system_class.static_fields["out"][1] = ps_ref system_class.static_fields["in"][1] = \ ("vm_ref", VM_OBJECTS["Stdin.InputputStream"]) # Additional parameters system_class.static_fields["lineSeparator"][1] = \ self.make_heap_string("\n") # Load additional classes to speed up booting self.touch_classes() self.initialized = True logger.debug("VM created")
def main(args): '''Init VM and run requested java application''' logging.basicConfig(filename='pyjvm.log', filemode='w', level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG) main_class = args.clazz[0] class_path = args.cp[0] params = args.param use_vm_cache = not args.no_vm_cache vm = None if use_vm_cache: vm = load_cached_vm(SERIALIZATION_ID) if vm is None: vm = vm_factory(class_path) vm.serialization_id = SERIALIZATION_ID if use_vm_cache: cache_vm(vm) else: vm.class_path = read_class_path(class_path) # lookup starter class & main method class_name = main_class.replace(".", "/") logger.debug("Starting with class %s", str(class_name)) java_class = vm.get_class(class_name) main_method = java_class.find_method("main", "([Ljava/lang/String;)V") if main_method is None: raise Exception("main method not found") logger.debug("Executing main") # create array of strings from command line parameters m_args = [''] * main_method[1] c_args = [] for param in params: ref = vm.make_heap_string(param) c_args.append(ref) heap_array = ("refarr", "java/lang/String", c_args) ref_arr = vm.add_to_heap(heap_array) array_class = vm.get_class("[Ljava/lang/String;") heap_item = JArray(array_class, vm) heap_item.values = c_args ref = vm.add_to_heap(heap_item) m_args[0] = ref # run main vm.run_vm(java_class, main_method, m_args) logger.debug("*** VM DONE ***")
def main(): if not os.path.exists(PYJVMGUI_HOME): os.makedirs(PYJVMGUI_HOME) download_rt() app = QtWidgets.QApplication(sys.argv) '''Init VM and run requested java application''' logging.basicConfig(filename=os.path.join(PYJVMGUI_HOME, 'pyjvm.log'), filemode='w', level=logging.DEBUG) main_class = program_args.clazz[0] class_path = program_args.cp[0] params = program_args.param use_vm_cache = not program_args.no_vm_cache if program_args.clean_cache and os.path.isfile(VM_CACHE_PATH): print "WARNING: Cleaning vm-cache.bin (-cleancache)" os.remove(VM_CACHE_PATH) vm = None if use_vm_cache: vm = load_cached_vm(SERIALIZATION_ID) if vm is None: vm = vm_factory(class_path) vm.serialization_id = SERIALIZATION_ID if use_vm_cache: cache_vm(vm) else: for thread in vm.threads: PyJvmGui.THREAD_GUIS.append(PyJvmGui(ThreadExecutor(thread), len(PyJvmGui.THREAD_GUIS))) vm.class_path = read_class_path(class_path) # lookup starter class & main method class_name = main_class.replace(".", "/") logger.debug("Starting with class %s", str(class_name)) java_class = vm.get_class(class_name) main_method = java_class.find_method("main", "([Ljava/lang/String;)V") if main_method is None: raise Exception("main method not found") logger.debug("Executing main") # create array of strings from command line parameters m_args = [''] * main_method[1] c_args = [] for param in params: ref = vm.make_heap_string(param) c_args.append(ref) heap_array = ("refarr", "java/lang/String", c_args) ref_arr = vm.add_to_heap(heap_array) array_class = vm.get_class("[Ljava/lang/String;") heap_item = JArray(array_class, vm) heap_item.values = c_args ref = vm.add_to_heap(heap_item) m_args[0] = ref # run main vm.initialize_vm(java_class, main_method, m_args) sys.exit(app.exec_())