示例#1
0
文件: vm.py 项目: MatevzFa/pyjvm
 def get_class(self, class_name):
     """
     Returns initialized class from pool (perm_gen) or loads
     it with class loader (and running static constructor).
     Getting a class might result in loading it's super first.
     :param class_name:
     :return:
     """
     if class_name is None:
         return  # this is look up for Object's super, which is  None
     if class_name in self.perm_gen:
         return self.perm_gen[class_name]
     if class_name[0] == '[':  # special treatment for arrays
         java_class = array_class_factory(self, class_name)
         lang_clazz = self.get_class("java/lang/Class")
         clazz_object = lang_clazz.get_instance(self)
         clazz_object.fields["@CLASS_NAME"] = class_name
         ref = self.add_to_heap(clazz_object)
         java_class.heap_ref = ref
         self.perm_gen[class_name] = java_class
         return java_class
     if class_name in [
             'byte', 'char', 'double', 'float', 'int', 'long', 'short',
             'boolean'
     ]:
         java_class = JavaClass()
         self.perm_gen[class_name] = java_class
         java_class.is_primitive = True
         java_class.this_name = class_name
         lang_clazz = self.get_class("java/lang/Class")
         clazz_object = lang_clazz.get_instance(self)
         clazz_object.fields["@CLASS_NAME"] = class_name
         ref = self.add_to_heap(clazz_object)
         java_class.heap_ref = ref
         return java_class
     logger.debug("Class {0} not yet ready".format(class_name))
     java_class = class_loader(class_name, self.class_path)
     super_class = java_class.super_class
     if type(super_class) is unicode:  # lame check
         super_class = self.get_class(super_class)
         java_class.super_class = super_class
     logger.debug("Loaded class def\n{0}".format(java_class))
     self.perm_gen[class_name] = java_class
     # create actual java.lang.Class instance
     lang_clazz = self.get_class("java/lang/Class")
     clazz_object = lang_clazz.get_instance(self)
     clazz_object.fields["@CLASS_NAME"] = class_name
     ref = self.add_to_heap(clazz_object)
     java_class.heap_ref = ref
     self.run_static_constructor(java_class)
     return java_class
示例#2
0
文件: class_loader.py 项目: v95/pyjvm
def make_class(this_name, super_name, constant_pool, all_fields, all_methods,
               all_interfaces, class_flags):
    '''Actually construct java class from data read earlier'''
    jc = JavaClass()
    jc.flags = class_flags
    if class_flags & 0x0200:  # is interface
        jc.is_interface = True
    jc.constant_pool = constant_pool
    jc.this_name = resolve_to_string(constant_pool, this_name)
    if super_name != 0:
        jc.super_class = resolve_to_string(constant_pool, super_name)
    add_fields(jc, constant_pool, all_fields)
    add_methods(jc, constant_pool, all_methods)
    add_interfaces(jc, constant_pool, all_interfaces)
    return jc
示例#3
0
def make_class(this_name, super_name, constant_pool, all_fields, all_methods, all_interfaces, class_flags):
    """Actually construct java class from data read earlier"""
    jc = JavaClass()
    jc.flags = class_flags
    if class_flags & 0x0200:  # is interface
        jc.is_interface = True
    jc.constant_pool = constant_pool
    jc.this_name = resolve_to_string(constant_pool, this_name)
    if super_name != 0:
        jc.super_class = resolve_to_string(constant_pool, super_name)
    add_fields(jc, constant_pool, all_fields)
    add_methods(jc, constant_pool, all_methods)
    add_interfaces(jc, constant_pool, all_interfaces)
    return jc
示例#4
0
文件: vm.py 项目: googya/pyjvm
 def get_class(self, class_name):
     '''Returns initialized class from pool (perm_gen) or loads
     it with class loader (and running static constructor).
     Getting a class might result in loading it's super first.
     '''
     if class_name is None:
         return  # this is look up for Object's super, which is  None
     if class_name in self.perm_gen:
         return self.perm_gen[class_name]
     if class_name[0] == '[':  # special treatment for arrays
         java_class = array_class_factory(self, class_name)
         lang_clazz = self.get_class("java/lang/Class")
         clazz_object = lang_clazz.get_instance(self)
         clazz_object.fields["@CLASS_NAME"] = class_name
         ref = self.add_to_heap(clazz_object)
         java_class.heap_ref = ref
         self.perm_gen[class_name] = java_class
         return java_class
     if class_name in ['byte', 'char', 'double', 'float', 'int', 'long',
                       'short', 'boolean']:
         java_class = JavaClass()
         self.perm_gen[class_name] = java_class
         java_class.is_primitive = True
         java_class.this_name = class_name
         lang_clazz = self.get_class("java/lang/Class")
         clazz_object = lang_clazz.get_instance(self)
         clazz_object.fields["@CLASS_NAME"] = class_name
         ref = self.add_to_heap(clazz_object)
         java_class.heap_ref = ref
         return java_class
     logger.debug("Class {0} not yet ready".format(class_name))
     java_class = class_loader(class_name, self.class_path)
     super_class = java_class.super_class
     if type(super_class) is unicode:  # lame check
         super_class = self.get_class(super_class)
         java_class.super_class = super_class
     logger.debug("Loaded class def\n{0}".format(java_class))
     self.perm_gen[class_name] = java_class
     # create actual java.lang.Class instance
     lang_clazz = self.get_class("java/lang/Class")
     clazz_object = lang_clazz.get_instance(self)
     clazz_object.fields["@CLASS_NAME"] = class_name
     ref = self.add_to_heap(clazz_object)
     java_class.heap_ref = ref
     self.run_static_constructor(java_class)
     return java_class