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

Side by Side Diff: src/objects.cc

Issue 10878047: Revert to code state of 3.13.1 plus r12350 (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 8 years, 4 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
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 Object* result; 62 Object* result;
63 { MaybeObject* maybe_result = 63 { MaybeObject* maybe_result =
64 constructor->GetHeap()->AllocateJSObject(constructor); 64 constructor->GetHeap()->AllocateJSObject(constructor);
65 if (!maybe_result->ToObject(&result)) return maybe_result; 65 if (!maybe_result->ToObject(&result)) return maybe_result;
66 } 66 }
67 JSValue::cast(result)->set_value(value); 67 JSValue::cast(result)->set_value(value);
68 return result; 68 return result;
69 } 69 }
70 70
71 71
72 MaybeObject* Object::ToObject(Context* native_context) { 72 MaybeObject* Object::ToObject(Context* global_context) {
73 if (IsNumber()) { 73 if (IsNumber()) {
74 return CreateJSValue(native_context->number_function(), this); 74 return CreateJSValue(global_context->number_function(), this);
75 } else if (IsBoolean()) { 75 } else if (IsBoolean()) {
76 return CreateJSValue(native_context->boolean_function(), this); 76 return CreateJSValue(global_context->boolean_function(), this);
77 } else if (IsString()) { 77 } else if (IsString()) {
78 return CreateJSValue(native_context->string_function(), this); 78 return CreateJSValue(global_context->string_function(), this);
79 } 79 }
80 ASSERT(IsJSObject()); 80 ASSERT(IsJSObject());
81 return this; 81 return this;
82 } 82 }
83 83
84 84
85 MaybeObject* Object::ToObject() { 85 MaybeObject* Object::ToObject() {
86 if (IsJSReceiver()) { 86 if (IsJSReceiver()) {
87 return this; 87 return this;
88 } else if (IsNumber()) { 88 } else if (IsNumber()) {
89 Isolate* isolate = Isolate::Current(); 89 Isolate* isolate = Isolate::Current();
90 Context* native_context = isolate->context()->native_context(); 90 Context* global_context = isolate->context()->global_context();
91 return CreateJSValue(native_context->number_function(), this); 91 return CreateJSValue(global_context->number_function(), this);
92 } else if (IsBoolean()) { 92 } else if (IsBoolean()) {
93 Isolate* isolate = HeapObject::cast(this)->GetIsolate(); 93 Isolate* isolate = HeapObject::cast(this)->GetIsolate();
94 Context* native_context = isolate->context()->native_context(); 94 Context* global_context = isolate->context()->global_context();
95 return CreateJSValue(native_context->boolean_function(), this); 95 return CreateJSValue(global_context->boolean_function(), this);
96 } else if (IsString()) { 96 } else if (IsString()) {
97 Isolate* isolate = HeapObject::cast(this)->GetIsolate(); 97 Isolate* isolate = HeapObject::cast(this)->GetIsolate();
98 Context* native_context = isolate->context()->native_context(); 98 Context* global_context = isolate->context()->global_context();
99 return CreateJSValue(native_context->string_function(), this); 99 return CreateJSValue(global_context->string_function(), this);
100 } 100 }
101 101
102 // Throw a type error. 102 // Throw a type error.
103 return Failure::InternalError(); 103 return Failure::InternalError();
104 } 104 }
105 105
106 106
107 Object* Object::ToBoolean() { 107 Object* Object::ToBoolean() {
108 if (IsTrue()) return this; 108 if (IsTrue()) return this;
109 if (IsFalse()) return this; 109 if (IsFalse()) return this;
(...skipping 17 matching lines...) Expand all
127 } 127 }
128 return heap_object->GetHeap()->true_value(); 128 return heap_object->GetHeap()->true_value();
129 } 129 }
130 130
131 131
132 void Object::Lookup(String* name, LookupResult* result) { 132 void Object::Lookup(String* name, LookupResult* result) {
133 Object* holder = NULL; 133 Object* holder = NULL;
134 if (IsJSReceiver()) { 134 if (IsJSReceiver()) {
135 holder = this; 135 holder = this;
136 } else { 136 } else {
137 Context* native_context = Isolate::Current()->context()->native_context(); 137 Context* global_context = Isolate::Current()->context()->global_context();
138 if (IsNumber()) { 138 if (IsNumber()) {
139 holder = native_context->number_function()->instance_prototype(); 139 holder = global_context->number_function()->instance_prototype();
140 } else if (IsString()) { 140 } else if (IsString()) {
141 holder = native_context->string_function()->instance_prototype(); 141 holder = global_context->string_function()->instance_prototype();
142 } else if (IsBoolean()) { 142 } else if (IsBoolean()) {
143 holder = native_context->boolean_function()->instance_prototype(); 143 holder = global_context->boolean_function()->instance_prototype();
144 } 144 }
145 } 145 }
146 ASSERT(holder != NULL); // Cannot handle null or undefined. 146 ASSERT(holder != NULL); // Cannot handle null or undefined.
147 JSReceiver::cast(holder)->Lookup(name, result); 147 JSReceiver::cast(holder)->Lookup(name, result);
148 } 148 }
149 149
150 150
151 MaybeObject* Object::GetPropertyWithReceiver(Object* receiver, 151 MaybeObject* Object::GetPropertyWithReceiver(Object* receiver,
152 String* name, 152 String* name,
153 PropertyAttributes* attributes) { 153 PropertyAttributes* attributes) {
(...skipping 29 matching lines...) Expand all
183 Handle<Object> receiver_handle(receiver); 183 Handle<Object> receiver_handle(receiver);
184 Handle<Object> args[2] = { name_handle, receiver_handle }; 184 Handle<Object> args[2] = { name_handle, receiver_handle };
185 Handle<Object> error = 185 Handle<Object> error =
186 isolate->factory()->NewTypeError("incompatible_method_receiver", 186 isolate->factory()->NewTypeError("incompatible_method_receiver",
187 HandleVector(args, 187 HandleVector(args,
188 ARRAY_SIZE(args))); 188 ARRAY_SIZE(args)));
189 return isolate->Throw(*error); 189 return isolate->Throw(*error);
190 } 190 }
191 Object* fun_obj = data->getter(); 191 Object* fun_obj = data->getter();
192 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); 192 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
193 if (call_fun == NULL) return isolate->heap()->undefined_value();
194 HandleScope scope(isolate); 193 HandleScope scope(isolate);
195 JSObject* self = JSObject::cast(receiver); 194 JSObject* self = JSObject::cast(receiver);
196 Handle<String> key(name); 195 Handle<String> key(name);
197 LOG(isolate, ApiNamedPropertyAccess("load", self, name)); 196 LOG(isolate, ApiNamedPropertyAccess("load", self, name));
198 CustomArguments args(isolate, data->data(), self, this); 197 CustomArguments args(isolate, data->data(), self, this);
199 v8::AccessorInfo info(args.end()); 198 v8::AccessorInfo info(args.end());
200 v8::Handle<v8::Value> result; 199 v8::Handle<v8::Value> result;
201 { 200 {
202 // Leaving JavaScript. 201 // Leaving JavaScript.
203 VMState state(isolate, EXTERNAL); 202 VMState state(isolate, EXTERNAL);
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 : HeapObject::cast(this)->GetHeap(); 655 : HeapObject::cast(this)->GetHeap();
657 Object* holder = this; 656 Object* holder = this;
658 657
659 // Iterate up the prototype chain until an element is found or the null 658 // Iterate up the prototype chain until an element is found or the null
660 // prototype is encountered. 659 // prototype is encountered.
661 for (holder = this; 660 for (holder = this;
662 holder != heap->null_value(); 661 holder != heap->null_value();
663 holder = holder->GetPrototype()) { 662 holder = holder->GetPrototype()) {
664 if (!holder->IsJSObject()) { 663 if (!holder->IsJSObject()) {
665 Isolate* isolate = heap->isolate(); 664 Isolate* isolate = heap->isolate();
666 Context* native_context = isolate->context()->native_context(); 665 Context* global_context = isolate->context()->global_context();
667 if (holder->IsNumber()) { 666 if (holder->IsNumber()) {
668 holder = native_context->number_function()->instance_prototype(); 667 holder = global_context->number_function()->instance_prototype();
669 } else if (holder->IsString()) { 668 } else if (holder->IsString()) {
670 holder = native_context->string_function()->instance_prototype(); 669 holder = global_context->string_function()->instance_prototype();
671 } else if (holder->IsBoolean()) { 670 } else if (holder->IsBoolean()) {
672 holder = native_context->boolean_function()->instance_prototype(); 671 holder = global_context->boolean_function()->instance_prototype();
673 } else if (holder->IsJSProxy()) { 672 } else if (holder->IsJSProxy()) {
674 return JSProxy::cast(holder)->GetElementWithHandler(receiver, index); 673 return JSProxy::cast(holder)->GetElementWithHandler(receiver, index);
675 } else { 674 } else {
676 // Undefined and null have no indexed properties. 675 // Undefined and null have no indexed properties.
677 ASSERT(holder->IsUndefined() || holder->IsNull()); 676 ASSERT(holder->IsUndefined() || holder->IsNull());
678 return heap->undefined_value(); 677 return heap->undefined_value();
679 } 678 }
680 } 679 }
681 680
682 // Inline the case for JSObjects. Doing so significantly improves the 681 // Inline the case for JSObjects. Doing so significantly improves the
(...skipping 21 matching lines...) Expand all
704 } 703 }
705 } 704 }
706 705
707 return heap->undefined_value(); 706 return heap->undefined_value();
708 } 707 }
709 708
710 709
711 Object* Object::GetPrototype() { 710 Object* Object::GetPrototype() {
712 if (IsSmi()) { 711 if (IsSmi()) {
713 Heap* heap = Isolate::Current()->heap(); 712 Heap* heap = Isolate::Current()->heap();
714 Context* context = heap->isolate()->context()->native_context(); 713 Context* context = heap->isolate()->context()->global_context();
715 return context->number_function()->instance_prototype(); 714 return context->number_function()->instance_prototype();
716 } 715 }
717 716
718 HeapObject* heap_object = HeapObject::cast(this); 717 HeapObject* heap_object = HeapObject::cast(this);
719 718
720 // The object is either a number, a string, a boolean, 719 // The object is either a number, a string, a boolean,
721 // a real JS object, or a Harmony proxy. 720 // a real JS object, or a Harmony proxy.
722 if (heap_object->IsJSReceiver()) { 721 if (heap_object->IsJSReceiver()) {
723 return heap_object->map()->prototype(); 722 return heap_object->map()->prototype();
724 } 723 }
725 Heap* heap = heap_object->GetHeap(); 724 Heap* heap = heap_object->GetHeap();
726 Context* context = heap->isolate()->context()->native_context(); 725 Context* context = heap->isolate()->context()->global_context();
727 726
728 if (heap_object->IsHeapNumber()) { 727 if (heap_object->IsHeapNumber()) {
729 return context->number_function()->instance_prototype(); 728 return context->number_function()->instance_prototype();
730 } 729 }
731 if (heap_object->IsString()) { 730 if (heap_object->IsString()) {
732 return context->string_function()->instance_prototype(); 731 return context->string_function()->instance_prototype();
733 } 732 }
734 if (heap_object->IsBoolean()) { 733 if (heap_object->IsBoolean()) {
735 return context->boolean_function()->instance_prototype(); 734 return context->boolean_function()->instance_prototype();
736 } else { 735 } else {
(...skipping 2599 matching lines...) Expand 10 before | Expand all | Expand 10 after
3336 } 3335 }
3337 3336
3338 Heap* current_heap = GetHeap(); 3337 Heap* current_heap = GetHeap();
3339 3338
3340 // Copy the next enumeration index from instance descriptor. 3339 // Copy the next enumeration index from instance descriptor.
3341 int index = map_of_this->instance_descriptors()->NextEnumerationIndex(); 3340 int index = map_of_this->instance_descriptors()->NextEnumerationIndex();
3342 dictionary->SetNextEnumerationIndex(index); 3341 dictionary->SetNextEnumerationIndex(index);
3343 3342
3344 Map* new_map; 3343 Map* new_map;
3345 MaybeObject* maybe_map = 3344 MaybeObject* maybe_map =
3346 current_heap->isolate()->context()->native_context()-> 3345 current_heap->isolate()->context()->global_context()->
3347 normalized_map_cache()->Get(this, mode); 3346 normalized_map_cache()->Get(this, mode);
3348 if (!maybe_map->To(&new_map)) return maybe_map; 3347 if (!maybe_map->To(&new_map)) return maybe_map;
3349 ASSERT(new_map->is_dictionary_map()); 3348 ASSERT(new_map->is_dictionary_map());
3350 3349
3351 // We have now successfully allocated all the necessary objects. 3350 // We have now successfully allocated all the necessary objects.
3352 // Changes can now be made with the guarantee that all of them take effect. 3351 // Changes can now be made with the guarantee that all of them take effect.
3353 3352
3354 // Resize the object in the heap if necessary. 3353 // Resize the object in the heap if necessary.
3355 int new_instance_size = new_map->instance_size(); 3354 int new_instance_size = new_map->instance_size();
3356 int instance_size_delta = map_of_this->instance_size() - new_instance_size; 3355 int instance_size_delta = map_of_this->instance_size() - new_instance_size;
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
4051 FAST_HOLEY_ELEMENTS; 4050 FAST_HOLEY_ELEMENTS;
4052 if (ReferencesObjectFromElements(arguments, kind, obj)) return true; 4051 if (ReferencesObjectFromElements(arguments, kind, obj)) return true;
4053 break; 4052 break;
4054 } 4053 }
4055 } 4054 }
4056 4055
4057 // For functions check the context. 4056 // For functions check the context.
4058 if (IsJSFunction()) { 4057 if (IsJSFunction()) {
4059 // Get the constructor function for arguments array. 4058 // Get the constructor function for arguments array.
4060 JSObject* arguments_boilerplate = 4059 JSObject* arguments_boilerplate =
4061 heap->isolate()->context()->native_context()-> 4060 heap->isolate()->context()->global_context()->
4062 arguments_boilerplate(); 4061 arguments_boilerplate();
4063 JSFunction* arguments_function = 4062 JSFunction* arguments_function =
4064 JSFunction::cast(arguments_boilerplate->map()->constructor()); 4063 JSFunction::cast(arguments_boilerplate->map()->constructor());
4065 4064
4066 // Get the context and don't check if it is the native context. 4065 // Get the context and don't check if it is the global context.
4067 JSFunction* f = JSFunction::cast(this); 4066 JSFunction* f = JSFunction::cast(this);
4068 Context* context = f->context(); 4067 Context* context = f->context();
4069 if (context->IsNativeContext()) { 4068 if (context->IsGlobalContext()) {
4070 return false; 4069 return false;
4071 } 4070 }
4072 4071
4073 // Check the non-special context slots. 4072 // Check the non-special context slots.
4074 for (int i = Context::MIN_CONTEXT_SLOTS; i < context->length(); i++) { 4073 for (int i = Context::MIN_CONTEXT_SLOTS; i < context->length(); i++) {
4075 // Only check JS objects. 4074 // Only check JS objects.
4076 if (context->get(i)->IsJSObject()) { 4075 if (context->get(i)->IsJSObject()) {
4077 JSObject* ctxobj = JSObject::cast(context->get(i)); 4076 JSObject* ctxobj = JSObject::cast(context->get(i));
4078 // If it is an arguments array check the content. 4077 // If it is an arguments array check the content.
4079 if (ctxobj->map()->constructor() == arguments_function) { 4078 if (ctxobj->map()->constructor() == arguments_function) {
(...skipping 3290 matching lines...) Expand 10 before | Expand all | Expand 10 after
7370 } 7369 }
7371 7370
7372 7371
7373 void SharedFunctionInfo::ClearOptimizedCodeMap() { 7372 void SharedFunctionInfo::ClearOptimizedCodeMap() {
7374 set_optimized_code_map(Smi::FromInt(0)); 7373 set_optimized_code_map(Smi::FromInt(0));
7375 } 7374 }
7376 7375
7377 7376
7378 void SharedFunctionInfo::AddToOptimizedCodeMap( 7377 void SharedFunctionInfo::AddToOptimizedCodeMap(
7379 Handle<SharedFunctionInfo> shared, 7378 Handle<SharedFunctionInfo> shared,
7380 Handle<Context> native_context, 7379 Handle<Context> global_context,
7381 Handle<Code> code, 7380 Handle<Code> code,
7382 Handle<FixedArray> literals) { 7381 Handle<FixedArray> literals) {
7383 ASSERT(code->kind() == Code::OPTIMIZED_FUNCTION); 7382 ASSERT(code->kind() == Code::OPTIMIZED_FUNCTION);
7384 ASSERT(native_context->IsNativeContext()); 7383 ASSERT(global_context->IsGlobalContext());
7385 STATIC_ASSERT(kEntryLength == 3); 7384 STATIC_ASSERT(kEntryLength == 3);
7386 Object* value = shared->optimized_code_map(); 7385 Object* value = shared->optimized_code_map();
7387 Handle<FixedArray> new_code_map; 7386 Handle<FixedArray> new_code_map;
7388 if (value->IsSmi()) { 7387 if (value->IsSmi()) {
7389 // No optimized code map. 7388 // No optimized code map.
7390 ASSERT_EQ(0, Smi::cast(value)->value()); 7389 ASSERT_EQ(0, Smi::cast(value)->value());
7391 // Crate 3 entries per context {context, code, literals}. 7390 // Crate 3 entries per context {context, code, literals}.
7392 new_code_map = FACTORY->NewFixedArray(kEntryLength); 7391 new_code_map = FACTORY->NewFixedArray(kEntryLength);
7393 new_code_map->set(0, *native_context); 7392 new_code_map->set(0, *global_context);
7394 new_code_map->set(1, *code); 7393 new_code_map->set(1, *code);
7395 new_code_map->set(2, *literals); 7394 new_code_map->set(2, *literals);
7396 } else { 7395 } else {
7397 // Copy old map and append one new entry. 7396 // Copy old map and append one new entry.
7398 Handle<FixedArray> old_code_map(FixedArray::cast(value)); 7397 Handle<FixedArray> old_code_map(FixedArray::cast(value));
7399 ASSERT_EQ(-1, shared->SearchOptimizedCodeMap(*native_context)); 7398 ASSERT_EQ(-1, shared->SearchOptimizedCodeMap(*global_context));
7400 int old_length = old_code_map->length(); 7399 int old_length = old_code_map->length();
7401 int new_length = old_length + kEntryLength; 7400 int new_length = old_length + kEntryLength;
7402 new_code_map = FACTORY->NewFixedArray(new_length); 7401 new_code_map = FACTORY->NewFixedArray(new_length);
7403 old_code_map->CopyTo(0, *new_code_map, 0, old_length); 7402 old_code_map->CopyTo(0, *new_code_map, 0, old_length);
7404 new_code_map->set(old_length, *native_context); 7403 new_code_map->set(old_length, *global_context);
7405 new_code_map->set(old_length + 1, *code); 7404 new_code_map->set(old_length + 1, *code);
7406 new_code_map->set(old_length + 2, *literals); 7405 new_code_map->set(old_length + 2, *literals);
7407 } 7406 }
7408 #ifdef DEBUG 7407 #ifdef DEBUG
7409 for (int i = 0; i < new_code_map->length(); i += kEntryLength) { 7408 for (int i = 0; i < new_code_map->length(); i += kEntryLength) {
7410 ASSERT(new_code_map->get(i)->IsNativeContext()); 7409 ASSERT(new_code_map->get(i)->IsGlobalContext());
7411 ASSERT(new_code_map->get(i + 1)->IsCode()); 7410 ASSERT(new_code_map->get(i + 1)->IsCode());
7412 ASSERT(Code::cast(new_code_map->get(i + 1))->kind() == 7411 ASSERT(Code::cast(new_code_map->get(i + 1))->kind() ==
7413 Code::OPTIMIZED_FUNCTION); 7412 Code::OPTIMIZED_FUNCTION);
7414 ASSERT(new_code_map->get(i + 2)->IsFixedArray()); 7413 ASSERT(new_code_map->get(i + 2)->IsFixedArray());
7415 } 7414 }
7416 #endif 7415 #endif
7417 shared->set_optimized_code_map(*new_code_map); 7416 shared->set_optimized_code_map(*new_code_map);
7418 } 7417 }
7419 7418
7420 7419
7421 void SharedFunctionInfo::InstallFromOptimizedCodeMap(JSFunction* function, 7420 void SharedFunctionInfo::InstallFromOptimizedCodeMap(JSFunction* function,
7422 int index) { 7421 int index) {
7423 ASSERT(index > 0); 7422 ASSERT(index > 0);
7424 ASSERT(optimized_code_map()->IsFixedArray()); 7423 ASSERT(optimized_code_map()->IsFixedArray());
7425 FixedArray* code_map = FixedArray::cast(optimized_code_map()); 7424 FixedArray* code_map = FixedArray::cast(optimized_code_map());
7426 if (!bound()) { 7425 if (!bound()) {
7427 FixedArray* cached_literals = FixedArray::cast(code_map->get(index + 1)); 7426 FixedArray* cached_literals = FixedArray::cast(code_map->get(index + 1));
7428 ASSERT(cached_literals != NULL); 7427 ASSERT(cached_literals != NULL);
7429 function->set_literals(cached_literals); 7428 function->set_literals(cached_literals);
7430 } 7429 }
7431 Code* code = Code::cast(code_map->get(index)); 7430 Code* code = Code::cast(code_map->get(index));
7432 ASSERT(code != NULL); 7431 ASSERT(code != NULL);
7433 ASSERT(function->context()->native_context() == code_map->get(index - 1)); 7432 ASSERT(function->context()->global_context() == code_map->get(index - 1));
7434 function->ReplaceCode(code); 7433 function->ReplaceCode(code);
7435 } 7434 }
7436 7435
7437 7436
7438 bool JSFunction::CompileLazy(Handle<JSFunction> function, 7437 bool JSFunction::CompileLazy(Handle<JSFunction> function,
7439 ClearExceptionFlag flag) { 7438 ClearExceptionFlag flag) {
7440 bool result = true; 7439 bool result = true;
7441 if (function->shared()->is_compiled()) { 7440 if (function->shared()->is_compiled()) {
7442 function->ReplaceCode(function->shared()->code()); 7441 function->ReplaceCode(function->shared()->code());
7443 function->shared()->set_code_age(0); 7442 function->shared()->set_code_age(0);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
7541 // different prototype. 7540 // different prototype.
7542 Map* new_map; 7541 Map* new_map;
7543 MaybeObject* maybe_new_map = map()->Copy(); 7542 MaybeObject* maybe_new_map = map()->Copy();
7544 if (!maybe_new_map->To(&new_map)) return maybe_new_map; 7543 if (!maybe_new_map->To(&new_map)) return maybe_new_map;
7545 7544
7546 Heap* heap = new_map->GetHeap(); 7545 Heap* heap = new_map->GetHeap();
7547 set_map(new_map); 7546 set_map(new_map);
7548 new_map->set_constructor(value); 7547 new_map->set_constructor(value);
7549 new_map->set_non_instance_prototype(true); 7548 new_map->set_non_instance_prototype(true);
7550 construct_prototype = 7549 construct_prototype =
7551 heap->isolate()->context()->native_context()-> 7550 heap->isolate()->context()->global_context()->
7552 initial_object_prototype(); 7551 initial_object_prototype();
7553 } else { 7552 } else {
7554 map()->set_non_instance_prototype(false); 7553 map()->set_non_instance_prototype(false);
7555 } 7554 }
7556 7555
7557 return SetInstancePrototype(construct_prototype); 7556 return SetInstancePrototype(construct_prototype);
7558 } 7557 }
7559 7558
7560 7559
7561 Object* JSFunction::RemovePrototype() { 7560 Object* JSFunction::RemovePrototype() {
7562 Context* native_context = context()->native_context(); 7561 Context* global_context = context()->global_context();
7563 Map* no_prototype_map = shared()->is_classic_mode() 7562 Map* no_prototype_map = shared()->is_classic_mode()
7564 ? native_context->function_without_prototype_map() 7563 ? global_context->function_without_prototype_map()
7565 : native_context->strict_mode_function_without_prototype_map(); 7564 : global_context->strict_mode_function_without_prototype_map();
7566 7565
7567 if (map() == no_prototype_map) { 7566 if (map() == no_prototype_map) {
7568 // Be idempotent. 7567 // Be idempotent.
7569 return this; 7568 return this;
7570 } 7569 }
7571 7570
7572 ASSERT(map() == (shared()->is_classic_mode() 7571 ASSERT(map() == (shared()->is_classic_mode()
7573 ? native_context->function_map() 7572 ? global_context->function_map()
7574 : native_context->strict_mode_function_map())); 7573 : global_context->strict_mode_function_map()));
7575 7574
7576 set_map(no_prototype_map); 7575 set_map(no_prototype_map);
7577 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value()); 7576 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value());
7578 return this; 7577 return this;
7579 } 7578 }
7580 7579
7581 7580
7582 Object* JSFunction::SetInstanceClassName(String* name) { 7581 Object* JSFunction::SetInstanceClassName(String* name) {
7583 shared()->set_instance_class_name(name); 7582 shared()->set_instance_class_name(name);
7584 return this; 7583 return this;
7585 } 7584 }
7586 7585
7587 7586
7588 void JSFunction::PrintName(FILE* out) { 7587 void JSFunction::PrintName(FILE* out) {
7589 SmartArrayPointer<char> name = shared()->DebugName()->ToCString(); 7588 SmartArrayPointer<char> name = shared()->DebugName()->ToCString();
7590 PrintF(out, "%s", *name); 7589 PrintF(out, "%s", *name);
7591 } 7590 }
7592 7591
7593 7592
7594 Context* JSFunction::NativeContextFromLiterals(FixedArray* literals) { 7593 Context* JSFunction::GlobalContextFromLiterals(FixedArray* literals) {
7595 return Context::cast(literals->get(JSFunction::kLiteralNativeContextIndex)); 7594 return Context::cast(literals->get(JSFunction::kLiteralGlobalContextIndex));
7596 } 7595 }
7597 7596
7598 7597
7599 MaybeObject* Oddball::Initialize(const char* to_string, 7598 MaybeObject* Oddball::Initialize(const char* to_string,
7600 Object* to_number, 7599 Object* to_number,
7601 byte kind) { 7600 byte kind) {
7602 String* symbol; 7601 String* symbol;
7603 { MaybeObject* maybe_symbol = 7602 { MaybeObject* maybe_symbol =
7604 Isolate::Current()->heap()->LookupAsciiSymbol(to_string); 7603 Isolate::Current()->heap()->LookupAsciiSymbol(to_string);
7605 if (!maybe_symbol->To(&symbol)) return maybe_symbol; 7604 if (!maybe_symbol->To(&symbol)) return maybe_symbol;
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
7983 // Resize the initial map and all maps in its transition tree. 7982 // Resize the initial map and all maps in its transition tree.
7984 map->TraverseTransitionTree(&ShrinkInstanceSize, &slack); 7983 map->TraverseTransitionTree(&ShrinkInstanceSize, &slack);
7985 7984
7986 // Give the correct expected_nof_properties to initial maps created later. 7985 // Give the correct expected_nof_properties to initial maps created later.
7987 ASSERT(expected_nof_properties() >= slack); 7986 ASSERT(expected_nof_properties() >= slack);
7988 set_expected_nof_properties(expected_nof_properties() - slack); 7987 set_expected_nof_properties(expected_nof_properties() - slack);
7989 } 7988 }
7990 } 7989 }
7991 7990
7992 7991
7993 int SharedFunctionInfo::SearchOptimizedCodeMap(Context* native_context) { 7992 int SharedFunctionInfo::SearchOptimizedCodeMap(Context* global_context) {
7994 ASSERT(native_context->IsNativeContext()); 7993 ASSERT(global_context->IsGlobalContext());
7995 if (!FLAG_cache_optimized_code) return -1; 7994 if (!FLAG_cache_optimized_code) return -1;
7996 Object* value = optimized_code_map(); 7995 Object* value = optimized_code_map();
7997 if (!value->IsSmi()) { 7996 if (!value->IsSmi()) {
7998 FixedArray* optimized_code_map = FixedArray::cast(value); 7997 FixedArray* optimized_code_map = FixedArray::cast(value);
7999 int length = optimized_code_map->length(); 7998 int length = optimized_code_map->length();
8000 for (int i = 0; i < length; i += 3) { 7999 for (int i = 0; i < length; i += 3) {
8001 if (optimized_code_map->get(i) == native_context) { 8000 if (optimized_code_map->get(i) == global_context) {
8002 return i + 1; 8001 return i + 1;
8003 } 8002 }
8004 } 8003 }
8005 } 8004 }
8006 return -1; 8005 return -1;
8007 } 8006 }
8008 8007
8009 8008
8010 #define DECLARE_TAG(ignore1, name, ignore2) name, 8009 #define DECLARE_TAG(ignore1, name, ignore2) name,
8011 const char* const VisitorSynchronization::kTags[ 8010 const char* const VisitorSynchronization::kTags[
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
8308 int function_id = iterator.Next(); 8307 int function_id = iterator.Next();
8309 JSFunction* function = 8308 JSFunction* function =
8310 JSFunction::cast(LiteralArray()->get(function_id)); 8309 JSFunction::cast(LiteralArray()->get(function_id));
8311 unsigned height = iterator.Next(); 8310 unsigned height = iterator.Next();
8312 PrintF(out, "{function="); 8311 PrintF(out, "{function=");
8313 function->PrintName(out); 8312 function->PrintName(out);
8314 PrintF(out, ", height=%u}", height); 8313 PrintF(out, ", height=%u}", height);
8315 break; 8314 break;
8316 } 8315 }
8317 8316
8318 case Translation::SETTER_STUB_FRAME: {
8319 int function_id = iterator.Next();
8320 JSFunction* function =
8321 JSFunction::cast(LiteralArray()->get(function_id));
8322 PrintF(out, "{function=");
8323 function->PrintName(out);
8324 PrintF(out, "}");
8325 break;
8326 }
8327
8328 case Translation::DUPLICATE: 8317 case Translation::DUPLICATE:
8329 break; 8318 break;
8330 8319
8331 case Translation::REGISTER: { 8320 case Translation::REGISTER: {
8332 int reg_code = iterator.Next(); 8321 int reg_code = iterator.Next();
8333 PrintF(out, "{input=%s}", converter.NameOfCPURegister(reg_code)); 8322 PrintF(out, "{input=%s}", converter.NameOfCPURegister(reg_code));
8334 break; 8323 break;
8335 } 8324 }
8336 8325
8337 case Translation::INT32_REGISTER: { 8326 case Translation::INT32_REGISTER: {
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
9123 uint32_t index, 9112 uint32_t index,
9124 Object* holder) { 9113 Object* holder) {
9125 Isolate* isolate = GetIsolate(); 9114 Isolate* isolate = GetIsolate();
9126 ASSERT(!structure->IsForeign()); 9115 ASSERT(!structure->IsForeign());
9127 9116
9128 // api style callbacks. 9117 // api style callbacks.
9129 if (structure->IsAccessorInfo()) { 9118 if (structure->IsAccessorInfo()) {
9130 Handle<AccessorInfo> data(AccessorInfo::cast(structure)); 9119 Handle<AccessorInfo> data(AccessorInfo::cast(structure));
9131 Object* fun_obj = data->getter(); 9120 Object* fun_obj = data->getter();
9132 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj); 9121 v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
9133 if (call_fun == NULL) return isolate->heap()->undefined_value();
9134 HandleScope scope(isolate); 9122 HandleScope scope(isolate);
9135 Handle<JSObject> self(JSObject::cast(receiver)); 9123 Handle<JSObject> self(JSObject::cast(receiver));
9136 Handle<JSObject> holder_handle(JSObject::cast(holder)); 9124 Handle<JSObject> holder_handle(JSObject::cast(holder));
9137 Handle<Object> number = isolate->factory()->NewNumberFromUint(index); 9125 Handle<Object> number = isolate->factory()->NewNumberFromUint(index);
9138 Handle<String> key = isolate->factory()->NumberToString(number); 9126 Handle<String> key = isolate->factory()->NumberToString(number);
9139 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key)); 9127 LOG(isolate, ApiNamedPropertyAccess("load", *self, *key));
9140 CustomArguments args(isolate, data->data(), *self, *holder_handle); 9128 CustomArguments args(isolate, data->data(), *self, *holder_handle);
9141 v8::AccessorInfo info(args.end()); 9129 v8::AccessorInfo info(args.end());
9142 v8::Handle<v8::Value> result; 9130 v8::Handle<v8::Value> result;
9143 { 9131 {
(...skipping 4023 matching lines...) Expand 10 before | Expand all | Expand 10 after
13167 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13155 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13168 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13156 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13169 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13157 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13170 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13158 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13171 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13159 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13172 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13160 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13173 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13161 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13174 } 13162 }
13175 13163
13176 } } // namespace v8::internal 13164 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698