Chromium Code Reviews| 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 | 77 |
| 78 | 78 |
| 79 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { | 79 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { |
| 80 DCHECK(args.length() == 0); | 80 DCHECK(args.length() == 0); |
| 81 return isolate->heap()->home_object_symbol(); | 81 return isolate->heap()->home_object_symbol(); |
| 82 } | 82 } |
| 83 | 83 |
| 84 static MaybeHandle<Object> DefineClass(Isolate* isolate, | 84 static MaybeHandle<Object> DefineClass(Isolate* isolate, |
| 85 Handle<Object> super_class, | 85 Handle<Object> super_class, |
| 86 Handle<JSFunction> constructor, | 86 Handle<JSFunction> constructor, |
| 87 Handle<JSArray> property_names, | |
| 88 Handle<JSArray> property_funcs, | |
| 89 Handle<JSArray> property_infos, | |
| 87 int start_position, int end_position) { | 90 int start_position, int end_position) { |
| 88 Handle<Object> prototype_parent; | 91 Handle<Object> prototype_parent; |
| 89 Handle<Object> constructor_parent; | 92 Handle<Object> constructor_parent; |
| 90 | 93 |
| 91 if (super_class->IsTheHole(isolate)) { | 94 if (super_class->IsTheHole(isolate)) { |
| 92 prototype_parent = isolate->initial_object_prototype(); | 95 prototype_parent = isolate->initial_object_prototype(); |
| 93 } else { | 96 } else { |
| 94 if (super_class->IsNull(isolate)) { | 97 if (super_class->IsNull(isolate)) { |
| 95 prototype_parent = isolate->factory()->null_value(); | 98 prototype_parent = isolate->factory()->null_value(); |
| 96 } else if (super_class->IsConstructor()) { | 99 } else if (super_class->IsConstructor()) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 Object::SetProperty( | 166 Object::SetProperty( |
| 164 constructor, isolate->factory()->class_start_position_symbol(), | 167 constructor, isolate->factory()->class_start_position_symbol(), |
| 165 handle(Smi::FromInt(start_position), isolate), STRICT), | 168 handle(Smi::FromInt(start_position), isolate), STRICT), |
| 166 Object); | 169 Object); |
| 167 RETURN_ON_EXCEPTION( | 170 RETURN_ON_EXCEPTION( |
| 168 isolate, Object::SetProperty( | 171 isolate, Object::SetProperty( |
| 169 constructor, isolate->factory()->class_end_position_symbol(), | 172 constructor, isolate->factory()->class_end_position_symbol(), |
| 170 handle(Smi::FromInt(end_position), isolate), STRICT), | 173 handle(Smi::FromInt(end_position), isolate), STRICT), |
| 171 Object); | 174 Object); |
| 172 | 175 |
| 176 Object* array_length_obj = property_names->length(); | |
| 177 CHECK(array_length_obj->IsSmi()); | |
| 178 int array_len = Smi::cast(array_length_obj)->value(); | |
| 179 | |
| 180 DCHECK_EQ(array_length_obj, property_funcs->length()); | |
| 181 DCHECK_EQ(array_length_obj, property_infos->length()); | |
| 182 | |
| 183 for (int i = 0; i < array_len; ++i) { | |
| 184 Handle<Object> name_obj = | |
| 185 JSReceiver::GetElement(isolate, property_names, i).ToHandleChecked(); | |
|
adamk
2016/07/13 20:57:32
These are probably one of the reasons this is slow
| |
| 186 DCHECK(name_obj->IsName()); | |
| 187 Handle<Name> name = Handle<Name>::cast(name_obj); | |
| 188 | |
| 189 Handle<Object> func_obj = | |
| 190 JSReceiver::GetElement(isolate, property_funcs, i).ToHandleChecked(); | |
| 191 DCHECK(func_obj->IsJSFunction()); | |
| 192 Handle<JSFunction> func = Handle<JSFunction>::cast(func_obj); | |
| 193 | |
| 194 Handle<Object> info_obj = | |
| 195 JSReceiver::GetElement(isolate, property_infos, i).ToHandleChecked(); | |
| 196 DCHECK(info_obj->IsSmi()); | |
| 197 int info = Smi::cast(*info_obj)->value(); | |
| 198 | |
| 199 bool is_static = info & kIsStaticMask; | |
| 200 | |
| 201 if (is_static) { | |
| 202 if (Name::Equals(name, isolate->factory()->prototype_string())) { | |
| 203 THROW_NEW_ERROR( | |
| 204 isolate, NewTypeError(MessageTemplate::kStaticPrototype), Object); | |
| 205 } | |
| 206 } | |
| 207 | |
| 208 Handle<JSObject> receiver = | |
| 209 is_static ? static_cast<Handle<JSObject>>(constructor) : prototype; | |
| 210 | |
| 211 if (func->shared()->needs_home_object()) { | |
| 212 RETURN_ON_EXCEPTION(isolate, | |
| 213 JSObject::SetOwnPropertyIgnoreAttributes( | |
| 214 func, home_object_symbol, receiver, DONT_ENUM), | |
| 215 Object); | |
| 216 } | |
| 217 | |
| 218 if (info & kIsAccessorMask) { | |
| 219 if (info & kIsSetterMask) { | |
| 220 // Setter | |
| 221 if (String::cast(func->shared()->name())->length() == 0) { | |
| 222 JSFunction::SetName(func, name, isolate->factory()->set_string()); | |
| 223 } | |
| 224 | |
| 225 RETURN_ON_EXCEPTION( | |
| 226 isolate, JSObject::DefineAccessor(receiver, name, | |
| 227 isolate->factory()->null_value(), | |
| 228 func, DONT_ENUM), | |
| 229 Object); | |
| 230 } else { | |
| 231 // Getter | |
| 232 if (String::cast(func->shared()->name())->length() == 0) { | |
| 233 JSFunction::SetName(func, name, isolate->factory()->get_string()); | |
| 234 } | |
| 235 | |
| 236 RETURN_ON_EXCEPTION( | |
| 237 isolate, JSObject::DefineAccessor(receiver, name, func, | |
| 238 isolate->factory()->null_value(), | |
| 239 DONT_ENUM), | |
| 240 Object); | |
| 241 } | |
| 242 } else { | |
| 243 // Method | |
| 244 if (String::cast(func->shared()->name())->length() == 0) { | |
| 245 JSFunction::SetName(func, name, isolate->factory()->empty_string()); | |
| 246 } | |
| 247 | |
| 248 LookupIterator it = LookupIterator::PropertyOrElement( | |
| 249 isolate, receiver, name, receiver, LookupIterator::OWN); | |
| 250 CHECK(JSObject::DefineOwnPropertyIgnoreAttributes(&it, func, DONT_ENUM, | |
| 251 Object::DONT_THROW) | |
| 252 .IsJust()); | |
| 253 } | |
| 254 } | |
| 255 | |
| 173 return constructor; | 256 return constructor; |
| 174 } | 257 } |
| 175 | 258 |
| 176 | 259 |
| 177 RUNTIME_FUNCTION(Runtime_DefineClass) { | 260 RUNTIME_FUNCTION(Runtime_DefineClass) { |
| 178 HandleScope scope(isolate); | 261 HandleScope scope(isolate); |
| 179 DCHECK(args.length() == 4); | 262 DCHECK(args.length() == 7); |
| 180 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 0); | 263 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 0); |
| 181 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 1); | 264 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 1); |
| 182 CONVERT_SMI_ARG_CHECKED(start_position, 2); | 265 CONVERT_ARG_HANDLE_CHECKED(JSArray, property_names, 2); |
| 183 CONVERT_SMI_ARG_CHECKED(end_position, 3); | 266 CONVERT_ARG_HANDLE_CHECKED(JSArray, property_funcs, 3); |
| 267 CONVERT_ARG_HANDLE_CHECKED(JSArray, property_infos, 4); | |
| 268 CONVERT_SMI_ARG_CHECKED(start_position, 5); | |
| 269 CONVERT_SMI_ARG_CHECKED(end_position, 6); | |
| 184 | 270 |
| 185 RETURN_RESULT_OR_FAILURE( | 271 RETURN_RESULT_OR_FAILURE( |
| 186 isolate, DefineClass(isolate, super_class, constructor, start_position, | 272 isolate, DefineClass(isolate, super_class, constructor, property_names, |
| 273 property_funcs, property_infos, start_position, | |
| 187 end_position)); | 274 end_position)); |
| 188 } | 275 } |
| 189 | 276 |
| 190 | 277 |
| 191 static MaybeHandle<Object> LoadFromSuper(Isolate* isolate, | 278 static MaybeHandle<Object> LoadFromSuper(Isolate* isolate, |
| 192 Handle<Object> receiver, | 279 Handle<Object> receiver, |
| 193 Handle<JSObject> home_object, | 280 Handle<JSObject> home_object, |
| 194 Handle<Name> name) { | 281 Handle<Name> name) { |
| 195 if (home_object->IsAccessCheckNeeded() && | 282 if (home_object->IsAccessCheckNeeded() && |
| 196 !isolate->MayAccess(handle(isolate->context()), home_object)) { | 283 !isolate->MayAccess(handle(isolate->context()), home_object)) { |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 390 | 477 |
| 391 RUNTIME_FUNCTION(Runtime_GetSuperConstructor) { | 478 RUNTIME_FUNCTION(Runtime_GetSuperConstructor) { |
| 392 SealHandleScope shs(isolate); | 479 SealHandleScope shs(isolate); |
| 393 DCHECK_EQ(1, args.length()); | 480 DCHECK_EQ(1, args.length()); |
| 394 CONVERT_ARG_CHECKED(JSFunction, active_function, 0); | 481 CONVERT_ARG_CHECKED(JSFunction, active_function, 0); |
| 395 return active_function->map()->prototype(); | 482 return active_function->map()->prototype(); |
| 396 } | 483 } |
| 397 | 484 |
| 398 } // namespace internal | 485 } // namespace internal |
| 399 } // namespace v8 | 486 } // namespace v8 |
| OLD | NEW |