Ejemplo n.º 1
0
			Class* initialize(ClassMap * classMap)
			{
				Class * newClass = new Class(NULL);
				staticClassPtr = newClass;
				newClass->classLoader = NULL;
				newClass->parentClass = classMap->getClass("java/lang/Object");
				newClass->fullyQualifiedName = Utf8String("java/lang/String");

				newClass->addMethod(getNativeMethod("<init>", "()V", &init));

				newClass->addMethod(getNativeMethod("toString", "()Ljava/lang/String;", &toString));
				newClass->addMethod(getNativeMethod("clone", "()Ljava/lang/Object;", &clone));
				newClass->addMethod(getNativeMethod("hashCode", "()I", &hashCode));
				newClass->addMethod(getNativeMethod("length", "()I", &length));

				return newClass;
			}
Ejemplo n.º 2
0
int main(int argc, char ** argv) {
    if (argc < 2) {
        std::cerr << "Driver must be called with the .class file to test" << std::endl;
        return 1;
    }

    auto cls = new Espresso::Blender::JVMClass(argv[1]);

    auto classdb = new Espresso::VM::ClassResolver();
    classdb->addClass(new Espresso::VM::Class::DlOpen("java/lang/System"));
    classdb->addClass(cls);

    auto vmp = Espresso::Blender::VMMethodProvider(classdb);
    vmp.getNativeMethod(cls->name(), "test", "()V"); // use another method just to check if <clinit> is called

    return _called_code == 99 ? 0 : 2;
}
Ejemplo n.º 3
0
			Class* initialize(ClassMap* classMap)
			{
				if (staticClassPtr != NULL)
				{
					return staticClassPtr;
				}

				Class * objectClass = classMap->getClass("java/io/InputStream");
				Class * aClass = new Class(0);
				aClass->parentClass = objectClass;
				aClass->classLoader = NULL;
				aClass->fullyQualifiedName = "java/io/FileInputStream";

				aClass->addMethod(getNativeMethod("<init>", "(Ljava/lang/String;)V", &initFromString));

				staticClassPtr = aClass;

				return aClass;

			}
Ejemplo n.º 4
0
int main(int argc, char ** argv) {
    if (argc != 2) {
        std::cerr << "Test must be called with the path to the test class" << std::endl;
        return 1;
    }

    Espresso::Log = _log;

    auto classdb = Espresso::VM::ClassResolver();
    classdb.addClass(new Espresso::VM::Class::DlOpen("java/lang/Object"));

    auto cls = new Espresso::Blender::JVMClass(argv[1]);
    if (!*cls) {
        std::cerr << argv[1] << " wasn't loaded: " << cls->error() << std::endl;
        return 1;
    }
    classdb.addClass(cls);

    auto vmp = Espresso::Blender::VMMethodProvider(&classdb);

    int (*fn)(int, int) = (int (*)(int, int))vmp.getNativeMethod(cls->name(), "doSum", "(II)I");
    if (!fn) {
        std::cerr << argv[1] << " does not contain sum(II)I" << std::endl;
        return 1;
    }

    if (fn(0, 0) != 0) {
        std::cerr << "sum(0, 0) - expected 0, returned " << fn(0, 0) << std::endl;
        return 1;
    }
    if (fn(1, 6) != 7) {
        std::cerr << "sum(1, 6) - expected 7, returned " << fn(1, 6) << std::endl;
        return 1;
    }
    if (fn(-1, 6) != 5) {
        std::cerr << "sum(-1, 6) - expected 5, returned " << fn(-1, 6) << std::endl;
        return 1;
    }

    return 0;
}