changeset 19:9fea3d8da9aa

!!! NOTE: this marks the beginning of Java 8 dependency for jpf-core compilation. From now on, we are free to use default methods and lambdas. added convenience Loggable and PrintStreamable interfaces that mix in the respective fat interfaces via default methods, so that we don't have to burn inheritance of respective target classes (they only have to provide getLogger() and getPrintStream() methods) added a abstract LoggablePeer so that model classes can implement Loggable with intercepted/native logging if they provide a respective concrete peer. added some more default interface method tests
author Peter Mehlitz <pcmehlitz@gmail.com>
date Wed, 01 Apr 2015 12:14:15 -0700
parents a9ada67f1799
children b1790909ebb1
files .idea/misc.xml src/main/gov/nasa/jpf/util/Loggable.java src/main/gov/nasa/jpf/util/PrintStreamable.java src/peers/gov/nasa/jpf/vm/LoggablePeer.java src/tests/java8/DefaultMethodTest.java src/tests/java8/JPF_java8_DefaultMethodTest$G1.java
diffstat 6 files changed, 563 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/.idea/misc.xml	Tue Mar 31 15:37:44 2015 -0700
+++ b/.idea/misc.xml	Wed Apr 01 12:14:15 2015 -0700
@@ -54,20 +54,4 @@
   <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build" />
   </component>
-  <component name="masterDetails">
-    <states>
-      <state key="ProjectJDKs.UI">
-        <settings>
-          <last-edited>1.8</last-edited>
-          <splitter-proportions>
-            <option name="proportions">
-              <list>
-                <option value="0.2" />
-              </list>
-            </option>
-          </splitter-proportions>
-        </settings>
-      </state>
-    </states>
-  </component>
 </project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/gov/nasa/jpf/util/Loggable.java	Wed Apr 01 12:14:15 2015 -0700
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2015, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All rights reserved.
+ *
+ * The Java Pathfinder core (jpf-core) platform is licensed under the
+ * Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package gov.nasa.jpf.util;
+
+/**
+ * convenience interface that mixes in JPFLogger interface methods
+ */
+public interface Loggable {
+
+  // the primitive method used by the defaults
+  JPFLogger getLogger();
+
+  default void severe (String msg){
+    getLogger().severe(msg);
+  }
+  default void severe (String a1, String a2){
+    getLogger().severe(a1, a2);
+  }
+  default void severe (String a1, String a2, String a3){
+    getLogger().severe(a1, a2, a3);
+  }
+  default void severe (String a1, String a2, String a3, String a4){
+    getLogger().severe(a1, a2, a3, a4);
+  }
+  default void severe (String a1, String a2, String a3, String a4, String a5){
+    getLogger().severe(a1, a2, a3, a4, a5);
+  }
+  default void severe (String... a) {
+    getLogger().severe((Object[])a);
+  }
+
+  default void severe (Object msg){
+    getLogger().severe(msg);
+  }
+  default void severe (Object a1, Object a2){
+    getLogger().severe(a1, a2);
+  }
+  default void severe (Object a1, Object a2, Object a3){
+    getLogger().severe(a1, a2, a3);
+  }
+  default void severe (Object a1, Object a2, Object a3, Object a4){
+    getLogger().severe(a1, a2, a3, a4);
+  }
+  default void severe (Object a1, Object a2, Object a3, Object a4, Object a5){
+    getLogger().severe(a1, a2, a3, a4, a5);
+  }
+  default void severe (Object... a) {
+    getLogger().severe((Object[])a);
+  }
+  default void fsevere (String format, Object... a) {
+    getLogger().fsevere(format, a);
+  }
+
+
+  default void warning (String msg){
+    getLogger().warning(msg);
+  }
+  default void warning (String a1, String a2){
+    getLogger().warning(a1, a2);
+  }
+  default void warning (String a1, String a2, String a3){
+    getLogger().warning(a1, a2, a3);
+  }
+  default void warning (String a1, String a2, String a3, String a4){
+    getLogger().warning(a1, a2, a3, a4);
+  }
+  default void warning (String a1, String a2, String a3, String a4, String a5){
+    getLogger().warning(a1, a2, a3, a4, a5);
+  }
+  default void warning (String... a) {
+    getLogger().warning((Object[]) a);
+  }
+
+  default void warning (Object msg){
+    getLogger().warning(msg);
+  }
+  default void warning (Object a1, Object a2){
+    getLogger().warning(a1, a2);
+  }
+  default void warning (Object a1, Object a2, Object a3){
+    getLogger().warning(a1, a2, a3);
+  }
+  default void warning (Object a1, Object a2, Object a3, Object a4){
+    getLogger().warning(a1, a2, a3, a4);
+  }
+  default void warning (Object a1, Object a2, Object a3, Object a4, Object a5){
+    getLogger().warning(a1, a2, a3, a4, a5);
+  }
+  default void warning (Object... a) {
+    getLogger().warning((Object[]) a);
+  }
+  default void fwarning (String format, Object... a) {
+    getLogger().fwarning(format, a);
+  }
+
+
+  default void info (String msg){
+    getLogger().info(msg);
+  }
+  default void info (String a1, String a2){
+    getLogger().info(a1, a2);
+  }
+  default void info (String a1, String a2, String a3){
+    getLogger().info(a1, a2, a3);
+  }
+  default void info (String a1, String a2, String a3, String a4){
+    getLogger().info(a1, a2, a3, a4);
+  }
+  default void info (String a1, String a2, String a3, String a4, String a5){
+    getLogger().info(a1, a2, a3, a4, a5);
+  }
+  default void info (String... a) {
+    getLogger().info((Object[]) a);
+  }
+
+  default void info (Object msg){
+    getLogger().info(msg);
+  }
+  default void info (Object a1, Object a2){
+    getLogger().info(a1, a2);
+  }
+  default void info (Object a1, Object a2, Object a3){
+    getLogger().info(a1, a2, a3);
+  }
+  default void info (Object a1, Object a2, Object a3, Object a4){
+    getLogger().info(a1, a2, a3, a4);
+  }
+  default void info (Object a1, Object a2, Object a3, Object a4, Object a5){
+    getLogger().info(a1, a2, a3, a4, a5);
+  }
+  default void info (Object... a) {
+    getLogger().info((Object[]) a);
+  }
+  default void finfo (String format, Object... a) {
+    getLogger().finfo(format, a);
+  }
+
+
+  default void fine (String msg){
+    getLogger().fine(msg);
+  }
+  default void fine (String a1, String a2){
+    getLogger().fine(a1, a2);
+  }
+  default void fine (String a1, String a2, String a3){
+    getLogger().fine(a1, a2, a3);
+  }
+  default void fine (String a1, String a2, String a3, String a4){
+    getLogger().fine(a1, a2, a3, a4);
+  }
+  default void fine (String a1, String a2, String a3, String a4, String a5){
+    getLogger().fine(a1, a2, a3, a4, a5);
+  }
+  default void fine (String... a) {
+    getLogger().fine((Object[]) a);
+  }
+
+  default void fine (Object msg){
+    getLogger().fine(msg);
+  }
+  default void fine (Object a1, Object a2){
+    getLogger().fine(a1, a2);
+  }
+  default void fine (Object a1, Object a2, Object a3){
+    getLogger().fine(a1, a2, a3);
+  }
+  default void fine (Object a1, Object a2, Object a3, Object a4){
+    getLogger().fine(a1, a2, a3, a4);
+  }
+  default void fine (Object a1, Object a2, Object a3, Object a4, Object a5){
+    getLogger().fine(a1, a2, a3, a4, a5);
+  }
+  default void fine (Object... a) {
+    getLogger().fine((Object[]) a);
+  }
+  default void ffine (String format, Object... a) {
+    getLogger().ffine(format, a);
+  }
+
+
+  default void finer (String msg){
+    getLogger().finer(msg);
+  }
+  default void finer (String a1, String a2){
+    getLogger().finer(a1, a2);
+  }
+  default void finer (String a1, String a2, String a3){
+    getLogger().finer(a1, a2, a3);
+  }
+  default void finer (String a1, String a2, String a3, String a4){
+    getLogger().finer(a1, a2, a3, a4);
+  }
+  default void finer (String a1, String a2, String a3, String a4, String a5){
+    getLogger().finer(a1, a2, a3, a4, a5);
+  }
+  default void finer (String... a) {
+    getLogger().finer((Object[]) a);
+  }
+
+  default void finer (Object msg){
+    getLogger().finer(msg);
+  }
+  default void finer (Object a1, Object a2){
+    getLogger().finer(a1, a2);
+  }
+  default void finer (Object a1, Object a2, Object a3){
+    getLogger().finer(a1, a2, a3);
+  }
+  default void finer (Object a1, Object a2, Object a3, Object a4){
+    getLogger().finer(a1, a2, a3, a4);
+  }
+  default void finer (Object a1, Object a2, Object a3, Object a4, Object a5){
+    getLogger().finer(a1, a2, a3, a4, a5);
+  }
+  default void finer (Object... a) {
+    getLogger().finer((Object[]) a);
+  }
+  default void ffiner (String format, Object... a) {
+    getLogger().ffiner(format, a);
+  }
+
+
+  default void finest (String msg){
+    getLogger().finest(msg);
+  }
+  default void finest (String a1, String a2){
+    getLogger().finest(a1, a2);
+  }
+  default void finest (String a1, String a2, String a3){
+    getLogger().finest(a1, a2, a3);
+  }
+  default void finest (String a1, String a2, String a3, String a4){
+    getLogger().finest(a1, a2, a3, a4);
+  }
+  default void finest (String a1, String a2, String a3, String a4, String a5){
+    getLogger().finest(a1, a2, a3, a4, a5);
+  }
+  default void finest (String... a) {
+    getLogger().finest((Object[]) a);
+  }
+
+  default void finest (Object msg){
+    getLogger().finest(msg);
+  }
+  default void finest (Object a1, Object a2){
+    getLogger().finest(a1, a2);
+  }
+  default void finest (Object a1, Object a2, Object a3){
+    getLogger().finest(a1, a2, a3);
+  }
+  default void finest (Object a1, Object a2, Object a3, Object a4){
+    getLogger().finest(a1, a2, a3, a4);
+  }
+  default void finest (Object a1, Object a2, Object a3, Object a4, Object a5){
+    getLogger().finest(a1, a2, a3, a4, a5);
+  }
+  default void finest (Object... a) {
+    getLogger().finest((Object[]) a);
+  }
+  default void ffinest (String format, Object... a) {
+    getLogger().ffinest(format, a);
+  }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/gov/nasa/jpf/util/PrintStreamable.java	Wed Apr 01 12:14:15 2015 -0700
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2015, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ * All rights reserved.
+ *
+ * The Java Pathfinder core (jpf-core) platform is licensed under the
+ * Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0.
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package gov.nasa.jpf.util;
+
+import java.io.PrintStream;
+
+/**
+ * convenience interface to mix in PrintStream interface
+ */
+public interface PrintStreamable {
+
+  // the primitive method used by the defaults
+  PrintStream getPrintStream();
+
+  default void println() {
+    getPrintStream().println();
+  }
+
+  default void print(boolean a){
+    getPrintStream().print(a);
+  }
+  default void print(int a){
+    getPrintStream().print(a);
+  }
+  default void print(double a){
+    getPrintStream().print(a);
+  }
+  default void print(String s) {
+    getPrintStream().print(s);
+  }
+  default void print(Object o) {
+    getPrintStream().print(o.toString());
+  }
+
+  default void println(boolean a){
+    getPrintStream().println(a);
+  }
+  default void println(int a){
+    getPrintStream().println(a);
+  }
+  default void println(double a){
+    getPrintStream().println(a);
+  }
+  default void println(String s) {
+    getPrintStream().println(s);
+  }
+  default void println(Object o) {
+    getPrintStream().println(o.toString());
+  }
+
+  default void printf (String format, Object... args) {
+    getPrintStream().printf(format, args);
+  }
+
+  //... and many more
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/peers/gov/nasa/jpf/vm/LoggablePeer.java	Wed Apr 01 12:14:15 2015 -0700
@@ -0,0 +1,134 @@
+package gov.nasa.jpf.vm;
+
+import gov.nasa.jpf.JPF;
+import gov.nasa.jpf.annotation.MJI;
+import gov.nasa.jpf.util.JPFLogger;
+
+/**
+ * abstract base for Loggable peers
+ */
+public abstract class LoggablePeer extends NativePeer {
+
+  final JPFLogger delegatee;
+
+  protected LoggablePeer (String loggerId) {
+    delegatee = JPF.getLogger(loggerId);
+  }
+
+
+  @MJI
+  public void severe__Ljava_lang_String_2__V (MJIEnv env, int objRef, int sRef) {
+    delegatee.severe(env.getStringObject(sRef));
+  }
+  @MJI public void severe__Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref) {
+    delegatee.severe(env.getStringObject(s1Ref), env.getStringObject(s2Ref));
+  }
+  @MJI public void severe__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref) {
+    delegatee.severe(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref));
+  }
+  @MJI public void severe__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref) {
+    delegatee.severe(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref));
+  }
+  @MJI public void severe__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref, int s5Ref) {
+    delegatee.severe(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref), env.getStringObject(s5Ref));
+  }
+  @MJI public void severe___3Ljava_lang_String_2__V (MJIEnv env, int objRef, int aRef) {
+    delegatee.severe((Object[]) env.getStringArrayObject(aRef));
+  }
+
+  @MJI public void warning__Ljava_lang_String_2__V (MJIEnv env, int objRef, int sRef) {
+    delegatee.warning(env.getStringObject(sRef));
+  }
+  @MJI public void warning__Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref) {
+    delegatee.warning(env.getStringObject(s1Ref), env.getStringObject(s2Ref));
+  }
+  @MJI public void warning__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref) {
+    delegatee.warning(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref));
+  }
+  @MJI public void warning__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref) {
+    delegatee.warning(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref));
+  }
+  @MJI public void warning__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref, int s5Ref) {
+    delegatee.warning(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref), env.getStringObject(s5Ref));
+  }
+  @MJI public void warning___3Ljava_lang_String_2__V (MJIEnv env, int objRef, int aRef) {
+    delegatee.warning((Object[]) env.getStringArrayObject(aRef));
+  }
+
+  @MJI public void info__Ljava_lang_String_2__V (MJIEnv env, int objRef, int sRef) {
+    delegatee.info(env.getStringObject(sRef));
+  }
+  @MJI public void info__Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref) {
+    delegatee.info(env.getStringObject(s1Ref), env.getStringObject(s2Ref));
+  }
+  @MJI public void info__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref) {
+    delegatee.info(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref));
+  }
+  @MJI public void info__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref) {
+    delegatee.info(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref));
+  }
+  @MJI public void info__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref, int s5Ref) {
+    delegatee.info(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref), env.getStringObject(s5Ref));
+  }
+  @MJI public void info___3Ljava_lang_String_2__V (MJIEnv env, int objRef, int aRef) {
+    delegatee.info((Object[]) env.getStringArrayObject(aRef));
+  }
+
+  @MJI public void fine__Ljava_lang_String_2__V (MJIEnv env, int objRef, int sRef) {
+    delegatee.fine(env.getStringObject(sRef));
+  }
+  @MJI public void fine__Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref) {
+    delegatee.fine(env.getStringObject(s1Ref), env.getStringObject(s2Ref));
+  }
+  @MJI public void fine__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref) {
+    delegatee.fine(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref));
+  }
+  @MJI public void fine__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref) {
+    delegatee.fine(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref));
+  }
+  @MJI public void fine__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref, int s5Ref) {
+    delegatee.fine(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref), env.getStringObject(s5Ref));
+  }
+  @MJI public void fine___3Ljava_lang_String_2__V (MJIEnv env, int objRef, int aRef) {
+    delegatee.fine((Object[]) env.getStringArrayObject(aRef));
+  }
+
+  @MJI public void finer__Ljava_lang_String_2__V (MJIEnv env, int objRef, int sRef) {
+    delegatee.finer(env.getStringObject(sRef));
+  }
+  @MJI public void finer__Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref) {
+    delegatee.finer(env.getStringObject(s1Ref), env.getStringObject(s2Ref));
+  }
+  @MJI public void finer__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref) {
+    delegatee.finer(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref));
+  }
+  @MJI public void finer__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref) {
+    delegatee.finer(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref));
+  }
+  @MJI public void finer__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref, int s5Ref) {
+    delegatee.finer(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref), env.getStringObject(s5Ref));
+  }
+  @MJI public void finer___3Ljava_lang_String_2__V (MJIEnv env, int objRef, int aRef) {
+    delegatee.finer((Object[]) env.getStringArrayObject(aRef));
+  }
+
+  @MJI public void finest__Ljava_lang_String_2__V (MJIEnv env, int objRef, int sRef) {
+    delegatee.finest(env.getStringObject(sRef));
+  }
+  @MJI public void finest__Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref) {
+    delegatee.finest(env.getStringObject(s1Ref), env.getStringObject(s2Ref));
+  }
+  @MJI public void finest__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref) {
+    delegatee.finest(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref));
+  }
+  @MJI public void finest__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref) {
+    delegatee.finest(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref));
+  }
+  @MJI public void finest__Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2Ljava_lang_String_2__V (MJIEnv env, int objRef, int s1Ref, int s2Ref, int s3Ref, int s4Ref, int s5Ref) {
+    delegatee.finest(env.getStringObject(s1Ref), env.getStringObject(s2Ref), env.getStringObject(s3Ref), env.getStringObject(s4Ref), env.getStringObject(s5Ref));
+  }
+  @MJI public void finest___3Ljava_lang_String_2__V (MJIEnv env, int objRef, int aRef) {
+    delegatee.finest((Object[]) env.getStringArrayObject(aRef));
+  }
+
+}
--- a/src/tests/java8/DefaultMethodTest.java	Tue Mar 31 15:37:44 2015 -0700
+++ b/src/tests/java8/DefaultMethodTest.java	Wed Apr 01 12:14:15 2015 -0700
@@ -17,7 +17,10 @@
  */
 package java8;
 
+import gov.nasa.jpf.annotation.MJI;
 import gov.nasa.jpf.util.test.TestJPF;
+import gov.nasa.jpf.vm.MJIEnv;
+import gov.nasa.jpf.vm.NativePeer;
 import gov.nasa.jpf.vm.Verify;
 import org.junit.Test;
 
@@ -80,7 +83,64 @@
       assertTrue (result == 45);
     }    
   }
-  
-  
+
+  //------------------------------------------- overloaded methods
+
+  interface E1 {
+    default int foo (String s1, String s2){
+      System.out.println("this is E1.foo(String,String)");
+      return 42;
+    }
+
+    default int foo (Object o1, Object o2){
+      System.out.println("this is E1.foo(Object,Object)");
+      return 0;
+    }
+  }
+
+  static class F implements E1 {
+    String getId() {
+      return "whatever";
+    }
+
+    void bar (){
+      int r = foo("blah", getId());
+      assertTrue(r == 42);
+    }
+  }
+
+  @Test
+  public void testOverloadedDefaults(){
+    if (verifyNoPropertyViolation()){
+      F o = new F();
+      o.bar();
+    }
+  }
+
+  //----------------------------------------------- native peer for interface
+
+  interface G1 {
+    default int foo (){  // should be intercepted by peer
+      System.out.println("this is bytecode G1.foo()");
+      return -1;
+    }
+  }
+
+  static class H implements G1 {
+    void bar (){
+      int r = foo();
+      //assertTrue(r == 42);
+    }
+  }
+
+  @Test
+  public void testInterfacePeer(){
+    if (verifyNoPropertyViolation()){
+      H o = new H();
+      o.bar();
+    }
+  }
+
   // <2do> how to test IncompatibleClassChangeError without explicit classfile restore?
 }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/tests/java8/JPF_java8_DefaultMethodTest$G1.java	Wed Apr 01 12:14:15 2015 -0700
@@ -0,0 +1,16 @@
+package java8;
+
+import gov.nasa.jpf.annotation.MJI;
+import gov.nasa.jpf.vm.MJIEnv;
+import gov.nasa.jpf.vm.NativePeer;
+
+/**
+ * Created by pcmehlitz on 4/1/15.
+ */
+public class JPF_java8_DefaultMethodTest$G1 extends NativePeer {
+  @MJI
+  public int foo____I (MJIEnv env, int objRef){
+    System.out.println("this is native G1.foo()");
+    return 42;
+  }
+}