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

Unified Diff: src/json-parser.h

Issue 7230006: Inctroduce NewStrictSubstring to avoid check for SubString(str, 0, str.length... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/json.js ('k') | src/runtime.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/json-parser.h
===================================================================
--- src/json-parser.h (revision 8350)
+++ src/json-parser.h (working copy)
@@ -109,7 +109,7 @@
Handle<String> ScanJsonString();
// Slow version for unicode support, uses the first ascii_count characters,
// as first part of a ConsString
- Handle<String> SlowScanJsonString();
+ Handle<String> SlowScanJsonString(int beg_pos);
// A JSON number (production JSONNumber) is a subset of the valid JavaScript
// decimal number literals.
@@ -156,15 +156,9 @@
int source_length_;
Handle<SeqAsciiString> seq_source_;
- // begin and end position of scanned string or number
- int beg_pos_;
- int end_pos_;
-
Isolate* isolate_;
uc32 c0_;
int position_;
-
- double number_;
};
template <bool seq_ascii>
@@ -353,7 +347,7 @@
template <bool seq_ascii>
Handle<Object> JsonParser<seq_ascii>::ParseJsonNumber() {
bool negative = false;
- beg_pos_ = position_;
+ int beg_pos = position_;
if (c0_ == '-') {
Advance();
negative = true;
@@ -373,9 +367,8 @@
Advance();
} while (c0_ >= '0' && c0_ <= '9');
if (c0_ != '.' && c0_ != 'e' && c0_ != 'E' && digits < 10) {
- number_ = (negative ? -i : i);
SkipWhitespace();
- return isolate()->factory()->NewNumber(number_);
+ return Handle<Smi>(Smi::FromInt((negative ? -i : i)), isolate());
}
}
if (c0_ == '.') {
@@ -393,35 +386,36 @@
Advance();
} while (c0_ >= '0' && c0_ <= '9');
}
- int length = position_ - beg_pos_;
+ int length = position_ - beg_pos;
+ double number;
if (seq_ascii) {
- Vector<const char> chars(seq_source_->GetChars() + beg_pos_, length);
- number_ = StringToDouble(isolate()->unicode_cache(),
+ Vector<const char> chars(seq_source_->GetChars() + beg_pos, length);
+ number = StringToDouble(isolate()->unicode_cache(),
chars,
NO_FLAGS, // Hex, octal or trailing junk.
OS::nan_value());
} else {
Vector<char> buffer = Vector<char>::New(length);
- String::WriteToFlat(*source_, buffer.start(), beg_pos_, position_);
+ String::WriteToFlat(*source_, buffer.start(), beg_pos, position_);
Vector<const char> result =
Vector<const char>(reinterpret_cast<const char*>(buffer.start()),
length);
- number_ = StringToDouble(isolate()->unicode_cache(),
+ number = StringToDouble(isolate()->unicode_cache(),
result,
NO_FLAGS, // Hex, octal or trailing junk.
0.0);
buffer.Dispose();
}
SkipWhitespace();
- return isolate()->factory()->NewNumber(number_);
+ return isolate()->factory()->NewNumber(number);
}
template <bool seq_ascii>
-Handle<String> JsonParser<seq_ascii>::SlowScanJsonString() {
+Handle<String> JsonParser<seq_ascii>::SlowScanJsonString(int beg_pos) {
// The currently scanned ascii characters.
- Handle<String> ascii(isolate()->factory()->NewSubString(source_,
- beg_pos_,
- position_));
+ Handle<String> ascii(isolate()->factory()->NewStrictSubString(source_,
+ beg_pos,
+ position_));
Handle<String> two_byte =
isolate()->factory()->NewRawTwoByteString(kInitialSpecialStringSize,
NOT_TENURED);
@@ -518,7 +512,7 @@
Handle<String> JsonParser<seq_ascii>::ScanJsonString() {
ASSERT_EQ('"', c0_);
Advance();
- beg_pos_ = position_;
+ int beg_pos = position_;
// Fast case for ascii only without escape characters.
while (c0_ != '"') {
// Check for control character (0x00-0x1f) or unterminated string (<0).
@@ -526,19 +520,21 @@
if (c0_ != '\\' && (seq_ascii || c0_ < kMaxAsciiCharCode)) {
Advance();
} else {
- return this->SlowScanJsonString();
+ return this->SlowScanJsonString(beg_pos);
}
}
ASSERT_EQ('"', c0_);
- end_pos_ = position_;
+ int end_pos = position_;
// Advance past the last '"'.
AdvanceSkipWhitespace();
if (seq_ascii && is_symbol) {
return isolate()->factory()->LookupAsciiSymbol(seq_source_,
- beg_pos_,
- end_pos_ - beg_pos_);
+ beg_pos,
+ end_pos - beg_pos);
} else {
- return isolate()->factory()->NewSubString(source_, beg_pos_, end_pos_);
+ return isolate()->factory()->NewStrictSubString(source_,
+ beg_pos,
+ end_pos);
}
}
« no previous file with comments | « src/json.js ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698