|  | // Copyright 2016 the V8 project authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // Flags: --allow-natives-syntax | 
|  |  | 
|  | // Tests function bindings are correctly handled in ignition. | 
|  | (function f() { | 
|  | function assignSloppy() { | 
|  | f = 0; | 
|  | } | 
|  | assertDoesNotThrow(assignSloppy); | 
|  |  | 
|  | function assignStrict() { | 
|  | 'use strict'; | 
|  | f = 0; | 
|  | } | 
|  | assertThrows(assignStrict, TypeError); | 
|  |  | 
|  | function assignStrictLookup() { | 
|  | eval("'use strict'; f = 1;"); | 
|  | } | 
|  | assertThrows(assignStrictLookup, TypeError); | 
|  | })(); | 
|  |  | 
|  | // Tests for compound assignments which are handled differently | 
|  | // in crankshaft. | 
|  | (function f() { | 
|  | function assignSloppy() { | 
|  | f += "x"; | 
|  | } | 
|  | assertDoesNotThrow(assignSloppy); | 
|  | assertDoesNotThrow(assignSloppy); | 
|  | %OptimizeFunctionOnNextCall(assignSloppy); | 
|  | assertDoesNotThrow(assignSloppy); | 
|  |  | 
|  | function assignStrict() { | 
|  | 'use strict'; | 
|  | f += "x"; | 
|  | } | 
|  | assertThrows(assignStrict, TypeError); | 
|  | assertThrows(assignStrict, TypeError); | 
|  | %OptimizeFunctionOnNextCall(assignStrict); | 
|  | assertThrows(assignStrict, TypeError); | 
|  | })(); |