OLD | NEW |
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 6951 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6962 Local<Value> proto1 = o1->GetPrototype(); | 6962 Local<Value> proto1 = o1->GetPrototype(); |
6963 CHECK(proto1->IsObject()); | 6963 CHECK(proto1->IsObject()); |
6964 CHECK_EQ(proto1.As<v8::Object>(), o2); | 6964 CHECK_EQ(proto1.As<v8::Object>(), o2); |
6965 | 6965 |
6966 Local<Value> proto2 = o2->GetPrototype(); | 6966 Local<Value> proto2 = o2->GetPrototype(); |
6967 CHECK(proto2->IsObject()); | 6967 CHECK(proto2->IsObject()); |
6968 CHECK_EQ(proto2.As<v8::Object>(), o3); | 6968 CHECK_EQ(proto2.As<v8::Object>(), o3); |
6969 } | 6969 } |
6970 | 6970 |
6971 | 6971 |
6972 THREADED_TEST(SetPrototypeProperties) { | 6972 THREADED_TEST(FunctionReadOnlyPrototype) { |
6973 v8::HandleScope handle_scope; | 6973 v8::HandleScope handle_scope; |
6974 LocalContext context; | 6974 LocalContext context; |
6975 | 6975 |
6976 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); | 6976 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); |
6977 t1->SetPrototypeAttributes(v8::DontDelete); | 6977 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(42)); |
| 6978 t1->ReadOnlyPrototype(); |
6978 context->Global()->Set(v8_str("func1"), t1->GetFunction()); | 6979 context->Global()->Set(v8_str("func1"), t1->GetFunction()); |
| 6980 // Configured value of ReadOnly flag. |
6979 CHECK(CompileRun( | 6981 CHECK(CompileRun( |
6980 "(function() {" | 6982 "(function() {" |
6981 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" | 6983 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" |
6982 " return (descriptor['writable'] == true) &&" | 6984 " return (descriptor['writable'] == false);" |
6983 " (descriptor['enumerable'] == true) &&" | |
6984 " (descriptor['configurable'] == false);" | |
6985 "})()")->BooleanValue()); | 6985 "})()")->BooleanValue()); |
| 6986 CHECK_EQ(42, CompileRun("func1.prototype.x")->Int32Value()); |
| 6987 CHECK_EQ(42, |
| 6988 CompileRun("func1.prototype = {}; func1.prototype.x")->Int32Value()); |
6986 | 6989 |
6987 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); | 6990 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); |
6988 t2->SetPrototypeAttributes(v8::DontEnum); | 6991 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(42)); |
6989 context->Global()->Set(v8_str("func2"), t2->GetFunction()); | 6992 context->Global()->Set(v8_str("func2"), t2->GetFunction()); |
| 6993 // Default value of ReadOnly flag. |
6990 CHECK(CompileRun( | 6994 CHECK(CompileRun( |
6991 "(function() {" | 6995 "(function() {" |
6992 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" | 6996 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" |
6993 " return (descriptor['writable'] == true) &&" | 6997 " return (descriptor['writable'] == true);" |
6994 " (descriptor['enumerable'] == false) &&" | |
6995 " (descriptor['configurable'] == true);" | |
6996 "})()")->BooleanValue()); | 6998 "})()")->BooleanValue()); |
6997 | 6999 CHECK_EQ(42, CompileRun("func2.prototype.x")->Int32Value()); |
6998 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(); | |
6999 t3->SetPrototypeAttributes(v8::ReadOnly); | |
7000 context->Global()->Set(v8_str("func3"), t3->GetFunction()); | |
7001 CHECK(CompileRun( | |
7002 "(function() {" | |
7003 " descriptor = Object.getOwnPropertyDescriptor(func3, 'prototype');" | |
7004 " return (descriptor['writable'] == false) &&" | |
7005 " (descriptor['enumerable'] == true) &&" | |
7006 " (descriptor['configurable'] == true);" | |
7007 "})()")->BooleanValue()); | |
7008 | |
7009 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(); | |
7010 t4->SetPrototypeAttributes(v8::ReadOnly | v8::DontEnum | v8::DontDelete); | |
7011 context->Global()->Set(v8_str("func4"), t4->GetFunction()); | |
7012 CHECK(CompileRun( | |
7013 "(function() {" | |
7014 " descriptor = Object.getOwnPropertyDescriptor(func4, 'prototype');" | |
7015 " return (descriptor['writable'] == false) &&" | |
7016 " (descriptor['enumerable'] == false) &&" | |
7017 " (descriptor['configurable'] == false);" | |
7018 "})()")->BooleanValue()); | |
7019 } | 7000 } |
7020 | 7001 |
7021 | 7002 |
7022 THREADED_TEST(SetPrototypeThrows) { | 7003 THREADED_TEST(SetPrototypeThrows) { |
7023 v8::HandleScope handle_scope; | 7004 v8::HandleScope handle_scope; |
7024 LocalContext context; | 7005 LocalContext context; |
7025 | 7006 |
7026 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 7007 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
7027 | 7008 |
7028 Local<v8::Object> o0 = t->GetFunction()->NewInstance(); | 7009 Local<v8::Object> o0 = t->GetFunction()->NewInstance(); |
(...skipping 7734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14763 } | 14744 } |
14764 | 14745 |
14765 i::Isolate::Current()->heap()->CollectAllGarbage(true); | 14746 i::Isolate::Current()->heap()->CollectAllGarbage(true); |
14766 { i::Object* raw_map_cache = i::Isolate::Current()->context()->map_cache(); | 14747 { i::Object* raw_map_cache = i::Isolate::Current()->context()->map_cache(); |
14767 if (raw_map_cache != i::Isolate::Current()->heap()->undefined_value()) { | 14748 if (raw_map_cache != i::Isolate::Current()->heap()->undefined_value()) { |
14768 i::MapCache* map_cache = i::MapCache::cast(raw_map_cache); | 14749 i::MapCache* map_cache = i::MapCache::cast(raw_map_cache); |
14769 CHECK_GT(elements, map_cache->NumberOfElements()); | 14750 CHECK_GT(elements, map_cache->NumberOfElements()); |
14770 } | 14751 } |
14771 } | 14752 } |
14772 } | 14753 } |
OLD | NEW |