From 1575b901d42ab9cc1ed925b5a2c71708cfa51151 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Wed, 8 Oct 2014 17:04:32 -0600 Subject: [PATCH] implement Class.getEnclosingClass --- src/builtin.cpp | 22 ++++++++++++++++++++++ test/Reflection.java | 3 +++ 2 files changed, 25 insertions(+) diff --git a/src/builtin.cpp b/src/builtin.cpp index a43c18d953..1c2f173b16 100644 --- a/src/builtin.cpp +++ b/src/builtin.cpp @@ -1301,6 +1301,28 @@ extern "C" AVIAN_EXPORT int64_t JNICALL return 0; } +extern "C" AVIAN_EXPORT int64_t JNICALL + Avian_java_lang_Class_getEnclosingClass(Thread* t, + object, + uintptr_t* arguments) +{ + GcClass* c + = cast(t, reinterpret_cast(arguments[0]))->vmClass(); + PROTECT(t, c); + + GcClassAddendum* addendum = c->addendum(); + if (addendum) { + GcByteArray* enclosingClass + = cast(t, addendum->enclosingClass()); + + if (enclosingClass) { + return reinterpret_cast( + getJClass(t, resolveClass(t, c->loader(), enclosingClass))); + } + } + return 0; +} + extern "C" AVIAN_EXPORT int64_t JNICALL Avian_java_lang_Class_getEnclosingConstructor(Thread* t, object method, diff --git a/test/Reflection.java b/test/Reflection.java index d20be272c4..7f0398ef81 100644 --- a/test/Reflection.java +++ b/test/Reflection.java @@ -256,6 +256,9 @@ public class Reflection { expect(Baz.class.getField("foo").getAnnotation(Ann.class) == null); expect(Baz.class.getField("foo").getAnnotations().length == 0); + expect(new Runnable() { public void run() { } }.getClass() + .getEnclosingClass().equals(Reflection.class)); + expect(new Runnable() { public void run() { } }.getClass() .getEnclosingMethod().equals (Reflection.class.getMethod