Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(483)

Side by Side Diff: runtime/vm/bigint_operations.cc

Issue 10786003: Ensure objects emitted in code are allocated in old space. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address review comments Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/ast.h ('k') | runtime/vm/code_generator_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 Google Inc. All Rights Reserved. 1 // Copyright 2012 Google Inc. All Rights Reserved.
2 2
3 #include "vm/bigint_operations.h" 3 #include "vm/bigint_operations.h"
4 4
5 #include "platform/utils.h" 5 #include "platform/utils.h"
6 6
7 #include "vm/double_internals.h" 7 #include "vm/double_internals.h"
8 #include "vm/exceptions.h" 8 #include "vm/exceptions.h"
9 #include "vm/object_store.h" 9 #include "vm/object_store.h"
10 #include "vm/zone.h" 10 #include "vm/zone.h"
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
107 } 107 }
108 108
109 intptr_t str_length = strlen(str); 109 intptr_t str_length = strlen(str);
110 if ((str_length > 2) && 110 if ((str_length > 2) &&
111 (str[0] == '0') && 111 (str[0] == '0') &&
112 ((str[1] == 'x') || (str[1] == 'X'))) { 112 ((str[1] == 'x') || (str[1] == 'X'))) {
113 const Bigint& result = Bigint::Handle(FromHexCString(&str[2], space)); 113 const Bigint& result = Bigint::Handle(FromHexCString(&str[2], space));
114 ASSERT(IsClamped(result)); 114 ASSERT(IsClamped(result));
115 return result.raw(); 115 return result.raw();
116 } else { 116 } else {
117 return FromDecimalCString(str); 117 return FromDecimalCString(str, space);
118 } 118 }
119 } 119 }
120 120
121 121
122 intptr_t BigintOperations::ComputeChunkLength(const char* hex_string) { 122 intptr_t BigintOperations::ComputeChunkLength(const char* hex_string) {
123 ASSERT(kDigitBitSize % 4 == 0); 123 ASSERT(kDigitBitSize % 4 == 0);
124 intptr_t hex_length = strlen(hex_string); 124 intptr_t hex_length = strlen(hex_string);
125 // Round up. 125 // Round up.
126 intptr_t bigint_length = ((hex_length - 1) / kHexCharsPerDigit) + 1; 126 intptr_t bigint_length = ((hex_length - 1) / kHexCharsPerDigit) + 1;
127 return bigint_length; 127 return bigint_length;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 162
163 // Read first digit separately. This avoids a multiplication and addition. 163 // Read first digit separately. This avoids a multiplication and addition.
164 // The first digit might also not have kDigitsPerIteration decimal digits. 164 // The first digit might also not have kDigitsPerIteration decimal digits.
165 int first_digit_decimal_digits = str_length % kDigitsPerIteration; 165 int first_digit_decimal_digits = str_length % kDigitsPerIteration;
166 Chunk digit = 0; 166 Chunk digit = 0;
167 for (intptr_t i = 0; i < first_digit_decimal_digits; i++) { 167 for (intptr_t i = 0; i < first_digit_decimal_digits; i++) {
168 char c = str[str_pos++]; 168 char c = str[str_pos++];
169 ASSERT(('0' <= c) && (c <= '9')); 169 ASSERT(('0' <= c) && (c <= '9'));
170 digit = digit * 10 + c - '0'; 170 digit = digit * 10 + c - '0';
171 } 171 }
172 Bigint& result = Bigint::Handle(Bigint::Allocate(1, space)); 172 Bigint& result = Bigint::Handle(Bigint::Allocate(1));
173 result.SetChunkAt(0, digit); 173 result.SetChunkAt(0, digit);
174 Clamp(result); // Multiplication requires the inputs to be clamped. 174 Clamp(result); // Multiplication requires the inputs to be clamped.
175 175
176 // Read kDigitsPerIteration at a time, and store it in 'increment'. 176 // Read kDigitsPerIteration at a time, and store it in 'increment'.
177 // Then multiply the temporary result by 10^kDigitsPerIteration and add 177 // Then multiply the temporary result by 10^kDigitsPerIteration and add
178 // 'increment' to the new result. 178 // 'increment' to the new result.
179 const Bigint& increment = Bigint::Handle(Bigint::Allocate(1, space)); 179 const Bigint& increment = Bigint::Handle(Bigint::Allocate(1));
180 while (str_pos < str_length - 1) { 180 while (str_pos < str_length - 1) {
181 Chunk digit = 0; 181 Chunk digit = 0;
182 for (intptr_t i = 0; i < kDigitsPerIteration; i++) { 182 for (intptr_t i = 0; i < kDigitsPerIteration; i++) {
183 char c = str[str_pos++]; 183 char c = str[str_pos++];
184 ASSERT(('0' <= c) && (c <= '9')); 184 ASSERT(('0' <= c) && (c <= '9'));
185 digit = digit * 10 + c - '0'; 185 digit = digit * 10 + c - '0';
186 } 186 }
187 result ^= MultiplyWithDigit(result, kTenMultiplier); 187 result ^= MultiplyWithDigit(result, kTenMultiplier);
188 if (digit != 0) { 188 if (digit != 0) {
189 increment.SetChunkAt(0, digit); 189 increment.SetChunkAt(0, digit);
190 result ^= Add(result, increment); 190 result ^= Add(result, increment);
191 } 191 }
192 } 192 }
193 Clamp(result); 193 Clamp(result);
194 if ((space == Heap::kOld) && !result.IsOld()) {
195 result ^= Object::Clone(result, Heap::kOld);
196 }
194 return result.raw(); 197 return result.raw();
195 } 198 }
196 199
197 200
198 RawBigint* BigintOperations::NewFromDouble(double d, Heap::Space space) { 201 RawBigint* BigintOperations::NewFromDouble(double d, Heap::Space space) {
199 if ((-1.0 < d) && (d < 1.0)) { 202 if ((-1.0 < d) && (d < 1.0)) {
200 // Shortcut for small numbers. Also makes the right-shift below 203 // Shortcut for small numbers. Also makes the right-shift below
201 // well specified. 204 // well specified.
202 Smi& zero = Smi::Handle(Smi::New(0)); 205 Smi& zero = Smi::Handle(Smi::New(0));
203 return NewFromSmi(zero, space); 206 return NewFromSmi(zero, space);
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 int BigintOperations::CountBits(Chunk digit) { 1648 int BigintOperations::CountBits(Chunk digit) {
1646 int result = 0; 1649 int result = 0;
1647 while (digit != 0) { 1650 while (digit != 0) {
1648 digit >>= 1; 1651 digit >>= 1;
1649 result++; 1652 result++;
1650 } 1653 }
1651 return result; 1654 return result;
1652 } 1655 }
1653 1656
1654 } // namespace dart 1657 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/ast.h ('k') | runtime/vm/code_generator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698