OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 <stdlib.h> | 5 #include <stdlib.h> |
6 #include <limits> | 6 #include <limits> |
7 | 7 |
8 #include "src/v8.h" | 8 #include "src/v8.h" |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
354 DCHECK(args.length() == 4); | 354 DCHECK(args.length() == 4); |
355 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | 355 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
356 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | 356 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
357 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 357 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
358 CONVERT_ARG_HANDLE_CHECKED(Name, name, 3); | 358 CONVERT_ARG_HANDLE_CHECKED(Name, name, 3); |
359 | 359 |
360 return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY); | 360 return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY); |
361 } | 361 } |
362 | 362 |
363 | 363 |
364 RUNTIME_FUNCTION(Runtime_DefineClass) { | |
365 HandleScope scope(isolate); | |
366 DCHECK(args.length() == 3); | |
367 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); | |
368 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); | |
369 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 2); | |
370 | |
371 Handle<Object> prototype_parent; | |
372 Handle<Object> constructor_parent; | |
373 bool has_constructor_parent = false; | |
374 | |
375 if (super_class->IsTheHole()) { | |
376 prototype_parent = isolate->initial_object_prototype(); | |
Dmitry Lomov (no reviews)
2014/10/07 10:28:32
What happens, per spec, if user assigns to Object.
arv (Not doing code reviews)
2014/10/07 14:47:09
The spec uses %ObjectPrototype% which is the origi
| |
377 } else { | |
378 if (super_class->IsNull()) { | |
379 prototype_parent = isolate->factory()->null_value(); | |
380 } else if (super_class->IsSpecFunction()) { | |
381 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
382 isolate, prototype_parent, | |
383 Runtime::GetObjectProperty(isolate, super_class, | |
384 isolate->factory()->prototype_string())); | |
385 if (!prototype_parent->IsNull() && !prototype_parent->IsSpecObject()) { | |
386 Handle<Object> args[1] = {prototype_parent}; | |
387 THROW_NEW_ERROR_RETURN_FAILURE( | |
388 isolate, NewTypeError("prototype_parent_not_an_object", | |
389 HandleVector(args, 1))); | |
390 } | |
391 constructor_parent = super_class; | |
392 has_constructor_parent = true; | |
393 } else { | |
394 // TODO(arv): Should be IsConstructor. | |
395 Handle<Object> args[1] = {super_class}; | |
396 THROW_NEW_ERROR_RETURN_FAILURE( | |
397 isolate, | |
398 NewTypeError("extends_value_not_a_function", HandleVector(args, 1))); | |
399 } | |
400 } | |
401 | |
402 Handle<JSObject> prototype = | |
403 isolate->factory()->NewJSObject(isolate->object_function()); | |
404 RETURN_FAILURE_ON_EXCEPTION( | |
405 isolate, JSObject::SetPrototype(prototype, prototype_parent, false)); | |
Dmitry Lomov (no reviews)
2014/10/07 10:28:32
Instead of SetPrototype here, I suggest using NewJ
arv (Not doing code reviews)
2014/10/07 14:47:09
Done.
I used to have a todo for this... I'm not s
| |
406 | |
407 Handle<String> name_string = name->IsString() | |
408 ? Handle<String>::cast(name) | |
409 : isolate->factory()->empty_string(); | |
410 | |
411 Handle<JSFunction> ctor; | |
412 if (constructor->IsSpecFunction()) { | |
413 ctor = Handle<JSFunction>::cast(constructor); | |
414 JSFunction::SetPrototype(ctor, prototype); | |
415 PropertyAttributes attribs = | |
416 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | |
417 RETURN_FAILURE_ON_EXCEPTION( | |
418 isolate, | |
419 JSObject::SetOwnPropertyIgnoreAttributes( | |
420 ctor, isolate->factory()->prototype_string(), prototype, attribs)); | |
421 } else { | |
422 // TODO(arv): This should not use an empty function but a function that | |
423 // calls super. | |
424 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction)); | |
425 ctor = isolate->factory()->NewFunction(name_string, code, prototype, true); | |
426 } | |
427 | |
428 Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol()); | |
429 RETURN_FAILURE_ON_EXCEPTION( | |
430 isolate, JSObject::SetOwnPropertyIgnoreAttributes( | |
431 ctor, home_object_symbol, prototype, DONT_ENUM)); | |
432 | |
433 if (has_constructor_parent) { | |
434 RETURN_FAILURE_ON_EXCEPTION( | |
435 isolate, JSObject::SetPrototype(ctor, constructor_parent, false)); | |
436 } | |
437 | |
438 JSObject::AddProperty(prototype, isolate->factory()->constructor_string(), | |
439 ctor, DONT_ENUM); | |
440 | |
441 return *ctor; | |
442 } | |
443 | |
444 | |
364 RUNTIME_FUNCTION(Runtime_IsExtensible) { | 445 RUNTIME_FUNCTION(Runtime_IsExtensible) { |
365 SealHandleScope shs(isolate); | 446 SealHandleScope shs(isolate); |
366 DCHECK(args.length() == 1); | 447 DCHECK(args.length() == 1); |
367 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 448 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
368 if (obj->IsJSGlobalProxy()) { | 449 if (obj->IsJSGlobalProxy()) { |
369 PrototypeIterator iter(isolate, obj); | 450 PrototypeIterator iter(isolate, obj); |
370 if (iter.IsAtEnd()) return isolate->heap()->false_value(); | 451 if (iter.IsAtEnd()) return isolate->heap()->false_value(); |
371 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); | 452 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); |
372 obj = JSObject::cast(iter.GetCurrent()); | 453 obj = JSObject::cast(iter.GetCurrent()); |
373 } | 454 } |
(...skipping 3060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3434 } | 3515 } |
3435 return NULL; | 3516 return NULL; |
3436 } | 3517 } |
3437 | 3518 |
3438 | 3519 |
3439 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 3520 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
3440 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 3521 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
3441 } | 3522 } |
3442 } | 3523 } |
3443 } // namespace v8::internal | 3524 } // namespace v8::internal |
OLD | NEW |