diff --git a/lib/Runtime/Language/AsmJsUtils.cpp b/lib/Runtime/Language/AsmJsUtils.cpp index 410d296c690..09290913f21 100644 --- a/lib/Runtime/Language/AsmJsUtils.cpp +++ b/lib/Runtime/Language/AsmJsUtils.cpp @@ -217,7 +217,8 @@ namespace Js AsmJsModuleInfo::EnsureHeapAttached(func); - uint actualArgCount = callInfo.Count - 1; // -1 for ScriptFunction + ArgumentReader reader(&callInfo, origArgs); + uint actualArgCount = reader.Info.Count - 1; // -1 for ScriptFunction argDst = argDst + MachPtr; // add one first so as to skip the ScriptFunction argument for (ArgSlot i = 0; i < info->GetArgCount(); i++) { diff --git a/lib/Runtime/Library/JavascriptString.cpp b/lib/Runtime/Library/JavascriptString.cpp index 0db870d0c85..53914b1b6ac 100644 --- a/lib/Runtime/Library/JavascriptString.cpp +++ b/lib/Runtime/Library/JavascriptString.cpp @@ -199,10 +199,10 @@ namespace Js } JavascriptString::JavascriptString(StaticType * type, charcount_t charLength, const char16* szValue) - : RecyclableObject(type), m_charLength(charLength), m_pszValue(szValue) + : RecyclableObject(type), m_pszValue(szValue) { Assert(type->GetTypeId() == TypeIds_String); - AssertMsg(IsValidCharCount(charLength), "String length is out of range"); + SetLength(charLength); } _Ret_range_(m_charLength, m_charLength) @@ -3353,7 +3353,7 @@ namespace Js return builder.ToString(); } - int JavascriptString::IndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, int len, const char16* searchStr, int searchLen, int position) + int JavascriptString::IndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, charcount_t len, const char16* searchStr, int searchLen, int position) { int result = -1; @@ -3400,7 +3400,7 @@ namespace Js return result; } - int JavascriptString::LastIndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, int len, const char16* searchStr, int searchLen, int position) + int JavascriptString::LastIndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, charcount_t len, const char16* searchStr, charcount_t searchLen, charcount_t position) { const char16 searchFirst = searchStr[0]; uint32 lMatchedJump = searchLen; diff --git a/lib/Runtime/Library/JavascriptString.h b/lib/Runtime/Library/JavascriptString.h index b9b8bcdbc43..40141dffcf4 100644 --- a/lib/Runtime/Library/JavascriptString.h +++ b/lib/Runtime/Library/JavascriptString.h @@ -157,8 +157,8 @@ namespace Js char16* GetSzCopy(); // get a copy of the inner string without compacting the chunks static Var ToCaseCore(JavascriptString* pThis, ToCase toCase); - static int IndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, int len, const char16* searchStr, int searchLen, int position); - static int LastIndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, int len, const char16* searchStr, int searchLen, int position); + static int IndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, charcount_t len, const char16* searchStr, int searchLen, int position); + static int LastIndexOfUsingJmpTable(JmpTable jmpTable, const char16* inputStr, charcount_t len, const char16* searchStr, charcount_t searchLen, charcount_t position); static bool BuildLastCharForwardBoyerMooreTable(JmpTable jmpTable, const char16* searchStr, int searchLen); static bool BuildFirstCharBackwardBoyerMooreTable(JmpTable jmpTable, const char16* searchStr, int searchLen); static charcount_t ConvertToIndex(Var varIndex, ScriptContext *scriptContext); diff --git a/test/AsmJs/evalbug.js b/test/AsmJs/evalbug.js new file mode 100644 index 00000000000..5372beab079 --- /dev/null +++ b/test/AsmJs/evalbug.js @@ -0,0 +1,18 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +function asm() { + "use asm" + function f(a, b) { + a = a|0; + b = b|0; + return a|0; + } + return f; +} + +eval = asm(); +eval("some string"); +print("PASSED"); diff --git a/test/AsmJs/rlexe.xml b/test/AsmJs/rlexe.xml index 7a1c1221611..2181f7a5cac 100644 --- a/test/AsmJs/rlexe.xml +++ b/test/AsmJs/rlexe.xml @@ -536,6 +536,11 @@ -testtrace:asmjs -simdjs + + + evalbug.js + + constTest.js diff --git a/test/Strings/repeatBug.js b/test/Strings/repeatBug.js new file mode 100644 index 00000000000..1ed7740f4cb --- /dev/null +++ b/test/Strings/repeatBug.js @@ -0,0 +1,21 @@ +//------------------------------------------------------------------------------------------------------- +// Copyright (C) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. +//------------------------------------------------------------------------------------------------------- + +try +{ + var str = "+".repeat(0x80000000); + str = str.replace(str, "+"); + + WScript.Echo("FAIL: Was expecting Out of Memory exception."); +} +catch (e) +{ + if(e.number == -2146828281) //Out of Memory + WScript.Echo("PASS"); + else + WScript.Echo("FAIL: Got the wrong exception code."); +} + + diff --git a/test/Strings/rlexe.xml b/test/Strings/rlexe.xml index 7fcb113051e..ac6393757ea 100644 --- a/test/Strings/rlexe.xml +++ b/test/Strings/rlexe.xml @@ -242,4 +242,10 @@ exclude_win7 + + + repeatBug.js + exclude_chk, Slow + +