15f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian/* 25f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Copyright (C) 2009 Apple Inc. All rights reserved. 35f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 45f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * Redistribution and use in source and binary forms, with or without 55f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * modification, are permitted provided that the following conditions 65f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * are met: 75f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 1. Redistributions of source code must retain the above copyright 85f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * notice, this list of conditions and the following disclaimer. 95f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 2. Redistributions in binary form must reproduce the above copyright 105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * notice, this list of conditions and the following disclaimer in the 115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * documentation and/or other materials provided with the distribution. 125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * 135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian */ 255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef YarrJIT_h 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define YarrJIT_h 285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(YARR_JIT) 305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "JSGlobalData.h" 325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "MacroAssembler.h" 336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "UString.h" 342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "YarrPattern.h" 355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 36d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86) && !COMPILER(MSVC) 375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define YARR_CALL __attribute__ ((regparm (3))) 385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define YARR_CALL 405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace JSC { 435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass JSGlobalData; 455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianclass ExecutablePool; 465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qiannamespace Yarr { 485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass YarrCodeBlock { 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch typedef int (*YarrJITCode)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianpublic: 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch YarrCodeBlock() 54f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch : m_needFallBack(false) 555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ~YarrCodeBlock() 595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 62f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch void setFallBack(bool fallback) { m_needFallBack = fallback; } 63f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool isFallBack() { return m_needFallBack; } 645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void set(MacroAssembler::CodeRef ref) { m_ref = ref; } 655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int execute(const UChar* input, unsigned start, unsigned length, int* output) 675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return reinterpret_cast<YarrJITCode>(m_ref.m_code.executableAddress())(input, start, length, output); 695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(REGEXP_TRACING) 725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick void *getAddr() { return m_ref.m_code.executableAddress(); } 735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif 745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianprivate: 765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian MacroAssembler::CodeRef m_ref; 77f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch bool m_needFallBack; 785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}; 795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 802fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid jitCompile(YarrPattern&, JSGlobalData*, YarrCodeBlock& jitObject); 812fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockint execute(YarrCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output); 822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} } // namespace JSC::Yarr 845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // YarrJIT_h 88