| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 | 2 |
| 3 #include <stdlib.h> | 3 #include <stdlib.h> |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "execution.h" | 7 #include "execution.h" |
| 8 #include "factory.h" | 8 #include "factory.h" |
| 9 #include "macro-assembler.h" | 9 #include "macro-assembler.h" |
| 10 #include "global-handles.h" | 10 #include "global-handles.h" |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 | 147 |
| 148 // nan oddball checks | 148 // nan oddball checks |
| 149 CHECK(HEAP->nan_value()->IsNumber()); | 149 CHECK(HEAP->nan_value()->IsNumber()); |
| 150 CHECK(isnan(HEAP->nan_value()->Number())); | 150 CHECK(isnan(HEAP->nan_value()->Number())); |
| 151 | 151 |
| 152 Handle<String> s = Factory::NewStringFromAscii(CStrVector("fisk hest ")); | 152 Handle<String> s = Factory::NewStringFromAscii(CStrVector("fisk hest ")); |
| 153 CHECK(s->IsString()); | 153 CHECK(s->IsString()); |
| 154 CHECK_EQ(10, s->length()); | 154 CHECK_EQ(10, s->length()); |
| 155 | 155 |
| 156 String* object_symbol = String::cast(HEAP->Object_symbol()); | 156 String* object_symbol = String::cast(HEAP->Object_symbol()); |
| 157 CHECK(Top::context()->global()->HasLocalProperty(object_symbol)); | 157 CHECK( |
| 158 Isolate::Current()->context()->global()->HasLocalProperty(object_symbol)); |
| 158 | 159 |
| 159 // Check ToString for oddballs | 160 // Check ToString for oddballs |
| 160 CheckOddball(HEAP->true_value(), "true"); | 161 CheckOddball(HEAP->true_value(), "true"); |
| 161 CheckOddball(HEAP->false_value(), "false"); | 162 CheckOddball(HEAP->false_value(), "false"); |
| 162 CheckOddball(HEAP->null_value(), "null"); | 163 CheckOddball(HEAP->null_value(), "null"); |
| 163 CheckOddball(HEAP->undefined_value(), "undefined"); | 164 CheckOddball(HEAP->undefined_value(), "undefined"); |
| 164 | 165 |
| 165 // Check ToString for Smis | 166 // Check ToString for Smis |
| 166 CheckSmi(0, "0"); | 167 CheckSmi(0, "0"); |
| 167 CheckSmi(42, "42"); | 168 CheckSmi(42, "42"); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 Handle<String> obj_name = Factory::LookupAsciiSymbol("theObject"); | 207 Handle<String> obj_name = Factory::LookupAsciiSymbol("theObject"); |
| 207 | 208 |
| 208 { | 209 { |
| 209 v8::HandleScope inner_scope; | 210 v8::HandleScope inner_scope; |
| 210 // Allocate a function and keep it in global object's property. | 211 // Allocate a function and keep it in global object's property. |
| 211 Handle<JSFunction> function = | 212 Handle<JSFunction> function = |
| 212 Factory::NewFunction(name, Factory::undefined_value()); | 213 Factory::NewFunction(name, Factory::undefined_value()); |
| 213 Handle<Map> initial_map = | 214 Handle<Map> initial_map = |
| 214 Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 215 Factory::NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
| 215 function->set_initial_map(*initial_map); | 216 function->set_initial_map(*initial_map); |
| 216 Top::context()->global()->SetProperty(*name, *function, NONE); | 217 Isolate::Current()->context()->global()->SetProperty(*name, *function, |
| 218 NONE); |
| 217 // Allocate an object. Unrooted after leaving the scope. | 219 // Allocate an object. Unrooted after leaving the scope. |
| 218 Handle<JSObject> obj = Factory::NewJSObject(function); | 220 Handle<JSObject> obj = Factory::NewJSObject(function); |
| 219 obj->SetProperty(*prop_name, Smi::FromInt(23), NONE); | 221 obj->SetProperty(*prop_name, Smi::FromInt(23), NONE); |
| 220 obj->SetProperty(*prop_namex, Smi::FromInt(24), NONE); | 222 obj->SetProperty(*prop_namex, Smi::FromInt(24), NONE); |
| 221 | 223 |
| 222 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 224 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 223 CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex)); | 225 CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex)); |
| 224 } | 226 } |
| 225 | 227 |
| 226 CHECK(HEAP->CollectGarbage(free_bytes, NEW_SPACE)); | 228 CHECK(HEAP->CollectGarbage(free_bytes, NEW_SPACE)); |
| 227 | 229 |
| 228 // Function should be alive. | 230 // Function should be alive. |
| 229 CHECK(Top::context()->global()->HasLocalProperty(*name)); | 231 CHECK(Isolate::Current()->context()->global()->HasLocalProperty(*name)); |
| 230 // Check function is retained. | 232 // Check function is retained. |
| 231 Object* func_value = Top::context()->global()->GetProperty(*name); | 233 Object* func_value = |
| 234 Isolate::Current()->context()->global()->GetProperty(*name); |
| 232 CHECK(func_value->IsJSFunction()); | 235 CHECK(func_value->IsJSFunction()); |
| 233 Handle<JSFunction> function(JSFunction::cast(func_value)); | 236 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 234 | 237 |
| 235 { | 238 { |
| 236 HandleScope inner_scope; | 239 HandleScope inner_scope; |
| 237 // Allocate another object, make it reachable from global. | 240 // Allocate another object, make it reachable from global. |
| 238 Handle<JSObject> obj = Factory::NewJSObject(function); | 241 Handle<JSObject> obj = Factory::NewJSObject(function); |
| 239 Top::context()->global()->SetProperty(*obj_name, *obj, NONE); | 242 Isolate::Current()->context()->global()->SetProperty(*obj_name, *obj, NONE); |
| 240 obj->SetProperty(*prop_name, Smi::FromInt(23), NONE); | 243 obj->SetProperty(*prop_name, Smi::FromInt(23), NONE); |
| 241 } | 244 } |
| 242 | 245 |
| 243 // After gc, it should survive. | 246 // After gc, it should survive. |
| 244 CHECK(HEAP->CollectGarbage(free_bytes, NEW_SPACE)); | 247 CHECK(HEAP->CollectGarbage(free_bytes, NEW_SPACE)); |
| 245 | 248 |
| 246 CHECK(Top::context()->global()->HasLocalProperty(*obj_name)); | 249 CHECK(Isolate::Current()->context()->global()->HasLocalProperty(*obj_name)); |
| 247 CHECK(Top::context()->global()->GetProperty(*obj_name)->IsJSObject()); | 250 CHECK(Isolate::Current()->context()->global()->GetProperty(*obj_name)-> |
| 251 IsJSObject()); |
| 248 JSObject* obj = | 252 JSObject* obj = |
| 249 JSObject::cast(Top::context()->global()->GetProperty(*obj_name)); | 253 JSObject::cast(Isolate::Current()->context()->global()-> |
| 254 GetProperty(*obj_name)); |
| 250 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 255 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 251 } | 256 } |
| 252 | 257 |
| 253 | 258 |
| 254 static void VerifyStringAllocation(const char* string) { | 259 static void VerifyStringAllocation(const char* string) { |
| 255 v8::HandleScope scope; | 260 v8::HandleScope scope; |
| 256 Handle<String> s = Factory::NewStringFromUtf8(CStrVector(string)); | 261 Handle<String> s = Factory::NewStringFromUtf8(CStrVector(string)); |
| 257 CHECK_EQ(StrLength(string), s->length()); | 262 CHECK_EQ(StrLength(string), s->length()); |
| 258 for (int index = 0; index < s->length(); index++) { | 263 for (int index = 0; index < s->length(); index++) { |
| 259 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); | 264 CHECK_EQ(static_cast<uint16_t>(string[index]), s->Get(index)); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); | 553 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); |
| 549 } | 554 } |
| 550 | 555 |
| 551 | 556 |
| 552 TEST(ObjectProperties) { | 557 TEST(ObjectProperties) { |
| 553 InitializeVM(); | 558 InitializeVM(); |
| 554 | 559 |
| 555 v8::HandleScope sc; | 560 v8::HandleScope sc; |
| 556 String* object_symbol = String::cast(HEAP->Object_symbol()); | 561 String* object_symbol = String::cast(HEAP->Object_symbol()); |
| 557 JSFunction* object_function = | 562 JSFunction* object_function = |
| 558 JSFunction::cast(Top::context()->global()->GetProperty(object_symbol)); | 563 JSFunction::cast(Isolate::Current()->context()->global()-> |
| 564 GetProperty(object_symbol)); |
| 559 Handle<JSFunction> constructor(object_function); | 565 Handle<JSFunction> constructor(object_function); |
| 560 Handle<JSObject> obj = Factory::NewJSObject(constructor); | 566 Handle<JSObject> obj = Factory::NewJSObject(constructor); |
| 561 Handle<String> first = Factory::LookupAsciiSymbol("first"); | 567 Handle<String> first = Factory::LookupAsciiSymbol("first"); |
| 562 Handle<String> second = Factory::LookupAsciiSymbol("second"); | 568 Handle<String> second = Factory::LookupAsciiSymbol("second"); |
| 563 | 569 |
| 564 // check for empty | 570 // check for empty |
| 565 CHECK(!obj->HasLocalProperty(*first)); | 571 CHECK(!obj->HasLocalProperty(*first)); |
| 566 | 572 |
| 567 // add first | 573 // add first |
| 568 obj->SetProperty(*first, Smi::FromInt(1), NONE); | 574 obj->SetProperty(*first, Smi::FromInt(1), NONE); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 CHECK(*initial_map != obj->map()); | 642 CHECK(*initial_map != obj->map()); |
| 637 } | 643 } |
| 638 | 644 |
| 639 | 645 |
| 640 TEST(JSArray) { | 646 TEST(JSArray) { |
| 641 InitializeVM(); | 647 InitializeVM(); |
| 642 | 648 |
| 643 v8::HandleScope sc; | 649 v8::HandleScope sc; |
| 644 Handle<String> name = Factory::LookupAsciiSymbol("Array"); | 650 Handle<String> name = Factory::LookupAsciiSymbol("Array"); |
| 645 Handle<JSFunction> function = Handle<JSFunction>( | 651 Handle<JSFunction> function = Handle<JSFunction>( |
| 646 JSFunction::cast(Top::context()->global()->GetProperty(*name))); | 652 JSFunction::cast(Isolate::Current()->context()->global()-> |
| 653 GetProperty(*name))); |
| 647 | 654 |
| 648 // Allocate the object. | 655 // Allocate the object. |
| 649 Handle<JSObject> object = Factory::NewJSObject(function); | 656 Handle<JSObject> object = Factory::NewJSObject(function); |
| 650 Handle<JSArray> array = Handle<JSArray>::cast(object); | 657 Handle<JSArray> array = Handle<JSArray>::cast(object); |
| 651 array->Initialize(0); | 658 array->Initialize(0); |
| 652 | 659 |
| 653 // Set array length to 0. | 660 // Set array length to 0. |
| 654 array->SetElementsLength(Smi::FromInt(0)); | 661 array->SetElementsLength(Smi::FromInt(0)); |
| 655 CHECK_EQ(Smi::FromInt(0), array->length()); | 662 CHECK_EQ(Smi::FromInt(0), array->length()); |
| 656 CHECK(array->HasFastElements()); // Must be in fast mode. | 663 CHECK(array->HasFastElements()); // Must be in fast mode. |
| (...skipping 22 matching lines...) Expand all Loading... |
| 679 CHECK_EQ(array->GetElement(0), *name); | 686 CHECK_EQ(array->GetElement(0), *name); |
| 680 } | 687 } |
| 681 | 688 |
| 682 | 689 |
| 683 TEST(JSObjectCopy) { | 690 TEST(JSObjectCopy) { |
| 684 InitializeVM(); | 691 InitializeVM(); |
| 685 | 692 |
| 686 v8::HandleScope sc; | 693 v8::HandleScope sc; |
| 687 String* object_symbol = String::cast(HEAP->Object_symbol()); | 694 String* object_symbol = String::cast(HEAP->Object_symbol()); |
| 688 JSFunction* object_function = | 695 JSFunction* object_function = |
| 689 JSFunction::cast(Top::context()->global()->GetProperty(object_symbol)); | 696 JSFunction::cast(Isolate::Current()->context()->global()-> |
| 697 GetProperty(object_symbol)); |
| 690 Handle<JSFunction> constructor(object_function); | 698 Handle<JSFunction> constructor(object_function); |
| 691 Handle<JSObject> obj = Factory::NewJSObject(constructor); | 699 Handle<JSObject> obj = Factory::NewJSObject(constructor); |
| 692 Handle<String> first = Factory::LookupAsciiSymbol("first"); | 700 Handle<String> first = Factory::LookupAsciiSymbol("first"); |
| 693 Handle<String> second = Factory::LookupAsciiSymbol("second"); | 701 Handle<String> second = Factory::LookupAsciiSymbol("second"); |
| 694 | 702 |
| 695 obj->SetProperty(*first, Smi::FromInt(1), NONE); | 703 obj->SetProperty(*first, Smi::FromInt(1), NONE); |
| 696 obj->SetProperty(*second, Smi::FromInt(2), NONE); | 704 obj->SetProperty(*second, Smi::FromInt(2), NONE); |
| 697 | 705 |
| 698 obj->SetElement(0, *first); | 706 obj->SetElement(0, *first); |
| 699 obj->SetElement(1, *second); | 707 obj->SetElement(1, *second); |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 bool force_compaction = true; | 892 bool force_compaction = true; |
| 885 HEAP->CollectAllGarbage(force_compaction); | 893 HEAP->CollectAllGarbage(force_compaction); |
| 886 | 894 |
| 887 v8::HandleScope scope; | 895 v8::HandleScope scope; |
| 888 | 896 |
| 889 // The plan: create JSObject which references objects in new space. | 897 // The plan: create JSObject which references objects in new space. |
| 890 // Then clone this object (forcing it to go into old space) and check | 898 // Then clone this object (forcing it to go into old space) and check |
| 891 // that region dirty marks are updated correctly. | 899 // that region dirty marks are updated correctly. |
| 892 | 900 |
| 893 // Step 1: prepare a map for the object. We add 1 inobject property to it. | 901 // Step 1: prepare a map for the object. We add 1 inobject property to it. |
| 894 Handle<JSFunction> object_ctor(Top::global_context()->object_function()); | 902 Handle<JSFunction> object_ctor( |
| 903 Isolate::Current()->global_context()->object_function()); |
| 895 CHECK(object_ctor->has_initial_map()); | 904 CHECK(object_ctor->has_initial_map()); |
| 896 Handle<Map> object_map(object_ctor->initial_map()); | 905 Handle<Map> object_map(object_ctor->initial_map()); |
| 897 // Create a map with single inobject property. | 906 // Create a map with single inobject property. |
| 898 Handle<Map> my_map = Factory::CopyMap(object_map, 1); | 907 Handle<Map> my_map = Factory::CopyMap(object_map, 1); |
| 899 int n_properties = my_map->inobject_properties(); | 908 int n_properties = my_map->inobject_properties(); |
| 900 CHECK_GT(n_properties, 0); | 909 CHECK_GT(n_properties, 0); |
| 901 | 910 |
| 902 int object_size = my_map->instance_size(); | 911 int object_size = my_map->instance_size(); |
| 903 | 912 |
| 904 // Step 2: allocate a lot of objects so to almost fill new space: we need | 913 // Step 2: allocate a lot of objects so to almost fill new space: we need |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 " var y = 42;" | 978 " var y = 42;" |
| 970 " var z = x + y;" | 979 " var z = x + y;" |
| 971 "};" | 980 "};" |
| 972 "foo()"; | 981 "foo()"; |
| 973 Handle<String> foo_name = Factory::LookupAsciiSymbol("foo"); | 982 Handle<String> foo_name = Factory::LookupAsciiSymbol("foo"); |
| 974 | 983 |
| 975 // This compile will add the code to the compilation cache. | 984 // This compile will add the code to the compilation cache. |
| 976 CompileRun(source); | 985 CompileRun(source); |
| 977 | 986 |
| 978 // Check function is compiled. | 987 // Check function is compiled. |
| 979 Object* func_value = Top::context()->global()->GetProperty(*foo_name); | 988 Object* func_value = |
| 989 Isolate::Current()->context()->global()->GetProperty(*foo_name); |
| 980 CHECK(func_value->IsJSFunction()); | 990 CHECK(func_value->IsJSFunction()); |
| 981 Handle<JSFunction> function(JSFunction::cast(func_value)); | 991 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 982 CHECK(function->shared()->is_compiled()); | 992 CHECK(function->shared()->is_compiled()); |
| 983 | 993 |
| 984 HEAP->CollectAllGarbage(true); | 994 HEAP->CollectAllGarbage(true); |
| 985 HEAP->CollectAllGarbage(true); | 995 HEAP->CollectAllGarbage(true); |
| 986 | 996 |
| 987 // foo should still be in the compilation cache and therefore not | 997 // foo should still be in the compilation cache and therefore not |
| 988 // have been removed. | 998 // have been removed. |
| 989 CHECK(function->shared()->is_compiled()); | 999 CHECK(function->shared()->is_compiled()); |
| 990 HEAP->CollectAllGarbage(true); | 1000 HEAP->CollectAllGarbage(true); |
| 991 HEAP->CollectAllGarbage(true); | 1001 HEAP->CollectAllGarbage(true); |
| 992 HEAP->CollectAllGarbage(true); | 1002 HEAP->CollectAllGarbage(true); |
| 993 HEAP->CollectAllGarbage(true); | 1003 HEAP->CollectAllGarbage(true); |
| 994 | 1004 |
| 995 // foo should no longer be in the compilation cache | 1005 // foo should no longer be in the compilation cache |
| 996 CHECK(!function->shared()->is_compiled()); | 1006 CHECK(!function->shared()->is_compiled()); |
| 997 // Call foo to get it recompiled. | 1007 // Call foo to get it recompiled. |
| 998 CompileRun("foo()"); | 1008 CompileRun("foo()"); |
| 999 CHECK(function->shared()->is_compiled()); | 1009 CHECK(function->shared()->is_compiled()); |
| 1000 } | 1010 } |
| OLD | NEW |