8027024: String.prototype.charAt and charCodeAt do not evaluate 'self' and 'pos' arguments in right order
Reviewed-by: jlaskey, attila, lagergren
/* * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *//** * NASHORN-703 * * Self modifying assignments and ++/-- operators had two issues * 1) the base was loaded twice * 2) if the base was anything but an IdentNode, AccessNode or IndexNode and in the scope, it would * only be evaluated once, leading to bytecode stack underflow * * This file is split into two tests as the presence of eval affects the whole script * * @test * @run */function template() { this.count = 17; eval();}//self assignment to accessnode in scopefunction test1() { a.count++; eval();}function test2() { a2[0].count++; eval();}function test3() { a3[0]++; eval();}function test4() { a4 *= 17; eval();}function test5() { a5.count *= 17; eval();}function test6() { a6[0].count *= 17; eval();}function test7() { a7[0] *= 17; eval();}function tpl() { return new template();}function count() { tpl().count++; eval();}var a = new template();test1();print(a.count);var a2 = [new template()];test2();print(a2[0].count);var a3 = [1];test3();print(a3);var a4 = 4711;test4();print(a4);var a5 = new template();test5();print(a5.count);var a6 = [new template()];test6();print(a6[0].count);var a7 = [1];test7();print(a7[0]);