📄 wrec.cpp
字号:
/* * Copyright (C) 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include "WREC.h"#if ENABLE(WREC)#include "CharacterClassConstructor.h"#include "Interpreter.h"#include "JSGlobalObject.h"#include "RegisterFile.h"#include "WRECFunctors.h"#include "WRECParser.h"#include "pcre_internal.h"using namespace WTF;namespace JSC { namespace WREC {// Patterns longer than this can hang the compiler.static const int MaxPatternSize = (1 << 13);CompiledRegExp Generator::compileRegExp(JSGlobalData* globalData, const UString& pattern, unsigned* numSubpatterns_ptr, const char** error_ptr, RefPtr<ExecutablePool>& pool, bool ignoreCase, bool multiline){ if (pattern.size() > MaxPatternSize) { *error_ptr = "regular expression too large"; return 0; } Parser parser(pattern, ignoreCase, multiline); Generator& generator = parser.generator(); MacroAssembler::JumpList failures; MacroAssembler::Jump endOfInput; generator.generateEnter(); generator.generateSaveIndex(); Label beginPattern(&generator); parser.parsePattern(failures); generator.generateReturnSuccess(); failures.link(&generator); generator.generateIncrementIndex(&endOfInput); parser.parsePattern(failures); generator.generateReturnSuccess(); failures.link(&generator); generator.generateIncrementIndex(); generator.generateJumpIfNotEndOfInput(beginPattern); endOfInput.link(&generator); generator.generateReturnFailure(); if (parser.error()) { *error_ptr = parser.syntaxError(); // NULL in the case of patterns that WREC doesn't support yet. return 0; } *numSubpatterns_ptr = parser.numSubpatterns(); pool = globalData->executableAllocator.poolForSize(generator.size()); return reinterpret_cast<CompiledRegExp>(generator.copyCode(pool.get()));}} } // namespace JSC::WREC#endif // ENABLE(WREC)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -