| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index afe370ee5987a894c4dda100fdb5811cc0008e6e..ce2d51c82a77cc9c2f37bad70764bdadb0aa7b21 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -151,6 +151,15 @@ namespace internal {
|
| StrictMode name = static_cast<StrictMode>(args.smi_at(index));
|
|
|
|
|
| +// Assert that the given argument is a number within the Int32 range
|
| +// and convert it to int32_t. If the argument is not an Int32 call
|
| +// IllegalOperation and return.
|
| +#define CONVERT_INT32_ARG_CHECKED(name, index) \
|
| + RUNTIME_ASSERT(args[index]->IsNumber()); \
|
| + int32_t name = 0; \
|
| + RUNTIME_ASSERT(args[index]->ToInt32(&name));
|
| +
|
| +
|
| static Handle<Map> ComputeObjectLiteralMap(
|
| Handle<Context> context,
|
| Handle<FixedArray> constant_properties,
|
| @@ -2501,10 +2510,10 @@ RUNTIME_FUNCTION(Runtime_RegExpExecRT) {
|
| DCHECK(args.length() == 4);
|
| CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
|
| CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
|
| + CONVERT_INT32_ARG_CHECKED(index, 2);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
|
| // Due to the way the JS calls are constructed this must be less than the
|
| // length of a string, i.e. it is always a Smi. We check anyway for security.
|
| - CONVERT_SMI_ARG_CHECKED(index, 2);
|
| - CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
|
| RUNTIME_ASSERT(index >= 0);
|
| RUNTIME_ASSERT(index <= subject->length());
|
| isolate->counters()->regexp_entry_runtime()->Increment();
|
| @@ -6243,7 +6252,7 @@ RUNTIME_FUNCTION(Runtime_StringToNumber) {
|
| RUNTIME_FUNCTION(Runtime_NewString) {
|
| HandleScope scope(isolate);
|
| DCHECK(args.length() == 2);
|
| - CONVERT_SMI_ARG_CHECKED(length, 0);
|
| + CONVERT_INT32_ARG_CHECKED(length, 0);
|
| CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1);
|
| if (length == 0) return isolate->heap()->empty_string();
|
| Handle<String> result;
|
| @@ -6262,7 +6271,7 @@ RUNTIME_FUNCTION(Runtime_TruncateString) {
|
| HandleScope scope(isolate);
|
| DCHECK(args.length() == 2);
|
| CONVERT_ARG_HANDLE_CHECKED(SeqString, string, 0);
|
| - CONVERT_SMI_ARG_CHECKED(new_length, 1);
|
| + CONVERT_INT32_ARG_CHECKED(new_length, 1);
|
| RUNTIME_ASSERT(new_length >= 0);
|
| return *SeqString::Truncate(string, new_length);
|
| }
|
| @@ -8940,8 +8949,8 @@ RUNTIME_FUNCTION(Runtime_Apply) {
|
| CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0);
|
| CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
|
| CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2);
|
| - CONVERT_SMI_ARG_CHECKED(offset, 3);
|
| - CONVERT_SMI_ARG_CHECKED(argc, 4);
|
| + CONVERT_INT32_ARG_CHECKED(offset, 3);
|
| + CONVERT_INT32_ARG_CHECKED(argc, 4);
|
| RUNTIME_ASSERT(offset >= 0);
|
| // Loose upper bound to allow fuzzing. We'll most likely run out of
|
| // stack space before hitting this limit.
|
| @@ -15227,17 +15236,17 @@ RUNTIME_FUNCTION(Runtime_ForInCacheArrayLength) {
|
| RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInNext) {
|
| SealHandleScope scope(isolate);
|
| DCHECK(args.length() == 4);
|
| + int32_t index;
|
| // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs.
|
| // Not worth creating a macro atm as this function should be removed.
|
| if (!args[0]->IsJSReceiver() || !args[1]->IsFixedArray() ||
|
| - !args[2]->IsObject() || !args[3]->IsSmi()) {
|
| + !args[2]->IsObject() || !args[3]->ToInt32(&index)) {
|
| Object* error = isolate->ThrowIllegalOperation();
|
| return MakePair(error, isolate->heap()->undefined_value());
|
| }
|
| Handle<JSReceiver> object = args.at<JSReceiver>(0);
|
| Handle<FixedArray> array = args.at<FixedArray>(1);
|
| Handle<Object> cache_type = args.at<Object>(2);
|
| - int index = args.smi_at(3);
|
| // Figure out first if a slow check is needed for this object.
|
| bool slow_check_needed = false;
|
| if (cache_type->IsMap()) {
|
| @@ -15395,8 +15404,8 @@ RUNTIME_FUNCTION(RuntimeReference_OneByteSeqStringSetChar) {
|
| SealHandleScope shs(isolate);
|
| DCHECK(args.length() == 3);
|
| CONVERT_ARG_CHECKED(SeqOneByteString, string, 0);
|
| - CONVERT_SMI_ARG_CHECKED(index, 1);
|
| - CONVERT_SMI_ARG_CHECKED(value, 2);
|
| + CONVERT_INT32_ARG_CHECKED(index, 1);
|
| + CONVERT_INT32_ARG_CHECKED(value, 2);
|
| string->SeqOneByteStringSet(index, value);
|
| return string;
|
| }
|
| @@ -15406,8 +15415,8 @@ RUNTIME_FUNCTION(RuntimeReference_TwoByteSeqStringSetChar) {
|
| SealHandleScope shs(isolate);
|
| DCHECK(args.length() == 3);
|
| CONVERT_ARG_CHECKED(SeqTwoByteString, string, 0);
|
| - CONVERT_SMI_ARG_CHECKED(index, 1);
|
| - CONVERT_SMI_ARG_CHECKED(value, 2);
|
| + CONVERT_INT32_ARG_CHECKED(index, 1);
|
| + CONVERT_INT32_ARG_CHECKED(value, 2);
|
| string->SeqTwoByteStringSet(index, value);
|
| return string;
|
| }
|
|
|