OLD | NEW |
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 22 matching lines...) Expand all Loading... |
33 #include "src/compilation-cache.h" | 33 #include "src/compilation-cache.h" |
34 #include "src/execution.h" | 34 #include "src/execution.h" |
35 #include "src/factory.h" | 35 #include "src/factory.h" |
36 #include "src/global-handles.h" | 36 #include "src/global-handles.h" |
37 #include "src/ic/ic.h" | 37 #include "src/ic/ic.h" |
38 #include "src/macro-assembler.h" | 38 #include "src/macro-assembler.h" |
39 #include "src/snapshot.h" | 39 #include "src/snapshot.h" |
40 #include "test/cctest/cctest.h" | 40 #include "test/cctest/cctest.h" |
41 | 41 |
42 using namespace v8::internal; | 42 using namespace v8::internal; |
| 43 using v8::Just; |
43 | 44 |
44 static void CheckMap(Map* map, int type, int instance_size) { | 45 static void CheckMap(Map* map, int type, int instance_size) { |
45 CHECK(map->IsHeapObject()); | 46 CHECK(map->IsHeapObject()); |
46 #ifdef DEBUG | 47 #ifdef DEBUG |
47 CHECK(CcTest::heap()->Contains(map)); | 48 CHECK(CcTest::heap()->Contains(map)); |
48 #endif | 49 #endif |
49 CHECK_EQ(CcTest::heap()->meta_map(), map->map()); | 50 CHECK_EQ(CcTest::heap()->meta_map(), map->map()); |
50 CHECK_EQ(type, map->instance_type()); | 51 CHECK_EQ(type, map->instance_type()); |
51 CHECK_EQ(instance_size, map->instance_size()); | 52 CHECK_EQ(instance_size, map->instance_size()); |
52 } | 53 } |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 // nan oddball checks | 185 // nan oddball checks |
185 CHECK(factory->nan_value()->IsNumber()); | 186 CHECK(factory->nan_value()->IsNumber()); |
186 CHECK(std::isnan(factory->nan_value()->Number())); | 187 CHECK(std::isnan(factory->nan_value()->Number())); |
187 | 188 |
188 Handle<String> s = factory->NewStringFromStaticChars("fisk hest "); | 189 Handle<String> s = factory->NewStringFromStaticChars("fisk hest "); |
189 CHECK(s->IsString()); | 190 CHECK(s->IsString()); |
190 CHECK_EQ(10, s->length()); | 191 CHECK_EQ(10, s->length()); |
191 | 192 |
192 Handle<String> object_string = Handle<String>::cast(factory->Object_string()); | 193 Handle<String> object_string = Handle<String>::cast(factory->Object_string()); |
193 Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object()); | 194 Handle<GlobalObject> global(CcTest::i_isolate()->context()->global_object()); |
194 v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(global, object_string); | 195 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, object_string)); |
195 CHECK(maybe.has_value); | |
196 CHECK(maybe.value); | |
197 | 196 |
198 // Check ToString for oddballs | 197 // Check ToString for oddballs |
199 CheckOddball(isolate, heap->true_value(), "true"); | 198 CheckOddball(isolate, heap->true_value(), "true"); |
200 CheckOddball(isolate, heap->false_value(), "false"); | 199 CheckOddball(isolate, heap->false_value(), "false"); |
201 CheckOddball(isolate, heap->null_value(), "null"); | 200 CheckOddball(isolate, heap->null_value(), "null"); |
202 CheckOddball(isolate, heap->undefined_value(), "undefined"); | 201 CheckOddball(isolate, heap->undefined_value(), "undefined"); |
203 | 202 |
204 // Check ToString for Smis | 203 // Check ToString for Smis |
205 CheckSmi(isolate, 0, "0"); | 204 CheckSmi(isolate, 0, "0"); |
206 CheckSmi(isolate, 42, "42"); | 205 CheckSmi(isolate, 42, "42"); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 252 |
254 CHECK_EQ(Smi::FromInt(23), | 253 CHECK_EQ(Smi::FromInt(23), |
255 *Object::GetProperty(obj, prop_name).ToHandleChecked()); | 254 *Object::GetProperty(obj, prop_name).ToHandleChecked()); |
256 CHECK_EQ(Smi::FromInt(24), | 255 CHECK_EQ(Smi::FromInt(24), |
257 *Object::GetProperty(obj, prop_namex).ToHandleChecked()); | 256 *Object::GetProperty(obj, prop_namex).ToHandleChecked()); |
258 } | 257 } |
259 | 258 |
260 heap->CollectGarbage(NEW_SPACE); | 259 heap->CollectGarbage(NEW_SPACE); |
261 | 260 |
262 // Function should be alive. | 261 // Function should be alive. |
263 v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(global, name); | 262 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, name)); |
264 CHECK(maybe.has_value); | |
265 CHECK(maybe.value); | |
266 // Check function is retained. | 263 // Check function is retained. |
267 Handle<Object> func_value = | 264 Handle<Object> func_value = |
268 Object::GetProperty(global, name).ToHandleChecked(); | 265 Object::GetProperty(global, name).ToHandleChecked(); |
269 CHECK(func_value->IsJSFunction()); | 266 CHECK(func_value->IsJSFunction()); |
270 Handle<JSFunction> function = Handle<JSFunction>::cast(func_value); | 267 Handle<JSFunction> function = Handle<JSFunction>::cast(func_value); |
271 | 268 |
272 { | 269 { |
273 HandleScope inner_scope(isolate); | 270 HandleScope inner_scope(isolate); |
274 // Allocate another object, make it reachable from global. | 271 // Allocate another object, make it reachable from global. |
275 Handle<JSObject> obj = factory->NewJSObject(function); | 272 Handle<JSObject> obj = factory->NewJSObject(function); |
276 JSReceiver::SetProperty(global, obj_name, obj, SLOPPY).Check(); | 273 JSReceiver::SetProperty(global, obj_name, obj, SLOPPY).Check(); |
277 JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check(); | 274 JSReceiver::SetProperty(obj, prop_name, twenty_three, SLOPPY).Check(); |
278 } | 275 } |
279 | 276 |
280 // After gc, it should survive. | 277 // After gc, it should survive. |
281 heap->CollectGarbage(NEW_SPACE); | 278 heap->CollectGarbage(NEW_SPACE); |
282 | 279 |
283 maybe = JSReceiver::HasOwnProperty(global, obj_name); | 280 CHECK(Just(true) == JSReceiver::HasOwnProperty(global, obj_name)); |
284 CHECK(maybe.has_value); | |
285 CHECK(maybe.value); | |
286 Handle<Object> obj = | 281 Handle<Object> obj = |
287 Object::GetProperty(global, obj_name).ToHandleChecked(); | 282 Object::GetProperty(global, obj_name).ToHandleChecked(); |
288 CHECK(obj->IsJSObject()); | 283 CHECK(obj->IsJSObject()); |
289 CHECK_EQ(Smi::FromInt(23), | 284 CHECK_EQ(Smi::FromInt(23), |
290 *Object::GetProperty(obj, prop_name).ToHandleChecked()); | 285 *Object::GetProperty(obj, prop_name).ToHandleChecked()); |
291 } | 286 } |
292 | 287 |
293 | 288 |
294 static void VerifyStringAllocation(Isolate* isolate, const char* string) { | 289 static void VerifyStringAllocation(Isolate* isolate, const char* string) { |
295 HandleScope scope(isolate); | 290 HandleScope scope(isolate); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 CcTest::i_isolate()->global_object(), object_string).ToHandleChecked(); | 627 CcTest::i_isolate()->global_object(), object_string).ToHandleChecked(); |
633 Handle<JSFunction> constructor = Handle<JSFunction>::cast(object); | 628 Handle<JSFunction> constructor = Handle<JSFunction>::cast(object); |
634 Handle<JSObject> obj = factory->NewJSObject(constructor); | 629 Handle<JSObject> obj = factory->NewJSObject(constructor); |
635 Handle<String> first = factory->InternalizeUtf8String("first"); | 630 Handle<String> first = factory->InternalizeUtf8String("first"); |
636 Handle<String> second = factory->InternalizeUtf8String("second"); | 631 Handle<String> second = factory->InternalizeUtf8String("second"); |
637 | 632 |
638 Handle<Smi> one(Smi::FromInt(1), isolate); | 633 Handle<Smi> one(Smi::FromInt(1), isolate); |
639 Handle<Smi> two(Smi::FromInt(2), isolate); | 634 Handle<Smi> two(Smi::FromInt(2), isolate); |
640 | 635 |
641 // check for empty | 636 // check for empty |
642 v8::Maybe<bool> maybe = JSReceiver::HasOwnProperty(obj, first); | 637 CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); |
643 CHECK(maybe.has_value); | |
644 CHECK(!maybe.value); | |
645 | 638 |
646 // add first | 639 // add first |
647 JSReceiver::SetProperty(obj, first, one, SLOPPY).Check(); | 640 JSReceiver::SetProperty(obj, first, one, SLOPPY).Check(); |
648 maybe = JSReceiver::HasOwnProperty(obj, first); | 641 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); |
649 CHECK(maybe.has_value); | |
650 CHECK(maybe.value); | |
651 | 642 |
652 // delete first | 643 // delete first |
653 JSReceiver::DeleteProperty(obj, first, SLOPPY).Check(); | 644 JSReceiver::DeleteProperty(obj, first, SLOPPY).Check(); |
654 maybe = JSReceiver::HasOwnProperty(obj, first); | 645 CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); |
655 CHECK(maybe.has_value); | |
656 CHECK(!maybe.value); | |
657 | 646 |
658 // add first and then second | 647 // add first and then second |
659 JSReceiver::SetProperty(obj, first, one, SLOPPY).Check(); | 648 JSReceiver::SetProperty(obj, first, one, SLOPPY).Check(); |
660 JSReceiver::SetProperty(obj, second, two, SLOPPY).Check(); | 649 JSReceiver::SetProperty(obj, second, two, SLOPPY).Check(); |
661 maybe = JSReceiver::HasOwnProperty(obj, first); | 650 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); |
662 CHECK(maybe.has_value); | 651 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, second)); |
663 CHECK(maybe.value); | |
664 maybe = JSReceiver::HasOwnProperty(obj, second); | |
665 CHECK(maybe.has_value); | |
666 CHECK(maybe.value); | |
667 | 652 |
668 // delete first and then second | 653 // delete first and then second |
669 JSReceiver::DeleteProperty(obj, first, SLOPPY).Check(); | 654 JSReceiver::DeleteProperty(obj, first, SLOPPY).Check(); |
670 maybe = JSReceiver::HasOwnProperty(obj, second); | 655 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, second)); |
671 CHECK(maybe.has_value); | |
672 CHECK(maybe.value); | |
673 JSReceiver::DeleteProperty(obj, second, SLOPPY).Check(); | 656 JSReceiver::DeleteProperty(obj, second, SLOPPY).Check(); |
674 maybe = JSReceiver::HasOwnProperty(obj, first); | 657 CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); |
675 CHECK(maybe.has_value); | 658 CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, second)); |
676 CHECK(!maybe.value); | |
677 maybe = JSReceiver::HasOwnProperty(obj, second); | |
678 CHECK(maybe.has_value); | |
679 CHECK(!maybe.value); | |
680 | 659 |
681 // add first and then second | 660 // add first and then second |
682 JSReceiver::SetProperty(obj, first, one, SLOPPY).Check(); | 661 JSReceiver::SetProperty(obj, first, one, SLOPPY).Check(); |
683 JSReceiver::SetProperty(obj, second, two, SLOPPY).Check(); | 662 JSReceiver::SetProperty(obj, second, two, SLOPPY).Check(); |
684 maybe = JSReceiver::HasOwnProperty(obj, first); | 663 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); |
685 CHECK(maybe.has_value); | 664 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, second)); |
686 CHECK(maybe.value); | |
687 maybe = JSReceiver::HasOwnProperty(obj, second); | |
688 CHECK(maybe.has_value); | |
689 CHECK(maybe.value); | |
690 | 665 |
691 // delete second and then first | 666 // delete second and then first |
692 JSReceiver::DeleteProperty(obj, second, SLOPPY).Check(); | 667 JSReceiver::DeleteProperty(obj, second, SLOPPY).Check(); |
693 maybe = JSReceiver::HasOwnProperty(obj, first); | 668 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, first)); |
694 CHECK(maybe.has_value); | |
695 CHECK(maybe.value); | |
696 JSReceiver::DeleteProperty(obj, first, SLOPPY).Check(); | 669 JSReceiver::DeleteProperty(obj, first, SLOPPY).Check(); |
697 maybe = JSReceiver::HasOwnProperty(obj, first); | 670 CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, first)); |
698 CHECK(maybe.has_value); | 671 CHECK(Just(false) == JSReceiver::HasOwnProperty(obj, second)); |
699 CHECK(!maybe.value); | |
700 maybe = JSReceiver::HasOwnProperty(obj, second); | |
701 CHECK(maybe.has_value); | |
702 CHECK(!maybe.value); | |
703 | 672 |
704 // check string and internalized string match | 673 // check string and internalized string match |
705 const char* string1 = "fisk"; | 674 const char* string1 = "fisk"; |
706 Handle<String> s1 = factory->NewStringFromAsciiChecked(string1); | 675 Handle<String> s1 = factory->NewStringFromAsciiChecked(string1); |
707 JSReceiver::SetProperty(obj, s1, one, SLOPPY).Check(); | 676 JSReceiver::SetProperty(obj, s1, one, SLOPPY).Check(); |
708 Handle<String> s1_string = factory->InternalizeUtf8String(string1); | 677 Handle<String> s1_string = factory->InternalizeUtf8String(string1); |
709 maybe = JSReceiver::HasOwnProperty(obj, s1_string); | 678 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, s1_string)); |
710 CHECK(maybe.has_value); | |
711 CHECK(maybe.value); | |
712 | 679 |
713 // check internalized string and string match | 680 // check internalized string and string match |
714 const char* string2 = "fugl"; | 681 const char* string2 = "fugl"; |
715 Handle<String> s2_string = factory->InternalizeUtf8String(string2); | 682 Handle<String> s2_string = factory->InternalizeUtf8String(string2); |
716 JSReceiver::SetProperty(obj, s2_string, one, SLOPPY).Check(); | 683 JSReceiver::SetProperty(obj, s2_string, one, SLOPPY).Check(); |
717 Handle<String> s2 = factory->NewStringFromAsciiChecked(string2); | 684 Handle<String> s2 = factory->NewStringFromAsciiChecked(string2); |
718 maybe = JSReceiver::HasOwnProperty(obj, s2); | 685 CHECK(Just(true) == JSReceiver::HasOwnProperty(obj, s2)); |
719 CHECK(maybe.has_value); | |
720 CHECK(maybe.value); | |
721 } | 686 } |
722 | 687 |
723 | 688 |
724 TEST(JSObjectMaps) { | 689 TEST(JSObjectMaps) { |
725 CcTest::InitializeVM(); | 690 CcTest::InitializeVM(); |
726 Isolate* isolate = CcTest::i_isolate(); | 691 Isolate* isolate = CcTest::i_isolate(); |
727 Factory* factory = isolate->factory(); | 692 Factory* factory = isolate->factory(); |
728 | 693 |
729 v8::HandleScope sc(CcTest::isolate()); | 694 v8::HandleScope sc(CcTest::isolate()); |
730 Handle<String> name = factory->InternalizeUtf8String("theFunction"); | 695 Handle<String> name = factory->InternalizeUtf8String("theFunction"); |
(...skipping 4389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5120 #ifdef DEBUG | 5085 #ifdef DEBUG |
5121 TEST(PathTracer) { | 5086 TEST(PathTracer) { |
5122 CcTest::InitializeVM(); | 5087 CcTest::InitializeVM(); |
5123 v8::HandleScope scope(CcTest::isolate()); | 5088 v8::HandleScope scope(CcTest::isolate()); |
5124 | 5089 |
5125 v8::Local<v8::Value> result = CompileRun("'abc'"); | 5090 v8::Local<v8::Value> result = CompileRun("'abc'"); |
5126 Handle<Object> o = v8::Utils::OpenHandle(*result); | 5091 Handle<Object> o = v8::Utils::OpenHandle(*result); |
5127 CcTest::i_isolate()->heap()->TracePathToObject(*o); | 5092 CcTest::i_isolate()->heap()->TracePathToObject(*o); |
5128 } | 5093 } |
5129 #endif // DEBUG | 5094 #endif // DEBUG |
OLD | NEW |