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

Side by Side Diff: src/runtime.cc

Issue 551363002: Allow some runtime functions to accept Int32s instead of Smis. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix typo. Created 6 years, 3 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 | « no previous file | test/mjsunit/new-string-add.js » ('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 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdlib.h> 5 #include <stdlib.h>
6 #include <limits> 6 #include <limits>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 144
145 // Assert that the given argument has a valid value for a StrictMode 145 // Assert that the given argument has a valid value for a StrictMode
146 // and store it in a StrictMode variable with the given name. 146 // and store it in a StrictMode variable with the given name.
147 #define CONVERT_STRICT_MODE_ARG_CHECKED(name, index) \ 147 #define CONVERT_STRICT_MODE_ARG_CHECKED(name, index) \
148 RUNTIME_ASSERT(args[index]->IsSmi()); \ 148 RUNTIME_ASSERT(args[index]->IsSmi()); \
149 RUNTIME_ASSERT(args.smi_at(index) == STRICT || \ 149 RUNTIME_ASSERT(args.smi_at(index) == STRICT || \
150 args.smi_at(index) == SLOPPY); \ 150 args.smi_at(index) == SLOPPY); \
151 StrictMode name = static_cast<StrictMode>(args.smi_at(index)); 151 StrictMode name = static_cast<StrictMode>(args.smi_at(index));
152 152
153 153
154 // Assert that the given argument is a number within the Int32 range
155 // and convert it to int32_t. If the argument is not an Int32 call
156 // IllegalOperation and return.
157 #define CONVERT_INT32_ARG_CHECKED(name, index) \
158 RUNTIME_ASSERT(args[index]->IsNumber()); \
159 int32_t name = 0; \
160 RUNTIME_ASSERT(args[index]->ToInt32(&name));
161
162
154 static Handle<Map> ComputeObjectLiteralMap( 163 static Handle<Map> ComputeObjectLiteralMap(
155 Handle<Context> context, 164 Handle<Context> context,
156 Handle<FixedArray> constant_properties, 165 Handle<FixedArray> constant_properties,
157 bool* is_result_from_cache) { 166 bool* is_result_from_cache) {
158 Isolate* isolate = context->GetIsolate(); 167 Isolate* isolate = context->GetIsolate();
159 int properties_length = constant_properties->length(); 168 int properties_length = constant_properties->length();
160 int number_of_properties = properties_length / 2; 169 int number_of_properties = properties_length / 2;
161 // Check that there are only internal strings and array indices among keys. 170 // Check that there are only internal strings and array indices among keys.
162 int number_of_string_keys = 0; 171 int number_of_string_keys = 0;
163 for (int p = 0; p != properties_length; p += 2) { 172 for (int p = 0; p != properties_length; p += 2) {
(...skipping 2330 matching lines...) Expand 10 before | Expand all | Expand 10 after
2494 } 2503 }
2495 return *object; 2504 return *object;
2496 } 2505 }
2497 2506
2498 2507
2499 RUNTIME_FUNCTION(Runtime_RegExpExecRT) { 2508 RUNTIME_FUNCTION(Runtime_RegExpExecRT) {
2500 HandleScope scope(isolate); 2509 HandleScope scope(isolate);
2501 DCHECK(args.length() == 4); 2510 DCHECK(args.length() == 4);
2502 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); 2511 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
2503 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); 2512 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
2513 CONVERT_INT32_ARG_CHECKED(index, 2);
2514 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
2504 // Due to the way the JS calls are constructed this must be less than the 2515 // Due to the way the JS calls are constructed this must be less than the
2505 // length of a string, i.e. it is always a Smi. We check anyway for security. 2516 // length of a string, i.e. it is always a Smi. We check anyway for security.
2506 CONVERT_SMI_ARG_CHECKED(index, 2);
2507 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
2508 RUNTIME_ASSERT(index >= 0); 2517 RUNTIME_ASSERT(index >= 0);
2509 RUNTIME_ASSERT(index <= subject->length()); 2518 RUNTIME_ASSERT(index <= subject->length());
2510 isolate->counters()->regexp_entry_runtime()->Increment(); 2519 isolate->counters()->regexp_entry_runtime()->Increment();
2511 Handle<Object> result; 2520 Handle<Object> result;
2512 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2521 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2513 isolate, result, 2522 isolate, result,
2514 RegExpImpl::Exec(regexp, subject, index, last_match_info)); 2523 RegExpImpl::Exec(regexp, subject, index, last_match_info));
2515 return *result; 2524 return *result;
2516 } 2525 }
2517 2526
(...skipping 3718 matching lines...) Expand 10 before | Expand all | Expand 10 after
6236 } 6245 }
6237 6246
6238 return *isolate->factory()->NewNumber(StringToDouble( 6247 return *isolate->factory()->NewNumber(StringToDouble(
6239 isolate->unicode_cache(), *subject, flags)); 6248 isolate->unicode_cache(), *subject, flags));
6240 } 6249 }
6241 6250
6242 6251
6243 RUNTIME_FUNCTION(Runtime_NewString) { 6252 RUNTIME_FUNCTION(Runtime_NewString) {
6244 HandleScope scope(isolate); 6253 HandleScope scope(isolate);
6245 DCHECK(args.length() == 2); 6254 DCHECK(args.length() == 2);
6246 CONVERT_SMI_ARG_CHECKED(length, 0); 6255 CONVERT_INT32_ARG_CHECKED(length, 0);
6247 CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1); 6256 CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1);
6248 if (length == 0) return isolate->heap()->empty_string(); 6257 if (length == 0) return isolate->heap()->empty_string();
6249 Handle<String> result; 6258 Handle<String> result;
6250 if (is_one_byte) { 6259 if (is_one_byte) {
6251 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6260 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6252 isolate, result, isolate->factory()->NewRawOneByteString(length)); 6261 isolate, result, isolate->factory()->NewRawOneByteString(length));
6253 } else { 6262 } else {
6254 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6263 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6255 isolate, result, isolate->factory()->NewRawTwoByteString(length)); 6264 isolate, result, isolate->factory()->NewRawTwoByteString(length));
6256 } 6265 }
6257 return *result; 6266 return *result;
6258 } 6267 }
6259 6268
6260 6269
6261 RUNTIME_FUNCTION(Runtime_TruncateString) { 6270 RUNTIME_FUNCTION(Runtime_TruncateString) {
6262 HandleScope scope(isolate); 6271 HandleScope scope(isolate);
6263 DCHECK(args.length() == 2); 6272 DCHECK(args.length() == 2);
6264 CONVERT_ARG_HANDLE_CHECKED(SeqString, string, 0); 6273 CONVERT_ARG_HANDLE_CHECKED(SeqString, string, 0);
6265 CONVERT_SMI_ARG_CHECKED(new_length, 1); 6274 CONVERT_INT32_ARG_CHECKED(new_length, 1);
6266 RUNTIME_ASSERT(new_length >= 0); 6275 RUNTIME_ASSERT(new_length >= 0);
6267 return *SeqString::Truncate(string, new_length); 6276 return *SeqString::Truncate(string, new_length);
6268 } 6277 }
6269 6278
6270 6279
6271 RUNTIME_FUNCTION(Runtime_URIEscape) { 6280 RUNTIME_FUNCTION(Runtime_URIEscape) {
6272 HandleScope scope(isolate); 6281 HandleScope scope(isolate);
6273 DCHECK(args.length() == 1); 6282 DCHECK(args.length() == 1);
6274 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); 6283 CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
6275 Handle<String> string = String::Flatten(source); 6284 Handle<String> string = String::Flatten(source);
(...skipping 2657 matching lines...) Expand 10 before | Expand all | Expand 10 after
8933 return *result; 8942 return *result;
8934 } 8943 }
8935 8944
8936 8945
8937 RUNTIME_FUNCTION(Runtime_Apply) { 8946 RUNTIME_FUNCTION(Runtime_Apply) {
8938 HandleScope scope(isolate); 8947 HandleScope scope(isolate);
8939 DCHECK(args.length() == 5); 8948 DCHECK(args.length() == 5);
8940 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0); 8949 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0);
8941 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1); 8950 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
8942 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2); 8951 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2);
8943 CONVERT_SMI_ARG_CHECKED(offset, 3); 8952 CONVERT_INT32_ARG_CHECKED(offset, 3);
8944 CONVERT_SMI_ARG_CHECKED(argc, 4); 8953 CONVERT_INT32_ARG_CHECKED(argc, 4);
8945 RUNTIME_ASSERT(offset >= 0); 8954 RUNTIME_ASSERT(offset >= 0);
8946 // Loose upper bound to allow fuzzing. We'll most likely run out of 8955 // Loose upper bound to allow fuzzing. We'll most likely run out of
8947 // stack space before hitting this limit. 8956 // stack space before hitting this limit.
8948 static int kMaxArgc = 1000000; 8957 static int kMaxArgc = 1000000;
8949 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc); 8958 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc);
8950 8959
8951 // If there are too many arguments, allocate argv via malloc. 8960 // If there are too many arguments, allocate argv via malloc.
8952 const int argv_small_size = 10; 8961 const int argv_small_size = 10;
8953 Handle<Object> argv_small_buffer[argv_small_size]; 8962 Handle<Object> argv_small_buffer[argv_small_size];
8954 SmartArrayPointer<Handle<Object> > argv_large_buffer; 8963 SmartArrayPointer<Handle<Object> > argv_large_buffer;
(...skipping 6265 matching lines...) Expand 10 before | Expand all | Expand 10 after
15220 15229
15221 // TODO(dcarney): remove this function when TurboFan supports it. 15230 // TODO(dcarney): remove this function when TurboFan supports it.
15222 // Takes (the object to be iterated over, 15231 // Takes (the object to be iterated over,
15223 // cache_array from ForInInit, 15232 // cache_array from ForInInit,
15224 // cache_type from ForInInit, 15233 // cache_type from ForInInit,
15225 // the current index) 15234 // the current index)
15226 // Returns pair (array[index], needs_filtering). 15235 // Returns pair (array[index], needs_filtering).
15227 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInNext) { 15236 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInNext) {
15228 SealHandleScope scope(isolate); 15237 SealHandleScope scope(isolate);
15229 DCHECK(args.length() == 4); 15238 DCHECK(args.length() == 4);
15239 int32_t index;
15230 // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs. 15240 // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs.
15231 // Not worth creating a macro atm as this function should be removed. 15241 // Not worth creating a macro atm as this function should be removed.
15232 if (!args[0]->IsJSReceiver() || !args[1]->IsFixedArray() || 15242 if (!args[0]->IsJSReceiver() || !args[1]->IsFixedArray() ||
15233 !args[2]->IsObject() || !args[3]->IsSmi()) { 15243 !args[2]->IsObject() || !args[3]->ToInt32(&index)) {
15234 Object* error = isolate->ThrowIllegalOperation(); 15244 Object* error = isolate->ThrowIllegalOperation();
15235 return MakePair(error, isolate->heap()->undefined_value()); 15245 return MakePair(error, isolate->heap()->undefined_value());
15236 } 15246 }
15237 Handle<JSReceiver> object = args.at<JSReceiver>(0); 15247 Handle<JSReceiver> object = args.at<JSReceiver>(0);
15238 Handle<FixedArray> array = args.at<FixedArray>(1); 15248 Handle<FixedArray> array = args.at<FixedArray>(1);
15239 Handle<Object> cache_type = args.at<Object>(2); 15249 Handle<Object> cache_type = args.at<Object>(2);
15240 int index = args.smi_at(3);
15241 // Figure out first if a slow check is needed for this object. 15250 // Figure out first if a slow check is needed for this object.
15242 bool slow_check_needed = false; 15251 bool slow_check_needed = false;
15243 if (cache_type->IsMap()) { 15252 if (cache_type->IsMap()) {
15244 if (object->map() != Map::cast(*cache_type)) { 15253 if (object->map() != Map::cast(*cache_type)) {
15245 // Object transitioned. Need slow check. 15254 // Object transitioned. Need slow check.
15246 slow_check_needed = true; 15255 slow_check_needed = true;
15247 } 15256 }
15248 } else { 15257 } else {
15249 // No slow check needed for proxies. 15258 // No slow check needed for proxies.
15250 slow_check_needed = Smi::cast(*cache_type)->value() == 1; 15259 slow_check_needed = Smi::cast(*cache_type)->value() == 1;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
15388 Object* code = __RT_impl_Runtime_StringCharCodeAtRT(args, isolate); 15397 Object* code = __RT_impl_Runtime_StringCharCodeAtRT(args, isolate);
15389 if (code->IsNaN()) return isolate->heap()->empty_string(); 15398 if (code->IsNaN()) return isolate->heap()->empty_string();
15390 return __RT_impl_Runtime_CharFromCode(Arguments(1, &code), isolate); 15399 return __RT_impl_Runtime_CharFromCode(Arguments(1, &code), isolate);
15391 } 15400 }
15392 15401
15393 15402
15394 RUNTIME_FUNCTION(RuntimeReference_OneByteSeqStringSetChar) { 15403 RUNTIME_FUNCTION(RuntimeReference_OneByteSeqStringSetChar) {
15395 SealHandleScope shs(isolate); 15404 SealHandleScope shs(isolate);
15396 DCHECK(args.length() == 3); 15405 DCHECK(args.length() == 3);
15397 CONVERT_ARG_CHECKED(SeqOneByteString, string, 0); 15406 CONVERT_ARG_CHECKED(SeqOneByteString, string, 0);
15398 CONVERT_SMI_ARG_CHECKED(index, 1); 15407 CONVERT_INT32_ARG_CHECKED(index, 1);
15399 CONVERT_SMI_ARG_CHECKED(value, 2); 15408 CONVERT_INT32_ARG_CHECKED(value, 2);
15400 string->SeqOneByteStringSet(index, value); 15409 string->SeqOneByteStringSet(index, value);
15401 return string; 15410 return string;
15402 } 15411 }
15403 15412
15404 15413
15405 RUNTIME_FUNCTION(RuntimeReference_TwoByteSeqStringSetChar) { 15414 RUNTIME_FUNCTION(RuntimeReference_TwoByteSeqStringSetChar) {
15406 SealHandleScope shs(isolate); 15415 SealHandleScope shs(isolate);
15407 DCHECK(args.length() == 3); 15416 DCHECK(args.length() == 3);
15408 CONVERT_ARG_CHECKED(SeqTwoByteString, string, 0); 15417 CONVERT_ARG_CHECKED(SeqTwoByteString, string, 0);
15409 CONVERT_SMI_ARG_CHECKED(index, 1); 15418 CONVERT_INT32_ARG_CHECKED(index, 1);
15410 CONVERT_SMI_ARG_CHECKED(value, 2); 15419 CONVERT_INT32_ARG_CHECKED(value, 2);
15411 string->SeqTwoByteStringSet(index, value); 15420 string->SeqTwoByteStringSet(index, value);
15412 return string; 15421 return string;
15413 } 15422 }
15414 15423
15415 15424
15416 RUNTIME_FUNCTION(RuntimeReference_ObjectEquals) { 15425 RUNTIME_FUNCTION(RuntimeReference_ObjectEquals) {
15417 SealHandleScope shs(isolate); 15426 SealHandleScope shs(isolate);
15418 DCHECK(args.length() == 2); 15427 DCHECK(args.length() == 2);
15419 CONVERT_ARG_CHECKED(Object, obj1, 0); 15428 CONVERT_ARG_CHECKED(Object, obj1, 0);
15420 CONVERT_ARG_CHECKED(Object, obj2, 1); 15429 CONVERT_ARG_CHECKED(Object, obj2, 1);
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
15657 } 15666 }
15658 return NULL; 15667 return NULL;
15659 } 15668 }
15660 15669
15661 15670
15662 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 15671 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
15663 return &(kIntrinsicFunctions[static_cast<int>(id)]); 15672 return &(kIntrinsicFunctions[static_cast<int>(id)]);
15664 } 15673 }
15665 15674
15666 } } // namespace v8::internal 15675 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/new-string-add.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698