| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/factory.h" | 5 #include "src/factory.h" |
| 6 | 6 |
| 7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.h" |
| 8 #include "src/conversions.h" | 8 #include "src/conversions.h" |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
| (...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: | 359 case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: |
| 360 return short_external_internalized_string_with_one_byte_data_map(); | 360 return short_external_internalized_string_with_one_byte_data_map(); |
| 361 default: return MaybeHandle<Map>(); // No match found. | 361 default: return MaybeHandle<Map>(); // No match found. |
| 362 } | 362 } |
| 363 } | 363 } |
| 364 | 364 |
| 365 | 365 |
| 366 MaybeHandle<SeqOneByteString> Factory::NewRawOneByteString( | 366 MaybeHandle<SeqOneByteString> Factory::NewRawOneByteString( |
| 367 int length, PretenureFlag pretenure) { | 367 int length, PretenureFlag pretenure) { |
| 368 if (length > String::kMaxLength || length < 0) { | 368 if (length > String::kMaxLength || length < 0) { |
| 369 return isolate()->Throw<SeqOneByteString>(NewInvalidStringLengthError()); | 369 THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), SeqOneByteString); |
| 370 } | 370 } |
| 371 CALL_HEAP_FUNCTION( | 371 CALL_HEAP_FUNCTION( |
| 372 isolate(), | 372 isolate(), |
| 373 isolate()->heap()->AllocateRawOneByteString(length, pretenure), | 373 isolate()->heap()->AllocateRawOneByteString(length, pretenure), |
| 374 SeqOneByteString); | 374 SeqOneByteString); |
| 375 } | 375 } |
| 376 | 376 |
| 377 | 377 |
| 378 MaybeHandle<SeqTwoByteString> Factory::NewRawTwoByteString( | 378 MaybeHandle<SeqTwoByteString> Factory::NewRawTwoByteString( |
| 379 int length, PretenureFlag pretenure) { | 379 int length, PretenureFlag pretenure) { |
| 380 if (length > String::kMaxLength || length < 0) { | 380 if (length > String::kMaxLength || length < 0) { |
| 381 return isolate()->Throw<SeqTwoByteString>(NewInvalidStringLengthError()); | 381 THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), SeqTwoByteString); |
| 382 } | 382 } |
| 383 CALL_HEAP_FUNCTION( | 383 CALL_HEAP_FUNCTION( |
| 384 isolate(), | 384 isolate(), |
| 385 isolate()->heap()->AllocateRawTwoByteString(length, pretenure), | 385 isolate()->heap()->AllocateRawTwoByteString(length, pretenure), |
| 386 SeqTwoByteString); | 386 SeqTwoByteString); |
| 387 } | 387 } |
| 388 | 388 |
| 389 | 389 |
| 390 Handle<String> Factory::LookupSingleCharacterStringFromCode(uint32_t code) { | 390 Handle<String> Factory::LookupSingleCharacterStringFromCode(uint32_t code) { |
| 391 if (code <= String::kMaxOneByteCharCodeU) { | 391 if (code <= String::kMaxOneByteCharCodeU) { |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 | 476 |
| 477 if (length == 2) { | 477 if (length == 2) { |
| 478 uint16_t c1 = left->Get(0); | 478 uint16_t c1 = left->Get(0); |
| 479 uint16_t c2 = right->Get(0); | 479 uint16_t c2 = right->Get(0); |
| 480 return MakeOrFindTwoCharacterString(isolate(), c1, c2); | 480 return MakeOrFindTwoCharacterString(isolate(), c1, c2); |
| 481 } | 481 } |
| 482 | 482 |
| 483 // Make sure that an out of memory exception is thrown if the length | 483 // Make sure that an out of memory exception is thrown if the length |
| 484 // of the new cons string is too large. | 484 // of the new cons string is too large. |
| 485 if (length > String::kMaxLength || length < 0) { | 485 if (length > String::kMaxLength || length < 0) { |
| 486 return isolate()->Throw<String>(NewInvalidStringLengthError()); | 486 THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String); |
| 487 } | 487 } |
| 488 | 488 |
| 489 bool left_is_one_byte = left->IsOneByteRepresentation(); | 489 bool left_is_one_byte = left->IsOneByteRepresentation(); |
| 490 bool right_is_one_byte = right->IsOneByteRepresentation(); | 490 bool right_is_one_byte = right->IsOneByteRepresentation(); |
| 491 bool is_one_byte = left_is_one_byte && right_is_one_byte; | 491 bool is_one_byte = left_is_one_byte && right_is_one_byte; |
| 492 bool is_one_byte_data_in_two_byte_string = false; | 492 bool is_one_byte_data_in_two_byte_string = false; |
| 493 if (!is_one_byte) { | 493 if (!is_one_byte) { |
| 494 // At least one of the strings uses two-byte representation so we | 494 // At least one of the strings uses two-byte representation so we |
| 495 // can't use the fast case code for short ASCII strings below, but | 495 // can't use the fast case code for short ASCII strings below, but |
| 496 // we can try to save memory if all chars actually fit in ASCII. | 496 // we can try to save memory if all chars actually fit in ASCII. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 slice->set_parent(*str); | 609 slice->set_parent(*str); |
| 610 slice->set_offset(offset); | 610 slice->set_offset(offset); |
| 611 return slice; | 611 return slice; |
| 612 } | 612 } |
| 613 | 613 |
| 614 | 614 |
| 615 MaybeHandle<String> Factory::NewExternalStringFromAscii( | 615 MaybeHandle<String> Factory::NewExternalStringFromAscii( |
| 616 const ExternalAsciiString::Resource* resource) { | 616 const ExternalAsciiString::Resource* resource) { |
| 617 size_t length = resource->length(); | 617 size_t length = resource->length(); |
| 618 if (length > static_cast<size_t>(String::kMaxLength)) { | 618 if (length > static_cast<size_t>(String::kMaxLength)) { |
| 619 return isolate()->Throw<String>(NewInvalidStringLengthError()); | 619 THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String); |
| 620 } | 620 } |
| 621 | 621 |
| 622 Handle<Map> map = external_ascii_string_map(); | 622 Handle<Map> map = external_ascii_string_map(); |
| 623 Handle<ExternalAsciiString> external_string = | 623 Handle<ExternalAsciiString> external_string = |
| 624 New<ExternalAsciiString>(map, NEW_SPACE); | 624 New<ExternalAsciiString>(map, NEW_SPACE); |
| 625 external_string->set_length(static_cast<int>(length)); | 625 external_string->set_length(static_cast<int>(length)); |
| 626 external_string->set_hash_field(String::kEmptyHashField); | 626 external_string->set_hash_field(String::kEmptyHashField); |
| 627 external_string->set_resource(resource); | 627 external_string->set_resource(resource); |
| 628 | 628 |
| 629 return external_string; | 629 return external_string; |
| 630 } | 630 } |
| 631 | 631 |
| 632 | 632 |
| 633 MaybeHandle<String> Factory::NewExternalStringFromTwoByte( | 633 MaybeHandle<String> Factory::NewExternalStringFromTwoByte( |
| 634 const ExternalTwoByteString::Resource* resource) { | 634 const ExternalTwoByteString::Resource* resource) { |
| 635 size_t length = resource->length(); | 635 size_t length = resource->length(); |
| 636 if (length > static_cast<size_t>(String::kMaxLength)) { | 636 if (length > static_cast<size_t>(String::kMaxLength)) { |
| 637 return isolate()->Throw<String>(NewInvalidStringLengthError()); | 637 THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String); |
| 638 } | 638 } |
| 639 | 639 |
| 640 // For small strings we check whether the resource contains only | 640 // For small strings we check whether the resource contains only |
| 641 // one byte characters. If yes, we use a different string map. | 641 // one byte characters. If yes, we use a different string map. |
| 642 static const size_t kOneByteCheckLengthLimit = 32; | 642 static const size_t kOneByteCheckLengthLimit = 32; |
| 643 bool is_one_byte = length <= kOneByteCheckLengthLimit && | 643 bool is_one_byte = length <= kOneByteCheckLengthLimit && |
| 644 String::IsOneByte(resource->data(), static_cast<int>(length)); | 644 String::IsOneByte(resource->data(), static_cast<int>(length)); |
| 645 Handle<Map> map = is_one_byte ? | 645 Handle<Map> map = is_one_byte ? |
| 646 external_string_with_one_byte_data_map() : external_string_map(); | 646 external_string_with_one_byte_data_map() : external_string_map(); |
| 647 Handle<ExternalTwoByteString> external_string = | 647 Handle<ExternalTwoByteString> external_string = |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1043 Handle<HeapNumber> Factory::NewHeapNumber(double value, | 1043 Handle<HeapNumber> Factory::NewHeapNumber(double value, |
| 1044 MutableMode mode, | 1044 MutableMode mode, |
| 1045 PretenureFlag pretenure) { | 1045 PretenureFlag pretenure) { |
| 1046 CALL_HEAP_FUNCTION( | 1046 CALL_HEAP_FUNCTION( |
| 1047 isolate(), | 1047 isolate(), |
| 1048 isolate()->heap()->AllocateHeapNumber(value, mode, pretenure), | 1048 isolate()->heap()->AllocateHeapNumber(value, mode, pretenure), |
| 1049 HeapNumber); | 1049 HeapNumber); |
| 1050 } | 1050 } |
| 1051 | 1051 |
| 1052 | 1052 |
| 1053 Handle<Object> Factory::NewTypeError(const char* message, | 1053 MaybeHandle<Object> Factory::NewTypeError(const char* message, |
| 1054 Vector< Handle<Object> > args) { | 1054 Vector<Handle<Object> > args) { |
| 1055 return NewError("MakeTypeError", message, args); | 1055 return NewError("MakeTypeError", message, args); |
| 1056 } | 1056 } |
| 1057 | 1057 |
| 1058 | 1058 |
| 1059 Handle<Object> Factory::NewTypeError(Handle<String> message) { | 1059 MaybeHandle<Object> Factory::NewTypeError(Handle<String> message) { |
| 1060 return NewError("$TypeError", message); | 1060 return NewError("$TypeError", message); |
| 1061 } | 1061 } |
| 1062 | 1062 |
| 1063 | 1063 |
| 1064 Handle<Object> Factory::NewRangeError(const char* message, | 1064 MaybeHandle<Object> Factory::NewRangeError(const char* message, |
| 1065 Vector< Handle<Object> > args) { | 1065 Vector<Handle<Object> > args) { |
| 1066 return NewError("MakeRangeError", message, args); | 1066 return NewError("MakeRangeError", message, args); |
| 1067 } | 1067 } |
| 1068 | 1068 |
| 1069 | 1069 |
| 1070 Handle<Object> Factory::NewRangeError(Handle<String> message) { | 1070 MaybeHandle<Object> Factory::NewRangeError(Handle<String> message) { |
| 1071 return NewError("$RangeError", message); | 1071 return NewError("$RangeError", message); |
| 1072 } | 1072 } |
| 1073 | 1073 |
| 1074 | 1074 |
| 1075 Handle<Object> Factory::NewSyntaxError(const char* message, | 1075 MaybeHandle<Object> Factory::NewSyntaxError(const char* message, |
| 1076 Handle<JSArray> args) { | 1076 Handle<JSArray> args) { |
| 1077 return NewError("MakeSyntaxError", message, args); | 1077 return NewError("MakeSyntaxError", message, args); |
| 1078 } | 1078 } |
| 1079 | 1079 |
| 1080 | 1080 |
| 1081 Handle<Object> Factory::NewSyntaxError(Handle<String> message) { | 1081 MaybeHandle<Object> Factory::NewSyntaxError(Handle<String> message) { |
| 1082 return NewError("$SyntaxError", message); | 1082 return NewError("$SyntaxError", message); |
| 1083 } | 1083 } |
| 1084 | 1084 |
| 1085 | 1085 |
| 1086 Handle<Object> Factory::NewReferenceError(const char* message, | 1086 MaybeHandle<Object> Factory::NewReferenceError(const char* message, |
| 1087 Vector< Handle<Object> > args) { | 1087 Vector<Handle<Object> > args) { |
| 1088 return NewError("MakeReferenceError", message, args); | 1088 return NewError("MakeReferenceError", message, args); |
| 1089 } | 1089 } |
| 1090 | 1090 |
| 1091 | 1091 |
| 1092 Handle<Object> Factory::NewReferenceError(const char* message, | 1092 MaybeHandle<Object> Factory::NewReferenceError(const char* message, |
| 1093 Handle<JSArray> args) { | 1093 Handle<JSArray> args) { |
| 1094 return NewError("MakeReferenceError", message, args); | 1094 return NewError("MakeReferenceError", message, args); |
| 1095 } | 1095 } |
| 1096 | 1096 |
| 1097 | 1097 |
| 1098 Handle<Object> Factory::NewReferenceError(Handle<String> message) { | 1098 MaybeHandle<Object> Factory::NewReferenceError(Handle<String> message) { |
| 1099 return NewError("$ReferenceError", message); | 1099 return NewError("$ReferenceError", message); |
| 1100 } | 1100 } |
| 1101 | 1101 |
| 1102 | 1102 |
| 1103 Handle<Object> Factory::NewError(const char* maker, | 1103 MaybeHandle<Object> Factory::NewError(const char* maker, const char* message, |
| 1104 const char* message, | 1104 Vector<Handle<Object> > args) { |
| 1105 Vector< Handle<Object> > args) { | |
| 1106 // Instantiate a closeable HandleScope for EscapeFrom. | 1105 // Instantiate a closeable HandleScope for EscapeFrom. |
| 1107 v8::EscapableHandleScope scope(reinterpret_cast<v8::Isolate*>(isolate())); | 1106 v8::EscapableHandleScope scope(reinterpret_cast<v8::Isolate*>(isolate())); |
| 1108 Handle<FixedArray> array = NewFixedArray(args.length()); | 1107 Handle<FixedArray> array = NewFixedArray(args.length()); |
| 1109 for (int i = 0; i < args.length(); i++) { | 1108 for (int i = 0; i < args.length(); i++) { |
| 1110 array->set(i, *args[i]); | 1109 array->set(i, *args[i]); |
| 1111 } | 1110 } |
| 1112 Handle<JSArray> object = NewJSArrayWithElements(array); | 1111 Handle<JSArray> object = NewJSArrayWithElements(array); |
| 1113 Handle<Object> result = NewError(maker, message, object); | 1112 Handle<Object> result; |
| 1113 ASSIGN_RETURN_ON_EXCEPTION(isolate(), result, |
| 1114 NewError(maker, message, object), Object); |
| 1114 return result.EscapeFrom(&scope); | 1115 return result.EscapeFrom(&scope); |
| 1115 } | 1116 } |
| 1116 | 1117 |
| 1117 | 1118 |
| 1118 Handle<Object> Factory::NewEvalError(const char* message, | 1119 MaybeHandle<Object> Factory::NewEvalError(const char* message, |
| 1119 Vector< Handle<Object> > args) { | 1120 Vector<Handle<Object> > args) { |
| 1120 return NewError("MakeEvalError", message, args); | 1121 return NewError("MakeEvalError", message, args); |
| 1121 } | 1122 } |
| 1122 | 1123 |
| 1123 | 1124 |
| 1124 Handle<Object> Factory::NewError(const char* message, | 1125 MaybeHandle<Object> Factory::NewError(const char* message, |
| 1125 Vector< Handle<Object> > args) { | 1126 Vector<Handle<Object> > args) { |
| 1126 return NewError("MakeError", message, args); | 1127 return NewError("MakeError", message, args); |
| 1127 } | 1128 } |
| 1128 | 1129 |
| 1129 | 1130 |
| 1130 Handle<String> Factory::EmergencyNewError(const char* message, | 1131 Handle<String> Factory::EmergencyNewError(const char* message, |
| 1131 Handle<JSArray> args) { | 1132 Handle<JSArray> args) { |
| 1132 const int kBufferSize = 1000; | 1133 const int kBufferSize = 1000; |
| 1133 char buffer[kBufferSize]; | 1134 char buffer[kBufferSize]; |
| 1134 size_t space = kBufferSize; | 1135 size_t space = kBufferSize; |
| 1135 char* p = &buffer[0]; | 1136 char* p = &buffer[0]; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1156 } | 1157 } |
| 1157 if (space > 0) { | 1158 if (space > 0) { |
| 1158 *p = '\0'; | 1159 *p = '\0'; |
| 1159 } else { | 1160 } else { |
| 1160 buffer[kBufferSize - 1] = '\0'; | 1161 buffer[kBufferSize - 1] = '\0'; |
| 1161 } | 1162 } |
| 1162 return NewStringFromUtf8(CStrVector(buffer), TENURED).ToHandleChecked(); | 1163 return NewStringFromUtf8(CStrVector(buffer), TENURED).ToHandleChecked(); |
| 1163 } | 1164 } |
| 1164 | 1165 |
| 1165 | 1166 |
| 1166 Handle<Object> Factory::NewError(const char* maker, | 1167 MaybeHandle<Object> Factory::NewError(const char* maker, const char* message, |
| 1167 const char* message, | 1168 Handle<JSArray> args) { |
| 1168 Handle<JSArray> args) { | |
| 1169 Handle<String> make_str = InternalizeUtf8String(maker); | 1169 Handle<String> make_str = InternalizeUtf8String(maker); |
| 1170 Handle<Object> fun_obj = Object::GetProperty( | 1170 Handle<Object> fun_obj = Object::GetProperty( |
| 1171 isolate()->js_builtins_object(), make_str).ToHandleChecked(); | 1171 isolate()->js_builtins_object(), make_str).ToHandleChecked(); |
| 1172 // If the builtins haven't been properly configured yet this error | 1172 // If the builtins haven't been properly configured yet this error |
| 1173 // constructor may not have been defined. Bail out. | 1173 // constructor may not have been defined. Bail out. |
| 1174 if (!fun_obj->IsJSFunction()) { | 1174 if (!fun_obj->IsJSFunction()) { |
| 1175 return EmergencyNewError(message, args); | 1175 return EmergencyNewError(message, args); |
| 1176 } | 1176 } |
| 1177 Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj); | 1177 Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj); |
| 1178 Handle<Object> message_obj = InternalizeUtf8String(message); | 1178 Handle<Object> message_obj = InternalizeUtf8String(message); |
| 1179 Handle<Object> argv[] = { message_obj, args }; | 1179 Handle<Object> argv[] = { message_obj, args }; |
| 1180 | 1180 |
| 1181 // Invoke the JavaScript factory method. If an exception is thrown while | 1181 // Invoke the JavaScript factory method. If an exception is thrown while |
| 1182 // running the factory method, use the exception as the result. | 1182 // running the factory method, use the exception as the result. |
| 1183 Handle<Object> result; | 1183 Handle<Object> result; |
| 1184 Handle<Object> exception; | 1184 MaybeHandle<Object> exception; |
| 1185 if (!Execution::TryCall(fun, | 1185 if (!Execution::TryCall(fun, |
| 1186 isolate()->js_builtins_object(), | 1186 isolate()->js_builtins_object(), |
| 1187 arraysize(argv), | 1187 arraysize(argv), |
| 1188 argv, | 1188 argv, |
| 1189 &exception).ToHandle(&result)) { | 1189 &exception).ToHandle(&result)) { |
| 1190 return exception; | 1190 return exception; |
| 1191 } | 1191 } |
| 1192 return result; | 1192 return result; |
| 1193 } | 1193 } |
| 1194 | 1194 |
| 1195 | 1195 |
| 1196 Handle<Object> Factory::NewError(Handle<String> message) { | 1196 MaybeHandle<Object> Factory::NewError(Handle<String> message) { |
| 1197 return NewError("$Error", message); | 1197 return NewError("$Error", message); |
| 1198 } | 1198 } |
| 1199 | 1199 |
| 1200 | 1200 |
| 1201 Handle<Object> Factory::NewError(const char* constructor, | 1201 MaybeHandle<Object> Factory::NewError(const char* constructor, |
| 1202 Handle<String> message) { | 1202 Handle<String> message) { |
| 1203 Handle<String> constr = InternalizeUtf8String(constructor); | 1203 Handle<String> constr = InternalizeUtf8String(constructor); |
| 1204 Handle<JSFunction> fun = Handle<JSFunction>::cast(Object::GetProperty( | 1204 Handle<JSFunction> fun = Handle<JSFunction>::cast(Object::GetProperty( |
| 1205 isolate()->js_builtins_object(), constr).ToHandleChecked()); | 1205 isolate()->js_builtins_object(), constr).ToHandleChecked()); |
| 1206 Handle<Object> argv[] = { message }; | 1206 Handle<Object> argv[] = { message }; |
| 1207 | 1207 |
| 1208 // Invoke the JavaScript factory method. If an exception is thrown while | 1208 // Invoke the JavaScript factory method. If an exception is thrown while |
| 1209 // running the factory method, use the exception as the result. | 1209 // running the factory method, use the exception as the result. |
| 1210 Handle<Object> result; | 1210 Handle<Object> result; |
| 1211 Handle<Object> exception; | 1211 MaybeHandle<Object> exception; |
| 1212 if (!Execution::TryCall(fun, | 1212 if (!Execution::TryCall(fun, |
| 1213 isolate()->js_builtins_object(), | 1213 isolate()->js_builtins_object(), |
| 1214 arraysize(argv), | 1214 arraysize(argv), |
| 1215 argv, | 1215 argv, |
| 1216 &exception).ToHandle(&result)) { | 1216 &exception).ToHandle(&result)) { |
| 1217 return exception; | 1217 return exception; |
| 1218 } | 1218 } |
| 1219 return result; | 1219 return result; |
| 1220 } | 1220 } |
| 1221 | 1221 |
| (...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2385 return Handle<Object>::null(); | 2385 return Handle<Object>::null(); |
| 2386 } | 2386 } |
| 2387 | 2387 |
| 2388 | 2388 |
| 2389 Handle<Object> Factory::ToBoolean(bool value) { | 2389 Handle<Object> Factory::ToBoolean(bool value) { |
| 2390 return value ? true_value() : false_value(); | 2390 return value ? true_value() : false_value(); |
| 2391 } | 2391 } |
| 2392 | 2392 |
| 2393 | 2393 |
| 2394 } } // namespace v8::internal | 2394 } } // namespace v8::internal |
| OLD | NEW |