blob: fed1074dd487fc337291b635204a62220778f3fb [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "RuntimeLibraryPch.h"
namespace Js
{
JavascriptArray* JavascriptRegularExpressionResult::Create(
void *const stackAllocationPointer,
JavascriptString* input,
ScriptContext* const scriptContext)
{
JavascriptArray* arr = JavascriptArray::New<JavascriptArray, InlineSlotCount>(stackAllocationPointer, 0, scriptContext->GetLibrary()->GetRegexResultType()); // use default array capacity
Assert(JavascriptRegularExpressionResult::Is(arr));
arr->SetSlot(SetSlotArguments(BuiltInPropertyRecords::input.propertyRecord.GetPropertyId(), InputIndex, input));
// SetMatch must be called with a valid match before the object is given to script code
// Each item will be filled in by the match loop
return arr;
}
JavascriptArray* JavascriptRegularExpressionResult::Create(
void *const stackAllocationPointer,
const int numGroups,
JavascriptString* input,
ScriptContext* const scriptContext)
{
Assert(numGroups > 0);
JavascriptArray* arr = JavascriptArray::NewLiteral<JavascriptArray, InlineSlotCount>(stackAllocationPointer, numGroups, scriptContext->GetLibrary()->GetRegexResultType());
Assert(JavascriptRegularExpressionResult::Is(arr));
arr->SetSlot(SetSlotArguments(BuiltInPropertyRecords::input.propertyRecord.GetPropertyId(), InputIndex, input));
// SetMatch must be called with a valid match before the object is given to script code
// Each item will be filled in by the match loop
return arr;
}
#if DEBUG
//
// Check if a given JavascriptArray is actually JavascriptRegularExpressionResult.
//
bool JavascriptRegularExpressionResult::Is(JavascriptArray* arr)
{
return arr->GetPropertyIndex(PropertyIds::input) == InputIndex
&& arr->GetPropertyIndex(PropertyIds::index) == IndexIndex;
}
#endif
void JavascriptRegularExpressionResult::SetMatch(JavascriptArray* arr, const UnifiedRegex::GroupInfo match)
{
Assert(JavascriptRegularExpressionResult::Is(arr));
Assert(!match.IsUndefined());
ScriptContext* scriptContext = arr->GetScriptContext();
arr->SetSlot(SetSlotArguments(BuiltInPropertyRecords::index.propertyRecord.GetPropertyId(), IndexIndex, JavascriptNumber::ToVar(match.offset, scriptContext)));
}
void JavascriptRegularExpressionResult::InstantiateForceInlinedMembers()
{
// Force-inlined functions defined in a translation unit need a reference from an extern non-force-inlined function in
// the same translation unit to force an instantiation of the force-inlined function. Otherwise, if the force-inlined
// function is not referenced in the same translation unit, it will not be generated and the linker is not able to find
// the definition to inline the function in other translation units.
Assert(false);
Create(nullptr, nullptr, nullptr);
Create(nullptr, 0, nullptr, nullptr);
}
CompileAssert(JavascriptRegularExpressionResult::InlineSlotCount >= 2);
}