OLD | NEW |
1 # Copyright (C) 2013 Google, Inc. All Rights Reserved. | 1 # Copyright (C) 2013 Google, Inc. All Rights Reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions | 4 # modification, are permitted provided that the following conditions |
5 # are met: | 5 # are met: |
6 # 1. Redistributions of source code must retain the above copyright | 6 # 1. Redistributions of source code must retain the above copyright |
7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
8 # 2. Redistributions in binary form must reproduce the above copyright | 8 # 2. Redistributions in binary form must reproduce the above copyright |
9 # notice, this list of conditions and the following disclaimer in the | 9 # notice, this list of conditions and the following disclaimer in the |
10 # documentation and/or other materials provided with the distribution. | 10 # documentation and/or other materials provided with the distribution. |
11 # | 11 # |
12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | 12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
13 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 13 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
15 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | 15 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
16 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 16 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
17 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 17 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
18 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 18 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
19 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 19 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
20 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 20 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
21 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 21 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
22 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 | 23 |
24 package StaticString; | 24 package StaticString; |
25 | 25 |
26 use strict; | 26 use strict; |
27 use Hasher; | 27 use Hasher; |
28 | 28 |
29 sub GenerateStrings($) | 29 sub GenerateStringDecls($) |
30 { | 30 { |
31 my $stringsRef = shift; | 31 my $stringsRef = shift; |
32 my %strings = %$stringsRef; | 32 my %strings = %$stringsRef; |
33 | 33 |
34 my @result = (); | 34 my @result = (); |
35 | 35 |
36 push(@result, "\n"); | 36 push(@result, "\n"); |
37 | 37 |
38 while ( my ($name, $value) = each %strings ) { | 38 while ( my ($name, $value) = each %strings ) { |
39 push(@result, "static const LChar ${name}String8[] = \"${value}\";\n"); | 39 my $length = length($value); |
| 40 push(@result, <<END); |
| 41 static struct { |
| 42 const char header[sizeof(StringImpl)]; |
| 43 const char data[$length + 1]; |
| 44 } ${name}Data = { |
| 45 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
| 46 "${value}", |
| 47 }; |
| 48 END |
40 } | 49 } |
41 | 50 |
| 51 return join "", @result; |
| 52 } |
| 53 |
| 54 sub GenerateStringImpls($) |
| 55 { |
| 56 my $stringsRef = shift; |
| 57 my %strings = %$stringsRef; |
| 58 |
| 59 my @result = (); |
| 60 |
42 push(@result, "\n"); | 61 push(@result, "\n"); |
43 | 62 |
44 while ( my ($name, $value) = each %strings ) { | 63 while ( my ($name, $value) = each %strings ) { |
45 my $length = length($value); | 64 my $length = length($value); |
46 my $hash = Hasher::GenerateHashValue($value); | 65 my $hash = Hasher::GenerateHashValue($value); |
47 push(@result, <<END); | 66 push(@result, " StringImpl* ${name}Impl = new ((void*)&${name}Data.he
ader) StringImpl($length, $hash, StringImpl::StaticString);\n"); |
48 static StringImpl::StaticASCIILiteral ${name}Data = { | |
49 ${name}String8, | |
50 StringImpl::StaticASCIILiteral::s_initialRefCount, | |
51 $length, | |
52 StringImpl::StaticASCIILiteral::s_initialFlags | (${hash} << StringImpl::Sta
ticASCIILiteral::s_hashShift) | |
53 }; | |
54 END | |
55 } | |
56 | |
57 push(@result, "\n"); | |
58 | |
59 while ( my ($name, $value) = each %strings ) { | |
60 push(@result, "static StringImpl* ${name}Impl = reinterpret_cast<StringI
mpl*>(&${name}Data);\n"); | |
61 } | 67 } |
62 | 68 |
63 push(@result, "\n"); | 69 push(@result, "\n"); |
64 | 70 |
65 return join "", @result; | 71 return join "", @result; |
66 } | |
67 | |
68 sub GenerateStringAsserts($) | |
69 { | |
70 my $stringsRef = shift; | |
71 my %strings = %$stringsRef; | |
72 | |
73 my @result = (); | |
74 | |
75 push(@result, "#ifndef NDEBUG\n"); | |
76 | |
77 while ( my ($name, $value) = each %strings ) { | |
78 push(@result, " ${name}Impl->assertHashIsCorrect();\n"); | |
79 } | |
80 | |
81 push(@result, "#endif // NDEBUG\n"); | |
82 | |
83 push(@result, "\n"); | |
84 | |
85 return join "", @result; | |
86 } | 72 } |
87 | 73 |
88 1; | 74 1; |
OLD | NEW |