| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <sstream> | 10 #include <sstream> |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 Handle<Object> object) { | 132 Handle<Object> object) { |
| 133 if (object->IsJSReceiver()) return Handle<JSReceiver>::cast(object); | 133 if (object->IsJSReceiver()) return Handle<JSReceiver>::cast(object); |
| 134 if (*object == isolate->heap()->null_value() || | 134 if (*object == isolate->heap()->null_value() || |
| 135 object->IsUndefined(isolate)) { | 135 object->IsUndefined(isolate)) { |
| 136 return isolate->global_proxy(); | 136 return isolate->global_proxy(); |
| 137 } | 137 } |
| 138 return Object::ToObject(isolate, object); | 138 return Object::ToObject(isolate, object); |
| 139 } | 139 } |
| 140 | 140 |
| 141 // static | 141 // static |
| 142 MaybeHandle<Object> Object::ToNumber(Handle<Object> input) { | 142 MaybeHandle<Object> Object::ConvertToNumber(Isolate* isolate, |
| 143 Handle<Object> input) { |
| 143 while (true) { | 144 while (true) { |
| 144 if (input->IsNumber()) { | 145 if (input->IsNumber()) { |
| 145 return input; | 146 return input; |
| 146 } | 147 } |
| 147 if (input->IsString()) { | 148 if (input->IsString()) { |
| 148 return String::ToNumber(Handle<String>::cast(input)); | 149 return String::ToNumber(Handle<String>::cast(input)); |
| 149 } | 150 } |
| 150 if (input->IsOddball()) { | 151 if (input->IsOddball()) { |
| 151 return Oddball::ToNumber(Handle<Oddball>::cast(input)); | 152 return Oddball::ToNumber(Handle<Oddball>::cast(input)); |
| 152 } | 153 } |
| 153 Isolate* const isolate = Handle<HeapObject>::cast(input)->GetIsolate(); | |
| 154 if (input->IsSymbol()) { | 154 if (input->IsSymbol()) { |
| 155 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber), | 155 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber), |
| 156 Object); | 156 Object); |
| 157 } | 157 } |
| 158 if (input->IsSimd128Value()) { | 158 if (input->IsSimd128Value()) { |
| 159 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSimdToNumber), | 159 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSimdToNumber), |
| 160 Object); | 160 Object); |
| 161 } | 161 } |
| 162 ASSIGN_RETURN_ON_EXCEPTION( | 162 ASSIGN_RETURN_ON_EXCEPTION( |
| 163 isolate, input, JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(input), | 163 isolate, input, JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(input), |
| 164 ToPrimitiveHint::kNumber), | 164 ToPrimitiveHint::kNumber), |
| 165 Object); | 165 Object); |
| 166 } | 166 } |
| 167 } | 167 } |
| 168 | 168 |
| 169 | |
| 170 // static | 169 // static |
| 171 MaybeHandle<Object> Object::ToInteger(Isolate* isolate, Handle<Object> input) { | 170 MaybeHandle<Object> Object::ConvertToInteger(Isolate* isolate, |
| 172 ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); | 171 Handle<Object> input) { |
| 172 ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ConvertToNumber(isolate, input), |
| 173 Object); |
| 174 if (input->IsSmi()) return input; |
| 173 return isolate->factory()->NewNumber(DoubleToInteger(input->Number())); | 175 return isolate->factory()->NewNumber(DoubleToInteger(input->Number())); |
| 174 } | 176 } |
| 175 | 177 |
| 176 | |
| 177 // static | 178 // static |
| 178 MaybeHandle<Object> Object::ToInt32(Isolate* isolate, Handle<Object> input) { | 179 MaybeHandle<Object> Object::ConvertToInt32(Isolate* isolate, |
| 179 ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); | 180 Handle<Object> input) { |
| 181 ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ConvertToNumber(isolate, input), |
| 182 Object); |
| 183 if (input->IsSmi()) return input; |
| 180 return isolate->factory()->NewNumberFromInt(DoubleToInt32(input->Number())); | 184 return isolate->factory()->NewNumberFromInt(DoubleToInt32(input->Number())); |
| 181 } | 185 } |
| 182 | 186 |
| 183 | |
| 184 // static | 187 // static |
| 185 MaybeHandle<Object> Object::ToUint32(Isolate* isolate, Handle<Object> input) { | 188 MaybeHandle<Object> Object::ConvertToUint32(Isolate* isolate, |
| 186 ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ToNumber(input), Object); | 189 Handle<Object> input) { |
| 190 ASSIGN_RETURN_ON_EXCEPTION(isolate, input, ConvertToNumber(isolate, input), |
| 191 Object); |
| 192 if (input->IsSmi()) return handle(Smi::cast(*input)->ToUint32Smi(), isolate); |
| 187 return isolate->factory()->NewNumberFromUint(DoubleToUint32(input->Number())); | 193 return isolate->factory()->NewNumberFromUint(DoubleToUint32(input->Number())); |
| 188 } | 194 } |
| 189 | 195 |
| 190 | |
| 191 // static | 196 // static |
| 192 MaybeHandle<Name> Object::ConvertToName(Isolate* isolate, | 197 MaybeHandle<Name> Object::ConvertToName(Isolate* isolate, |
| 193 Handle<Object> input) { | 198 Handle<Object> input) { |
| 194 ASSIGN_RETURN_ON_EXCEPTION( | 199 ASSIGN_RETURN_ON_EXCEPTION( |
| 195 isolate, input, Object::ToPrimitive(input, ToPrimitiveHint::kString), | 200 isolate, input, Object::ToPrimitive(input, ToPrimitiveHint::kString), |
| 196 Name); | 201 Name); |
| 197 if (input->IsName()) return Handle<Name>::cast(input); | 202 if (input->IsName()) return Handle<Name>::cast(input); |
| 198 return ToString(isolate, input); | 203 return ToString(isolate, input); |
| 199 } | 204 } |
| 200 | 205 |
| 201 // static | 206 // static |
| 202 MaybeHandle<String> Object::ToString(Isolate* isolate, Handle<Object> input) { | 207 MaybeHandle<String> Object::ConvertToString(Isolate* isolate, |
| 208 Handle<Object> input) { |
| 203 while (true) { | 209 while (true) { |
| 204 if (input->IsString()) { | |
| 205 return Handle<String>::cast(input); | |
| 206 } | |
| 207 if (input->IsOddball()) { | 210 if (input->IsOddball()) { |
| 208 return handle(Handle<Oddball>::cast(input)->to_string(), isolate); | 211 return handle(Handle<Oddball>::cast(input)->to_string(), isolate); |
| 209 } | 212 } |
| 210 if (input->IsNumber()) { | 213 if (input->IsNumber()) { |
| 211 return isolate->factory()->NumberToString(input); | 214 return isolate->factory()->NumberToString(input); |
| 212 } | 215 } |
| 213 if (input->IsSymbol()) { | 216 if (input->IsSymbol()) { |
| 214 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToString), | 217 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToString), |
| 215 String); | 218 String); |
| 216 } | 219 } |
| 217 if (input->IsSimd128Value()) { | 220 if (input->IsSimd128Value()) { |
| 218 return Simd128Value::ToString(Handle<Simd128Value>::cast(input)); | 221 return Simd128Value::ToString(Handle<Simd128Value>::cast(input)); |
| 219 } | 222 } |
| 220 ASSIGN_RETURN_ON_EXCEPTION( | 223 ASSIGN_RETURN_ON_EXCEPTION( |
| 221 isolate, input, JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(input), | 224 isolate, input, JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(input), |
| 222 ToPrimitiveHint::kString), | 225 ToPrimitiveHint::kString), |
| 223 String); | 226 String); |
| 227 // The previous isString() check happened in Object::ToString and thus we |
| 228 // put it at the end of the loop in this helper. |
| 229 if (input->IsString()) { |
| 230 return Handle<String>::cast(input); |
| 231 } |
| 224 } | 232 } |
| 225 } | 233 } |
| 226 | 234 |
| 227 namespace { | 235 namespace { |
| 228 | 236 |
| 229 bool IsErrorObject(Isolate* isolate, Handle<Object> object) { | 237 bool IsErrorObject(Isolate* isolate, Handle<Object> object) { |
| 230 if (!object->IsJSReceiver()) return false; | 238 if (!object->IsJSReceiver()) return false; |
| 231 Handle<Symbol> symbol = isolate->factory()->stack_trace_symbol(); | 239 Handle<Symbol> symbol = isolate->factory()->stack_trace_symbol(); |
| 232 return JSReceiver::HasOwnProperty(Handle<JSReceiver>::cast(object), symbol) | 240 return JSReceiver::HasOwnProperty(Handle<JSReceiver>::cast(object), symbol) |
| 233 .FromMaybe(false); | 241 .FromMaybe(false); |
| (...skipping 20177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20411 // depend on this. | 20419 // depend on this. |
| 20412 return DICTIONARY_ELEMENTS; | 20420 return DICTIONARY_ELEMENTS; |
| 20413 } | 20421 } |
| 20414 DCHECK_LE(kind, LAST_ELEMENTS_KIND); | 20422 DCHECK_LE(kind, LAST_ELEMENTS_KIND); |
| 20415 return kind; | 20423 return kind; |
| 20416 } | 20424 } |
| 20417 } | 20425 } |
| 20418 | 20426 |
| 20419 } // namespace internal | 20427 } // namespace internal |
| 20420 } // namespace v8 | 20428 } // namespace v8 |
| OLD | NEW |