# HG changeset patch # User Jaroslav Tulach # Date 1403388596 -7200 # Node ID 8ac637d7d62a26d78d18c2d56b8735a49fc9e0ba # Parent 3e565843a1313fb77986d53a1b457e428ef42200 Using Object.defineProperty to hide attributes from list of enumerable properties diff -r 3e565843a131 -r 8ac637d7d62a rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java --- a/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Mon Jun 09 19:32:49 2014 +0200 +++ b/rt/vm/src/main/java/org/apidesign/vm4brwsr/ByteCodeToJavaScript.java Sun Jun 22 00:09:56 2014 +0200 @@ -260,15 +260,18 @@ append("\n c.constructor = CLS;"); append("\n function fillInstOf(x) {"); String instOfName = "$instOf_" + className; - append("\n x['").append(instOfName).append("'] = true;"); + append("\n Object.defineProperty(x, '").append(instOfName).append("', { value : true });"); for (String superInterface : jc.getSuperInterfaces()) { String intrfc = superInterface.replace('/', '_'); append("\n vm.").append(intrfc).append("(false)['fillInstOf'](x);"); requireReference(superInterface); } append("\n }"); - append("\n c['fillInstOf'] = fillInstOf;"); - append("\n fillInstOf(c);"); + append("\n try {"); + append("\n Object.defineProperty(c, 'fillInstOf', { value: fillInstOf });"); + append("\n fillInstOf(c);"); + append("\n } catch (ignore) {"); + append("\n }"); // obfuscationDelegate.exportJSProperty(this, "c", instOfName); append("\n CLS.$class = 'temp';"); append("\n CLS.$class = "); diff -r 3e565843a131 -r 8ac637d7d62a rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Mon Jun 09 19:32:49 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/Instance.java Sun Jun 22 00:09:56 2014 +0200 @@ -135,6 +135,13 @@ return jsgetbytes(new Instance()); } + public static int noInstOfExposed() { + return countInstOf(10); + } + + @JavaScriptBody(args = "o", body = "var i = 0; for (p in o) { if (p.toString().indexOf('instOf') >= 0) i++; } return i;") + private static native int countInstOf(Object o); + @JavaScriptBody(args = { "instance" }, body = "return instance.getByte__B();") private static native int jsgetbytes(Instance instance); diff -r 3e565843a131 -r 8ac637d7d62a rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java --- a/rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Mon Jun 09 19:32:49 2014 +0200 +++ b/rt/vm/src/test/java/org/apidesign/vm4brwsr/InstanceTest.java Sun Jun 22 00:09:56 2014 +0200 @@ -47,6 +47,13 @@ Double.valueOf(31) ); } + @Test public void noInstOfExposed() throws Exception { + assertExec( + "No instOf properties found", + Instance.class, "noInstOfExposed__I", + Double.valueOf(0) + ); + } @Test public void verifyMagicOne() throws Exception { assertExec( "Should be three and something",