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

Side by Side Diff: test/cctest/test-api.cc

Issue 1148653007: Update UTF-8 decoder to detect more special cases. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 5 years, 7 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
« no previous file with comments | « src/unicode.cc ('k') | test/cctest/test-parsing.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 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * 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 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 7108 matching lines...) Expand 10 before | Expand all | Expand 10 after
7119 Local<v8::String> string = 7119 Local<v8::String> string =
7120 Local<v8::String>::Cast(a->Get(i)); 7120 Local<v8::String>::Cast(a->Get(i));
7121 Local<v8::Number> expected_len = 7121 Local<v8::Number> expected_len =
7122 Local<v8::Number>::Cast(alens->Get(i)); 7122 Local<v8::Number>::Cast(alens->Get(i));
7123 int length = GetUtf8Length(string); 7123 int length = GetUtf8Length(string);
7124 CHECK_EQ(static_cast<int>(expected_len->Value()), length); 7124 CHECK_EQ(static_cast<int>(expected_len->Value()), length);
7125 } 7125 }
7126 } 7126 }
7127 7127
7128 7128
7129 static uint16_t StringGet(Handle<String> str, int index) {
7130 i::Handle<i::String> istring =
7131 v8::Utils::OpenHandle(String::Cast(*str));
7132 return istring->Get(index);
7133 }
7134
7135
7136 static void WriteUtf8Helper(
7137 LocalContext& context, // NOLINT
7138 const char* name,
7139 const char* lengths_name,
7140 int len) {
7141 Local<v8::Array> b =
7142 Local<v8::Array>::Cast(context->Global()->Get(v8_str(name)));
7143 Local<v8::Array> alens =
7144 Local<v8::Array>::Cast(context->Global()->Get(v8_str(lengths_name)));
7145 char buffer[1000];
7146 char buffer2[1000];
7147 for (int i = 0; i < len; i++) {
7148 Local<v8::String> string =
7149 Local<v8::String>::Cast(b->Get(i));
7150 Local<v8::Number> expected_len =
7151 Local<v8::Number>::Cast(alens->Get(i));
7152 int utf8_length = static_cast<int>(expected_len->Value());
7153 for (int j = utf8_length + 1; j >= 0; j--) {
7154 memset(reinterpret_cast<void*>(&buffer), 42, sizeof(buffer));
7155 memset(reinterpret_cast<void*>(&buffer2), 42, sizeof(buffer2));
7156 int nchars;
7157 int utf8_written =
7158 string->WriteUtf8(buffer, j, &nchars, String::NO_OPTIONS);
7159 int utf8_written2 =
7160 string->WriteUtf8(buffer2, j, &nchars, String::NO_NULL_TERMINATION);
7161 CHECK_GE(utf8_length + 1, utf8_written);
7162 CHECK_GE(utf8_length, utf8_written2);
7163 for (int k = 0; k < utf8_written2; k++) {
7164 CHECK_EQ(buffer[k], buffer2[k]);
7165 }
7166 CHECK(nchars * 3 >= utf8_written - 1);
7167 CHECK(nchars <= utf8_written);
7168 if (j == utf8_length + 1) {
7169 CHECK_EQ(utf8_written2, utf8_length);
7170 CHECK_EQ(utf8_written2 + 1, utf8_written);
7171 }
7172 CHECK_EQ(buffer[utf8_written], 42);
7173 if (j > utf8_length) {
7174 if (utf8_written != 0) CHECK_EQ(buffer[utf8_written - 1], 0);
7175 if (utf8_written > 1) CHECK_NE(buffer[utf8_written - 2], 42);
7176 Handle<String> roundtrip = v8_str(buffer);
7177 CHECK(roundtrip->Equals(string));
7178 } else {
7179 if (utf8_written != 0) CHECK_NE(buffer[utf8_written - 1], 42);
7180 }
7181 if (utf8_written2 != 0) CHECK_NE(buffer[utf8_written - 1], 42);
7182 if (nchars >= 2) {
7183 uint16_t trail = StringGet(string, nchars - 1);
7184 uint16_t lead = StringGet(string, nchars - 2);
7185 if (((lead & 0xfc00) == 0xd800) &&
7186 ((trail & 0xfc00) == 0xdc00)) {
7187 unsigned u1 = buffer2[utf8_written2 - 4];
7188 unsigned u2 = buffer2[utf8_written2 - 3];
7189 unsigned u3 = buffer2[utf8_written2 - 2];
7190 unsigned u4 = buffer2[utf8_written2 - 1];
7191 CHECK_EQ((u1 & 0xf8), 0xf0u);
7192 CHECK_EQ((u2 & 0xc0), 0x80u);
7193 CHECK_EQ((u3 & 0xc0), 0x80u);
7194 CHECK_EQ((u4 & 0xc0), 0x80u);
7195 uint32_t c = 0x10000 + ((lead & 0x3ff) << 10) + (trail & 0x3ff);
7196 CHECK_EQ((u4 & 0x3f), (c & 0x3f));
7197 CHECK_EQ((u3 & 0x3f), ((c >> 6) & 0x3f));
7198 CHECK_EQ((u2 & 0x3f), ((c >> 12) & 0x3f));
7199 CHECK_EQ((u1 & 0x3), c >> 18);
7200 }
7201 }
7202 }
7203 }
7204 }
7205
7206
7207 THREADED_TEST(Utf16) { 7129 THREADED_TEST(Utf16) {
7208 LocalContext context; 7130 LocalContext context;
7209 v8::HandleScope scope(context->GetIsolate()); 7131 v8::HandleScope scope(context->GetIsolate());
7210 CompileRun( 7132 CompileRun(
7211 "var pad = '01234567890123456789';" 7133 "var pad = '01234567890123456789';"
7212 "var p = [];" 7134 "var p = [];"
7213 "var plens = [20, 3, 3];" 7135 "var plens = [20, 3, 3];"
7214 "p.push('01234567890123456789');" 7136 "p.push('01234567890123456789');"
7215 "var lead = 0xd800;" 7137 "var lead = 0xd800;"
7216 "var trail = 0xdc00;" 7138 "var trail = 0xdc00;"
(...skipping 26 matching lines...) Expand all
7243 " c2.push(newc.substring(1, newc.length - 1));" 7165 " c2.push(newc.substring(1, newc.length - 1));"
7244 " var utf = alens[m] + alens[n];" // And here. 7166 " var utf = alens[m] + alens[n];" // And here.
7245 // The 'n's that start with 0xdc.. are 6-8 7167 // The 'n's that start with 0xdc.. are 6-8
7246 // The 'm's that end with 0xd8.. are 1, 4 and 7 7168 // The 'm's that end with 0xd8.. are 1, 4 and 7
7247 " if ((m % 3) == 1 && n >= 6) utf -= 2;" 7169 " if ((m % 3) == 1 && n >= 6) utf -= 2;"
7248 " a2lens.push(utf);" 7170 " a2lens.push(utf);"
7249 " }" 7171 " }"
7250 "}"); 7172 "}");
7251 Utf16Helper(context, "a", "alens", 9); 7173 Utf16Helper(context, "a", "alens", 9);
7252 Utf16Helper(context, "a2", "a2lens", 81); 7174 Utf16Helper(context, "a2", "a2lens", 81);
7253 WriteUtf8Helper(context, "b", "alens", 9);
7254 WriteUtf8Helper(context, "b2", "a2lens", 81);
7255 WriteUtf8Helper(context, "c2", "a2lens", 81);
7256 } 7175 }
7257 7176
7258 7177
7259 static bool SameSymbol(Handle<String> s1, Handle<String> s2) { 7178 static bool SameSymbol(Handle<String> s1, Handle<String> s2) {
7260 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1)); 7179 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1));
7261 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2)); 7180 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2));
7262 return *is1 == *is2; 7181 return *is1 == *is2;
7263 } 7182 }
7264 7183
7265 static void SameSymbolHelper(v8::Isolate* isolate, const char* a,
7266 const char* b) {
7267 Handle<String> symbol1 =
7268 v8::String::NewFromUtf8(isolate, a, v8::String::kInternalizedString);
7269 Handle<String> symbol2 =
7270 v8::String::NewFromUtf8(isolate, b, v8::String::kInternalizedString);
7271 CHECK(SameSymbol(symbol1, symbol2));
7272 }
7273
7274 7184
7275 THREADED_TEST(Utf16Symbol) { 7185 THREADED_TEST(Utf16Symbol) {
7276 LocalContext context; 7186 LocalContext context;
7277 v8::HandleScope scope(context->GetIsolate()); 7187 v8::HandleScope scope(context->GetIsolate());
7278 7188
7279 Handle<String> symbol1 = v8::String::NewFromUtf8( 7189 Handle<String> symbol1 = v8::String::NewFromUtf8(
7280 context->GetIsolate(), "abc", v8::String::kInternalizedString); 7190 context->GetIsolate(), "abc", v8::String::kInternalizedString);
7281 Handle<String> symbol2 = v8::String::NewFromUtf8( 7191 Handle<String> symbol2 = v8::String::NewFromUtf8(
7282 context->GetIsolate(), "abc", v8::String::kInternalizedString); 7192 context->GetIsolate(), "abc", v8::String::kInternalizedString);
7283 CHECK(SameSymbol(symbol1, symbol2)); 7193 CHECK(SameSymbol(symbol1, symbol2));
7284 7194
7285 SameSymbolHelper(context->GetIsolate(),
7286 "\360\220\220\205", // 4 byte encoding.
7287 "\355\240\201\355\260\205"); // 2 3-byte surrogates.
7288 SameSymbolHelper(context->GetIsolate(),
7289 "\355\240\201\355\260\206", // 2 3-byte surrogates.
7290 "\360\220\220\206"); // 4 byte encoding.
7291 SameSymbolHelper(context->GetIsolate(),
7292 "x\360\220\220\205", // 4 byte encoding.
7293 "x\355\240\201\355\260\205"); // 2 3-byte surrogates.
7294 SameSymbolHelper(context->GetIsolate(),
7295 "x\355\240\201\355\260\206", // 2 3-byte surrogates.
7296 "x\360\220\220\206"); // 4 byte encoding.
7297 CompileRun( 7195 CompileRun(
7298 "var sym0 = 'benedictus';" 7196 "var sym0 = 'benedictus';"
7299 "var sym0b = 'S\303\270ren';" 7197 "var sym0b = 'S\303\270ren';"
7300 "var sym1 = '\355\240\201\355\260\207';" 7198 "var sym1 = '\355\240\201\355\260\207';"
7301 "var sym2 = '\360\220\220\210';" 7199 "var sym2 = '\360\220\220\210';"
7302 "var sym3 = 'x\355\240\201\355\260\207';" 7200 "var sym3 = 'x\355\240\201\355\260\207';"
7303 "var sym4 = 'x\360\220\220\210';" 7201 "var sym4 = 'x\360\220\220\210';"
7304 "if (sym1.length != 2) throw sym1;" 7202 "if (sym1.length != 2) throw sym1;"
7305 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);" 7203 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);"
7306 "if (sym2.length != 2) throw sym2;" 7204 "if (sym2.length != 2) throw sym2;"
(...skipping 13729 matching lines...) Expand 10 before | Expand all | Expand 10 after
21036 // add the testExtraShouldReturnFive export 20934 // add the testExtraShouldReturnFive export
21037 v8::Local<v8::Object> exports = env->GetExtrasExportsObject(); 20935 v8::Local<v8::Object> exports = env->GetExtrasExportsObject();
21038 20936
21039 auto func = 20937 auto func =
21040 exports->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>(); 20938 exports->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>();
21041 auto undefined = v8::Undefined(isolate); 20939 auto undefined = v8::Undefined(isolate);
21042 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); 20940 auto result = func->Call(undefined, 0, {}).As<v8::Number>();
21043 20941
21044 CHECK(result->Value() == 5.0); 20942 CHECK(result->Value() == 5.0);
21045 } 20943 }
OLDNEW
« no previous file with comments | « src/unicode.cc ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698