# HG changeset patch # User Jaroslav Tulach # Date 1408298285 -7200 # Node ID 2d3d0b72af04665e82ba3e0074663267fd2b330f # Parent 1efb2645c7aacf1bf11d95470bdfd3ff0e5b2b1e 1st implementation of interface extender methods diff -r 1efb2645c7aa -r 2d3d0b72af04 rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Aug 17 08:27:45 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Aug 17 19:58:05 2014 +0200 @@ -261,6 +261,19 @@ append("\n function fillInstOf(x) {"); String instOfName = "$instOf_" + className; append("\n Object.defineProperty(x, '").append(instOfName).append("', { value : true });"); + if (jc.isInterface()) { + for (MethodData m : jc.getMethods()) { + if ((m.getAccess() & ACC_ABSTRACT) == 0 + && (m.getAccess() & ACC_STATIC) == 0 + && (m.getAccess() & ACC_PRIVATE) == 0) { + final String mn = findMethodName(m, new StringBuilder()); + append("\n try {"); + append("\n Object.defineProperty(x, '").append(mn).append("', { value : c['").append(mn).append("']});"); + append("\n } catch (ignore) {"); + append("\n }"); + } + } + } for (String superInterface : jc.getSuperInterfaces()) { String intrfc = superInterface.replace('/', '_'); append("\n vm.").append(intrfc).append("(false)['fillInstOf'](x);"); diff -r 1efb2645c7aa -r 2d3d0b72af04 rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/Defaults.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/Defaults.java Sun Aug 17 19:58:05 2014 +0200 @@ -0,0 +1,48 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.vm8; + +public interface Defaults { + public static int staticValue() { + return 42; + } + + public default int value() { + return 42; + } + + public static Defaults create(boolean overriden) { + class X implements Defaults { + } + class Y implements Defaults { + @Override + public int value() { + return 7; + } + } + return overriden ? new Y() : new X(); + } + + public static int defaultValue() { + return create(false).value(); + } + + public static int myValue() { + return create(true).value(); + } +} diff -r 1efb2645c7aa -r 2d3d0b72af04 rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/DefaultsTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rt/vm8/src/test/java/org/apidesign/bck2brwsr/vm8/DefaultsTest.java Sun Aug 17 19:58:05 2014 +0200 @@ -0,0 +1,56 @@ +/** + * Back 2 Browser Bytecode Translator + * Copyright (C) 2012 Jaroslav Tulach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. Look for COPYING file in the top folder. + * If not, see http://opensource.org/licenses/GPL-2.0. + */ +package org.apidesign.bck2brwsr.vm8; + +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class DefaultsTest { + private static TestVM code; + + @Test public void callStatic() throws Exception { + Object js = code.execCode("Value from static method", + Defaults.class, "staticValue__I", 42 + ); + } + + @Test public void defaultValue() throws Exception { + Object js = code.execCode("Value from interface", + Defaults.class, "defaultValue__I", 42 + ); + } + + @Test public void overridenValue() throws Exception { + Object js = code.execCode("Value from class", + Defaults.class, "myValue__I", 7 + ); + } + + @BeforeClass + public static void compileTheCode() throws Exception { + code = TestVM.compileClass( + "org/apidesign/bck2brwsr/vm8/Defaults"); + } + + @AfterClass + public static void releaseTheCode() { + code = null; + } + +}