| 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/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
| (...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1096 } | 1096 } |
| 1097 | 1097 |
| 1098 | 1098 |
| 1099 Handle<Bool8x16> Factory::NewBool8x16(bool lanes[16], PretenureFlag pretenure) { | 1099 Handle<Bool8x16> Factory::NewBool8x16(bool lanes[16], PretenureFlag pretenure) { |
| 1100 CALL_HEAP_FUNCTION(isolate(), | 1100 CALL_HEAP_FUNCTION(isolate(), |
| 1101 isolate()->heap()->AllocateBool8x16(lanes, pretenure), | 1101 isolate()->heap()->AllocateBool8x16(lanes, pretenure), |
| 1102 Bool8x16); | 1102 Bool8x16); |
| 1103 } | 1103 } |
| 1104 | 1104 |
| 1105 | 1105 |
| 1106 Handle<Object> Factory::NewError(const char* maker, | 1106 Handle<Object> Factory::NewError(Handle<JSFunction> constructor, |
| 1107 MessageTemplate::Template template_index, | 1107 MessageTemplate::Template template_index, |
| 1108 Handle<Object> arg0, Handle<Object> arg1, | 1108 Handle<Object> arg0, Handle<Object> arg1, |
| 1109 Handle<Object> arg2) { | 1109 Handle<Object> arg2) { |
| 1110 HandleScope scope(isolate()); | 1110 HandleScope scope(isolate()); |
| 1111 Handle<String> error_maker = InternalizeUtf8String(maker); | |
| 1112 if (isolate()->bootstrapper()->IsActive()) { | 1111 if (isolate()->bootstrapper()->IsActive()) { |
| 1113 // If this exception is being thrown during bootstrapping, | 1112 // During bootstrapping we cannot construct error objects. |
| 1114 // js_builtins_object is unavailable. We return the error maker | 1113 return scope.CloseAndEscape(NewStringFromAsciiChecked( |
| 1115 // name's string as the exception since we have nothing better | 1114 MessageTemplate::TemplateString(template_index))); |
| 1116 // to do. | |
| 1117 return scope.CloseAndEscape(error_maker); | |
| 1118 } | 1115 } |
| 1119 Handle<Object> fun_obj = Object::GetProperty(isolate()->js_builtins_object(), | |
| 1120 error_maker).ToHandleChecked(); | |
| 1121 | 1116 |
| 1122 Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj); | 1117 Handle<JSFunction> fun = isolate()->make_error_function(); |
| 1123 Handle<Object> message_type(Smi::FromInt(template_index), isolate()); | 1118 Handle<Object> message_type(Smi::FromInt(template_index), isolate()); |
| 1124 if (arg0.is_null()) arg0 = undefined_value(); | 1119 if (arg0.is_null()) arg0 = undefined_value(); |
| 1125 if (arg1.is_null()) arg1 = undefined_value(); | 1120 if (arg1.is_null()) arg1 = undefined_value(); |
| 1126 if (arg2.is_null()) arg2 = undefined_value(); | 1121 if (arg2.is_null()) arg2 = undefined_value(); |
| 1127 Handle<Object> argv[] = {message_type, arg0, arg1, arg2}; | 1122 Handle<Object> argv[] = {constructor, message_type, arg0, arg1, arg2}; |
| 1128 | 1123 |
| 1129 // Invoke the JavaScript factory method. If an exception is thrown while | 1124 // Invoke the JavaScript factory method. If an exception is thrown while |
| 1130 // running the factory method, use the exception as the result. | 1125 // running the factory method, use the exception as the result. |
| 1131 Handle<Object> result; | 1126 Handle<Object> result; |
| 1132 MaybeHandle<Object> exception; | 1127 MaybeHandle<Object> exception; |
| 1133 if (!Execution::TryCall(fun, isolate()->js_builtins_object(), arraysize(argv), | 1128 if (!Execution::TryCall(fun, undefined_value(), arraysize(argv), argv, |
| 1134 argv, &exception).ToHandle(&result)) { | 1129 &exception) |
| 1130 .ToHandle(&result)) { |
| 1135 Handle<Object> exception_obj; | 1131 Handle<Object> exception_obj; |
| 1136 if (exception.ToHandle(&exception_obj)) { | 1132 if (exception.ToHandle(&exception_obj)) { |
| 1137 result = exception_obj; | 1133 result = exception_obj; |
| 1138 } else { | 1134 } else { |
| 1139 result = undefined_value(); | 1135 result = undefined_value(); |
| 1140 } | 1136 } |
| 1141 } | 1137 } |
| 1142 return scope.CloseAndEscape(result); | 1138 return scope.CloseAndEscape(result); |
| 1143 } | 1139 } |
| 1144 | 1140 |
| 1145 | 1141 |
| 1146 Handle<Object> Factory::NewError(MessageTemplate::Template template_index, | |
| 1147 Handle<Object> arg0, Handle<Object> arg1, | |
| 1148 Handle<Object> arg2) { | |
| 1149 return NewError("MakeError", template_index, arg0, arg1, arg2); | |
| 1150 } | |
| 1151 | |
| 1152 | |
| 1153 Handle<Object> Factory::NewTypeError(MessageTemplate::Template template_index, | |
| 1154 Handle<Object> arg0, Handle<Object> arg1, | |
| 1155 Handle<Object> arg2) { | |
| 1156 return NewError("MakeTypeError", template_index, arg0, arg1, arg2); | |
| 1157 } | |
| 1158 | |
| 1159 | |
| 1160 Handle<Object> Factory::NewSyntaxError(MessageTemplate::Template template_index, | |
| 1161 Handle<Object> arg0, Handle<Object> arg1, | |
| 1162 Handle<Object> arg2) { | |
| 1163 return NewError("MakeSyntaxError", template_index, arg0, arg1, arg2); | |
| 1164 } | |
| 1165 | |
| 1166 | |
| 1167 Handle<Object> Factory::NewReferenceError( | |
| 1168 MessageTemplate::Template template_index, Handle<Object> arg0, | |
| 1169 Handle<Object> arg1, Handle<Object> arg2) { | |
| 1170 return NewError("MakeReferenceError", template_index, arg0, arg1, arg2); | |
| 1171 } | |
| 1172 | |
| 1173 | |
| 1174 Handle<Object> Factory::NewRangeError(MessageTemplate::Template template_index, | |
| 1175 Handle<Object> arg0, Handle<Object> arg1, | |
| 1176 Handle<Object> arg2) { | |
| 1177 return NewError("MakeRangeError", template_index, arg0, arg1, arg2); | |
| 1178 } | |
| 1179 | |
| 1180 | |
| 1181 Handle<Object> Factory::NewEvalError(MessageTemplate::Template template_index, | |
| 1182 Handle<Object> arg0, Handle<Object> arg1, | |
| 1183 Handle<Object> arg2) { | |
| 1184 return NewError("MakeEvalError", template_index, arg0, arg1, arg2); | |
| 1185 } | |
| 1186 | |
| 1187 | |
| 1188 Handle<String> Factory::EmergencyNewError(const char* message, | |
| 1189 Handle<JSArray> args) { | |
| 1190 const int kBufferSize = 1000; | |
| 1191 char buffer[kBufferSize]; | |
| 1192 size_t space = kBufferSize; | |
| 1193 char* p = &buffer[0]; | |
| 1194 | |
| 1195 Vector<char> v(buffer, kBufferSize); | |
| 1196 StrNCpy(v, message, space); | |
| 1197 space -= Min(space, strlen(message)); | |
| 1198 p = &buffer[kBufferSize] - space; | |
| 1199 | |
| 1200 for (int i = 0; i < Smi::cast(args->length())->value(); i++) { | |
| 1201 if (space > 0) { | |
| 1202 *p++ = ' '; | |
| 1203 space--; | |
| 1204 if (space > 0) { | |
| 1205 Handle<String> arg_str = Handle<String>::cast( | |
| 1206 Object::GetElement(isolate(), args, i).ToHandleChecked()); | |
| 1207 base::SmartArrayPointer<char> arg = arg_str->ToCString(); | |
| 1208 Vector<char> v2(p, static_cast<int>(space)); | |
| 1209 StrNCpy(v2, arg.get(), space); | |
| 1210 space -= Min(space, strlen(arg.get())); | |
| 1211 p = &buffer[kBufferSize] - space; | |
| 1212 } | |
| 1213 } | |
| 1214 } | |
| 1215 if (space > 0) { | |
| 1216 *p = '\0'; | |
| 1217 } else { | |
| 1218 buffer[kBufferSize - 1] = '\0'; | |
| 1219 } | |
| 1220 return NewStringFromUtf8(CStrVector(buffer), TENURED).ToHandleChecked(); | |
| 1221 } | |
| 1222 | |
| 1223 | |
| 1224 Handle<Object> Factory::NewError(const char* maker, const char* message, | |
| 1225 Handle<JSArray> args) { | |
| 1226 Handle<String> make_str = InternalizeUtf8String(maker); | |
| 1227 Handle<Object> fun_obj = Object::GetProperty( | |
| 1228 isolate()->js_builtins_object(), make_str).ToHandleChecked(); | |
| 1229 // If the builtins haven't been properly configured yet this error | |
| 1230 // constructor may not have been defined. Bail out. | |
| 1231 if (!fun_obj->IsJSFunction()) { | |
| 1232 return EmergencyNewError(message, args); | |
| 1233 } | |
| 1234 Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj); | |
| 1235 Handle<Object> message_obj = InternalizeUtf8String(message); | |
| 1236 Handle<Object> argv[] = { message_obj, args }; | |
| 1237 | |
| 1238 // Invoke the JavaScript factory method. If an exception is thrown while | |
| 1239 // running the factory method, use the exception as the result. | |
| 1240 Handle<Object> result; | |
| 1241 MaybeHandle<Object> exception; | |
| 1242 if (!Execution::TryCall(fun, undefined_value(), arraysize(argv), argv, | |
| 1243 &exception) | |
| 1244 .ToHandle(&result)) { | |
| 1245 Handle<Object> exception_obj; | |
| 1246 if (exception.ToHandle(&exception_obj)) return exception_obj; | |
| 1247 return undefined_value(); | |
| 1248 } | |
| 1249 return result; | |
| 1250 } | |
| 1251 | |
| 1252 | |
| 1253 Handle<Object> Factory::NewError(Handle<JSFunction> constructor, | 1142 Handle<Object> Factory::NewError(Handle<JSFunction> constructor, |
| 1254 Handle<String> message) { | 1143 Handle<String> message) { |
| 1255 Handle<Object> argv[] = { message }; | 1144 Handle<Object> argv[] = { message }; |
| 1256 | 1145 |
| 1257 // Invoke the JavaScript factory method. If an exception is thrown while | 1146 // Invoke the JavaScript factory method. If an exception is thrown while |
| 1258 // running the factory method, use the exception as the result. | 1147 // running the factory method, use the exception as the result. |
| 1259 Handle<Object> result; | 1148 Handle<Object> result; |
| 1260 MaybeHandle<Object> exception; | 1149 MaybeHandle<Object> exception; |
| 1261 if (!Execution::TryCall(constructor, undefined_value(), arraysize(argv), argv, | 1150 if (!Execution::TryCall(constructor, undefined_value(), arraysize(argv), argv, |
| 1262 &exception) | 1151 &exception) |
| (...skipping 1202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2465 } | 2354 } |
| 2466 | 2355 |
| 2467 | 2356 |
| 2468 Handle<Object> Factory::ToBoolean(bool value) { | 2357 Handle<Object> Factory::ToBoolean(bool value) { |
| 2469 return value ? true_value() : false_value(); | 2358 return value ? true_value() : false_value(); |
| 2470 } | 2359 } |
| 2471 | 2360 |
| 2472 | 2361 |
| 2473 } // namespace internal | 2362 } // namespace internal |
| 2474 } // namespace v8 | 2363 } // namespace v8 |
| OLD | NEW |