WebKit Bugzilla
Attachment 349624 Details for
Bug 189574
: Move JavaScriptCore files to match Xcode project hierarchy
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch v2
bug-189574-20180912212715.patch (text/plain), 112.52 KB, created by
David Kilzer (:ddkilzer)
on 2018-09-12 21:27:16 PDT
(
hide
)
Description:
Patch v2
Filename:
MIME Type:
Creator:
David Kilzer (:ddkilzer)
Created:
2018-09-12 21:27:16 PDT
Size:
112.52 KB
patch
obsolete
>Subversion Revision: 235837 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 37338634b72995c888f97074cb0e2eccf9e0c865..093759380d606bcb32116f39ba227d098d0403aa 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,26 @@ >+2018-09-12 David Kilzer <ddkilzer@apple.com> >+ >+ Move JavaScriptCore files to match Xcode project hierarchy >+ <https://webkit.org/b/189574> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * API/JSAPIValueWrapper.cpp: Rename from Source/JavaScriptCore/runtime/JSAPIValueWrapper.cpp. >+ * API/JSAPIValueWrapper.h: Rename from Source/JavaScriptCore/runtime/JSAPIValueWrapper.h. >+ * CMakeLists.txt: Update for new path to >+ generateYarrUnicodePropertyTables.py. >+ * DerivedSources.make: Ditto. >+ * JavaScriptCore.xcodeproj/project.pbxproj: Update for new file >+ reference paths. Add hasher.py library to project. >+ * Sources.txt: Update for new path to >+ JSAPIValueWrapper.cpp. >+ * runtime/JSImmutableButterfly.h: Add missing includes >+ after changes to Sources.txt and regenerating unified >+ sources. >+ * runtime/RuntimeType.h: Ditto. >+ * yarr/generateYarrUnicodePropertyTables.py: Rename from Source/JavaScriptCore/Scripts/generateYarrUnicodePropertyTables.py. >+ * yarr/hasher.py: Rename from Source/JavaScriptCore/Scripts/hasher.py. >+ > 2018-09-12 David Kilzer <ddkilzer@apple.com> > > Let Xcode have its way with the JavaScriptCore project >diff --git a/Source/JavaScriptCore/API/JSAPIValueWrapper.cpp b/Source/JavaScriptCore/API/JSAPIValueWrapper.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..454f196fca7190e0d2a7bc8343f18d908f84e5f3 >--- /dev/null >+++ b/Source/JavaScriptCore/API/JSAPIValueWrapper.cpp >@@ -0,0 +1,34 @@ >+/* >+ * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) >+ * Copyright (C) 2001 Peter Kelly (pmk@post.com) >+ * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved. >+ * >+ * This library is free software; you can redistribute it and/or >+ * modify it under the terms of the GNU Library General Public >+ * License as published by the Free Software Foundation; either >+ * version 2 of the License, or (at your option) any later version. >+ * >+ * This library is distributed in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >+ * Library General Public License for more details. >+ * >+ * You should have received a copy of the GNU Library General Public License >+ * along with this library; see the file COPYING.LIB. If not, write to >+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >+ * Boston, MA 02110-1301, USA. >+ * >+ */ >+ >+#include "config.h" >+#include "JSAPIValueWrapper.h" >+ >+#include "NumberObject.h" >+ >+namespace JSC { >+ >+STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSAPIValueWrapper); >+ >+const ClassInfo JSAPIValueWrapper::s_info = { "API Wrapper", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(JSAPIValueWrapper) }; >+ >+} // namespace JSC >diff --git a/Source/JavaScriptCore/API/JSAPIValueWrapper.h b/Source/JavaScriptCore/API/JSAPIValueWrapper.h >new file mode 100644 >index 0000000000000000000000000000000000000000..06b307103eea2340547b03029ce3fb0e6d767633 >--- /dev/null >+++ b/Source/JavaScriptCore/API/JSAPIValueWrapper.h >@@ -0,0 +1,77 @@ >+/* >+ * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) >+ * Copyright (C) 2001 Peter Kelly (pmk@post.com) >+ * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved. >+ * >+ * This library is free software; you can redistribute it and/or >+ * modify it under the terms of the GNU Library General Public >+ * License as published by the Free Software Foundation; either >+ * version 2 of the License, or (at your option) any later version. >+ * >+ * This library is distributed in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >+ * Library General Public License for more details. >+ * >+ * You should have received a copy of the GNU Library General Public License >+ * along with this library; see the file COPYING.LIB. If not, write to >+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >+ * Boston, MA 02110-1301, USA. >+ * >+ */ >+ >+#pragma once >+ >+#include "CallFrame.h" >+#include "JSCJSValue.h" >+#include "JSCast.h" >+#include "Structure.h" >+ >+namespace JSC { >+ >+class JSAPIValueWrapper final : public JSCell { >+ friend JSValue jsAPIValueWrapper(ExecState*, JSValue); >+public: >+ typedef JSCell Base; >+ static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal; >+ >+ JSValue value() const { return m_value.get(); } >+ >+ static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) >+ { >+ return Structure::create(vm, globalObject, prototype, TypeInfo(APIValueWrapperType, OverridesGetPropertyNames), info()); >+ } >+ >+ DECLARE_EXPORT_INFO; >+ >+ static JSAPIValueWrapper* create(ExecState* exec, JSValue value) >+ { >+ VM& vm = exec->vm(); >+ JSAPIValueWrapper* wrapper = new (NotNull, allocateCell<JSAPIValueWrapper>(vm.heap)) JSAPIValueWrapper(exec); >+ wrapper->finishCreation(vm, value); >+ return wrapper; >+ } >+ >+protected: >+ void finishCreation(VM& vm, JSValue value) >+ { >+ Base::finishCreation(vm); >+ m_value.set(vm, this, value); >+ ASSERT(!value.isCell()); >+ } >+ >+private: >+ JSAPIValueWrapper(ExecState* exec) >+ : JSCell(exec->vm(), exec->vm().apiWrapperStructure.get()) >+ { >+ } >+ >+ WriteBarrier<Unknown> m_value; >+}; >+ >+inline JSValue jsAPIValueWrapper(ExecState* exec, JSValue value) >+{ >+ return JSAPIValueWrapper::create(exec, value); >+} >+ >+} // namespace JSC >diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt >index 9305648c55857d59e9618dea114d93d492cbcf2e..85212fafd770cff6867c3cb2fb87f80873c536cb 100644 >--- a/Source/JavaScriptCore/CMakeLists.txt >+++ b/Source/JavaScriptCore/CMakeLists.txt >@@ -964,9 +964,9 @@ WEBKIT_ADD_SOURCE_DEPENDENCIES(${CMAKE_CURRENT_SOURCE_DIR}/yarr/YarrPattern.cpp > > add_custom_command( > OUTPUT ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/yarr/UnicodePatternTables.h >- MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/Scripts/generateYarrUnicodePropertyTables.py >+ MAIN_DEPENDENCY ${JAVASCRIPTCORE_DIR}/yarr/generateYarrUnicodePropertyTables.py > DEPENDS ${JAVASCRIPTCORE_DIR}/Scripts/hasher.py ${JAVASCRIPTCORE_DIR}/ucd/DerivedBinaryProperties.txt ${JAVASCRIPTCORE_DIR}/ucd/DerivedCoreProperties.txt ${JAVASCRIPTCORE_DIR}/ucd/DerivedNormalizationProps.txt ${JAVASCRIPTCORE_DIR}/ucd/PropList.txt ${JAVASCRIPTCORE_DIR}/ucd/PropertyAliases.txt ${JAVASCRIPTCORE_DIR}/ucd/PropertyValueAliases.txt ${JAVASCRIPTCORE_DIR}/ucd/ScriptExtensions.txt ${JAVASCRIPTCORE_DIR}/ucd/Scripts.txt ${JAVASCRIPTCORE_DIR}/ucd/UnicodeData.txt ${JAVASCRIPTCORE_DIR}/ucd/emoji-data.txt >- COMMAND ${PYTHON_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/Scripts/generateYarrUnicodePropertyTables.py ${JAVASCRIPTCORE_DIR}/ucd ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/yarr/UnicodePatternTables.h >+ COMMAND ${PYTHON_EXECUTABLE} ${JAVASCRIPTCORE_DIR}/yarr/generateYarrUnicodePropertyTables.py ${JAVASCRIPTCORE_DIR}/ucd ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/yarr/UnicodePatternTables.h > VERBATIM) > list(APPEND JavaScriptCore_HEADERS ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/yarr/UnicodePatternTables.h) > WEBKIT_ADD_SOURCE_DEPENDENCIES(${CMAKE_CURRENT_SOURCE_DIR}/yarr/UnicodePatternTables.cpp ${DERIVED_SOURCES_JAVASCRIPTCORE_DIR}/yarr/UnicodePatternTables.h) >diff --git a/Source/JavaScriptCore/DerivedSources.make b/Source/JavaScriptCore/DerivedSources.make >index 173ecaefd9d1d881121a614e19e1acd26664b0cb..d95ccd6e094f563d715e6f4e9a57e96c4d25b9c4 100644 >--- a/Source/JavaScriptCore/DerivedSources.make >+++ b/Source/JavaScriptCore/DerivedSources.make >@@ -304,8 +304,8 @@ InjectedScriptSource.h : inspector/InjectedScriptSource.js $(JavaScriptCore_SCRI > AirOpcode.h: $(JavaScriptCore)/b3/air/opcode_generator.rb $(JavaScriptCore)/b3/air/AirOpcode.opcodes > $(RUBY) $^ > >-UnicodePatternTables.h: $(JavaScriptCore)/Scripts/generateYarrUnicodePropertyTables.py $(JavaScriptCore)/ucd/DerivedBinaryProperties.txt $(JavaScriptCore)/ucd/DerivedCoreProperties.txt $(JavaScriptCore)/ucd/DerivedNormalizationProps.txt $(JavaScriptCore)/ucd/PropList.txt $(JavaScriptCore)/ucd/PropertyAliases.txt $(JavaScriptCore)/ucd/PropertyValueAliases.txt $(JavaScriptCore)/ucd/ScriptExtensions.txt $(JavaScriptCore)/ucd/Scripts.txt $(JavaScriptCore)/ucd/UnicodeData.txt $(JavaScriptCore)/ucd/emoji-data.txt >- $(PYTHON) $(JavaScriptCore)/Scripts/generateYarrUnicodePropertyTables.py $(JavaScriptCore)/ucd ./UnicodePatternTables.h >+UnicodePatternTables.h: $(JavaScriptCore)/yarr/generateYarrUnicodePropertyTables.py $(JavaScriptCore)/ucd/DerivedBinaryProperties.txt $(JavaScriptCore)/ucd/DerivedCoreProperties.txt $(JavaScriptCore)/ucd/DerivedNormalizationProps.txt $(JavaScriptCore)/ucd/PropList.txt $(JavaScriptCore)/ucd/PropertyAliases.txt $(JavaScriptCore)/ucd/PropertyValueAliases.txt $(JavaScriptCore)/ucd/ScriptExtensions.txt $(JavaScriptCore)/ucd/Scripts.txt $(JavaScriptCore)/ucd/UnicodeData.txt $(JavaScriptCore)/ucd/emoji-data.txt >+ $(PYTHON) $(JavaScriptCore)/yarr/generateYarrUnicodePropertyTables.py $(JavaScriptCore)/ucd ./UnicodePatternTables.h > > yarr/YarrCanonicalizeUnicode.cpp: $(JavaScriptCore)/yarr/generateYarrCanonicalizeUnicode $(JavaScriptCore)/ucd/CaseFolding.txt > $(PYTHON) $(JavaScriptCore)/yarr/generateYarrCanonicalizeUnicode $(JavaScriptCore)/ucd/CaseFolding.txt ./yarr/YarrCanonicalizeUnicode.cpp >diff --git a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >index 28fa51e8ce681c4ac6e906304b7c1419cc5419e1..72ac528737af5bd3067c501dc0f2f9ea2673adce 100644 >--- a/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >+++ b/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj >@@ -3266,6 +3266,7 @@ > 43AB26C51C1A52F700D82AE6 /* B3MathExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3MathExtras.h; path = b3/B3MathExtras.h; sourceTree = "<group>"; }; > 43C392AA1C3BEB0000241F53 /* AssemblerCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AssemblerCommon.h; sourceTree = "<group>"; }; > 43CBA1601CAB67BA00328A5C /* udis86_udint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = udis86_udint.h; path = disassembler/udis86/udis86_udint.h; sourceTree = "<group>"; }; >+ 442FBD852149D1E00073519C /* hasher.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; name = hasher.py; path = yarr/hasher.py; sourceTree = "<group>"; }; > 449097EE0F8F81B50076A327 /* FeatureDefines.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeatureDefines.xcconfig; sourceTree = "<group>"; }; > 451539B812DC994500EF7AC4 /* Yarr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Yarr.h; path = yarr/Yarr.h; sourceTree = "<group>"; }; > 45E12D8806A49B0F00E9DF84 /* jsc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jsc.cpp; sourceTree = "<group>"; tabWidth = 4; }; >@@ -3595,7 +3596,7 @@ > 65C6BEE021128C3B006849C3 /* YarrDisassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YarrDisassembler.h; path = yarr/YarrDisassembler.h; sourceTree = "<group>"; }; > 65C7A1710A8EAACB00FA37EA /* JSWrapperObject.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSWrapperObject.cpp; sourceTree = "<group>"; }; > 65C7A1720A8EAACB00FA37EA /* JSWrapperObject.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSWrapperObject.h; sourceTree = "<group>"; }; >- 65DA90461F87052A009BC546 /* generateYarrUnicodePropertyTables.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = generateYarrUnicodePropertyTables.py; path = Scripts/generateYarrUnicodePropertyTables.py; sourceTree = "<group>"; }; >+ 65DA90461F87052A009BC546 /* generateYarrUnicodePropertyTables.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; name = generateYarrUnicodePropertyTables.py; path = yarr/generateYarrUnicodePropertyTables.py; sourceTree = "<group>"; }; > 65E866ED0DD59AFA00A2B2A1 /* SourceProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceProvider.h; sourceTree = "<group>"; }; > 65EA4C99092AF9E20093D800 /* JSLock.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSLock.cpp; sourceTree = "<group>"; tabWidth = 8; }; > 65EA4C9A092AF9E20093D800 /* JSLock.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = JSLock.h; sourceTree = "<group>"; tabWidth = 8; }; >@@ -4403,8 +4404,8 @@ > BC02E98B0E183E38000F9297 /* ErrorInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorInstance.h; sourceTree = "<group>"; }; > BC02E9B60E1842FA000F9297 /* JSString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSString.cpp; sourceTree = "<group>"; }; > BC02E9B80E184545000F9297 /* GetterSetter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetterSetter.cpp; sourceTree = "<group>"; }; >- BC0894D50FAFBA2D00001865 /* JSAPIValueWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSAPIValueWrapper.cpp; path = ../runtime/JSAPIValueWrapper.cpp; sourceTree = "<group>"; }; >- BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSAPIValueWrapper.h; path = ../runtime/JSAPIValueWrapper.h; sourceTree = "<group>"; }; >+ BC0894D50FAFBA2D00001865 /* JSAPIValueWrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAPIValueWrapper.cpp; sourceTree = "<group>"; }; >+ BC0894D60FAFBA2D00001865 /* JSAPIValueWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAPIValueWrapper.h; sourceTree = "<group>"; }; > BC1166000E1997B1008066DD /* DateInstance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DateInstance.cpp; sourceTree = "<group>"; }; > BC1166010E1997B1008066DD /* DateInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateInstance.h; sourceTree = "<group>"; }; > BC11667A0E199C05008066DD /* InternalFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalFunction.h; sourceTree = "<group>"; }; >@@ -7131,6 +7132,7 @@ > A718F8211178EB4B002465A7 /* create_regex_tables */, > 65A946131C8E9F2000A7209A /* generateYarrCanonicalizeUnicode */, > 65DA90461F87052A009BC546 /* generateYarrUnicodePropertyTables.py */, >+ 442FBD852149D1E00073519C /* hasher.py */, > A57D23EB1891B5540031C7FA /* RegularExpression.cpp */, > A57D23EC1891B5540031C7FA /* RegularExpression.h */, > 451539B812DC994500EF7AC4 /* Yarr.h */, >diff --git a/Source/JavaScriptCore/Scripts/generateYarrUnicodePropertyTables.py b/Source/JavaScriptCore/Scripts/generateYarrUnicodePropertyTables.py >deleted file mode 100644 >index f8bc6805d70c31aeb8d15b241df5607c05b607b8..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/Scripts/generateYarrUnicodePropertyTables.py >+++ /dev/null >@@ -1,979 +0,0 @@ >-#!/usr/bin/env python >- >-# Copyright (C) 2017 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 AND ITS CONTRIBUTORS "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 OR ITS 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. >- >-# This tool processes the Unicode Character Database file CaseFolding.txt to create >-# canonicalization table as decribed in ECMAScript 6 standard in section >-# "21.2.2.8.2 Runtime Semantics: Canonicalize()", step 2. >- >-import sys >-import copy >-import optparse >-import os >-import re >-from hasher import stringHash >- >-header = """/* >-* Copyright (C) 2017-2018 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 AND ITS CONTRIBUTORS "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 OR ITS 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. >-*/ >- >-// DO NO EDIT! - This file was generated by """ + __file__ + """ >-""" >- >- >-footer = """ >-""" >- >-RequiredUCDFiles = ["DerivedBinaryProperties.txt", "DerivedCoreProperties.txt", "DerivedNormalizationProps.txt", "PropList.txt", "PropertyAliases.txt", "PropertyValueAliases.txt", "ScriptExtensions.txt", "UnicodeData.txt", "emoji-data.txt"] >-UCDDirectoryPath = None >- >-SupportedBinaryProperties = [ >- "Alphabetic", "Any", "ASCII", "ASCII_Hex_Digit", "Assigned", "Bidi_Control", "Bidi_Mirrored", "Case_Ignorable", >- "Cased", "Changes_When_Casefolded", "Changes_When_Casemapped", "Changes_When_Lowercased", "Changes_When_NFKC_Casefolded", >- "Changes_When_Titlecased", "Changes_When_Uppercased", "Dash", "Default_Ignorable_Code_Point", "Deprecated", >- "Diacritic", "Emoji", "Emoji_Component", "Emoji_Modifier_Base", "Emoji_Modifier", "Emoji_Presentation", >- "Extended_Pictographic", "Extender", "Grapheme_Base", "Grapheme_Extend", "Hex_Digit", "ID_Continue", "ID_Start", >- "Ideographic", "IDS_Binary_Operator", "IDS_Trinary_Operator", "Join_Control", "Logical_Order_Exception", "Lowercase", >- "Math", "Noncharacter_Code_Point", "Pattern_Syntax", "Pattern_White_Space", "Quotation_Mark", "Radical", >- "Regional_Indicator", "Sentence_Terminal", "Soft_Dotted", "Terminal_Punctuation", "Unified_Ideograph", "Uppercase", >- "Variation_Selector", "White_Space", "XID_Continue", "XID_Start"] >- >-lastASCIICodePoint = 0x7f >-firstUnicodeCodePoint = 0x80 >-MaxUnicode = 0x10ffff >-MaxBMP = 0xffff >-commonAndSimpleLinesRE = re.compile(r"(?P<code>[0-9A-F]+)\s*;\s*[CS]\s*;\s*(?P<mapping>[0-9A-F]+)", re.IGNORECASE) >-aliases = None >- >- >-def openOrExit(path, mode): >- try: >- return open(path, mode) >- except IOError as e: >- print("I/O error opening {0}, ({1}): {2}".format(path, e.errno, e.strerror)) >- exit(1) >- >- >-def openUCDFileOrExit(path): >- if not UCDDirectoryPath: >- exit(1) >- >- return openOrExit(os.path.join(UCDDirectoryPath, path), 'r') >- >- >-def verifyUCDFilesExist(): >- if not UCDDirectoryPath: >- exit(1) >- >- missingFileCount = 0 >- for file in RequiredUCDFiles: >- fullPath = os.path.join(UCDDirectoryPath, file) >- if not os.path.exists(fullPath): >- print("Couldn't find UCD file {0} at {1}".format(file, fullPath)) >- missingFileCount = missingFileCount + 1 >- if missingFileCount: >- exit(1) >- >- >-def ceilingToPowerOf2(size): >- powerOf2 = 1 >- while size > powerOf2: >- powerOf2 = powerOf2 << 1 >- >- return powerOf2 >- >- >-class Aliases: >- def __init__(self): >- self.globalNameToAliases = {} >- self.generalCategoryToAliases = {} >- self.aliasToGeneralCategory = {} >- self.scriptToAliases = {} >- self.aliasToScript = {} >- >- def parsePropertyAliasesFile(self, file): >- for line in file: >- line = line.split('#', 1)[0] >- line = line.rstrip() >- if (not len(line)): >- continue >- >- fields = line.split(';') >- if (not fields): >- continue >- >- aliases = [fields[0].strip()] >- fullName = fields[1].strip() >- for otherAlias in fields[2:]: >- aliases.append(otherAlias.strip()) >- >- if fullName in self.globalNameToAliases: >- print("Error, already an alias for {}".format(fullName)) >- else: >- self.globalNameToAliases[fullName] = aliases >- >- def parsePropertyValueAliasesFile(self, file): >- for line in file: >- line = line.split('#', 1)[0] >- line = line.rstrip() >- if (not len(line)): >- continue >- >- fields = line.split(';') >- if (not fields): >- continue >- >- propertyType = fields[0].strip() >- >- if propertyType == "gc": >- mapToModify = self.generalCategoryToAliases >- reverseMapToModify = self.aliasToGeneralCategory >- elif propertyType == "sc": >- mapToModify = self.scriptToAliases >- reverseMapToModify = self.aliasToScript >- else: >- continue >- >- primaryAlias = fields[1].strip() >- fullName = fields[2].strip() >- aliases = [primaryAlias] >- for otherAlias in fields[3:]: >- aliases.append(otherAlias.strip()) >- >- if fullName in mapToModify: >- print("Error, already an {} alias for {}".format(propertyType, fullName)) >- else: >- mapToModify[fullName] = aliases >- if reverseMapToModify != None: >- reverseMapToModify[primaryAlias] = fullName >- >- def globalAliasesFor(self, name): >- if name not in self.globalNameToAliases: >- return [] >- return self.globalNameToAliases[name] >- >- def generalCategoryAliasesFor(self, name): >- if name not in self.generalCategoryToAliases: >- return "" >- return self.generalCategoryToAliases[name] >- >- def generalCategoryForAlias(self, name): >- if name not in self.aliasToGeneralCategory: >- return "" >- return self.aliasToGeneralCategory[name] >- >- def scriptAliasesFor(self, name): >- if name not in self.scriptToAliases: >- return "" >- return self.scriptToAliases[name] >- >- def scriptNameForAlias(self, name): >- if name not in self.aliasToScript: >- return "" >- return self.aliasToScript[name] >- >- >-class PropertyData: >- allPropertyData = [] >- >- def __init__(self, name): >- self.name = name >- self.aliases = [] >- self.index = len(PropertyData.allPropertyData) >- self.hasNonBMPCharacters = False >- self.matches = [] >- self.ranges = [] >- self.unicodeMatches = [] >- self.unicodeRanges = [] >- self.codePointCount = 0 >- PropertyData.allPropertyData.append(self) >- >- def setAliases(self, aliases): >- self.aliases = aliases >- >- def makeCopy(self): >- result = copy.deepcopy(self) >- result.index = len(PropertyData.allPropertyData) >- PropertyData.allPropertyData.append(result) >- return result >- >- def getIndex(self): >- return self.index >- >- def getCreateFuncName(self): >- return "createCharacterClass{}".format(self.index) >- >- def addMatch(self, codePoint): >- if codePoint > MaxBMP: >- self.hasNonBMPCharacters = True >- if codePoint <= lastASCIICodePoint: >- if (len(self.matches) and self.matches[-1] > codePoint) or (len(self.ranges) and self.ranges[-1][1] > codePoint): >- self.addMatchUnordered(codePoint) >- return >- >- self.codePointCount = self.codePointCount + 1 >- if len(self.matches) and self.matches[-1] == (codePoint - 1): >- lowCodePoint = self.matches.pop() >- self.ranges.append((lowCodePoint, codePoint)) >- elif len(self.ranges) and self.ranges[-1][1] == (codePoint - 1): >- priorRange = self.ranges.pop() >- self.ranges.append((priorRange[0], codePoint)) >- else: >- self.matches.append(codePoint) >- else: >- if (len(self.unicodeMatches) and self.unicodeMatches[-1] > codePoint) or (len(self.unicodeRanges) and self.unicodeRanges[-1][1] > codePoint): >- self.addMatchUnordered(codePoint) >- return >- >- self.codePointCount = self.codePointCount + 1 >- if len(self.unicodeMatches) and self.unicodeMatches[-1] == (codePoint - 1): >- lowCodePoint = self.unicodeMatches.pop() >- self.unicodeRanges.append((lowCodePoint, codePoint)) >- elif len(self.unicodeRanges) and self.unicodeRanges[-1][1] == (codePoint - 1): >- priorRange = self.unicodeRanges.pop() >- self.unicodeRanges.append((priorRange[0], codePoint)) >- else: >- self.unicodeMatches.append(codePoint) >- >- def addRange(self, lowCodePoint, highCodePoint): >- if highCodePoint > MaxBMP: >- self.hasNonBMPCharacters = True >- if highCodePoint <= lastASCIICodePoint: >- if (len(self.matches) and self.matches[-1] > lowCodePoint) or (len(self.ranges) and self.ranges[-1][1] > lowCodePoint): >- self.addRangeUnordered(lowCodePoint, highCodePoint) >- return >- >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- if len(self.matches) and self.matches[-1] == (lowCodePoint - 1): >- lowCodePoint = self.matches.pop() >- elif len(self.ranges) and self.ranges[-1][1] == (lowCodePoint - 1): >- priorRange = self.ranges.pop() >- lowCodePoint = priorRange[0] >- self.ranges.append((lowCodePoint, highCodePoint)) >- elif lowCodePoint <= lastASCIICodePoint: >- if lowCodePoint == lastASCIICodePoint: >- self.addMatch(lowCodePoint) >- else: >- self.addRange(lowCodePoint, lastASCIICodePoint) >- if highCodePoint == firstUnicodeCodePoint: >- self.addMatch(highCodePoint) >- else: >- self.addRange(firstUnicodeCodePoint, highCodePoint) >- else: >- if (len(self.unicodeMatches) and self.unicodeMatches[-1] > lowCodePoint) or (len(self.unicodeRanges) and self.unicodeRanges[-1][1] > lowCodePoint): >- self.addRangeUnordered(lowCodePoint, highCodePoint) >- return >- >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- if len(self.unicodeMatches) and self.unicodeMatches[-1] == (lowCodePoint - 1): >- lowCodePoint = self.unicodeMatches.pop() >- self.unicodeRanges.append((lowCodePoint, highCodePoint)) >- elif len(self.unicodeRanges) and self.unicodeRanges[-1][1] == (lowCodePoint - 1): >- priorRange = self.unicodeRanges.pop() >- self.unicodeRanges.append((priorRange[0], highCodePoint)) >- else: >- self.unicodeRanges.append((lowCodePoint, highCodePoint)) >- >- def addMatchUnorderedForMatchesAndRanges(self, codePoint, matches, ranges): >- if codePoint in matches: >- return >- insertLocation = None >- lowCodePoint = None >- highCodePoint = None >- for idx in xrange(len(matches)): >- match = matches[idx] >- if codePoint == match + 1: >- lowCodePoint = match >- if idx < (len(matches) - 1) and codePoint == matches[idx + 1] - 1: >- highCodePoint = matches[idx + 1] >- del matches[idx + 1] >- self.codePointCount = self.codePointCount - 1 >- else: >- highCodePoint = codePoint >- del matches[idx] >- self.codePointCount = self.codePointCount - 1 >- break >- elif codePoint == match - 1: >- lowCodePoint = codePoint >- highCodePoint = match >- del matches[idx] >- self.codePointCount = self.codePointCount - 1 >- break >- elif codePoint < match: >- insertLocation = idx >- break >- >- if insertLocation is None: >- insertLocation = len(matches) >- if lowCodePoint is None: >- lowCodePoint = codePoint >- highCodePoint = codePoint >- >- for idx in xrange(len(ranges)): >- range = ranges[idx] >- if lowCodePoint >= range[0] and highCodePoint <= range[1]: >- return >- if lowCodePoint <= (range[1] + 1) and highCodePoint >= (range[0] - 1): >- while idx < len(ranges) and highCodePoint >= (ranges[idx][0] - 1): >- range = ranges[idx] >- lowCodePoint = min(lowCodePoint, range[0]) >- highCodePoint = max(highCodePoint, range[1]) >- del ranges[idx] >- self.codePointCount = self.codePointCount - (range[1] - range[0]) - 1 >- >- ranges.insert(idx, (lowCodePoint, highCodePoint)) >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- return >- elif highCodePoint < range[0]: >- if lowCodePoint != highCodePoint: >- ranges.insert(idx, (lowCodePoint, highCodePoint)) >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- return >- break >- >- if lowCodePoint != highCodePoint: >- ranges.append((lowCodePoint, highCodePoint)) >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- return >- >- if insertLocation is not None: >- matches.insert(insertLocation, codePoint) >- self.codePointCount = self.codePointCount + 1 >- >- def addRangeUnorderedForMatchesAndRanges(self, lowCodePoint, highCodePoint, matches, ranges): >- if len(matches) and highCodePoint >= matches[0] and lowCodePoint <= matches[-1]: >- for idx in xrange(len(matches)): >- match = matches[idx] >- if lowCodePoint <= match and highCodePoint >= match: >- while idx < len(matches) and highCodePoint >= matches[idx]: >- del matches[idx] >- self.codePointCount = self.codePointCount - 1 >- if idx < (len(matches) - 1) and highCodePoint == matches[idx + 1] - 1: >- highCodePoint = matches[idx + 1] >- del matches[idx + 1] >- self.codePointCount = self.codePointCount - 1 >- break >- elif lowCodePoint == match + 1: >- lowCodePoint = match >- while idx < len(matches) and highCodePoint >= matches[idx]: >- del matches[idx] >- self.codePointCount = self.codePointCount - 1 >- >- if idx < (len(matches) - 1) and highCodePoint == matches[idx + 1] - 1: >- highCodePoint = matches[idx + 1] >- del matches[idx + 1] >- self.codePointCount = self.codePointCount - 1 >- break >- elif highCodePoint == match - 1: >- highCodePoint = match >- del matches[idx] >- self.codePointCount = self.codePointCount - 1 >- break >- elif highCodePoint < match: >- break >- >- for idx in xrange(len(ranges)): >- range = ranges[idx] >- if lowCodePoint >= range[0] and highCodePoint <= range[1]: >- return >- if lowCodePoint <= (range[1] + 1) and highCodePoint >= (range[0] - 1): >- while idx < len(ranges) and highCodePoint >= (ranges[idx][0] - 1): >- range = ranges[idx] >- lowCodePoint = min(lowCodePoint, range[0]) >- highCodePoint = max(highCodePoint, range[1]) >- del ranges[idx] >- self.codePointCount = self.codePointCount - (range[1] - range[0]) - 1 >- >- ranges.insert(idx, (lowCodePoint, highCodePoint)) >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- return >- elif highCodePoint < range[0]: >- ranges.insert(idx, (lowCodePoint, highCodePoint)) >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- return >- >- ranges.append((lowCodePoint, highCodePoint)) >- self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >- >- def addMatchUnordered(self, codePoint): >- if codePoint <= lastASCIICodePoint: >- self.addMatchUnorderedForMatchesAndRanges(codePoint, self.matches, self.ranges) >- else: >- self.addMatchUnorderedForMatchesAndRanges(codePoint, self.unicodeMatches, self.unicodeRanges) >- >- def addRangeUnordered(self, lowCodePoint, highCodePoint): >- if highCodePoint <= lastASCIICodePoint: >- self.addRangeUnorderedForMatchesAndRanges(lowCodePoint, highCodePoint, self.matches, self.ranges) >- elif lowCodePoint >= firstUnicodeCodePoint: >- self.addRangeUnorderedForMatchesAndRanges(lowCodePoint, highCodePoint, self.unicodeMatches, self.unicodeRanges) >- else: >- if lowCodePoint == lastASCIICodePoint: >- self.addMatchUnorderedForMatchesAndRanges(lowCodePoint, self.matches, self.ranges) >- else: >- self.addRangeUnorderedForMatchesAndRanges(lowCodePoint, lastASCIICodePoint, self.unicodeMatches, self.ranges) >- if highCodePoint == firstUnicodeCodePoint: >- self.addMatchUnorderedForMatchesAndRanges(highCodePoint, self.unicodeMatches, self.unicodeRanges) >- else: >- self.addRangeUnorderedForMatchesAndRanges(firstUnicodeCodePoint, highCodePoint, self.unicodeMatches, self.unicodeRanges) >- >- def removeMatchFromRanges(self, codePoint, ranges): >- for idx in xrange(len(ranges)): >- range = ranges[idx] >- if range[0] <= codePoint and codePoint <= range[1]: >- ranges.pop(idx) >- if range[0] < codePoint and codePoint < range[1]: >- lowRange = (range[0], codePoint - 1) >- highRange = (codePoint + 1, range[1]) >- # Since list.insert inserts before the index given, handle the high range first >- if highRange[0] == highRange[1]: >- self.addMatchUnordered(highRange[0]) >- else: >- ranges.insert(idx, highRange) >- if lowRange[0] == lowRange[1]: >- self.addMatchUnordered(lowRange[0]) >- else: >- ranges.insert(idx, lowRange) >- else: >- if range[0] == codePoint: >- range = (codePoint + 1, range[1]) >- else: >- range = (range[0], codePoint - 1) >- if range[0] == range[1]: >- self.addMatchUnordered(range[0]) >- else: >- ranges.insert(idx, range) >- self.codePointCount = self.codePointCount - 1 >- return >- >- def removeMatch(self, codePoint): >- if codePoint <= lastASCIICodePoint: >- if codePoint in self.matches: >- self.matches.remove(codePoint) >- self.codePointCount = self.codePointCount - 1 >- else: >- self.removeMatchFromRanges(codePoint, self.ranges) >- else: >- if codePoint in self.unicodeMatches: >- self.unicodeMatches.remove(codePoint) >- self.codePointCount = self.codePointCount - 1 >- else: >- self.removeMatchFromRanges(codePoint, self.unicodeRanges) >- >- def dumpMatchData(self, file, valuesPerLine, dataList, formatter): >- valuesThisLine = 0 >- firstValue = True >- >- file.write("{") >- for elem in dataList: >- if firstValue: >- firstValue = False >- else: >- file.write(", ") >- valuesThisLine = valuesThisLine + 1 >- if valuesThisLine > valuesPerLine: >- file.write("\n ") >- valuesThisLine = 1 >- formatter(file, elem) >- file.write("}") >- >- def dump(self, file, commaAfter): >- file.write("static std::unique_ptr<CharacterClass> {}()\n{{\n".format(self.getCreateFuncName())) >- file.write(" // Name = {}, number of codePoints: {}\n".format(self.name, self.codePointCount)) >- file.write(" auto characterClass = std::make_unique<CharacterClass>(\n") >- file.write(" std::initializer_list<UChar32>(") >- self.dumpMatchData(file, 8, self.matches, lambda file, match: (file.write("{0:0=#4x}".format(match)))) >- file.write("),\n") >- file.write(" std::initializer_list<CharacterRange>(") >- self.dumpMatchData(file, 4, self.ranges, lambda file, range: (file.write("{{{0:0=#4x}, {1:0=#4x}}}".format(range[0], range[1])))) >- file.write("),\n") >- file.write(" std::initializer_list<UChar32>(") >- self.dumpMatchData(file, 8, self.unicodeMatches, lambda file, match: (file.write("{0:0=#6x}".format(match)))) >- file.write("),\n") >- file.write(" std::initializer_list<CharacterRange>(") >- self.dumpMatchData(file, 4, self.unicodeRanges, lambda file, range: (file.write("{{{0:0=#6x}, {1:0=#6x}}}".format(range[0], range[1])))) >- file.write("));\n") >- >- file.write(" characterClass->m_hasNonBMPCharacters = {};\n".format(("false", "true")[self.hasNonBMPCharacters])) >- file.write(" return characterClass;\n}\n\n") >- >- @classmethod >- def dumpAll(cls, file): >- for propertyData in cls.allPropertyData: >- propertyData.dump(file, propertyData != cls.allPropertyData[-1]) >- >- file.write("typedef std::unique_ptr<CharacterClass> (*CreateCharacterClass)();\n") >- file.write("static CreateCharacterClass createFunctions[{}] = {{\n ".format(len(cls.allPropertyData))) >- functionsOnThisLine = 0 >- for propertyData in cls.allPropertyData: >- file.write(" {},".format(propertyData.getCreateFuncName())) >- functionsOnThisLine = functionsOnThisLine + 1 >- if functionsOnThisLine == 4: >- file.write("\n ") >- functionsOnThisLine = 0 >- >- file.write("};\n\n") >- >- @classmethod >- def createAndDumpHashTable(self, file, propertyDict, tablePrefix): >- propertyKeys = propertyDict.keys() >- numberOfKeys = len(propertyKeys) >- hashSize = ceilingToPowerOf2(numberOfKeys * 2) >- hashMask = hashSize - 1 >- hashTable = [None] * hashSize >- valueTable = [] >- tableSize = hashSize >- >- keyValuesToHash = [] >- for propertyName in propertyKeys: >- propertyData = propertyDict[propertyName] >- keyValuesToHash.append((propertyName, propertyData.getIndex())) >- for alias in propertyData.aliases: >- keyValuesToHash.append((alias, propertyData.getIndex())) >- >- for keyValue in keyValuesToHash: >- key = keyValue[0] >- hash = stringHash(key) % hashSize >- while hashTable[hash] is not None: >- if hashTable[hash][1] is not None: >- hash = hashTable[hash][1] >- else: >- hashTable[hash] = (hashTable[hash][0], tableSize) >- hashTable.append(None) >- hash = tableSize >- tableSize = tableSize + 1 >- >- hashTable[hash] = (len(valueTable), None) >- valueTable.append((key, keyValue[1])) >- >- file.write("static const struct HashIndex {}TableIndex[{}] = {{\n".format(tablePrefix, len(hashTable))) >- >- for tableIndex in hashTable: >- value = -1 >- next = -1 >- if tableIndex is not None: >- value = tableIndex[0] >- if tableIndex[1] is not None: >- next = tableIndex[1] >- >- file.write(" {{ {}, {} }},\n".format(value, next)) >- >- file.write("};\n\n") >- >- file.write("static const struct HashValue {}TableValue[{}] = {{\n".format(tablePrefix, len(valueTable))) >- for value in valueTable: >- file.write(" {{ \"{}\", {} }},\n".format(value[0], value[1])) >- file.write("};\n\n") >- >- file.write("static const struct HashTable {}HashTable = \n".format(tablePrefix)) >- file.write(" {{ {}, {}, {}TableValue, {}TableIndex }};\n\n".format(len(valueTable), hashMask, tablePrefix, tablePrefix)) >- >- >-class Scripts: >- def __init__(self): >- self.allPropertyData = [] >- self.scriptsByName = {} >- self.scriptExtensionsByName = {} >- self.unknownScript = PropertyData("Unknown") >- self.unknownScript.setAliases(aliases.scriptAliasesFor("Unknown")) >- self.allPropertyData.append(self.unknownScript) >- self.scriptsParsed = False >- >- def parseScriptsFile(self, file): >- currentScriptName = None >- currentPropertyData = None >- # To calculate the Unknown, we gather all the codePoints asigned to a scripts as ranges, >- # sort them, and then go the list to create the inverse of the assigned ranges. >- assignedCodePointRanges = [] >- >- for line in file: >- line = line.split('#', 1)[0] >- line = line.rstrip() >- if (not len(line)): >- continue >- >- fields = line.split(';') >- if (not fields): >- continue >- >- codePoints = fields[0].strip() >- scriptName = fields[1].strip() >- >- if scriptName != currentScriptName: >- currentScriptName = scriptName >- currentPropertyData = PropertyData(scriptName) >- currentPropertyData.setAliases(aliases.scriptAliasesFor(scriptName)) >- self.allPropertyData.append(currentPropertyData) >- self.scriptsByName[scriptName] = currentPropertyData >- >- dotDot = codePoints.find("..") >- if dotDot == -1: >- codePoint = int(codePoints, 16) >- currentPropertyData.addMatch(codePoint) >- assignedCodePointRanges.append((codePoint, codePoint)) >- else: >- lowCodePoint = int(codePoints[:dotDot], 16) >- highCodePoint = int(codePoints[dotDot + 2:], 16) >- currentPropertyData.addRange(lowCodePoint, highCodePoint) >- assignedCodePointRanges.append((lowCodePoint, highCodePoint)) >- >- assignedCodePointRanges.sort(key=lambda range: range[0]) >- lastAssignedCodePoint = 0 >- >- for range in assignedCodePointRanges: >- if range[0] - lastAssignedCodePoint > 1: >- if range[0] - lastAssignedCodePoint == 2: >- self.unknownScript.addMatch(lastAssignedCodePoint + 1) >- else: >- self.unknownScript.addRange(lastAssignedCodePoint + 1, range[0] - 1) >- lastAssignedCodePoint = range[1] >- >- if lastAssignedCodePoint < MaxUnicode: >- if MaxUnicode - lastAssignedCodePoint == 1: >- self.unknownScript.addMatch(MaxUnicode) >- else: >- self.unknownScript.addRange(lastAssignedCodePoint + 1, MaxUnicode) >- >- self.scriptsParsed = True >- >- def parseScriptExtensionsFile(self, file): >- currentPropertyData = None >- # To calculate the Unknown, we gather all the codePoints asigned to a scripts as ranges, >- # sort them, and then go the list to create the inverse of the assigned ranges. >- assignedCodePointRanges = [] >- >- if not self.scriptsParsed: >- print("Error: parsing ScriptExtensions.txt before Scripts.txt") >- exit(1) >- >- commonScriptExtenstionPropertyData = None >- inheritedScriptExtensionPropertyData = None >- >- scriptName = "Common" >- if scriptName in self.scriptsByName: >- commonScriptExtenstionPropertyData = self.scriptsByName[scriptName].makeCopy() >- else: >- commonScriptExtenstionPropertyData = PropertyData(scriptName) >- commonScriptExtenstionPropertyData.setAliases(aliases.scriptAliasesFor(scriptName)) >- self.allPropertyData.append(commonScriptExtenstionPropertyData) >- self.scriptExtensionsByName[scriptName] = commonScriptExtenstionPropertyData >- >- scriptName = "Inherited" >- if scriptName in self.scriptsByName: >- inheritedScriptExtensionPropertyData = self.scriptsByName[scriptName].makeCopy() >- else: >- inheritedScriptExtensionPropertyData = PropertyData(scriptName) >- inheritedScriptExtensionPropertyData.setAliases(aliases.scriptAliasesFor(scriptName)) >- self.allPropertyData.append(inheritedScriptExtensionPropertyData) >- self.scriptExtensionsByName[scriptName] = inheritedScriptExtensionPropertyData >- >- for line in file: >- line = line.split('#', 1)[0] >- line = line.rstrip() >- if (not len(line)): >- continue >- >- fields = line.split(';') >- if (not fields): >- continue >- >- codePoints = fields[0].strip() >- scriptAliasList = fields[1].strip() >- >- for scriptAlias in scriptAliasList.split(' '): >- scriptName = aliases.scriptNameForAlias(scriptAlias) >- currentPropertyData = None >- >- if scriptName not in self.scriptExtensionsByName: >- currentPropertyData = self.scriptsByName[scriptName].makeCopy() >- self.allPropertyData.append(currentPropertyData) >- self.scriptExtensionsByName[scriptName] = currentPropertyData >- else: >- currentPropertyData = self.scriptExtensionsByName[scriptName] >- >- dotDot = codePoints.find("..") >- if dotDot == -1: >- codePoint = int(codePoints, 16) >- currentPropertyData.addMatch(codePoint) >- commonScriptExtenstionPropertyData.removeMatch(codePoint) >- inheritedScriptExtensionPropertyData.removeMatch(codePoint) >- else: >- lowCodePoint = int(codePoints[:dotDot], 16) >- highCodePoint = int(codePoints[dotDot + 2:], 16) >- currentPropertyData.addRange(lowCodePoint, highCodePoint) >- for codePoint in xrange(lowCodePoint, highCodePoint + 1): >- commonScriptExtenstionPropertyData.removeMatch(codePoint) >- inheritedScriptExtensionPropertyData.removeMatch(codePoint) >- >- # For the scripts that don't have any additional extension codePoints, copy the script >- # data to the script extension with the same name >- for scriptName, propertyData in self.scriptsByName.iteritems(): >- if scriptName not in self.scriptExtensionsByName: >- self.scriptExtensionsByName[scriptName] = propertyData >- >- def dump(self, file): >- file.write("// Scripts:\n") >- PropertyData.createAndDumpHashTable(file, self.scriptsByName, "script") >- >- file.write("// Script_Extensions:\n") >- PropertyData.createAndDumpHashTable(file, self.scriptExtensionsByName, "scriptExtension") >- >- >-class GeneralCategory: >- def __init__(self, file): >- self.file = file >- self.allPropertyData = [] >- self.propertyDataByCategory = {} >- self.createSpecialPropertyData("Any", (0, MaxUnicode)) >- self.createSpecialPropertyData("ASCII", (0, lastASCIICodePoint)) >- self.assignedPropertyData = self.createSpecialPropertyData("Assigned") >- self.unassignedProperyData = self.findPropertyGroupFor("Cn")[1] >- self.casedLetterPropertyData = self.findPropertyGroupFor("LC")[1] >- self.lastAddedCodePoint = 0 >- >- def createSpecialPropertyData(self, name, range=None): >- propertyData = PropertyData(name) >- self.allPropertyData.append(propertyData) >- self.propertyDataByCategory[name] = propertyData >- if range: >- propertyData.addRange(range[0], range[1]) >- >- return propertyData >- >- def findPropertyGroupFor(self, categoryAlias): >- category = aliases.generalCategoryForAlias(categoryAlias) >- allCategoryAliases = aliases.generalCategoryAliasesFor(category) >- categoryGroupAlias = categoryAlias[0] >- categoryGroup = aliases.generalCategoryForAlias(categoryGroupAlias) >- allCategoryGroupAlias = aliases.generalCategoryAliasesFor(categoryGroup) >- groupPropertyData = None >- propertyData = None >- >- if categoryGroup not in self.propertyDataByCategory: >- groupPropertyData = PropertyData(categoryGroup) >- groupPropertyData.setAliases(allCategoryGroupAlias) >- self.allPropertyData.append(groupPropertyData) >- self.propertyDataByCategory[categoryGroup] = groupPropertyData >- else: >- groupPropertyData = self.propertyDataByCategory[categoryGroup] >- >- if category not in self.propertyDataByCategory: >- propertyData = PropertyData(category) >- propertyData.setAliases(allCategoryAliases) >- self.allPropertyData.append(propertyData) >- self.propertyDataByCategory[category] = propertyData >- else: >- propertyData = self.propertyDataByCategory[category] >- >- return (groupPropertyData, propertyData) >- >- def addNextCodePoints(self, categoryAlias, codePoint, highCodePoint=None): >- if codePoint - self.lastAddedCodePoint > 1: >- propertyDatas = self.findPropertyGroupFor("Cn") >- if codePoint - self.lastAddedCodePoint == 2: >- propertyDatas[0].addMatch(self.lastAddedCodePoint + 1) >- propertyDatas[1].addMatch(self.lastAddedCodePoint + 1) >- else: >- propertyDatas[0].addRange(self.lastAddedCodePoint + 1, codePoint - 1) >- propertyDatas[1].addRange(self.lastAddedCodePoint + 1, codePoint - 1) >- >- propertyDatas = self.findPropertyGroupFor(categoryAlias) >- if highCodePoint: >- propertyDatas[0].addRange(codePoint, highCodePoint) >- propertyDatas[1].addRange(codePoint, highCodePoint) >- if categoryAlias == "Ll" or categoryAlias == "Lt" or categoryAlias == "Lu": >- self.casedLetterPropertyData.addRange(codePoint, highCodePoint) >- self.assignedPropertyData.addRange(codePoint, highCodePoint) >- >- self.lastAddedCodePoint = highCodePoint >- else: >- propertyDatas[0].addMatch(codePoint) >- propertyDatas[1].addMatch(codePoint) >- if categoryAlias == "Ll" or categoryAlias == "Lt" or categoryAlias == "Lu": >- self.casedLetterPropertyData.addMatch(codePoint) >- self.assignedPropertyData.addMatch(codePoint) >- >- self.lastAddedCodePoint = codePoint >- >- def parse(self): >- lastLineFirstOfRange = None >- lastLineCodePoint = 0 >- for line in self.file: >- line = line.split('#', 1)[0] >- line = line.rstrip() >- if (not len(line)): >- continue >- >- fields = line.split(';') >- if (not fields): >- continue >- >- codePoint = int(fields[0].strip(), 16) >- description = fields[1].strip() >- categoryAlias = fields[2].strip() >- >- if lastLineFirstOfRange: >- if description[-5:-1] == "Last": >- self.addNextCodePoints(categoryAlias, lastLineFirstOfRange, codePoint) >- lastLineFirstOfRange = None >- continue >- else: >- print("Malformed First..Last pair of lines") >- >- if description[-6:-1] == "First": >- lastLineFirstOfRange = codePoint >- continue >- >- self.addNextCodePoints(categoryAlias, codePoint) >- >- if self.lastAddedCodePoint < MaxUnicode: >- propertyDatas = self.findPropertyGroupFor("Cn") >- if MaxUnicode - self.lastAddedCodePoint == 1: >- propertyDatas[0].addMatch(MaxUnicode) >- propertyDatas[1].addMatch(MaxUnicode) >- else: >- propertyDatas[0].addRange(self.lastAddedCodePoint + 1, MaxUnicode) >- propertyDatas[1].addRange(self.lastAddedCodePoint + 1, MaxUnicode) >- >- def dump(self, file): >- file.write("// General_Category:\n") >- PropertyData.createAndDumpHashTable(file, self.propertyDataByCategory, "generalCategory") >- >- >-class BinaryProperty: >- def __init__(self): >- self.allPropertyData = [] >- self.propertyDataByProperty = {} >- >- def parsePropertyFile(self, file): >- currentPropertyName = None >- currentPropertyData = None >- >- for line in file: >- line = line.split('#', 1)[0] >- line = line.rstrip() >- if (not len(line)): >- continue >- >- fields = line.split(';') >- if (not fields): >- continue >- >- codePoints = fields[0].strip() >- propertyName = fields[1].strip() >- >- if propertyName != currentPropertyName: >- if propertyName not in SupportedBinaryProperties: >- continue >- >- currentPropertyName = propertyName >- currentPropertyData = PropertyData(propertyName) >- currentPropertyData.setAliases(aliases.globalAliasesFor(propertyName)) >- self.allPropertyData.append(currentPropertyData) >- self.propertyDataByProperty[propertyName] = currentPropertyData >- >- dotDot = codePoints.find("..") >- if dotDot == -1: >- currentPropertyData.addMatch(int(codePoints, 16)) >- else: >- currentPropertyData.addRange(int(codePoints[:dotDot], 16), int(codePoints[dotDot + 2:], 16)) >- >- def dump(self, file): >- file.write("// binary properties:\n") >- PropertyData.createAndDumpHashTable(file, self.propertyDataByProperty, "binaryProperty") >- >-if __name__ == "__main__": >- parser = optparse.OptionParser(usage="usage: %prog <UCD-Directory> <YarrUnicodePropertyData.h>") >- (options, args) = parser.parse_args() >- >- if len(args) != 2: >- parser.error("<UCD-Directory> <YarrUnicodePropertyData.h>") >- >- UCDDirectoryPath = args[0] >- unicodeProertyDataHPath = args[1] >- >- verifyUCDFilesExist() >- >- propertyAliasesFile = openUCDFileOrExit("PropertyAliases.txt") >- propertyValueAliasesFile = openUCDFileOrExit("PropertyValueAliases.txt") >- scriptsFile = openUCDFileOrExit("Scripts.txt") >- scriptExtensionsFile = openUCDFileOrExit("ScriptExtensions.txt") >- unicodeDataFile = openUCDFileOrExit("UnicodeData.txt") >- derivedBinaryPropertiesFile = openUCDFileOrExit("DerivedBinaryProperties.txt") >- derivedCorePropertiesFile = openUCDFileOrExit("DerivedCoreProperties.txt") >- derivedNormalizationPropertiesFile = openUCDFileOrExit("DerivedNormalizationProps.txt") >- propListFile = openUCDFileOrExit("PropList.txt") >- emojiDataFile = openUCDFileOrExit("emoji-data.txt") >- >- aliases = Aliases() >- >- propertyDataHFile = openOrExit(unicodeProertyDataHPath, "wb") >- >- propertyDataHFile.write(header) >- >- aliases.parsePropertyAliasesFile(propertyAliasesFile) >- aliases.parsePropertyValueAliasesFile(propertyValueAliasesFile) >- >- generalCategory = GeneralCategory(unicodeDataFile) >- generalCategory.parse() >- >- binaryProperty = BinaryProperty() >- binaryProperty.parsePropertyFile(derivedBinaryPropertiesFile) >- binaryProperty.parsePropertyFile(derivedCorePropertiesFile) >- binaryProperty.parsePropertyFile(derivedNormalizationPropertiesFile) >- binaryProperty.parsePropertyFile(propListFile) >- binaryProperty.parsePropertyFile(emojiDataFile) >- >- scripts = Scripts() >- scripts.parseScriptsFile(scriptsFile) >- scripts.parseScriptExtensionsFile(scriptExtensionsFile) >- >- PropertyData.dumpAll(propertyDataHFile) >- generalCategory.dump(propertyDataHFile) >- binaryProperty.dump(propertyDataHFile) >- scripts.dump(propertyDataHFile) >- >- propertyDataHFile.write(footer) >- >- exit(0) >diff --git a/Source/JavaScriptCore/Scripts/hasher.py b/Source/JavaScriptCore/Scripts/hasher.py >deleted file mode 100644 >index cf0290b5e5e5f6640b33d8c441d7d6f44d9d8e89..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/Scripts/hasher.py >+++ /dev/null >@@ -1,71 +0,0 @@ >-#!/usr/bin/env python >- >-# Copyright (C) 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> >-# Copyright (C) 2006 Anders Carlsson <andersca@mac.com> >-# Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org> >-# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> >-# Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. >-# Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> >-# Copyright (C) Research In Motion Limited 2010. All rights reserved. >-# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) >-# Copyright (C) 2011 Patrick Gansterer <paroga@webkit.org> >-# Copyright (C) 2012 Ericsson AB. All rights reserved. >-# >-# This library is free software; you can redistribute it and/or >-# modify it under the terms of the GNU Library General Public >-# License as published by the Free Software Foundation; either >-# version 2 of the License, or (at your option) any later version. >-# >-# This library is distributed in the hope that it will be useful, >-# but WITHOUT ANY WARRANTY; without even the implied warranty of >-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >-# Library General Public License for more details. >-# >-# You should have received a copy of the GNU Library General Public License >-# along with this library; see the file COPYING.LIB. If not, write to >-# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >-# Boston, MA 02110-1301, USA. >- >- >-def stringHash(str): >- # Implements Paul Hsieh's SuperFastHash - http://www.azillionmonkeys.com/qed/hash.html >- # LChar data is interpreted as Latin-1-encoded (zero extended to 16 bits). >- stringHashingStartValue = 0x9E3779B9 >- twoTo32 = 4294967296 >- >- hash = stringHashingStartValue >- >- strLength = len(str) >- characterPairs = strLength / 2 >- remainder = strLength & 1 >- >- # Main loop >- while characterPairs > 0: >- hash = hash + ord(str[0]) >- tmp = (ord(str[1]) << 11) ^ hash >- hash = ((hash << 16) % twoTo32) ^ tmp >- str = str[2:] >- hash = hash + (hash >> 11) >- hash = hash % twoTo32 >- characterPairs = characterPairs - 1 >- >- # Handle end case >- if remainder: >- hash = hash + ord(str[0]) >- hash = hash ^ ((hash << 11) % twoTo32) >- hash = hash + (hash >> 17) >- >- hash = hash ^ (hash << 3) >- hash = hash + (hash >> 5) >- hash = hash % twoTo32 >- hash = hash ^ ((hash << 2) % twoTo32) >- hash = hash + (hash >> 15) >- hash = hash % twoTo32 >- hash = hash ^ ((hash << 10) % twoTo32) >- >- hash = hash & 0xffffff >- >- if not hash: >- hash = 0x800000 >- >- return hash >diff --git a/Source/JavaScriptCore/Sources.txt b/Source/JavaScriptCore/Sources.txt >index 38830768efbb63a4fdc3fb311ab06ebd636f64f2..6db2c372bc4d2e477b356eb9d8abaf3ea7641ed8 100644 >--- a/Source/JavaScriptCore/Sources.txt >+++ b/Source/JavaScriptCore/Sources.txt >@@ -21,6 +21,7 @@ > // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF > // THE POSSIBILITY OF SUCH DAMAGE. > >+API/JSAPIValueWrapper.cpp > API/JSBase.cpp > API/JSCTestRunnerUtils.cpp > API/JSCallbackConstructor.cpp >@@ -786,7 +787,6 @@ runtime/IntlPluralRulesConstructor.cpp > runtime/IntlPluralRulesPrototype.cpp > runtime/IteratorOperations.cpp > runtime/IteratorPrototype.cpp >-runtime/JSAPIValueWrapper.cpp > runtime/JSArray.cpp > runtime/JSArrayBuffer.cpp > runtime/JSArrayBufferConstructor.cpp >diff --git a/Source/JavaScriptCore/runtime/JSAPIValueWrapper.cpp b/Source/JavaScriptCore/runtime/JSAPIValueWrapper.cpp >deleted file mode 100644 >index 454f196fca7190e0d2a7bc8343f18d908f84e5f3..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/runtime/JSAPIValueWrapper.cpp >+++ /dev/null >@@ -1,34 +0,0 @@ >-/* >- * Copyright (C) 1999-2002 Harri Porten (porten@kde.org) >- * Copyright (C) 2001 Peter Kelly (pmk@post.com) >- * Copyright (C) 2004, 2007, 2008 Apple Inc. All rights reserved. >- * >- * This library is free software; you can redistribute it and/or >- * modify it under the terms of the GNU Library General Public >- * License as published by the Free Software Foundation; either >- * version 2 of the License, or (at your option) any later version. >- * >- * This library is distributed in the hope that it will be useful, >- * but WITHOUT ANY WARRANTY; without even the implied warranty of >- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >- * Library General Public License for more details. >- * >- * You should have received a copy of the GNU Library General Public License >- * along with this library; see the file COPYING.LIB. If not, write to >- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >- * Boston, MA 02110-1301, USA. >- * >- */ >- >-#include "config.h" >-#include "JSAPIValueWrapper.h" >- >-#include "NumberObject.h" >- >-namespace JSC { >- >-STATIC_ASSERT_IS_TRIVIALLY_DESTRUCTIBLE(JSAPIValueWrapper); >- >-const ClassInfo JSAPIValueWrapper::s_info = { "API Wrapper", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(JSAPIValueWrapper) }; >- >-} // namespace JSC >diff --git a/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h b/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h >deleted file mode 100644 >index 06b307103eea2340547b03029ce3fb0e6d767633..0000000000000000000000000000000000000000 >--- a/Source/JavaScriptCore/runtime/JSAPIValueWrapper.h >+++ /dev/null >@@ -1,77 +0,0 @@ >-/* >- * Copyright (C) 1999-2001 Harri Porten (porten@kde.org) >- * Copyright (C) 2001 Peter Kelly (pmk@post.com) >- * Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved. >- * >- * This library is free software; you can redistribute it and/or >- * modify it under the terms of the GNU Library General Public >- * License as published by the Free Software Foundation; either >- * version 2 of the License, or (at your option) any later version. >- * >- * This library is distributed in the hope that it will be useful, >- * but WITHOUT ANY WARRANTY; without even the implied warranty of >- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >- * Library General Public License for more details. >- * >- * You should have received a copy of the GNU Library General Public License >- * along with this library; see the file COPYING.LIB. If not, write to >- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >- * Boston, MA 02110-1301, USA. >- * >- */ >- >-#pragma once >- >-#include "CallFrame.h" >-#include "JSCJSValue.h" >-#include "JSCast.h" >-#include "Structure.h" >- >-namespace JSC { >- >-class JSAPIValueWrapper final : public JSCell { >- friend JSValue jsAPIValueWrapper(ExecState*, JSValue); >-public: >- typedef JSCell Base; >- static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal; >- >- JSValue value() const { return m_value.get(); } >- >- static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) >- { >- return Structure::create(vm, globalObject, prototype, TypeInfo(APIValueWrapperType, OverridesGetPropertyNames), info()); >- } >- >- DECLARE_EXPORT_INFO; >- >- static JSAPIValueWrapper* create(ExecState* exec, JSValue value) >- { >- VM& vm = exec->vm(); >- JSAPIValueWrapper* wrapper = new (NotNull, allocateCell<JSAPIValueWrapper>(vm.heap)) JSAPIValueWrapper(exec); >- wrapper->finishCreation(vm, value); >- return wrapper; >- } >- >-protected: >- void finishCreation(VM& vm, JSValue value) >- { >- Base::finishCreation(vm); >- m_value.set(vm, this, value); >- ASSERT(!value.isCell()); >- } >- >-private: >- JSAPIValueWrapper(ExecState* exec) >- : JSCell(exec->vm(), exec->vm().apiWrapperStructure.get()) >- { >- } >- >- WriteBarrier<Unknown> m_value; >-}; >- >-inline JSValue jsAPIValueWrapper(ExecState* exec, JSValue value) >-{ >- return JSAPIValueWrapper::create(exec, value); >-} >- >-} // namespace JSC >diff --git a/Source/JavaScriptCore/runtime/JSImmutableButterfly.h b/Source/JavaScriptCore/runtime/JSImmutableButterfly.h >index 4b6ac7bab247fcbec9a6e54cb7c2c7a90c61ef0b..284783c0c75596adda5a1f98f36b069e0eb8e4a1 100644 >--- a/Source/JavaScriptCore/runtime/JSImmutableButterfly.h >+++ b/Source/JavaScriptCore/runtime/JSImmutableButterfly.h >@@ -25,8 +25,11 @@ > > #pragma once > >+#include "Butterfly.h" > #include "IndexingHeader.h" > #include "JSCell.h" >+#include "Structure.h" >+#include "VirtualRegister.h" > > namespace JSC { > >diff --git a/Source/JavaScriptCore/runtime/RuntimeType.h b/Source/JavaScriptCore/runtime/RuntimeType.h >index 82388eb0a47391c76facf1b5071b3efbb87769a4..782668628eff079474dd0b4908d4ccd3847929be 100644 >--- a/Source/JavaScriptCore/runtime/RuntimeType.h >+++ b/Source/JavaScriptCore/runtime/RuntimeType.h >@@ -26,6 +26,7 @@ > > #pragma once > >+#include "VM.h" > #include <wtf/text/WTFString.h> > > namespace JSC { >diff --git a/Source/JavaScriptCore/yarr/generateYarrUnicodePropertyTables.py b/Source/JavaScriptCore/yarr/generateYarrUnicodePropertyTables.py >new file mode 100644 >index 0000000000000000000000000000000000000000..f8bc6805d70c31aeb8d15b241df5607c05b607b8 >--- /dev/null >+++ b/Source/JavaScriptCore/yarr/generateYarrUnicodePropertyTables.py >@@ -0,0 +1,979 @@ >+#!/usr/bin/env python >+ >+# Copyright (C) 2017 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 AND ITS CONTRIBUTORS "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 OR ITS 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. >+ >+# This tool processes the Unicode Character Database file CaseFolding.txt to create >+# canonicalization table as decribed in ECMAScript 6 standard in section >+# "21.2.2.8.2 Runtime Semantics: Canonicalize()", step 2. >+ >+import sys >+import copy >+import optparse >+import os >+import re >+from hasher import stringHash >+ >+header = """/* >+* Copyright (C) 2017-2018 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 AND ITS CONTRIBUTORS "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 OR ITS 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. >+*/ >+ >+// DO NO EDIT! - This file was generated by """ + __file__ + """ >+""" >+ >+ >+footer = """ >+""" >+ >+RequiredUCDFiles = ["DerivedBinaryProperties.txt", "DerivedCoreProperties.txt", "DerivedNormalizationProps.txt", "PropList.txt", "PropertyAliases.txt", "PropertyValueAliases.txt", "ScriptExtensions.txt", "UnicodeData.txt", "emoji-data.txt"] >+UCDDirectoryPath = None >+ >+SupportedBinaryProperties = [ >+ "Alphabetic", "Any", "ASCII", "ASCII_Hex_Digit", "Assigned", "Bidi_Control", "Bidi_Mirrored", "Case_Ignorable", >+ "Cased", "Changes_When_Casefolded", "Changes_When_Casemapped", "Changes_When_Lowercased", "Changes_When_NFKC_Casefolded", >+ "Changes_When_Titlecased", "Changes_When_Uppercased", "Dash", "Default_Ignorable_Code_Point", "Deprecated", >+ "Diacritic", "Emoji", "Emoji_Component", "Emoji_Modifier_Base", "Emoji_Modifier", "Emoji_Presentation", >+ "Extended_Pictographic", "Extender", "Grapheme_Base", "Grapheme_Extend", "Hex_Digit", "ID_Continue", "ID_Start", >+ "Ideographic", "IDS_Binary_Operator", "IDS_Trinary_Operator", "Join_Control", "Logical_Order_Exception", "Lowercase", >+ "Math", "Noncharacter_Code_Point", "Pattern_Syntax", "Pattern_White_Space", "Quotation_Mark", "Radical", >+ "Regional_Indicator", "Sentence_Terminal", "Soft_Dotted", "Terminal_Punctuation", "Unified_Ideograph", "Uppercase", >+ "Variation_Selector", "White_Space", "XID_Continue", "XID_Start"] >+ >+lastASCIICodePoint = 0x7f >+firstUnicodeCodePoint = 0x80 >+MaxUnicode = 0x10ffff >+MaxBMP = 0xffff >+commonAndSimpleLinesRE = re.compile(r"(?P<code>[0-9A-F]+)\s*;\s*[CS]\s*;\s*(?P<mapping>[0-9A-F]+)", re.IGNORECASE) >+aliases = None >+ >+ >+def openOrExit(path, mode): >+ try: >+ return open(path, mode) >+ except IOError as e: >+ print("I/O error opening {0}, ({1}): {2}".format(path, e.errno, e.strerror)) >+ exit(1) >+ >+ >+def openUCDFileOrExit(path): >+ if not UCDDirectoryPath: >+ exit(1) >+ >+ return openOrExit(os.path.join(UCDDirectoryPath, path), 'r') >+ >+ >+def verifyUCDFilesExist(): >+ if not UCDDirectoryPath: >+ exit(1) >+ >+ missingFileCount = 0 >+ for file in RequiredUCDFiles: >+ fullPath = os.path.join(UCDDirectoryPath, file) >+ if not os.path.exists(fullPath): >+ print("Couldn't find UCD file {0} at {1}".format(file, fullPath)) >+ missingFileCount = missingFileCount + 1 >+ if missingFileCount: >+ exit(1) >+ >+ >+def ceilingToPowerOf2(size): >+ powerOf2 = 1 >+ while size > powerOf2: >+ powerOf2 = powerOf2 << 1 >+ >+ return powerOf2 >+ >+ >+class Aliases: >+ def __init__(self): >+ self.globalNameToAliases = {} >+ self.generalCategoryToAliases = {} >+ self.aliasToGeneralCategory = {} >+ self.scriptToAliases = {} >+ self.aliasToScript = {} >+ >+ def parsePropertyAliasesFile(self, file): >+ for line in file: >+ line = line.split('#', 1)[0] >+ line = line.rstrip() >+ if (not len(line)): >+ continue >+ >+ fields = line.split(';') >+ if (not fields): >+ continue >+ >+ aliases = [fields[0].strip()] >+ fullName = fields[1].strip() >+ for otherAlias in fields[2:]: >+ aliases.append(otherAlias.strip()) >+ >+ if fullName in self.globalNameToAliases: >+ print("Error, already an alias for {}".format(fullName)) >+ else: >+ self.globalNameToAliases[fullName] = aliases >+ >+ def parsePropertyValueAliasesFile(self, file): >+ for line in file: >+ line = line.split('#', 1)[0] >+ line = line.rstrip() >+ if (not len(line)): >+ continue >+ >+ fields = line.split(';') >+ if (not fields): >+ continue >+ >+ propertyType = fields[0].strip() >+ >+ if propertyType == "gc": >+ mapToModify = self.generalCategoryToAliases >+ reverseMapToModify = self.aliasToGeneralCategory >+ elif propertyType == "sc": >+ mapToModify = self.scriptToAliases >+ reverseMapToModify = self.aliasToScript >+ else: >+ continue >+ >+ primaryAlias = fields[1].strip() >+ fullName = fields[2].strip() >+ aliases = [primaryAlias] >+ for otherAlias in fields[3:]: >+ aliases.append(otherAlias.strip()) >+ >+ if fullName in mapToModify: >+ print("Error, already an {} alias for {}".format(propertyType, fullName)) >+ else: >+ mapToModify[fullName] = aliases >+ if reverseMapToModify != None: >+ reverseMapToModify[primaryAlias] = fullName >+ >+ def globalAliasesFor(self, name): >+ if name not in self.globalNameToAliases: >+ return [] >+ return self.globalNameToAliases[name] >+ >+ def generalCategoryAliasesFor(self, name): >+ if name not in self.generalCategoryToAliases: >+ return "" >+ return self.generalCategoryToAliases[name] >+ >+ def generalCategoryForAlias(self, name): >+ if name not in self.aliasToGeneralCategory: >+ return "" >+ return self.aliasToGeneralCategory[name] >+ >+ def scriptAliasesFor(self, name): >+ if name not in self.scriptToAliases: >+ return "" >+ return self.scriptToAliases[name] >+ >+ def scriptNameForAlias(self, name): >+ if name not in self.aliasToScript: >+ return "" >+ return self.aliasToScript[name] >+ >+ >+class PropertyData: >+ allPropertyData = [] >+ >+ def __init__(self, name): >+ self.name = name >+ self.aliases = [] >+ self.index = len(PropertyData.allPropertyData) >+ self.hasNonBMPCharacters = False >+ self.matches = [] >+ self.ranges = [] >+ self.unicodeMatches = [] >+ self.unicodeRanges = [] >+ self.codePointCount = 0 >+ PropertyData.allPropertyData.append(self) >+ >+ def setAliases(self, aliases): >+ self.aliases = aliases >+ >+ def makeCopy(self): >+ result = copy.deepcopy(self) >+ result.index = len(PropertyData.allPropertyData) >+ PropertyData.allPropertyData.append(result) >+ return result >+ >+ def getIndex(self): >+ return self.index >+ >+ def getCreateFuncName(self): >+ return "createCharacterClass{}".format(self.index) >+ >+ def addMatch(self, codePoint): >+ if codePoint > MaxBMP: >+ self.hasNonBMPCharacters = True >+ if codePoint <= lastASCIICodePoint: >+ if (len(self.matches) and self.matches[-1] > codePoint) or (len(self.ranges) and self.ranges[-1][1] > codePoint): >+ self.addMatchUnordered(codePoint) >+ return >+ >+ self.codePointCount = self.codePointCount + 1 >+ if len(self.matches) and self.matches[-1] == (codePoint - 1): >+ lowCodePoint = self.matches.pop() >+ self.ranges.append((lowCodePoint, codePoint)) >+ elif len(self.ranges) and self.ranges[-1][1] == (codePoint - 1): >+ priorRange = self.ranges.pop() >+ self.ranges.append((priorRange[0], codePoint)) >+ else: >+ self.matches.append(codePoint) >+ else: >+ if (len(self.unicodeMatches) and self.unicodeMatches[-1] > codePoint) or (len(self.unicodeRanges) and self.unicodeRanges[-1][1] > codePoint): >+ self.addMatchUnordered(codePoint) >+ return >+ >+ self.codePointCount = self.codePointCount + 1 >+ if len(self.unicodeMatches) and self.unicodeMatches[-1] == (codePoint - 1): >+ lowCodePoint = self.unicodeMatches.pop() >+ self.unicodeRanges.append((lowCodePoint, codePoint)) >+ elif len(self.unicodeRanges) and self.unicodeRanges[-1][1] == (codePoint - 1): >+ priorRange = self.unicodeRanges.pop() >+ self.unicodeRanges.append((priorRange[0], codePoint)) >+ else: >+ self.unicodeMatches.append(codePoint) >+ >+ def addRange(self, lowCodePoint, highCodePoint): >+ if highCodePoint > MaxBMP: >+ self.hasNonBMPCharacters = True >+ if highCodePoint <= lastASCIICodePoint: >+ if (len(self.matches) and self.matches[-1] > lowCodePoint) or (len(self.ranges) and self.ranges[-1][1] > lowCodePoint): >+ self.addRangeUnordered(lowCodePoint, highCodePoint) >+ return >+ >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ if len(self.matches) and self.matches[-1] == (lowCodePoint - 1): >+ lowCodePoint = self.matches.pop() >+ elif len(self.ranges) and self.ranges[-1][1] == (lowCodePoint - 1): >+ priorRange = self.ranges.pop() >+ lowCodePoint = priorRange[0] >+ self.ranges.append((lowCodePoint, highCodePoint)) >+ elif lowCodePoint <= lastASCIICodePoint: >+ if lowCodePoint == lastASCIICodePoint: >+ self.addMatch(lowCodePoint) >+ else: >+ self.addRange(lowCodePoint, lastASCIICodePoint) >+ if highCodePoint == firstUnicodeCodePoint: >+ self.addMatch(highCodePoint) >+ else: >+ self.addRange(firstUnicodeCodePoint, highCodePoint) >+ else: >+ if (len(self.unicodeMatches) and self.unicodeMatches[-1] > lowCodePoint) or (len(self.unicodeRanges) and self.unicodeRanges[-1][1] > lowCodePoint): >+ self.addRangeUnordered(lowCodePoint, highCodePoint) >+ return >+ >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ if len(self.unicodeMatches) and self.unicodeMatches[-1] == (lowCodePoint - 1): >+ lowCodePoint = self.unicodeMatches.pop() >+ self.unicodeRanges.append((lowCodePoint, highCodePoint)) >+ elif len(self.unicodeRanges) and self.unicodeRanges[-1][1] == (lowCodePoint - 1): >+ priorRange = self.unicodeRanges.pop() >+ self.unicodeRanges.append((priorRange[0], highCodePoint)) >+ else: >+ self.unicodeRanges.append((lowCodePoint, highCodePoint)) >+ >+ def addMatchUnorderedForMatchesAndRanges(self, codePoint, matches, ranges): >+ if codePoint in matches: >+ return >+ insertLocation = None >+ lowCodePoint = None >+ highCodePoint = None >+ for idx in xrange(len(matches)): >+ match = matches[idx] >+ if codePoint == match + 1: >+ lowCodePoint = match >+ if idx < (len(matches) - 1) and codePoint == matches[idx + 1] - 1: >+ highCodePoint = matches[idx + 1] >+ del matches[idx + 1] >+ self.codePointCount = self.codePointCount - 1 >+ else: >+ highCodePoint = codePoint >+ del matches[idx] >+ self.codePointCount = self.codePointCount - 1 >+ break >+ elif codePoint == match - 1: >+ lowCodePoint = codePoint >+ highCodePoint = match >+ del matches[idx] >+ self.codePointCount = self.codePointCount - 1 >+ break >+ elif codePoint < match: >+ insertLocation = idx >+ break >+ >+ if insertLocation is None: >+ insertLocation = len(matches) >+ if lowCodePoint is None: >+ lowCodePoint = codePoint >+ highCodePoint = codePoint >+ >+ for idx in xrange(len(ranges)): >+ range = ranges[idx] >+ if lowCodePoint >= range[0] and highCodePoint <= range[1]: >+ return >+ if lowCodePoint <= (range[1] + 1) and highCodePoint >= (range[0] - 1): >+ while idx < len(ranges) and highCodePoint >= (ranges[idx][0] - 1): >+ range = ranges[idx] >+ lowCodePoint = min(lowCodePoint, range[0]) >+ highCodePoint = max(highCodePoint, range[1]) >+ del ranges[idx] >+ self.codePointCount = self.codePointCount - (range[1] - range[0]) - 1 >+ >+ ranges.insert(idx, (lowCodePoint, highCodePoint)) >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ return >+ elif highCodePoint < range[0]: >+ if lowCodePoint != highCodePoint: >+ ranges.insert(idx, (lowCodePoint, highCodePoint)) >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ return >+ break >+ >+ if lowCodePoint != highCodePoint: >+ ranges.append((lowCodePoint, highCodePoint)) >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ return >+ >+ if insertLocation is not None: >+ matches.insert(insertLocation, codePoint) >+ self.codePointCount = self.codePointCount + 1 >+ >+ def addRangeUnorderedForMatchesAndRanges(self, lowCodePoint, highCodePoint, matches, ranges): >+ if len(matches) and highCodePoint >= matches[0] and lowCodePoint <= matches[-1]: >+ for idx in xrange(len(matches)): >+ match = matches[idx] >+ if lowCodePoint <= match and highCodePoint >= match: >+ while idx < len(matches) and highCodePoint >= matches[idx]: >+ del matches[idx] >+ self.codePointCount = self.codePointCount - 1 >+ if idx < (len(matches) - 1) and highCodePoint == matches[idx + 1] - 1: >+ highCodePoint = matches[idx + 1] >+ del matches[idx + 1] >+ self.codePointCount = self.codePointCount - 1 >+ break >+ elif lowCodePoint == match + 1: >+ lowCodePoint = match >+ while idx < len(matches) and highCodePoint >= matches[idx]: >+ del matches[idx] >+ self.codePointCount = self.codePointCount - 1 >+ >+ if idx < (len(matches) - 1) and highCodePoint == matches[idx + 1] - 1: >+ highCodePoint = matches[idx + 1] >+ del matches[idx + 1] >+ self.codePointCount = self.codePointCount - 1 >+ break >+ elif highCodePoint == match - 1: >+ highCodePoint = match >+ del matches[idx] >+ self.codePointCount = self.codePointCount - 1 >+ break >+ elif highCodePoint < match: >+ break >+ >+ for idx in xrange(len(ranges)): >+ range = ranges[idx] >+ if lowCodePoint >= range[0] and highCodePoint <= range[1]: >+ return >+ if lowCodePoint <= (range[1] + 1) and highCodePoint >= (range[0] - 1): >+ while idx < len(ranges) and highCodePoint >= (ranges[idx][0] - 1): >+ range = ranges[idx] >+ lowCodePoint = min(lowCodePoint, range[0]) >+ highCodePoint = max(highCodePoint, range[1]) >+ del ranges[idx] >+ self.codePointCount = self.codePointCount - (range[1] - range[0]) - 1 >+ >+ ranges.insert(idx, (lowCodePoint, highCodePoint)) >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ return >+ elif highCodePoint < range[0]: >+ ranges.insert(idx, (lowCodePoint, highCodePoint)) >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ return >+ >+ ranges.append((lowCodePoint, highCodePoint)) >+ self.codePointCount = self.codePointCount + (highCodePoint - lowCodePoint) + 1 >+ >+ def addMatchUnordered(self, codePoint): >+ if codePoint <= lastASCIICodePoint: >+ self.addMatchUnorderedForMatchesAndRanges(codePoint, self.matches, self.ranges) >+ else: >+ self.addMatchUnorderedForMatchesAndRanges(codePoint, self.unicodeMatches, self.unicodeRanges) >+ >+ def addRangeUnordered(self, lowCodePoint, highCodePoint): >+ if highCodePoint <= lastASCIICodePoint: >+ self.addRangeUnorderedForMatchesAndRanges(lowCodePoint, highCodePoint, self.matches, self.ranges) >+ elif lowCodePoint >= firstUnicodeCodePoint: >+ self.addRangeUnorderedForMatchesAndRanges(lowCodePoint, highCodePoint, self.unicodeMatches, self.unicodeRanges) >+ else: >+ if lowCodePoint == lastASCIICodePoint: >+ self.addMatchUnorderedForMatchesAndRanges(lowCodePoint, self.matches, self.ranges) >+ else: >+ self.addRangeUnorderedForMatchesAndRanges(lowCodePoint, lastASCIICodePoint, self.unicodeMatches, self.ranges) >+ if highCodePoint == firstUnicodeCodePoint: >+ self.addMatchUnorderedForMatchesAndRanges(highCodePoint, self.unicodeMatches, self.unicodeRanges) >+ else: >+ self.addRangeUnorderedForMatchesAndRanges(firstUnicodeCodePoint, highCodePoint, self.unicodeMatches, self.unicodeRanges) >+ >+ def removeMatchFromRanges(self, codePoint, ranges): >+ for idx in xrange(len(ranges)): >+ range = ranges[idx] >+ if range[0] <= codePoint and codePoint <= range[1]: >+ ranges.pop(idx) >+ if range[0] < codePoint and codePoint < range[1]: >+ lowRange = (range[0], codePoint - 1) >+ highRange = (codePoint + 1, range[1]) >+ # Since list.insert inserts before the index given, handle the high range first >+ if highRange[0] == highRange[1]: >+ self.addMatchUnordered(highRange[0]) >+ else: >+ ranges.insert(idx, highRange) >+ if lowRange[0] == lowRange[1]: >+ self.addMatchUnordered(lowRange[0]) >+ else: >+ ranges.insert(idx, lowRange) >+ else: >+ if range[0] == codePoint: >+ range = (codePoint + 1, range[1]) >+ else: >+ range = (range[0], codePoint - 1) >+ if range[0] == range[1]: >+ self.addMatchUnordered(range[0]) >+ else: >+ ranges.insert(idx, range) >+ self.codePointCount = self.codePointCount - 1 >+ return >+ >+ def removeMatch(self, codePoint): >+ if codePoint <= lastASCIICodePoint: >+ if codePoint in self.matches: >+ self.matches.remove(codePoint) >+ self.codePointCount = self.codePointCount - 1 >+ else: >+ self.removeMatchFromRanges(codePoint, self.ranges) >+ else: >+ if codePoint in self.unicodeMatches: >+ self.unicodeMatches.remove(codePoint) >+ self.codePointCount = self.codePointCount - 1 >+ else: >+ self.removeMatchFromRanges(codePoint, self.unicodeRanges) >+ >+ def dumpMatchData(self, file, valuesPerLine, dataList, formatter): >+ valuesThisLine = 0 >+ firstValue = True >+ >+ file.write("{") >+ for elem in dataList: >+ if firstValue: >+ firstValue = False >+ else: >+ file.write(", ") >+ valuesThisLine = valuesThisLine + 1 >+ if valuesThisLine > valuesPerLine: >+ file.write("\n ") >+ valuesThisLine = 1 >+ formatter(file, elem) >+ file.write("}") >+ >+ def dump(self, file, commaAfter): >+ file.write("static std::unique_ptr<CharacterClass> {}()\n{{\n".format(self.getCreateFuncName())) >+ file.write(" // Name = {}, number of codePoints: {}\n".format(self.name, self.codePointCount)) >+ file.write(" auto characterClass = std::make_unique<CharacterClass>(\n") >+ file.write(" std::initializer_list<UChar32>(") >+ self.dumpMatchData(file, 8, self.matches, lambda file, match: (file.write("{0:0=#4x}".format(match)))) >+ file.write("),\n") >+ file.write(" std::initializer_list<CharacterRange>(") >+ self.dumpMatchData(file, 4, self.ranges, lambda file, range: (file.write("{{{0:0=#4x}, {1:0=#4x}}}".format(range[0], range[1])))) >+ file.write("),\n") >+ file.write(" std::initializer_list<UChar32>(") >+ self.dumpMatchData(file, 8, self.unicodeMatches, lambda file, match: (file.write("{0:0=#6x}".format(match)))) >+ file.write("),\n") >+ file.write(" std::initializer_list<CharacterRange>(") >+ self.dumpMatchData(file, 4, self.unicodeRanges, lambda file, range: (file.write("{{{0:0=#6x}, {1:0=#6x}}}".format(range[0], range[1])))) >+ file.write("));\n") >+ >+ file.write(" characterClass->m_hasNonBMPCharacters = {};\n".format(("false", "true")[self.hasNonBMPCharacters])) >+ file.write(" return characterClass;\n}\n\n") >+ >+ @classmethod >+ def dumpAll(cls, file): >+ for propertyData in cls.allPropertyData: >+ propertyData.dump(file, propertyData != cls.allPropertyData[-1]) >+ >+ file.write("typedef std::unique_ptr<CharacterClass> (*CreateCharacterClass)();\n") >+ file.write("static CreateCharacterClass createFunctions[{}] = {{\n ".format(len(cls.allPropertyData))) >+ functionsOnThisLine = 0 >+ for propertyData in cls.allPropertyData: >+ file.write(" {},".format(propertyData.getCreateFuncName())) >+ functionsOnThisLine = functionsOnThisLine + 1 >+ if functionsOnThisLine == 4: >+ file.write("\n ") >+ functionsOnThisLine = 0 >+ >+ file.write("};\n\n") >+ >+ @classmethod >+ def createAndDumpHashTable(self, file, propertyDict, tablePrefix): >+ propertyKeys = propertyDict.keys() >+ numberOfKeys = len(propertyKeys) >+ hashSize = ceilingToPowerOf2(numberOfKeys * 2) >+ hashMask = hashSize - 1 >+ hashTable = [None] * hashSize >+ valueTable = [] >+ tableSize = hashSize >+ >+ keyValuesToHash = [] >+ for propertyName in propertyKeys: >+ propertyData = propertyDict[propertyName] >+ keyValuesToHash.append((propertyName, propertyData.getIndex())) >+ for alias in propertyData.aliases: >+ keyValuesToHash.append((alias, propertyData.getIndex())) >+ >+ for keyValue in keyValuesToHash: >+ key = keyValue[0] >+ hash = stringHash(key) % hashSize >+ while hashTable[hash] is not None: >+ if hashTable[hash][1] is not None: >+ hash = hashTable[hash][1] >+ else: >+ hashTable[hash] = (hashTable[hash][0], tableSize) >+ hashTable.append(None) >+ hash = tableSize >+ tableSize = tableSize + 1 >+ >+ hashTable[hash] = (len(valueTable), None) >+ valueTable.append((key, keyValue[1])) >+ >+ file.write("static const struct HashIndex {}TableIndex[{}] = {{\n".format(tablePrefix, len(hashTable))) >+ >+ for tableIndex in hashTable: >+ value = -1 >+ next = -1 >+ if tableIndex is not None: >+ value = tableIndex[0] >+ if tableIndex[1] is not None: >+ next = tableIndex[1] >+ >+ file.write(" {{ {}, {} }},\n".format(value, next)) >+ >+ file.write("};\n\n") >+ >+ file.write("static const struct HashValue {}TableValue[{}] = {{\n".format(tablePrefix, len(valueTable))) >+ for value in valueTable: >+ file.write(" {{ \"{}\", {} }},\n".format(value[0], value[1])) >+ file.write("};\n\n") >+ >+ file.write("static const struct HashTable {}HashTable = \n".format(tablePrefix)) >+ file.write(" {{ {}, {}, {}TableValue, {}TableIndex }};\n\n".format(len(valueTable), hashMask, tablePrefix, tablePrefix)) >+ >+ >+class Scripts: >+ def __init__(self): >+ self.allPropertyData = [] >+ self.scriptsByName = {} >+ self.scriptExtensionsByName = {} >+ self.unknownScript = PropertyData("Unknown") >+ self.unknownScript.setAliases(aliases.scriptAliasesFor("Unknown")) >+ self.allPropertyData.append(self.unknownScript) >+ self.scriptsParsed = False >+ >+ def parseScriptsFile(self, file): >+ currentScriptName = None >+ currentPropertyData = None >+ # To calculate the Unknown, we gather all the codePoints asigned to a scripts as ranges, >+ # sort them, and then go the list to create the inverse of the assigned ranges. >+ assignedCodePointRanges = [] >+ >+ for line in file: >+ line = line.split('#', 1)[0] >+ line = line.rstrip() >+ if (not len(line)): >+ continue >+ >+ fields = line.split(';') >+ if (not fields): >+ continue >+ >+ codePoints = fields[0].strip() >+ scriptName = fields[1].strip() >+ >+ if scriptName != currentScriptName: >+ currentScriptName = scriptName >+ currentPropertyData = PropertyData(scriptName) >+ currentPropertyData.setAliases(aliases.scriptAliasesFor(scriptName)) >+ self.allPropertyData.append(currentPropertyData) >+ self.scriptsByName[scriptName] = currentPropertyData >+ >+ dotDot = codePoints.find("..") >+ if dotDot == -1: >+ codePoint = int(codePoints, 16) >+ currentPropertyData.addMatch(codePoint) >+ assignedCodePointRanges.append((codePoint, codePoint)) >+ else: >+ lowCodePoint = int(codePoints[:dotDot], 16) >+ highCodePoint = int(codePoints[dotDot + 2:], 16) >+ currentPropertyData.addRange(lowCodePoint, highCodePoint) >+ assignedCodePointRanges.append((lowCodePoint, highCodePoint)) >+ >+ assignedCodePointRanges.sort(key=lambda range: range[0]) >+ lastAssignedCodePoint = 0 >+ >+ for range in assignedCodePointRanges: >+ if range[0] - lastAssignedCodePoint > 1: >+ if range[0] - lastAssignedCodePoint == 2: >+ self.unknownScript.addMatch(lastAssignedCodePoint + 1) >+ else: >+ self.unknownScript.addRange(lastAssignedCodePoint + 1, range[0] - 1) >+ lastAssignedCodePoint = range[1] >+ >+ if lastAssignedCodePoint < MaxUnicode: >+ if MaxUnicode - lastAssignedCodePoint == 1: >+ self.unknownScript.addMatch(MaxUnicode) >+ else: >+ self.unknownScript.addRange(lastAssignedCodePoint + 1, MaxUnicode) >+ >+ self.scriptsParsed = True >+ >+ def parseScriptExtensionsFile(self, file): >+ currentPropertyData = None >+ # To calculate the Unknown, we gather all the codePoints asigned to a scripts as ranges, >+ # sort them, and then go the list to create the inverse of the assigned ranges. >+ assignedCodePointRanges = [] >+ >+ if not self.scriptsParsed: >+ print("Error: parsing ScriptExtensions.txt before Scripts.txt") >+ exit(1) >+ >+ commonScriptExtenstionPropertyData = None >+ inheritedScriptExtensionPropertyData = None >+ >+ scriptName = "Common" >+ if scriptName in self.scriptsByName: >+ commonScriptExtenstionPropertyData = self.scriptsByName[scriptName].makeCopy() >+ else: >+ commonScriptExtenstionPropertyData = PropertyData(scriptName) >+ commonScriptExtenstionPropertyData.setAliases(aliases.scriptAliasesFor(scriptName)) >+ self.allPropertyData.append(commonScriptExtenstionPropertyData) >+ self.scriptExtensionsByName[scriptName] = commonScriptExtenstionPropertyData >+ >+ scriptName = "Inherited" >+ if scriptName in self.scriptsByName: >+ inheritedScriptExtensionPropertyData = self.scriptsByName[scriptName].makeCopy() >+ else: >+ inheritedScriptExtensionPropertyData = PropertyData(scriptName) >+ inheritedScriptExtensionPropertyData.setAliases(aliases.scriptAliasesFor(scriptName)) >+ self.allPropertyData.append(inheritedScriptExtensionPropertyData) >+ self.scriptExtensionsByName[scriptName] = inheritedScriptExtensionPropertyData >+ >+ for line in file: >+ line = line.split('#', 1)[0] >+ line = line.rstrip() >+ if (not len(line)): >+ continue >+ >+ fields = line.split(';') >+ if (not fields): >+ continue >+ >+ codePoints = fields[0].strip() >+ scriptAliasList = fields[1].strip() >+ >+ for scriptAlias in scriptAliasList.split(' '): >+ scriptName = aliases.scriptNameForAlias(scriptAlias) >+ currentPropertyData = None >+ >+ if scriptName not in self.scriptExtensionsByName: >+ currentPropertyData = self.scriptsByName[scriptName].makeCopy() >+ self.allPropertyData.append(currentPropertyData) >+ self.scriptExtensionsByName[scriptName] = currentPropertyData >+ else: >+ currentPropertyData = self.scriptExtensionsByName[scriptName] >+ >+ dotDot = codePoints.find("..") >+ if dotDot == -1: >+ codePoint = int(codePoints, 16) >+ currentPropertyData.addMatch(codePoint) >+ commonScriptExtenstionPropertyData.removeMatch(codePoint) >+ inheritedScriptExtensionPropertyData.removeMatch(codePoint) >+ else: >+ lowCodePoint = int(codePoints[:dotDot], 16) >+ highCodePoint = int(codePoints[dotDot + 2:], 16) >+ currentPropertyData.addRange(lowCodePoint, highCodePoint) >+ for codePoint in xrange(lowCodePoint, highCodePoint + 1): >+ commonScriptExtenstionPropertyData.removeMatch(codePoint) >+ inheritedScriptExtensionPropertyData.removeMatch(codePoint) >+ >+ # For the scripts that don't have any additional extension codePoints, copy the script >+ # data to the script extension with the same name >+ for scriptName, propertyData in self.scriptsByName.iteritems(): >+ if scriptName not in self.scriptExtensionsByName: >+ self.scriptExtensionsByName[scriptName] = propertyData >+ >+ def dump(self, file): >+ file.write("// Scripts:\n") >+ PropertyData.createAndDumpHashTable(file, self.scriptsByName, "script") >+ >+ file.write("// Script_Extensions:\n") >+ PropertyData.createAndDumpHashTable(file, self.scriptExtensionsByName, "scriptExtension") >+ >+ >+class GeneralCategory: >+ def __init__(self, file): >+ self.file = file >+ self.allPropertyData = [] >+ self.propertyDataByCategory = {} >+ self.createSpecialPropertyData("Any", (0, MaxUnicode)) >+ self.createSpecialPropertyData("ASCII", (0, lastASCIICodePoint)) >+ self.assignedPropertyData = self.createSpecialPropertyData("Assigned") >+ self.unassignedProperyData = self.findPropertyGroupFor("Cn")[1] >+ self.casedLetterPropertyData = self.findPropertyGroupFor("LC")[1] >+ self.lastAddedCodePoint = 0 >+ >+ def createSpecialPropertyData(self, name, range=None): >+ propertyData = PropertyData(name) >+ self.allPropertyData.append(propertyData) >+ self.propertyDataByCategory[name] = propertyData >+ if range: >+ propertyData.addRange(range[0], range[1]) >+ >+ return propertyData >+ >+ def findPropertyGroupFor(self, categoryAlias): >+ category = aliases.generalCategoryForAlias(categoryAlias) >+ allCategoryAliases = aliases.generalCategoryAliasesFor(category) >+ categoryGroupAlias = categoryAlias[0] >+ categoryGroup = aliases.generalCategoryForAlias(categoryGroupAlias) >+ allCategoryGroupAlias = aliases.generalCategoryAliasesFor(categoryGroup) >+ groupPropertyData = None >+ propertyData = None >+ >+ if categoryGroup not in self.propertyDataByCategory: >+ groupPropertyData = PropertyData(categoryGroup) >+ groupPropertyData.setAliases(allCategoryGroupAlias) >+ self.allPropertyData.append(groupPropertyData) >+ self.propertyDataByCategory[categoryGroup] = groupPropertyData >+ else: >+ groupPropertyData = self.propertyDataByCategory[categoryGroup] >+ >+ if category not in self.propertyDataByCategory: >+ propertyData = PropertyData(category) >+ propertyData.setAliases(allCategoryAliases) >+ self.allPropertyData.append(propertyData) >+ self.propertyDataByCategory[category] = propertyData >+ else: >+ propertyData = self.propertyDataByCategory[category] >+ >+ return (groupPropertyData, propertyData) >+ >+ def addNextCodePoints(self, categoryAlias, codePoint, highCodePoint=None): >+ if codePoint - self.lastAddedCodePoint > 1: >+ propertyDatas = self.findPropertyGroupFor("Cn") >+ if codePoint - self.lastAddedCodePoint == 2: >+ propertyDatas[0].addMatch(self.lastAddedCodePoint + 1) >+ propertyDatas[1].addMatch(self.lastAddedCodePoint + 1) >+ else: >+ propertyDatas[0].addRange(self.lastAddedCodePoint + 1, codePoint - 1) >+ propertyDatas[1].addRange(self.lastAddedCodePoint + 1, codePoint - 1) >+ >+ propertyDatas = self.findPropertyGroupFor(categoryAlias) >+ if highCodePoint: >+ propertyDatas[0].addRange(codePoint, highCodePoint) >+ propertyDatas[1].addRange(codePoint, highCodePoint) >+ if categoryAlias == "Ll" or categoryAlias == "Lt" or categoryAlias == "Lu": >+ self.casedLetterPropertyData.addRange(codePoint, highCodePoint) >+ self.assignedPropertyData.addRange(codePoint, highCodePoint) >+ >+ self.lastAddedCodePoint = highCodePoint >+ else: >+ propertyDatas[0].addMatch(codePoint) >+ propertyDatas[1].addMatch(codePoint) >+ if categoryAlias == "Ll" or categoryAlias == "Lt" or categoryAlias == "Lu": >+ self.casedLetterPropertyData.addMatch(codePoint) >+ self.assignedPropertyData.addMatch(codePoint) >+ >+ self.lastAddedCodePoint = codePoint >+ >+ def parse(self): >+ lastLineFirstOfRange = None >+ lastLineCodePoint = 0 >+ for line in self.file: >+ line = line.split('#', 1)[0] >+ line = line.rstrip() >+ if (not len(line)): >+ continue >+ >+ fields = line.split(';') >+ if (not fields): >+ continue >+ >+ codePoint = int(fields[0].strip(), 16) >+ description = fields[1].strip() >+ categoryAlias = fields[2].strip() >+ >+ if lastLineFirstOfRange: >+ if description[-5:-1] == "Last": >+ self.addNextCodePoints(categoryAlias, lastLineFirstOfRange, codePoint) >+ lastLineFirstOfRange = None >+ continue >+ else: >+ print("Malformed First..Last pair of lines") >+ >+ if description[-6:-1] == "First": >+ lastLineFirstOfRange = codePoint >+ continue >+ >+ self.addNextCodePoints(categoryAlias, codePoint) >+ >+ if self.lastAddedCodePoint < MaxUnicode: >+ propertyDatas = self.findPropertyGroupFor("Cn") >+ if MaxUnicode - self.lastAddedCodePoint == 1: >+ propertyDatas[0].addMatch(MaxUnicode) >+ propertyDatas[1].addMatch(MaxUnicode) >+ else: >+ propertyDatas[0].addRange(self.lastAddedCodePoint + 1, MaxUnicode) >+ propertyDatas[1].addRange(self.lastAddedCodePoint + 1, MaxUnicode) >+ >+ def dump(self, file): >+ file.write("// General_Category:\n") >+ PropertyData.createAndDumpHashTable(file, self.propertyDataByCategory, "generalCategory") >+ >+ >+class BinaryProperty: >+ def __init__(self): >+ self.allPropertyData = [] >+ self.propertyDataByProperty = {} >+ >+ def parsePropertyFile(self, file): >+ currentPropertyName = None >+ currentPropertyData = None >+ >+ for line in file: >+ line = line.split('#', 1)[0] >+ line = line.rstrip() >+ if (not len(line)): >+ continue >+ >+ fields = line.split(';') >+ if (not fields): >+ continue >+ >+ codePoints = fields[0].strip() >+ propertyName = fields[1].strip() >+ >+ if propertyName != currentPropertyName: >+ if propertyName not in SupportedBinaryProperties: >+ continue >+ >+ currentPropertyName = propertyName >+ currentPropertyData = PropertyData(propertyName) >+ currentPropertyData.setAliases(aliases.globalAliasesFor(propertyName)) >+ self.allPropertyData.append(currentPropertyData) >+ self.propertyDataByProperty[propertyName] = currentPropertyData >+ >+ dotDot = codePoints.find("..") >+ if dotDot == -1: >+ currentPropertyData.addMatch(int(codePoints, 16)) >+ else: >+ currentPropertyData.addRange(int(codePoints[:dotDot], 16), int(codePoints[dotDot + 2:], 16)) >+ >+ def dump(self, file): >+ file.write("// binary properties:\n") >+ PropertyData.createAndDumpHashTable(file, self.propertyDataByProperty, "binaryProperty") >+ >+if __name__ == "__main__": >+ parser = optparse.OptionParser(usage="usage: %prog <UCD-Directory> <YarrUnicodePropertyData.h>") >+ (options, args) = parser.parse_args() >+ >+ if len(args) != 2: >+ parser.error("<UCD-Directory> <YarrUnicodePropertyData.h>") >+ >+ UCDDirectoryPath = args[0] >+ unicodeProertyDataHPath = args[1] >+ >+ verifyUCDFilesExist() >+ >+ propertyAliasesFile = openUCDFileOrExit("PropertyAliases.txt") >+ propertyValueAliasesFile = openUCDFileOrExit("PropertyValueAliases.txt") >+ scriptsFile = openUCDFileOrExit("Scripts.txt") >+ scriptExtensionsFile = openUCDFileOrExit("ScriptExtensions.txt") >+ unicodeDataFile = openUCDFileOrExit("UnicodeData.txt") >+ derivedBinaryPropertiesFile = openUCDFileOrExit("DerivedBinaryProperties.txt") >+ derivedCorePropertiesFile = openUCDFileOrExit("DerivedCoreProperties.txt") >+ derivedNormalizationPropertiesFile = openUCDFileOrExit("DerivedNormalizationProps.txt") >+ propListFile = openUCDFileOrExit("PropList.txt") >+ emojiDataFile = openUCDFileOrExit("emoji-data.txt") >+ >+ aliases = Aliases() >+ >+ propertyDataHFile = openOrExit(unicodeProertyDataHPath, "wb") >+ >+ propertyDataHFile.write(header) >+ >+ aliases.parsePropertyAliasesFile(propertyAliasesFile) >+ aliases.parsePropertyValueAliasesFile(propertyValueAliasesFile) >+ >+ generalCategory = GeneralCategory(unicodeDataFile) >+ generalCategory.parse() >+ >+ binaryProperty = BinaryProperty() >+ binaryProperty.parsePropertyFile(derivedBinaryPropertiesFile) >+ binaryProperty.parsePropertyFile(derivedCorePropertiesFile) >+ binaryProperty.parsePropertyFile(derivedNormalizationPropertiesFile) >+ binaryProperty.parsePropertyFile(propListFile) >+ binaryProperty.parsePropertyFile(emojiDataFile) >+ >+ scripts = Scripts() >+ scripts.parseScriptsFile(scriptsFile) >+ scripts.parseScriptExtensionsFile(scriptExtensionsFile) >+ >+ PropertyData.dumpAll(propertyDataHFile) >+ generalCategory.dump(propertyDataHFile) >+ binaryProperty.dump(propertyDataHFile) >+ scripts.dump(propertyDataHFile) >+ >+ propertyDataHFile.write(footer) >+ >+ exit(0) >diff --git a/Source/JavaScriptCore/yarr/hasher.py b/Source/JavaScriptCore/yarr/hasher.py >new file mode 100644 >index 0000000000000000000000000000000000000000..cf0290b5e5e5f6640b33d8c441d7d6f44d9d8e89 >--- /dev/null >+++ b/Source/JavaScriptCore/yarr/hasher.py >@@ -0,0 +1,71 @@ >+#!/usr/bin/env python >+ >+# Copyright (C) 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> >+# Copyright (C) 2006 Anders Carlsson <andersca@mac.com> >+# Copyright (C) 2006, 2007 Samuel Weinig <sam@webkit.org> >+# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> >+# Copyright (C) 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. >+# Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> >+# Copyright (C) Research In Motion Limited 2010. All rights reserved. >+# Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) >+# Copyright (C) 2011 Patrick Gansterer <paroga@webkit.org> >+# Copyright (C) 2012 Ericsson AB. All rights reserved. >+# >+# This library is free software; you can redistribute it and/or >+# modify it under the terms of the GNU Library General Public >+# License as published by the Free Software Foundation; either >+# version 2 of the License, or (at your option) any later version. >+# >+# This library is distributed in the hope that it will be useful, >+# but WITHOUT ANY WARRANTY; without even the implied warranty of >+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >+# Library General Public License for more details. >+# >+# You should have received a copy of the GNU Library General Public License >+# along with this library; see the file COPYING.LIB. If not, write to >+# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, >+# Boston, MA 02110-1301, USA. >+ >+ >+def stringHash(str): >+ # Implements Paul Hsieh's SuperFastHash - http://www.azillionmonkeys.com/qed/hash.html >+ # LChar data is interpreted as Latin-1-encoded (zero extended to 16 bits). >+ stringHashingStartValue = 0x9E3779B9 >+ twoTo32 = 4294967296 >+ >+ hash = stringHashingStartValue >+ >+ strLength = len(str) >+ characterPairs = strLength / 2 >+ remainder = strLength & 1 >+ >+ # Main loop >+ while characterPairs > 0: >+ hash = hash + ord(str[0]) >+ tmp = (ord(str[1]) << 11) ^ hash >+ hash = ((hash << 16) % twoTo32) ^ tmp >+ str = str[2:] >+ hash = hash + (hash >> 11) >+ hash = hash % twoTo32 >+ characterPairs = characterPairs - 1 >+ >+ # Handle end case >+ if remainder: >+ hash = hash + ord(str[0]) >+ hash = hash ^ ((hash << 11) % twoTo32) >+ hash = hash + (hash >> 17) >+ >+ hash = hash ^ (hash << 3) >+ hash = hash + (hash >> 5) >+ hash = hash % twoTo32 >+ hash = hash ^ ((hash << 2) % twoTo32) >+ hash = hash + (hash >> 15) >+ hash = hash % twoTo32 >+ hash = hash ^ ((hash << 10) % twoTo32) >+ >+ hash = hash & 0xffffff >+ >+ if not hash: >+ hash = 0x800000 >+ >+ return hash
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189574
:
349623
|
349624
|
349626
|
349629
|
349652
|
349658