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