| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| #include "tests.h" |
| |
| JSBool |
| OperationCallback(JSContext *cx) |
| { |
| return false; |
| } |
| |
| static unsigned sRemain; |
| |
| JSBool |
| TriggerOperationCallback(JSContext *cx, unsigned argc, jsval *vp) |
| { |
| if (!sRemain--) |
| JS_TriggerOperationCallback(JS_GetRuntime(cx)); |
| *vp = JSVAL_VOID; |
| return true; |
| } |
| |
| BEGIN_TEST(testSlowScript) |
| { |
| JS_SetOperationCallback(cx, OperationCallback); |
| JS_DefineFunction(cx, global, "triggerOperationCallback", TriggerOperationCallback, 0, 0); |
| |
| test("while (true)" |
| " for (i in [0,0,0,0])" |
| " triggerOperationCallback();"); |
| |
| test("while (true)" |
| " for (i in [0,0,0,0])" |
| " for (j in [0,0,0,0])" |
| " triggerOperationCallback();"); |
| |
| test("while (true)" |
| " for (i in [0,0,0,0])" |
| " for (j in [0,0,0,0])" |
| " for (k in [0,0,0,0])" |
| " triggerOperationCallback();"); |
| |
| test("function f() { while (true) yield triggerOperationCallback() }" |
| "for (i in f()) ;"); |
| |
| test("function f() { while (true) yield 1 }" |
| "for (i in f())" |
| " triggerOperationCallback();"); |
| |
| test("(function() {" |
| " while (true)" |
| " let (x = 1) { eval('triggerOperationCallback()'); }" |
| "})()"); |
| |
| return true; |
| } |
| |
| bool |
| test(const char *bytes) |
| { |
| jsval v; |
| |
| JS_SetOptions(cx, JS_GetOptions(cx) & ~(JSOPTION_METHODJIT | JSOPTION_METHODJIT_ALWAYS)); |
| sRemain = 0; |
| CHECK(!evaluate(bytes, __FILE__, __LINE__, &v)); |
| CHECK(!JS_IsExceptionPending(cx)); |
| |
| sRemain = 1000; |
| CHECK(!evaluate(bytes, __FILE__, __LINE__, &v)); |
| CHECK(!JS_IsExceptionPending(cx)); |
| |
| JS_SetOptions(cx, JS_GetOptions(cx) | JSOPTION_METHODJIT | JSOPTION_METHODJIT_ALWAYS); |
| |
| sRemain = 0; |
| CHECK(!evaluate(bytes, __FILE__, __LINE__, &v)); |
| CHECK(!JS_IsExceptionPending(cx)); |
| |
| sRemain = 1000; |
| CHECK(!evaluate(bytes, __FILE__, __LINE__, &v)); |
| CHECK(!JS_IsExceptionPending(cx)); |
| |
| return true; |
| } |
| END_TEST(testSlowScript) |