| 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 4355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4366 | 4366 |
| 4367 THREADED_TEST(PropertyAttributes) { | 4367 THREADED_TEST(PropertyAttributes) { |
| 4368 LocalContext context; | 4368 LocalContext context; |
| 4369 v8::HandleScope scope(context->GetIsolate()); | 4369 v8::HandleScope scope(context->GetIsolate()); |
| 4370 // none | 4370 // none |
| 4371 Local<String> prop = v8_str("none"); | 4371 Local<String> prop = v8_str("none"); |
| 4372 context->Global()->Set(prop, v8_num(7)); | 4372 context->Global()->Set(prop, v8_num(7)); |
| 4373 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); | 4373 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); |
| 4374 // read-only | 4374 // read-only |
| 4375 prop = v8_str("read_only"); | 4375 prop = v8_str("read_only"); |
| 4376 context->Global()->Set(prop, v8_num(7), v8::ReadOnly); | 4376 context->Global()->ForceSet(prop, v8_num(7), v8::ReadOnly); |
| 4377 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4377 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); |
| 4378 CHECK_EQ(v8::ReadOnly, context->Global()->GetPropertyAttributes(prop)); | 4378 CHECK_EQ(v8::ReadOnly, context->Global()->GetPropertyAttributes(prop)); |
| 4379 CompileRun("read_only = 9"); | 4379 CompileRun("read_only = 9"); |
| 4380 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4380 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); |
| 4381 context->Global()->Set(prop, v8_num(10)); | 4381 context->Global()->Set(prop, v8_num(10)); |
| 4382 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4382 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); |
| 4383 // dont-delete | 4383 // dont-delete |
| 4384 prop = v8_str("dont_delete"); | 4384 prop = v8_str("dont_delete"); |
| 4385 context->Global()->Set(prop, v8_num(13), v8::DontDelete); | 4385 context->Global()->ForceSet(prop, v8_num(13), v8::DontDelete); |
| 4386 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); | 4386 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); |
| 4387 CompileRun("delete dont_delete"); | 4387 CompileRun("delete dont_delete"); |
| 4388 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); | 4388 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); |
| 4389 CHECK_EQ(v8::DontDelete, context->Global()->GetPropertyAttributes(prop)); | 4389 CHECK_EQ(v8::DontDelete, context->Global()->GetPropertyAttributes(prop)); |
| 4390 // dont-enum | 4390 // dont-enum |
| 4391 prop = v8_str("dont_enum"); | 4391 prop = v8_str("dont_enum"); |
| 4392 context->Global()->Set(prop, v8_num(28), v8::DontEnum); | 4392 context->Global()->ForceSet(prop, v8_num(28), v8::DontEnum); |
| 4393 CHECK_EQ(v8::DontEnum, context->Global()->GetPropertyAttributes(prop)); | 4393 CHECK_EQ(v8::DontEnum, context->Global()->GetPropertyAttributes(prop)); |
| 4394 // absent | 4394 // absent |
| 4395 prop = v8_str("absent"); | 4395 prop = v8_str("absent"); |
| 4396 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); | 4396 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); |
| 4397 Local<Value> fake_prop = v8_num(1); | 4397 Local<Value> fake_prop = v8_num(1); |
| 4398 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(fake_prop)); | 4398 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(fake_prop)); |
| 4399 // exception | 4399 // exception |
| 4400 TryCatch try_catch; | 4400 TryCatch try_catch; |
| 4401 Local<Value> exception = | 4401 Local<Value> exception = |
| 4402 CompileRun("({ toString: function() { throw 'exception';} })"); | 4402 CompileRun("({ toString: function() { throw 'exception';} })"); |
| (...skipping 10737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15140 // Test that we cannot set a property on the global object if there | 15140 // Test that we cannot set a property on the global object if there |
| 15141 // is a read-only property in the prototype chain. | 15141 // is a read-only property in the prototype chain. |
| 15142 TEST(ReadOnlyPropertyInGlobalProto) { | 15142 TEST(ReadOnlyPropertyInGlobalProto) { |
| 15143 v8::Isolate* isolate = CcTest::isolate(); | 15143 v8::Isolate* isolate = CcTest::isolate(); |
| 15144 v8::HandleScope scope(isolate); | 15144 v8::HandleScope scope(isolate); |
| 15145 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 15145 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
| 15146 LocalContext context(0, templ); | 15146 LocalContext context(0, templ); |
| 15147 v8::Handle<v8::Object> global = context->Global(); | 15147 v8::Handle<v8::Object> global = context->Global(); |
| 15148 v8::Handle<v8::Object> global_proto = | 15148 v8::Handle<v8::Object> global_proto = |
| 15149 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__"))); | 15149 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__"))); |
| 15150 global_proto->Set(v8_str("x"), v8::Integer::New(isolate, 0), v8::ReadOnly); | 15150 global_proto->ForceSet(v8_str("x"), v8::Integer::New(isolate, 0), |
| 15151 global_proto->Set(v8_str("y"), v8::Integer::New(isolate, 0), v8::ReadOnly); | 15151 v8::ReadOnly); |
| 15152 global_proto->ForceSet(v8_str("y"), v8::Integer::New(isolate, 0), |
| 15153 v8::ReadOnly); |
| 15152 // Check without 'eval' or 'with'. | 15154 // Check without 'eval' or 'with'. |
| 15153 v8::Handle<v8::Value> res = | 15155 v8::Handle<v8::Value> res = |
| 15154 CompileRun("function f() { x = 42; return x; }; f()"); | 15156 CompileRun("function f() { x = 42; return x; }; f()"); |
| 15155 CHECK_EQ(v8::Integer::New(isolate, 0), res); | 15157 CHECK_EQ(v8::Integer::New(isolate, 0), res); |
| 15156 // Check with 'eval'. | 15158 // Check with 'eval'. |
| 15157 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()"); | 15159 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()"); |
| 15158 CHECK_EQ(v8::Integer::New(isolate, 0), res); | 15160 CHECK_EQ(v8::Integer::New(isolate, 0), res); |
| 15159 // Check with 'with'. | 15161 // Check with 'with'. |
| 15160 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()"); | 15162 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()"); |
| 15161 CHECK_EQ(v8::Integer::New(isolate, 0), res); | 15163 CHECK_EQ(v8::Integer::New(isolate, 0), res); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15199 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 15201 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
| 15200 v8::Handle<v8::String> access_property = | 15202 v8::Handle<v8::String> access_property = |
| 15201 v8::String::NewFromUtf8(isolate, "a"); | 15203 v8::String::NewFromUtf8(isolate, "a"); |
| 15202 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); | 15204 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); |
| 15203 LocalContext context(NULL, templ); | 15205 LocalContext context(NULL, templ); |
| 15204 v8::Handle<v8::Object> global = context->Global(); | 15206 v8::Handle<v8::Object> global = context->Global(); |
| 15205 | 15207 |
| 15206 // Ordinary properties | 15208 // Ordinary properties |
| 15207 v8::Handle<v8::String> simple_property = | 15209 v8::Handle<v8::String> simple_property = |
| 15208 v8::String::NewFromUtf8(isolate, "p"); | 15210 v8::String::NewFromUtf8(isolate, "p"); |
| 15209 global->Set(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly); | 15211 global->ForceSet(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly); |
| 15210 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); | 15212 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); |
| 15211 // This should fail because the property is read-only | 15213 // This should fail because the property is read-only |
| 15212 global->Set(simple_property, v8::Int32::New(isolate, 5)); | 15214 global->Set(simple_property, v8::Int32::New(isolate, 5)); |
| 15213 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); | 15215 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); |
| 15214 // This should succeed even though the property is read-only | 15216 // This should succeed even though the property is read-only |
| 15215 global->ForceSet(simple_property, v8::Int32::New(isolate, 6)); | 15217 global->ForceSet(simple_property, v8::Int32::New(isolate, 6)); |
| 15216 CHECK_EQ(6, global->Get(simple_property)->Int32Value()); | 15218 CHECK_EQ(6, global->Get(simple_property)->Int32Value()); |
| 15217 | 15219 |
| 15218 // Accessors | 15220 // Accessors |
| 15219 CHECK_EQ(0, force_set_set_count); | 15221 CHECK_EQ(0, force_set_set_count); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15287 THREADED_TEST(ForceDelete) { | 15289 THREADED_TEST(ForceDelete) { |
| 15288 v8::Isolate* isolate = CcTest::isolate(); | 15290 v8::Isolate* isolate = CcTest::isolate(); |
| 15289 v8::HandleScope scope(isolate); | 15291 v8::HandleScope scope(isolate); |
| 15290 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 15292 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
| 15291 LocalContext context(NULL, templ); | 15293 LocalContext context(NULL, templ); |
| 15292 v8::Handle<v8::Object> global = context->Global(); | 15294 v8::Handle<v8::Object> global = context->Global(); |
| 15293 | 15295 |
| 15294 // Ordinary properties | 15296 // Ordinary properties |
| 15295 v8::Handle<v8::String> simple_property = | 15297 v8::Handle<v8::String> simple_property = |
| 15296 v8::String::NewFromUtf8(isolate, "p"); | 15298 v8::String::NewFromUtf8(isolate, "p"); |
| 15297 global->Set(simple_property, v8::Int32::New(isolate, 4), v8::DontDelete); | 15299 global->ForceSet(simple_property, v8::Int32::New(isolate, 4), v8::DontDelete); |
| 15298 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); | 15300 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); |
| 15299 // This should fail because the property is dont-delete. | 15301 // This should fail because the property is dont-delete. |
| 15300 CHECK(!global->Delete(simple_property)); | 15302 CHECK(!global->Delete(simple_property)); |
| 15301 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); | 15303 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); |
| 15302 // This should succeed even though the property is dont-delete. | 15304 // This should succeed even though the property is dont-delete. |
| 15303 CHECK(global->ForceDelete(simple_property)); | 15305 CHECK(global->ForceDelete(simple_property)); |
| 15304 CHECK(global->Get(simple_property)->IsUndefined()); | 15306 CHECK(global->Get(simple_property)->IsUndefined()); |
| 15305 } | 15307 } |
| 15306 | 15308 |
| 15307 | 15309 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 15324 | 15326 |
| 15325 v8::Isolate* isolate = CcTest::isolate(); | 15327 v8::Isolate* isolate = CcTest::isolate(); |
| 15326 v8::HandleScope scope(isolate); | 15328 v8::HandleScope scope(isolate); |
| 15327 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 15329 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
| 15328 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter); | 15330 templ->SetNamedPropertyHandler(0, 0, 0, ForceDeleteDeleter); |
| 15329 LocalContext context(NULL, templ); | 15331 LocalContext context(NULL, templ); |
| 15330 v8::Handle<v8::Object> global = context->Global(); | 15332 v8::Handle<v8::Object> global = context->Global(); |
| 15331 | 15333 |
| 15332 v8::Handle<v8::String> some_property = | 15334 v8::Handle<v8::String> some_property = |
| 15333 v8::String::NewFromUtf8(isolate, "a"); | 15335 v8::String::NewFromUtf8(isolate, "a"); |
| 15334 global->Set(some_property, v8::Integer::New(isolate, 42), v8::DontDelete); | 15336 global->ForceSet(some_property, v8::Integer::New(isolate, 42), |
| 15337 v8::DontDelete); |
| 15335 | 15338 |
| 15336 // Deleting a property should get intercepted and nothing should | 15339 // Deleting a property should get intercepted and nothing should |
| 15337 // happen. | 15340 // happen. |
| 15338 CHECK_EQ(0, force_delete_interceptor_count); | 15341 CHECK_EQ(0, force_delete_interceptor_count); |
| 15339 CHECK(global->Delete(some_property)); | 15342 CHECK(global->Delete(some_property)); |
| 15340 CHECK_EQ(1, force_delete_interceptor_count); | 15343 CHECK_EQ(1, force_delete_interceptor_count); |
| 15341 CHECK_EQ(42, global->Get(some_property)->Int32Value()); | 15344 CHECK_EQ(42, global->Get(some_property)->Int32Value()); |
| 15342 // Deleting the property when the interceptor returns an empty | 15345 // Deleting the property when the interceptor returns an empty |
| 15343 // handle should not delete the property since it is DontDelete. | 15346 // handle should not delete the property since it is DontDelete. |
| 15344 pass_on_delete = true; | 15347 pass_on_delete = true; |
| (...skipping 4232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19577 | 19580 |
| 19578 | 19581 |
| 19579 TEST(DontDeleteCellLoadICAPI) { | 19582 TEST(DontDeleteCellLoadICAPI) { |
| 19580 const char* function_code = | 19583 const char* function_code = |
| 19581 "function readCell() { while (true) { return cell; } }"; | 19584 "function readCell() { while (true) { return cell; } }"; |
| 19582 | 19585 |
| 19583 // Run the code twice to initialize the load IC for a don't delete | 19586 // Run the code twice to initialize the load IC for a don't delete |
| 19584 // cell created using the API. | 19587 // cell created using the API. |
| 19585 LocalContext context; | 19588 LocalContext context; |
| 19586 v8::HandleScope scope(context->GetIsolate()); | 19589 v8::HandleScope scope(context->GetIsolate()); |
| 19587 context->Global()->Set(v8_str("cell"), v8_str("value"), v8::DontDelete); | 19590 context->Global()->ForceSet(v8_str("cell"), v8_str("value"), v8::DontDelete); |
| 19588 ExpectBoolean("delete cell", false); | 19591 ExpectBoolean("delete cell", false); |
| 19589 CompileRun(function_code); | 19592 CompileRun(function_code); |
| 19590 ExpectString("readCell()", "value"); | 19593 ExpectString("readCell()", "value"); |
| 19591 ExpectString("readCell()", "value"); | 19594 ExpectString("readCell()", "value"); |
| 19592 | 19595 |
| 19593 // Delete the cell using the API and check the inlined code works | 19596 // Delete the cell using the API and check the inlined code works |
| 19594 // correctly. | 19597 // correctly. |
| 19595 CHECK(context->Global()->ForceDelete(v8_str("cell"))); | 19598 CHECK(context->Global()->ForceDelete(v8_str("cell"))); |
| 19596 ExpectString("(function() {" | 19599 ExpectString("(function() {" |
| 19597 " try {" | 19600 " try {" |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20174 | 20177 |
| 20175 // Regression test for issue 1470. | 20178 // Regression test for issue 1470. |
| 20176 THREADED_TEST(ReadOnlyIndexedProperties) { | 20179 THREADED_TEST(ReadOnlyIndexedProperties) { |
| 20177 v8::Isolate* isolate = CcTest::isolate(); | 20180 v8::Isolate* isolate = CcTest::isolate(); |
| 20178 v8::HandleScope scope(isolate); | 20181 v8::HandleScope scope(isolate); |
| 20179 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 20182 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 20180 | 20183 |
| 20181 LocalContext context; | 20184 LocalContext context; |
| 20182 Local<v8::Object> obj = templ->NewInstance(); | 20185 Local<v8::Object> obj = templ->NewInstance(); |
| 20183 context->Global()->Set(v8_str("obj"), obj); | 20186 context->Global()->Set(v8_str("obj"), obj); |
| 20184 obj->Set(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); | 20187 obj->ForceSet(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); |
| 20185 obj->Set(v8_str("1"), v8_str("foobar")); | 20188 obj->Set(v8_str("1"), v8_str("foobar")); |
| 20186 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("1"))); | 20189 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("1"))); |
| 20187 obj->Set(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); | 20190 obj->ForceSet(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); |
| 20188 obj->Set(v8_num(2), v8_str("foobar")); | 20191 obj->Set(v8_num(2), v8_str("foobar")); |
| 20189 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_num(2))); | 20192 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_num(2))); |
| 20190 | 20193 |
| 20191 // Test non-smi case. | 20194 // Test non-smi case. |
| 20192 obj->Set(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly); | 20195 obj->ForceSet(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly); |
| 20193 obj->Set(v8_str("2000000000"), v8_str("foobar")); | 20196 obj->Set(v8_str("2000000000"), v8_str("foobar")); |
| 20194 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("2000000000"))); | 20197 CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("2000000000"))); |
| 20195 } | 20198 } |
| 20196 | 20199 |
| 20197 | 20200 |
| 20198 THREADED_TEST(Regress1516) { | 20201 THREADED_TEST(Regress1516) { |
| 20199 LocalContext context; | 20202 LocalContext context; |
| 20200 v8::HandleScope scope(context->GetIsolate()); | 20203 v8::HandleScope scope(context->GetIsolate()); |
| 20201 | 20204 |
| 20202 { v8::HandleScope temp_scope(context->GetIsolate()); | 20205 { v8::HandleScope temp_scope(context->GetIsolate()); |
| (...skipping 2575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22778 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); | 22781 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); |
| 22779 Local<Function> set = | 22782 Local<Function> set = |
| 22780 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); | 22783 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); |
| 22781 Local<Function> get = | 22784 Local<Function> get = |
| 22782 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); | 22785 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); |
| 22783 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); | 22786 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); |
| 22784 Handle<Value> args[] = { v8_num(14) }; | 22787 Handle<Value> args[] = { v8_num(14) }; |
| 22785 set->Call(x, 1, args); | 22788 set->Call(x, 1, args); |
| 22786 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); | 22789 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); |
| 22787 } | 22790 } |
| OLD | NEW |