Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2007-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2008 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 6022 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6033 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 6033 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
| 6034 templ->SetAccessCheckCallbacks(NamedSetAccessBlocker, | 6034 templ->SetAccessCheckCallbacks(NamedSetAccessBlocker, |
| 6035 IndexedSetAccessBlocker); | 6035 IndexedSetAccessBlocker); |
| 6036 templ->Set(v8_str("x"), v8::True()); | 6036 templ->Set(v8_str("x"), v8::True()); |
| 6037 Local<v8::Object> instance = templ->NewInstance(); | 6037 Local<v8::Object> instance = templ->NewInstance(); |
| 6038 context->Global()->Set(v8_str("obj"), instance); | 6038 context->Global()->Set(v8_str("obj"), instance); |
| 6039 Local<Value> value = CompileRun("obj.x"); | 6039 Local<Value> value = CompileRun("obj.x"); |
| 6040 CHECK(value->BooleanValue()); | 6040 CHECK(value->BooleanValue()); |
| 6041 } | 6041 } |
| 6042 | 6042 |
| 6043 | |
| 6043 static bool NamedGetAccessBlocker(Local<v8::Object> obj, | 6044 static bool NamedGetAccessBlocker(Local<v8::Object> obj, |
| 6044 Local<Value> name, | 6045 Local<Value> name, |
| 6045 v8::AccessType type, | 6046 v8::AccessType type, |
| 6046 Local<Value> data) { | 6047 Local<Value> data) { |
| 6047 return false; | 6048 return false; |
| 6048 } | 6049 } |
| 6049 | 6050 |
| 6050 | 6051 |
| 6051 static bool IndexedGetAccessBlocker(Local<v8::Object> obj, | 6052 static bool IndexedGetAccessBlocker(Local<v8::Object> obj, |
| 6052 uint32_t key, | 6053 uint32_t key, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6086 Local<Value> value_1 = CompileRun("obj_1.a"); | 6087 Local<Value> value_1 = CompileRun("obj_1.a"); |
| 6087 CHECK(value_1->IsUndefined()); | 6088 CHECK(value_1->IsUndefined()); |
| 6088 | 6089 |
| 6089 Local<v8::Object> instance_2 = templ->NewInstance(); | 6090 Local<v8::Object> instance_2 = templ->NewInstance(); |
| 6090 context->Global()->Set(v8_str("obj_2"), instance_2); | 6091 context->Global()->Set(v8_str("obj_2"), instance_2); |
| 6091 | 6092 |
| 6092 Local<Value> value_2 = CompileRun("obj_2.a"); | 6093 Local<Value> value_2 = CompileRun("obj_2.a"); |
| 6093 CHECK(value_2->IsUndefined()); | 6094 CHECK(value_2->IsUndefined()); |
| 6094 } | 6095 } |
| 6095 | 6096 |
| 6097 | |
| 6096 // This tests that access check information remains on the global | 6098 // This tests that access check information remains on the global |
| 6097 // object template when creating contexts. | 6099 // object template when creating contexts. |
| 6098 THREADED_TEST(AccessControlRepeatedContextCreation) { | 6100 THREADED_TEST(AccessControlRepeatedContextCreation) { |
| 6099 v8::HandleScope handle_scope; | 6101 v8::HandleScope handle_scope; |
| 6100 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 6102 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
| 6101 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, | 6103 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, |
| 6102 IndexedSetAccessBlocker); | 6104 IndexedSetAccessBlocker); |
| 6103 i::Handle<i::ObjectTemplateInfo> internal_template = | 6105 i::Handle<i::ObjectTemplateInfo> internal_template = |
| 6104 v8::Utils::OpenHandle(*global_template); | 6106 v8::Utils::OpenHandle(*global_template); |
| 6105 CHECK(!internal_template->constructor()->IsUndefined()); | 6107 CHECK(!internal_template->constructor()->IsUndefined()); |
| 6106 i::Handle<i::FunctionTemplateInfo> constructor( | 6108 i::Handle<i::FunctionTemplateInfo> constructor( |
| 6107 i::FunctionTemplateInfo::cast(internal_template->constructor())); | 6109 i::FunctionTemplateInfo::cast(internal_template->constructor())); |
| 6108 CHECK(!constructor->access_check_info()->IsUndefined()); | 6110 CHECK(!constructor->access_check_info()->IsUndefined()); |
| 6109 v8::Persistent<Context> context0 = Context::New(NULL, global_template); | 6111 v8::Persistent<Context> context0 = Context::New(NULL, global_template); |
| 6110 CHECK(!constructor->access_check_info()->IsUndefined()); | 6112 CHECK(!constructor->access_check_info()->IsUndefined()); |
| 6111 } | 6113 } |
| 6112 | 6114 |
| 6113 | 6115 |
| 6116 THREADED_TEST(TurnOnAccessCheck) { | |
| 6117 v8::HandleScope handle_scope; | |
| 6118 | |
| 6119 // Create an environment with access check to the global object disabled by | |
| 6120 // default. | |
| 6121 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | |
| 6122 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, | |
| 6123 IndexedGetAccessBlocker, | |
| 6124 v8::Handle<v8::Value>(), | |
| 6125 false); | |
| 6126 v8::Persistent<Context> context = Context::New(NULL, global_template); | |
| 6127 Context::Scope context_scope(context); | |
| 6128 | |
| 6129 // Set up a property and a number of functions. | |
| 6130 context->Global()->Set(v8_str("a"), v8_num(1)); | |
| 6131 CompileRun("function f1() {return a;}" | |
| 6132 "function f2() {return a;}" | |
| 6133 "function g1() {return h();}" | |
| 6134 "function g2() {return h();}" | |
| 6135 "function h() {return 1;}"); | |
| 6136 Local<Function> f1 = | |
| 6137 Local<Function>::Cast(context->Global()->Get(v8_str("f1"))); | |
| 6138 Local<Function> f2 = | |
| 6139 Local<Function>::Cast(context->Global()->Get(v8_str("f2"))); | |
| 6140 Local<Function> g1 = | |
| 6141 Local<Function>::Cast(context->Global()->Get(v8_str("g1"))); | |
| 6142 Local<Function> g2 = | |
| 6143 Local<Function>::Cast(context->Global()->Get(v8_str("g2"))); | |
| 6144 Local<Function> h = | |
| 6145 Local<Function>::Cast(context->Global()->Get(v8_str("h"))); | |
| 6146 | |
| 6147 // Get the global object. | |
| 6148 v8::Handle<v8::Object> global = context->Global(); | |
| 6149 | |
| 6150 // Call f1 one time and f2 a number of times. This will ensure that f1 still | |
| 6151 // uses the runtime system to retreive property a whereas f2 uses global load | |
| 6152 // inline cache is used. | |
|
Mads Ager (chromium)
2009/06/30 10:07:34
remove 'is used'
| |
| 6153 CHECK(!f1->Call(global, 0, NULL)->IsUndefined()); | |
|
Mads Ager (chromium)
2009/06/30 10:07:34
Maybe check that it is actually '1' in these cases
| |
| 6154 for (int i = 0; i < 4; i++) { | |
| 6155 CHECK(!f2->Call(global, 0, NULL)->IsUndefined()); | |
| 6156 } | |
| 6157 | |
| 6158 // Same for g1 and g2. | |
| 6159 CHECK(!g1->Call(global, 0, NULL)->IsUndefined()); | |
| 6160 for (int i = 0; i < 4; i++) { | |
| 6161 CHECK(!g2->Call(global, 0, NULL)->IsUndefined()); | |
| 6162 } | |
| 6163 | |
| 6164 // Detach the global and turn on access check. | |
| 6165 context->DetachGlobal(); | |
| 6166 context->Global()->TurnOnAccessCheck(); | |
| 6167 | |
| 6168 // Failing access check to property get results in undefined. | |
| 6169 CHECK(f1->Call(global, 0, NULL)->IsUndefined()); | |
| 6170 CHECK(f2->Call(global, 0, NULL)->IsUndefined()); | |
| 6171 | |
| 6172 // Failing access check to function call results in exception. | |
| 6173 CHECK(g1->Call(global, 0, NULL).IsEmpty()); | |
| 6174 CHECK(g2->Call(global, 0, NULL).IsEmpty()); | |
| 6175 | |
| 6176 // No failing access check when just returning a constant. | |
| 6177 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); | |
| 6178 } | |
| 6179 | |
| 6180 | |
| 6114 // This test verifies that pre-compilation (aka preparsing) can be called | 6181 // This test verifies that pre-compilation (aka preparsing) can be called |
| 6115 // without initializing the whole VM. Thus we cannot run this test in a | 6182 // without initializing the whole VM. Thus we cannot run this test in a |
| 6116 // multi-threaded setup. | 6183 // multi-threaded setup. |
| 6117 TEST(PreCompile) { | 6184 TEST(PreCompile) { |
| 6118 // TODO(155): This test would break without the initialization of V8. This is | 6185 // TODO(155): This test would break without the initialization of V8. This is |
| 6119 // a workaround for now to make this test not fail. | 6186 // a workaround for now to make this test not fail. |
| 6120 v8::V8::Initialize(); | 6187 v8::V8::Initialize(); |
| 6121 const char *script = "function foo(a) { return a+1; }"; | 6188 const char *script = "function foo(a) { return a+1; }"; |
| 6122 v8::ScriptData *sd = v8::ScriptData::PreCompile(script, strlen(script)); | 6189 v8::ScriptData *sd = v8::ScriptData::PreCompile(script, strlen(script)); |
| 6123 CHECK_NE(sd->Length(), 0); | 6190 CHECK_NE(sd->Length(), 0); |
| (...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6950 calling_context2->Exit(); | 7017 calling_context2->Exit(); |
| 6951 | 7018 |
| 6952 // Dispose the contexts to allow them to be garbage collected. | 7019 // Dispose the contexts to allow them to be garbage collected. |
| 6953 calling_context0.Dispose(); | 7020 calling_context0.Dispose(); |
| 6954 calling_context1.Dispose(); | 7021 calling_context1.Dispose(); |
| 6955 calling_context2.Dispose(); | 7022 calling_context2.Dispose(); |
| 6956 calling_context0.Clear(); | 7023 calling_context0.Clear(); |
| 6957 calling_context1.Clear(); | 7024 calling_context1.Clear(); |
| 6958 calling_context2.Clear(); | 7025 calling_context2.Clear(); |
| 6959 } | 7026 } |
| OLD | NEW |