From 9176485c8bf2c5d1696fedcd621a8363ec10bf33 Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Sat, 28 Jun 2014 00:33:04 +0000 Subject: [PATCH] Support non-internalized string key lookups in Hydrogen KeyedLoadIC R=jkummerow@chromium.org Review URL: https://codereview.chromium.org/356213003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22070 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen.cc | 22 ++++++++++++++++------ src/runtime.cc | 8 ++++++++ src/runtime.h | 1 + test/mjsunit/runtime-gen/internalizestring.js | 5 +++++ tools/generate-runtime-tests.py | 4 ++-- 5 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 test/mjsunit/runtime-gen/internalizestring.js diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 89f61de..1b6cb11 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -1513,13 +1513,23 @@ void HGraphBuilder::BuildKeyedIndexCheck(HValue* key, Token::BIT_AND, instance_type, Add(static_cast(kIsNotInternalizedMask))); - DeoptimizeIf( - not_internalized_bit, - graph()->GetConstant0(), - Token::NE, - "BuildKeyedIndexCheck: string isn't internalized"); - // Key guaranteed to be a unqiue string + + IfBuilder internalized(this); + internalized.If(not_internalized_bit, + graph()->GetConstant0(), + Token::EQ); + internalized.Then(); Push(key); + + internalized.Else(); + Add(key); + HValue* intern_key = Add( + isolate()->factory()->empty_string(), + Runtime::FunctionForId(Runtime::kInternalizeString), 1); + Push(intern_key); + + internalized.End(); + // Key guaranteed to be a unique string } string_index_if.JoinContinuation(join_continuation); } diff --git a/src/runtime.cc b/src/runtime.cc index 31d91be..eba17a1 100644 --- a/src/runtime.cc +++ b/src/runtime.cc @@ -4455,6 +4455,14 @@ RUNTIME_FUNCTION(Runtime_SubString) { } +RUNTIME_FUNCTION(Runtime_InternalizeString) { + HandleScope handles(isolate); + RUNTIME_ASSERT(args.length() == 1); + CONVERT_ARG_HANDLE_CHECKED(String, string, 0); + return *isolate->factory()->InternalizeString(string); +} + + RUNTIME_FUNCTION(Runtime_StringMatch) { HandleScope handles(isolate); ASSERT(args.length() == 3); diff --git a/src/runtime.h b/src/runtime.h index 1bd087b..f01f173 100644 --- a/src/runtime.h +++ b/src/runtime.h @@ -403,6 +403,7 @@ namespace internal { F(RegExpExecRT, 4, 1) \ F(StringAdd, 2, 1) \ F(SubString, 3, 1) \ + F(InternalizeString, 1, 1) \ F(StringCompare, 2, 1) \ F(StringCharCodeAtRT, 2, 1) \ F(GetFromCache, 2, 1) \ diff --git a/test/mjsunit/runtime-gen/internalizestring.js b/test/mjsunit/runtime-gen/internalizestring.js new file mode 100644 index 0000000..7729f56 --- /dev/null +++ b/test/mjsunit/runtime-gen/internalizestring.js @@ -0,0 +1,5 @@ +// Copyright 2014 the V8 project authors. All rights reserved. +// AUTO-GENERATED BY tools/generate-runtime-tests.py, DO NOT MODIFY +// Flags: --allow-natives-syntax --harmony +var _string = "foo"; +%InternalizeString(_string); diff --git a/tools/generate-runtime-tests.py b/tools/generate-runtime-tests.py index 9740b37..52b7dcb 100755 --- a/tools/generate-runtime-tests.py +++ b/tools/generate-runtime-tests.py @@ -47,8 +47,8 @@ EXPAND_MACROS = [ # that the parser doesn't bit-rot. Change the values as needed when you add, # remove or change runtime functions, but make sure we don't lose our ability # to parse them! -EXPECTED_FUNCTION_COUNT = 414 -EXPECTED_FUZZABLE_COUNT = 329 +EXPECTED_FUNCTION_COUNT = 415 +EXPECTED_FUZZABLE_COUNT = 330 EXPECTED_CCTEST_COUNT = 6 EXPECTED_UNKNOWN_COUNT = 4 EXPECTED_BUILTINS_COUNT = 806 -- 2.7.4