2
* Copyright (C) 2009 Apple Inc. All rights reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
7
* 1. Redistributions of source code must retain the above copyright
8
* notice, this list of conditions and the following disclaimer.
9
* 2. Redistributions in binary form must reproduce the above copyright
10
* notice, this list of conditions and the following disclaimer in the
11
* documentation and/or other materials provided with the distribution.
13
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
#include "JSGlobalData.h"
32
#include "MacroAssemblerCodeRef.h"
33
#include "MatchResult.h"
35
#include "YarrPattern.h"
37
#if CPU(X86) && !COMPILER(MSVC)
38
#define YARR_CALL __attribute__ ((regparm (3)))
52
typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
53
typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
54
typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL;
55
typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL;
57
typedef EncodedMatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
58
typedef EncodedMatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
59
typedef EncodedMatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL;
60
typedef EncodedMatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL;
65
: m_needFallBack(false)
73
void setFallBack(bool fallback) { m_needFallBack = fallback; }
74
bool isFallBack() { return m_needFallBack; }
76
bool has8BitCode() { return m_ref8.size(); }
77
bool has16BitCode() { return m_ref16.size(); }
78
void set8BitCode(MacroAssemblerCodeRef ref) { m_ref8 = ref; }
79
void set16BitCode(MacroAssemblerCodeRef ref) { m_ref16 = ref; }
81
bool has8BitCodeMatchOnly() { return m_matchOnly8.size(); }
82
bool has16BitCodeMatchOnly() { return m_matchOnly16.size(); }
83
void set8BitCodeMatchOnly(MacroAssemblerCodeRef matchOnly) { m_matchOnly8 = matchOnly; }
84
void set16BitCodeMatchOnly(MacroAssemblerCodeRef matchOnly) { m_matchOnly16 = matchOnly; }
86
MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output)
88
ASSERT(has8BitCode());
89
return MatchResult(reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output));
92
MatchResult execute(const UChar* input, unsigned start, unsigned length, int* output)
94
ASSERT(has16BitCode());
95
return MatchResult(reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output));
98
MatchResult execute(const LChar* input, unsigned start, unsigned length)
100
ASSERT(has8BitCodeMatchOnly());
101
return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly8>(m_matchOnly8.code().executableAddress())(input, start, length));
104
MatchResult execute(const UChar* input, unsigned start, unsigned length)
106
ASSERT(has16BitCodeMatchOnly());
107
return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly16>(m_matchOnly16.code().executableAddress())(input, start, length));
110
#if ENABLE(REGEXP_TRACING)
111
void *getAddr() { return m_ref.code().executableAddress(); }
116
m_ref8 = MacroAssemblerCodeRef();
117
m_ref16 = MacroAssemblerCodeRef();
118
m_matchOnly8 = MacroAssemblerCodeRef();
119
m_matchOnly16 = MacroAssemblerCodeRef();
120
m_needFallBack = false;
124
MacroAssemblerCodeRef m_ref8;
125
MacroAssemblerCodeRef m_ref16;
126
MacroAssemblerCodeRef m_matchOnly8;
127
MacroAssemblerCodeRef m_matchOnly16;
131
enum YarrJITCompileMode {
135
void jitCompile(YarrPattern&, YarrCharSize, JSGlobalData*, YarrCodeBlock& jitObject, YarrJITCompileMode = IncludeSubpatterns);
137
} } // namespace JSC::Yarr