| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 // nan oddball checks | 150 // nan oddball checks |
| 151 CHECK(HEAP->nan_value()->IsNumber()); | 151 CHECK(HEAP->nan_value()->IsNumber()); |
| 152 CHECK(isnan(HEAP->nan_value()->Number())); | 152 CHECK(isnan(HEAP->nan_value()->Number())); |
| 153 | 153 |
| 154 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector("fisk hest ")); | 154 Handle<String> s = FACTORY->NewStringFromAscii(CStrVector("fisk hest ")); |
| 155 CHECK(s->IsString()); | 155 CHECK(s->IsString()); |
| 156 CHECK_EQ(10, s->length()); | 156 CHECK_EQ(10, s->length()); |
| 157 | 157 |
| 158 String* object_symbol = String::cast(HEAP->Object_symbol()); | 158 String* object_symbol = String::cast(HEAP->Object_symbol()); |
| 159 CHECK( | 159 CHECK( |
| 160 Isolate::Current()->context()->global()->HasLocalProperty(object_symbol)); | 160 Isolate::Current()->context()->global_object()->HasLocalProperty( |
| 161 object_symbol)); |
| 161 | 162 |
| 162 // Check ToString for oddballs | 163 // Check ToString for oddballs |
| 163 CheckOddball(HEAP->true_value(), "true"); | 164 CheckOddball(HEAP->true_value(), "true"); |
| 164 CheckOddball(HEAP->false_value(), "false"); | 165 CheckOddball(HEAP->false_value(), "false"); |
| 165 CheckOddball(HEAP->null_value(), "null"); | 166 CheckOddball(HEAP->null_value(), "null"); |
| 166 CheckOddball(HEAP->undefined_value(), "undefined"); | 167 CheckOddball(HEAP->undefined_value(), "undefined"); |
| 167 | 168 |
| 168 // Check ToString for Smis | 169 // Check ToString for Smis |
| 169 CheckSmi(0, "0"); | 170 CheckSmi(0, "0"); |
| 170 CheckSmi(42, "42"); | 171 CheckSmi(42, "42"); |
| (...skipping 35 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 Isolate::Current()->context()->global()->SetProperty( | 217 Isolate::Current()->context()->global_object()->SetProperty( |
| 217 *name, *function, NONE, kNonStrictMode)->ToObjectChecked(); | 218 *name, *function, NONE, kNonStrictMode)->ToObjectChecked(); |
| 218 // Allocate an object. Unrooted after leaving the scope. | 219 // Allocate an object. Unrooted after leaving the scope. |
| 219 Handle<JSObject> obj = FACTORY->NewJSObject(function); | 220 Handle<JSObject> obj = FACTORY->NewJSObject(function); |
| 220 obj->SetProperty( | 221 obj->SetProperty( |
| 221 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); | 222 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); |
| 222 obj->SetProperty( | 223 obj->SetProperty( |
| 223 *prop_namex, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); | 224 *prop_namex, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); |
| 224 | 225 |
| 225 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); | 226 CHECK_EQ(Smi::FromInt(23), obj->GetProperty(*prop_name)); |
| 226 CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex)); | 227 CHECK_EQ(Smi::FromInt(24), obj->GetProperty(*prop_namex)); |
| 227 } | 228 } |
| 228 | 229 |
| 229 HEAP->CollectGarbage(NEW_SPACE); | 230 HEAP->CollectGarbage(NEW_SPACE); |
| 230 | 231 |
| 231 // Function should be alive. | 232 // Function should be alive. |
| 232 CHECK(Isolate::Current()->context()->global()->HasLocalProperty(*name)); | 233 CHECK(Isolate::Current()->context()->global_object()-> |
| 234 HasLocalProperty(*name)); |
| 233 // Check function is retained. | 235 // Check function is retained. |
| 234 Object* func_value = Isolate::Current()->context()->global()-> | 236 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 235 GetProperty(*name)->ToObjectChecked(); | 237 GetProperty(*name)->ToObjectChecked(); |
| 236 CHECK(func_value->IsJSFunction()); | 238 CHECK(func_value->IsJSFunction()); |
| 237 Handle<JSFunction> function(JSFunction::cast(func_value)); | 239 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 238 | 240 |
| 239 { | 241 { |
| 240 HandleScope inner_scope; | 242 HandleScope inner_scope; |
| 241 // Allocate another object, make it reachable from global. | 243 // Allocate another object, make it reachable from global. |
| 242 Handle<JSObject> obj = FACTORY->NewJSObject(function); | 244 Handle<JSObject> obj = FACTORY->NewJSObject(function); |
| 243 Isolate::Current()->context()->global()->SetProperty( | 245 Isolate::Current()->context()->global_object()->SetProperty( |
| 244 *obj_name, *obj, NONE, kNonStrictMode)->ToObjectChecked(); | 246 *obj_name, *obj, NONE, kNonStrictMode)->ToObjectChecked(); |
| 245 obj->SetProperty( | 247 obj->SetProperty( |
| 246 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); | 248 *prop_name, Smi::FromInt(23), NONE, kNonStrictMode)->ToObjectChecked(); |
| 247 } | 249 } |
| 248 | 250 |
| 249 // After gc, it should survive. | 251 // After gc, it should survive. |
| 250 HEAP->CollectGarbage(NEW_SPACE); | 252 HEAP->CollectGarbage(NEW_SPACE); |
| 251 | 253 |
| 252 CHECK(Isolate::Current()->context()->global()->HasLocalProperty(*obj_name)); | 254 CHECK(Isolate::Current()->context()->global_object()-> |
| 253 CHECK(Isolate::Current()->context()->global()-> | 255 HasLocalProperty(*obj_name)); |
| 256 CHECK(Isolate::Current()->context()->global_object()-> |
| 254 GetProperty(*obj_name)->ToObjectChecked()->IsJSObject()); | 257 GetProperty(*obj_name)->ToObjectChecked()->IsJSObject()); |
| 255 Object* obj = Isolate::Current()->context()->global()-> | 258 Object* obj = Isolate::Current()->context()->global_object()-> |
| 256 GetProperty(*obj_name)->ToObjectChecked(); | 259 GetProperty(*obj_name)->ToObjectChecked(); |
| 257 JSObject* js_obj = JSObject::cast(obj); | 260 JSObject* js_obj = JSObject::cast(obj); |
| 258 CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name)); | 261 CHECK_EQ(Smi::FromInt(23), js_obj->GetProperty(*prop_name)); |
| 259 } | 262 } |
| 260 | 263 |
| 261 | 264 |
| 262 static void VerifyStringAllocation(const char* string) { | 265 static void VerifyStringAllocation(const char* string) { |
| 263 v8::HandleScope scope; | 266 v8::HandleScope scope; |
| 264 Handle<String> s = FACTORY->NewStringFromUtf8(CStrVector(string)); | 267 Handle<String> s = FACTORY->NewStringFromUtf8(CStrVector(string)); |
| 265 CHECK_EQ(StrLength(string), s->length()); | 268 CHECK_EQ(StrLength(string), s->length()); |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 556 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); | 559 *prop_name, Smi::FromInt(24), NONE, kNonStrictMode)->ToObjectChecked(); |
| 557 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); | 560 CHECK_EQ(Smi::FromInt(24), function->GetProperty(*prop_name)); |
| 558 } | 561 } |
| 559 | 562 |
| 560 | 563 |
| 561 TEST(ObjectProperties) { | 564 TEST(ObjectProperties) { |
| 562 InitializeVM(); | 565 InitializeVM(); |
| 563 | 566 |
| 564 v8::HandleScope sc; | 567 v8::HandleScope sc; |
| 565 String* object_symbol = String::cast(HEAP->Object_symbol()); | 568 String* object_symbol = String::cast(HEAP->Object_symbol()); |
| 566 Object* raw_object = Isolate::Current()->context()->global()-> | 569 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 567 GetProperty(object_symbol)->ToObjectChecked(); | 570 GetProperty(object_symbol)->ToObjectChecked(); |
| 568 JSFunction* object_function = JSFunction::cast(raw_object); | 571 JSFunction* object_function = JSFunction::cast(raw_object); |
| 569 Handle<JSFunction> constructor(object_function); | 572 Handle<JSFunction> constructor(object_function); |
| 570 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); | 573 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); |
| 571 Handle<String> first = FACTORY->LookupAsciiSymbol("first"); | 574 Handle<String> first = FACTORY->LookupAsciiSymbol("first"); |
| 572 Handle<String> second = FACTORY->LookupAsciiSymbol("second"); | 575 Handle<String> second = FACTORY->LookupAsciiSymbol("second"); |
| 573 | 576 |
| 574 // check for empty | 577 // check for empty |
| 575 CHECK(!obj->HasLocalProperty(*first)); | 578 CHECK(!obj->HasLocalProperty(*first)); |
| 576 | 579 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 // Check the map has changed | 656 // Check the map has changed |
| 654 CHECK(*initial_map != obj->map()); | 657 CHECK(*initial_map != obj->map()); |
| 655 } | 658 } |
| 656 | 659 |
| 657 | 660 |
| 658 TEST(JSArray) { | 661 TEST(JSArray) { |
| 659 InitializeVM(); | 662 InitializeVM(); |
| 660 | 663 |
| 661 v8::HandleScope sc; | 664 v8::HandleScope sc; |
| 662 Handle<String> name = FACTORY->LookupAsciiSymbol("Array"); | 665 Handle<String> name = FACTORY->LookupAsciiSymbol("Array"); |
| 663 Object* raw_object = Isolate::Current()->context()->global()-> | 666 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 664 GetProperty(*name)->ToObjectChecked(); | 667 GetProperty(*name)->ToObjectChecked(); |
| 665 Handle<JSFunction> function = Handle<JSFunction>( | 668 Handle<JSFunction> function = Handle<JSFunction>( |
| 666 JSFunction::cast(raw_object)); | 669 JSFunction::cast(raw_object)); |
| 667 | 670 |
| 668 // Allocate the object. | 671 // Allocate the object. |
| 669 Handle<JSObject> object = FACTORY->NewJSObject(function); | 672 Handle<JSObject> object = FACTORY->NewJSObject(function); |
| 670 Handle<JSArray> array = Handle<JSArray>::cast(object); | 673 Handle<JSArray> array = Handle<JSArray>::cast(object); |
| 671 // We just initialized the VM, no heap allocation failure yet. | 674 // We just initialized the VM, no heap allocation failure yet. |
| 672 array->Initialize(0)->ToObjectChecked(); | 675 array->Initialize(0)->ToObjectChecked(); |
| 673 | 676 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 700 CHECK_EQ(array->GetElement(int_length), *name); | 703 CHECK_EQ(array->GetElement(int_length), *name); |
| 701 CHECK_EQ(array->GetElement(0), *name); | 704 CHECK_EQ(array->GetElement(0), *name); |
| 702 } | 705 } |
| 703 | 706 |
| 704 | 707 |
| 705 TEST(JSObjectCopy) { | 708 TEST(JSObjectCopy) { |
| 706 InitializeVM(); | 709 InitializeVM(); |
| 707 | 710 |
| 708 v8::HandleScope sc; | 711 v8::HandleScope sc; |
| 709 String* object_symbol = String::cast(HEAP->Object_symbol()); | 712 String* object_symbol = String::cast(HEAP->Object_symbol()); |
| 710 Object* raw_object = Isolate::Current()->context()->global()-> | 713 Object* raw_object = Isolate::Current()->context()->global_object()-> |
| 711 GetProperty(object_symbol)->ToObjectChecked(); | 714 GetProperty(object_symbol)->ToObjectChecked(); |
| 712 JSFunction* object_function = JSFunction::cast(raw_object); | 715 JSFunction* object_function = JSFunction::cast(raw_object); |
| 713 Handle<JSFunction> constructor(object_function); | 716 Handle<JSFunction> constructor(object_function); |
| 714 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); | 717 Handle<JSObject> obj = FACTORY->NewJSObject(constructor); |
| 715 Handle<String> first = FACTORY->LookupAsciiSymbol("first"); | 718 Handle<String> first = FACTORY->LookupAsciiSymbol("first"); |
| 716 Handle<String> second = FACTORY->LookupAsciiSymbol("second"); | 719 Handle<String> second = FACTORY->LookupAsciiSymbol("second"); |
| 717 | 720 |
| 718 obj->SetProperty( | 721 obj->SetProperty( |
| 719 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); | 722 *first, Smi::FromInt(1), NONE, kNonStrictMode)->ToObjectChecked(); |
| 720 obj->SetProperty( | 723 obj->SetProperty( |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 949 "};" | 952 "};" |
| 950 "foo()"; | 953 "foo()"; |
| 951 Handle<String> foo_name = FACTORY->LookupAsciiSymbol("foo"); | 954 Handle<String> foo_name = FACTORY->LookupAsciiSymbol("foo"); |
| 952 | 955 |
| 953 // This compile will add the code to the compilation cache. | 956 // This compile will add the code to the compilation cache. |
| 954 { v8::HandleScope scope; | 957 { v8::HandleScope scope; |
| 955 CompileRun(source); | 958 CompileRun(source); |
| 956 } | 959 } |
| 957 | 960 |
| 958 // Check function is compiled. | 961 // Check function is compiled. |
| 959 Object* func_value = Isolate::Current()->context()->global()-> | 962 Object* func_value = Isolate::Current()->context()->global_object()-> |
| 960 GetProperty(*foo_name)->ToObjectChecked(); | 963 GetProperty(*foo_name)->ToObjectChecked(); |
| 961 CHECK(func_value->IsJSFunction()); | 964 CHECK(func_value->IsJSFunction()); |
| 962 Handle<JSFunction> function(JSFunction::cast(func_value)); | 965 Handle<JSFunction> function(JSFunction::cast(func_value)); |
| 963 CHECK(function->shared()->is_compiled()); | 966 CHECK(function->shared()->is_compiled()); |
| 964 | 967 |
| 965 // TODO(1609) Currently incremental marker does not support code flushing. | 968 // TODO(1609) Currently incremental marker does not support code flushing. |
| 966 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 969 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 967 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); | 970 HEAP->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); |
| 968 | 971 |
| 969 CHECK(function->shared()->is_compiled()); | 972 CHECK(function->shared()->is_compiled()); |
| (...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2173 CHECK(ic_before->ic_state() == MEGAMORPHIC); | 2176 CHECK(ic_before->ic_state() == MEGAMORPHIC); |
| 2174 | 2177 |
| 2175 // Fire context dispose notification. | 2178 // Fire context dispose notification. |
| 2176 v8::V8::ContextDisposedNotification(); | 2179 v8::V8::ContextDisposedNotification(); |
| 2177 SimulateIncrementalMarking(); | 2180 SimulateIncrementalMarking(); |
| 2178 HEAP->CollectAllGarbage(Heap::kNoGCFlags); | 2181 HEAP->CollectAllGarbage(Heap::kNoGCFlags); |
| 2179 | 2182 |
| 2180 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); | 2183 Code* ic_after = FindFirstIC(f->shared()->code(), Code::LOAD_IC); |
| 2181 CHECK(ic_after->ic_state() == UNINITIALIZED); | 2184 CHECK(ic_after->ic_state() == UNINITIALIZED); |
| 2182 } | 2185 } |
| OLD | NEW |