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

Side by Side Diff: src/objects.cc

Issue 8417035: Introduce extended mode. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed more comments. Created 9 years, 1 month 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-inl.h » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 7238 matching lines...) Expand 10 before | Expand all | Expand 10 after
7249 } else { 7249 } else {
7250 map()->set_non_instance_prototype(false); 7250 map()->set_non_instance_prototype(false);
7251 } 7251 }
7252 7252
7253 return SetInstancePrototype(construct_prototype); 7253 return SetInstancePrototype(construct_prototype);
7254 } 7254 }
7255 7255
7256 7256
7257 Object* JSFunction::RemovePrototype() { 7257 Object* JSFunction::RemovePrototype() {
7258 Context* global_context = context()->global_context(); 7258 Context* global_context = context()->global_context();
7259 Map* no_prototype_map = shared()->strict_mode() 7259 Map* no_prototype_map = shared()->is_classic_mode()
7260 ? global_context->strict_mode_function_without_prototype_map() 7260 ? global_context->function_without_prototype_map()
7261 : global_context->function_without_prototype_map(); 7261 : global_context->strict_mode_function_without_prototype_map();
7262 7262
7263 if (map() == no_prototype_map) { 7263 if (map() == no_prototype_map) {
7264 // Be idempotent. 7264 // Be idempotent.
7265 return this; 7265 return this;
7266 } 7266 }
7267 7267
7268 ASSERT(!shared()->strict_mode() || 7268 ASSERT(map() == (shared()->is_classic_mode()
7269 map() == global_context->strict_mode_function_map()); 7269 ? global_context->function_map()
7270 ASSERT(shared()->strict_mode() || map() == global_context->function_map()); 7270 : global_context->strict_mode_function_map()));
7271 7271
7272 set_map(no_prototype_map); 7272 set_map(no_prototype_map);
7273 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value()); 7273 set_prototype_or_initial_map(no_prototype_map->GetHeap()->the_hole_value());
7274 return this; 7274 return this;
7275 } 7275 }
7276 7276
7277 7277
7278 Object* JSFunction::SetInstanceClassName(String* name) { 7278 Object* JSFunction::SetInstanceClassName(String* name) {
7279 shared()->set_instance_class_name(name); 7279 shared()->set_instance_class_name(name);
7280 return this; 7280 return this;
(...skipping 3009 matching lines...) Expand 10 before | Expand all | Expand 10 after
10290 String* string_; 10290 String* string_;
10291 uint32_t hash_; 10291 uint32_t hash_;
10292 }; 10292 };
10293 10293
10294 10294
10295 // StringSharedKeys are used as keys in the eval cache. 10295 // StringSharedKeys are used as keys in the eval cache.
10296 class StringSharedKey : public HashTableKey { 10296 class StringSharedKey : public HashTableKey {
10297 public: 10297 public:
10298 StringSharedKey(String* source, 10298 StringSharedKey(String* source,
10299 SharedFunctionInfo* shared, 10299 SharedFunctionInfo* shared,
10300 StrictModeFlag strict_mode, 10300 LanguageMode language_mode,
10301 int scope_position) 10301 int scope_position)
10302 : source_(source), 10302 : source_(source),
10303 shared_(shared), 10303 shared_(shared),
10304 strict_mode_(strict_mode), 10304 language_mode_(language_mode),
10305 scope_position_(scope_position) { } 10305 scope_position_(scope_position) { }
10306 10306
10307 bool IsMatch(Object* other) { 10307 bool IsMatch(Object* other) {
10308 if (!other->IsFixedArray()) return false; 10308 if (!other->IsFixedArray()) return false;
10309 FixedArray* other_array = FixedArray::cast(other); 10309 FixedArray* other_array = FixedArray::cast(other);
10310 SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0)); 10310 SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0));
10311 if (shared != shared_) return false; 10311 if (shared != shared_) return false;
10312 int strict_unchecked = Smi::cast(other_array->get(2))->value(); 10312 int language_unchecked = Smi::cast(other_array->get(2))->value();
10313 ASSERT(strict_unchecked == kStrictMode || 10313 ASSERT(language_unchecked == CLASSIC_MODE ||
10314 strict_unchecked == kNonStrictMode); 10314 language_unchecked == STRICT_MODE ||
10315 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked); 10315 language_unchecked == EXTENDED_MODE);
10316 if (strict_mode != strict_mode_) return false; 10316 LanguageMode language_mode = static_cast<LanguageMode>(language_unchecked);
10317 if (language_mode != language_mode_) return false;
10317 int scope_position = Smi::cast(other_array->get(3))->value(); 10318 int scope_position = Smi::cast(other_array->get(3))->value();
10318 if (scope_position != scope_position_) return false; 10319 if (scope_position != scope_position_) return false;
10319 String* source = String::cast(other_array->get(1)); 10320 String* source = String::cast(other_array->get(1));
10320 return source->Equals(source_); 10321 return source->Equals(source_);
10321 } 10322 }
10322 10323
10323 static uint32_t StringSharedHashHelper(String* source, 10324 static uint32_t StringSharedHashHelper(String* source,
10324 SharedFunctionInfo* shared, 10325 SharedFunctionInfo* shared,
10325 StrictModeFlag strict_mode, 10326 LanguageMode language_mode,
10326 int scope_position) { 10327 int scope_position) {
10327 uint32_t hash = source->Hash(); 10328 uint32_t hash = source->Hash();
10328 if (shared->HasSourceCode()) { 10329 if (shared->HasSourceCode()) {
10329 // Instead of using the SharedFunctionInfo pointer in the hash 10330 // Instead of using the SharedFunctionInfo pointer in the hash
10330 // code computation, we use a combination of the hash of the 10331 // code computation, we use a combination of the hash of the
10331 // script source code and the start position of the calling scope. 10332 // script source code and the start position of the calling scope.
10332 // We do this to ensure that the cache entries can survive garbage 10333 // We do this to ensure that the cache entries can survive garbage
10333 // collection. 10334 // collection.
10334 Script* script = Script::cast(shared->script()); 10335 Script* script = Script::cast(shared->script());
10335 hash ^= String::cast(script->source())->Hash(); 10336 hash ^= String::cast(script->source())->Hash();
10336 if (strict_mode == kStrictMode) hash ^= 0x8000; 10337 if (language_mode == STRICT_MODE) hash ^= 0x8000;
10338 if (language_mode == EXTENDED_MODE) hash ^= 0x0080;
10337 hash += scope_position; 10339 hash += scope_position;
10338 } 10340 }
10339 return hash; 10341 return hash;
10340 } 10342 }
10341 10343
10342 uint32_t Hash() { 10344 uint32_t Hash() {
10343 return StringSharedHashHelper( 10345 return StringSharedHashHelper(
10344 source_, shared_, strict_mode_, scope_position_); 10346 source_, shared_, language_mode_, scope_position_);
10345 } 10347 }
10346 10348
10347 uint32_t HashForObject(Object* obj) { 10349 uint32_t HashForObject(Object* obj) {
10348 FixedArray* other_array = FixedArray::cast(obj); 10350 FixedArray* other_array = FixedArray::cast(obj);
10349 SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0)); 10351 SharedFunctionInfo* shared = SharedFunctionInfo::cast(other_array->get(0));
10350 String* source = String::cast(other_array->get(1)); 10352 String* source = String::cast(other_array->get(1));
10351 int strict_unchecked = Smi::cast(other_array->get(2))->value(); 10353 int language_unchecked = Smi::cast(other_array->get(2))->value();
10352 ASSERT(strict_unchecked == kStrictMode || 10354 ASSERT(language_unchecked == CLASSIC_MODE ||
10353 strict_unchecked == kNonStrictMode); 10355 language_unchecked == STRICT_MODE ||
10354 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked); 10356 language_unchecked == EXTENDED_MODE);
10357 LanguageMode language_mode = static_cast<LanguageMode>(language_unchecked);
10355 int scope_position = Smi::cast(other_array->get(3))->value(); 10358 int scope_position = Smi::cast(other_array->get(3))->value();
10356 return StringSharedHashHelper(source, shared, strict_mode, scope_position); 10359 return StringSharedHashHelper(
10360 source, shared, language_mode, scope_position);
10357 } 10361 }
10358 10362
10359 MUST_USE_RESULT MaybeObject* AsObject() { 10363 MUST_USE_RESULT MaybeObject* AsObject() {
10360 Object* obj; 10364 Object* obj;
10361 { MaybeObject* maybe_obj = source_->GetHeap()->AllocateFixedArray(4); 10365 { MaybeObject* maybe_obj = source_->GetHeap()->AllocateFixedArray(4);
10362 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 10366 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
10363 } 10367 }
10364 FixedArray* other_array = FixedArray::cast(obj); 10368 FixedArray* other_array = FixedArray::cast(obj);
10365 other_array->set(0, shared_); 10369 other_array->set(0, shared_);
10366 other_array->set(1, source_); 10370 other_array->set(1, source_);
10367 other_array->set(2, Smi::FromInt(strict_mode_)); 10371 other_array->set(2, Smi::FromInt(language_mode_));
10368 other_array->set(3, Smi::FromInt(scope_position_)); 10372 other_array->set(3, Smi::FromInt(scope_position_));
10369 return other_array; 10373 return other_array;
10370 } 10374 }
10371 10375
10372 private: 10376 private:
10373 String* source_; 10377 String* source_;
10374 SharedFunctionInfo* shared_; 10378 SharedFunctionInfo* shared_;
10375 StrictModeFlag strict_mode_; 10379 LanguageMode language_mode_;
10376 int scope_position_; 10380 int scope_position_;
10377 }; 10381 };
10378 10382
10379 10383
10380 // RegExpKey carries the source and flags of a regular expression as key. 10384 // RegExpKey carries the source and flags of a regular expression as key.
10381 class RegExpKey : public HashTableKey { 10385 class RegExpKey : public HashTableKey {
10382 public: 10386 public:
10383 RegExpKey(String* string, JSRegExp::Flags flags) 10387 RegExpKey(String* string, JSRegExp::Flags flags)
10384 : string_(string), 10388 : string_(string),
10385 flags_(Smi::FromInt(flags.value())) { } 10389 flags_(Smi::FromInt(flags.value())) { }
(...skipping 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after
11521 Object* CompilationCacheTable::Lookup(String* src) { 11525 Object* CompilationCacheTable::Lookup(String* src) {
11522 StringKey key(src); 11526 StringKey key(src);
11523 int entry = FindEntry(&key); 11527 int entry = FindEntry(&key);
11524 if (entry == kNotFound) return GetHeap()->undefined_value(); 11528 if (entry == kNotFound) return GetHeap()->undefined_value();
11525 return get(EntryToIndex(entry) + 1); 11529 return get(EntryToIndex(entry) + 1);
11526 } 11530 }
11527 11531
11528 11532
11529 Object* CompilationCacheTable::LookupEval(String* src, 11533 Object* CompilationCacheTable::LookupEval(String* src,
11530 Context* context, 11534 Context* context,
11531 StrictModeFlag strict_mode, 11535 LanguageMode language_mode,
11532 int scope_position) { 11536 int scope_position) {
11533 StringSharedKey key(src, 11537 StringSharedKey key(src,
11534 context->closure()->shared(), 11538 context->closure()->shared(),
11535 strict_mode, 11539 language_mode,
11536 scope_position); 11540 scope_position);
11537 int entry = FindEntry(&key); 11541 int entry = FindEntry(&key);
11538 if (entry == kNotFound) return GetHeap()->undefined_value(); 11542 if (entry == kNotFound) return GetHeap()->undefined_value();
11539 return get(EntryToIndex(entry) + 1); 11543 return get(EntryToIndex(entry) + 1);
11540 } 11544 }
11541 11545
11542 11546
11543 Object* CompilationCacheTable::LookupRegExp(String* src, 11547 Object* CompilationCacheTable::LookupRegExp(String* src,
11544 JSRegExp::Flags flags) { 11548 JSRegExp::Flags flags) {
11545 RegExpKey key(src, flags); 11549 RegExpKey key(src, flags);
(...skipping 19 matching lines...) Expand all
11565 return cache; 11569 return cache;
11566 } 11570 }
11567 11571
11568 11572
11569 MaybeObject* CompilationCacheTable::PutEval(String* src, 11573 MaybeObject* CompilationCacheTable::PutEval(String* src,
11570 Context* context, 11574 Context* context,
11571 SharedFunctionInfo* value, 11575 SharedFunctionInfo* value,
11572 int scope_position) { 11576 int scope_position) {
11573 StringSharedKey key(src, 11577 StringSharedKey key(src,
11574 context->closure()->shared(), 11578 context->closure()->shared(),
11575 value->strict_mode_flag(), 11579 value->language_mode(),
11576 scope_position); 11580 scope_position);
11577 Object* obj; 11581 Object* obj;
11578 { MaybeObject* maybe_obj = EnsureCapacity(1, &key); 11582 { MaybeObject* maybe_obj = EnsureCapacity(1, &key);
11579 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 11583 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
11580 } 11584 }
11581 11585
11582 CompilationCacheTable* cache = 11586 CompilationCacheTable* cache =
11583 reinterpret_cast<CompilationCacheTable*>(obj); 11587 reinterpret_cast<CompilationCacheTable*>(obj);
11584 int entry = cache->FindInsertionEntry(key.Hash()); 11588 int entry = cache->FindInsertionEntry(key.Hash());
11585 11589
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after
12536 if (break_point_objects()->IsUndefined()) return 0; 12540 if (break_point_objects()->IsUndefined()) return 0;
12537 // Single break point. 12541 // Single break point.
12538 if (!break_point_objects()->IsFixedArray()) return 1; 12542 if (!break_point_objects()->IsFixedArray()) return 1;
12539 // Multiple break points. 12543 // Multiple break points.
12540 return FixedArray::cast(break_point_objects())->length(); 12544 return FixedArray::cast(break_point_objects())->length();
12541 } 12545 }
12542 #endif // ENABLE_DEBUGGER_SUPPORT 12546 #endif // ENABLE_DEBUGGER_SUPPORT
12543 12547
12544 12548
12545 } } // namespace v8::internal 12549 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698