Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: src/runtime/runtime.cc

Issue 631433002: Classes runtime (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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();
377 } else {
378 if (super_class->IsNull()) {
379 prototype_parent = isolate->factory()->null_value();
380 } else if (!super_class->IsSpecFunction()) {
381 // TODO(arv): Should be IsConstructor.
382 Handle<Object> args[1] = {super_class};
383 THROW_NEW_ERROR_RETURN_FAILURE(
384 isolate,
385 NewTypeError("extends_value_not_a_function", HandleVector(args, 1)));
386 } else {
387 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
388 isolate, prototype_parent,
389 Runtime::GetObjectProperty(isolate, super_class,
390 isolate->factory()->prototype_string()));
391 if (!prototype_parent->IsNull() && !prototype_parent->IsSpecObject()) {
392 Handle<Object> args[1] = {prototype_parent};
393 THROW_NEW_ERROR_RETURN_FAILURE(
394 isolate, NewTypeError("prototype_parent_not_an_object",
395 HandleVector(args, 1)));
396 }
397 constructor_parent = super_class;
398 has_constructor_parent = true;
399 }
400 }
401
402 Handle<JSObject> prototype =
403 isolate->factory()->NewJSObject(isolate->object_function());
404 JSObject::SetPrototype(prototype, prototype_parent, false).Assert();
405
406 Handle<String> name_string = name->IsString()
407 ? Handle<String>::cast(name)
408 : isolate->factory()->empty_string();
409
410 Handle<JSFunction> ctor;
411 if (constructor->IsUndefined()) {
412 // TODO(arv): This should not use an empty function but a function that
413 // calls super.
414 Handle<Code> code(isolate->builtins()->builtin(Builtins::kEmptyFunction));
415 ctor = isolate->factory()->NewFunction(name_string, code, prototype, true);
416 } else {
417 ctor = Handle<JSFunction>::cast(constructor);
418 JSFunction::SetPrototype(ctor, prototype);
419 PropertyAttributes attribs =
420 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
421 JSObject::SetOwnPropertyIgnoreAttributes(
422 ctor, isolate->factory()->prototype_string(), prototype, attribs)
423 .Assert();
424 }
425
426 Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol());
427 JSObject::SetOwnPropertyIgnoreAttributes(ctor, home_object_symbol, prototype,
428 DONT_ENUM).Assert();
429
430 if (has_constructor_parent) {
431 JSObject::SetPrototype(ctor, constructor_parent, false).Assert();
432 }
433
434 JSObject::AddProperty(prototype, isolate->factory()->constructor_string(),
435 ctor, DONT_ENUM);
436
437 return *ctor;
438 }
439
440
364 RUNTIME_FUNCTION(Runtime_IsExtensible) { 441 RUNTIME_FUNCTION(Runtime_IsExtensible) {
365 SealHandleScope shs(isolate); 442 SealHandleScope shs(isolate);
366 DCHECK(args.length() == 1); 443 DCHECK(args.length() == 1);
367 CONVERT_ARG_CHECKED(JSObject, obj, 0); 444 CONVERT_ARG_CHECKED(JSObject, obj, 0);
368 if (obj->IsJSGlobalProxy()) { 445 if (obj->IsJSGlobalProxy()) {
369 PrototypeIterator iter(isolate, obj); 446 PrototypeIterator iter(isolate, obj);
370 if (iter.IsAtEnd()) return isolate->heap()->false_value(); 447 if (iter.IsAtEnd()) return isolate->heap()->false_value();
371 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); 448 DCHECK(iter.GetCurrent()->IsJSGlobalObject());
372 obj = JSObject::cast(iter.GetCurrent()); 449 obj = JSObject::cast(iter.GetCurrent());
373 } 450 }
(...skipping 3060 matching lines...) Expand 10 before | Expand all | Expand 10 after
3434 } 3511 }
3435 return NULL; 3512 return NULL;
3436 } 3513 }
3437 3514
3438 3515
3439 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 3516 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
3440 return &(kIntrinsicFunctions[static_cast<int>(id)]); 3517 return &(kIntrinsicFunctions[static_cast<int>(id)]);
3441 } 3518 }
3442 } 3519 }
3443 } // namespace v8::internal 3520 } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698