# HG changeset patch # User Doug Simon # Date 1401285081 -7200 # Node ID 9a7803400ba7d3e5700ea6b7dcb9a9830e6f3e58 # Parent 27ff0792b0480a7543f0c8471195a7bd3dbe8aa9 generate more efficient code for GraalRuntime::get_service_impls diff -r 27ff0792b048 -r 9a7803400ba7 graal/com.oracle.graal.hotspot.sourcegen/src/com/oracle/graal/hotspot/sourcegen/GenGraalRuntimeInlineHpp.java --- a/graal/com.oracle.graal.hotspot.sourcegen/src/com/oracle/graal/hotspot/sourcegen/GenGraalRuntimeInlineHpp.java Wed May 28 14:47:34 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sourcegen/src/com/oracle/graal/hotspot/sourcegen/GenGraalRuntimeInlineHpp.java Wed May 28 15:51:21 2014 +0200 @@ -77,24 +77,42 @@ } } - out.println("Handle GraalRuntime::get_service_impls(KlassHandle serviceKlass, TRAPS) {"); + Set lengths = new TreeSet<>(); for (Class service : services) { - out.printf(" if (serviceKlass->name()->equals(\"%s\")) {%n", toInternalName(service)); - List> impls = new ArrayList<>(); - for (Object impl : ServiceLoader.load(service)) { - impls.add(impl.getClass()); + lengths.add(toInternalName(service).length()); + } + + out.println("Handle GraalRuntime::get_service_impls(KlassHandle serviceKlass, TRAPS) {"); + out.println(" switch (serviceKlass->name()->utf8_length()) {"); + for (int len : lengths) { + boolean printedCase = false; + for (Class service : services) { + String serviceName = toInternalName(service); + if (len == serviceName.length()) { + if (!printedCase) { + printedCase = true; + out.println(" case " + len + ":"); + } + out.printf(" if (serviceKlass->name()->equals(\"%s\", %d)) {%n", serviceName, serviceName.length()); + List> impls = new ArrayList<>(); + for (Object impl : ServiceLoader.load(service)) { + impls.add(impl.getClass()); + } + + out.printf(" objArrayOop servicesOop = oopFactory::new_objArray(serviceKlass(), %d, CHECK_NH);%n", impls.size()); + out.println(" objArrayHandle services(THREAD, servicesOop);"); + for (int i = 0; i < impls.size(); i++) { + String name = toInternalName(impls.get(i)); + out.printf(" %sservice = create_Service(\"%s\", CHECK_NH);%n", (i == 0 ? "Handle " : ""), name); + out.printf(" services->obj_at_put(%d, service());%n", i); + } + out.println(" return services;"); + out.println(" }"); + } } - out.printf(" objArrayOop servicesOop = oopFactory::new_objArray(serviceKlass(), %d, CHECK_NH);%n", impls.size()); - out.println(" objArrayHandle services(THREAD, servicesOop);"); - for (int i = 0; i < impls.size(); i++) { - String name = toInternalName(impls.get(i)); - out.printf(" %sservice = create_Service(\"%s\", CHECK_NH);%n", (i == 0 ? "Handle " : ""), name); - out.printf(" services->obj_at_put(%d, service());%n", i); - } - out.println(" return services;"); - out.println(" }"); } + out.println(" }"); out.println(" return Handle();"); out.println("}"); }