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 1887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1898 | 1898 |
1899 // base1 and base2 cannot cross reference to each's prototype | 1899 // base1 and base2 cannot cross reference to each's prototype |
1900 CHECK(v8_compile("obj.v2")->Run()->IsUndefined()); | 1900 CHECK(v8_compile("obj.v2")->Run()->IsUndefined()); |
1901 CHECK(v8_compile("obj2.v1")->Run()->IsUndefined()); | 1901 CHECK(v8_compile("obj2.v1")->Run()->IsUndefined()); |
1902 } | 1902 } |
1903 | 1903 |
1904 | 1904 |
1905 int echo_named_call_count; | 1905 int echo_named_call_count; |
1906 | 1906 |
1907 | 1907 |
1908 static void EchoNamedProperty(Local<String> name, | 1908 static void EchoNamedProperty(Local<Name> name, |
1909 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1909 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1910 ApiTestFuzzer::Fuzz(); | 1910 ApiTestFuzzer::Fuzz(); |
1911 CHECK_EQ(v8_str("data"), info.Data()); | 1911 CHECK_EQ(v8_str("data"), info.Data()); |
1912 echo_named_call_count++; | 1912 echo_named_call_count++; |
1913 info.GetReturnValue().Set(name); | 1913 info.GetReturnValue().Set(name); |
1914 } | 1914 } |
1915 | 1915 |
1916 | 1916 |
1917 // Helper functions for Interceptor/Accessor interaction tests | 1917 // Helper functions for Interceptor/Accessor interaction tests |
1918 | 1918 |
(...skipping 21 matching lines...) Expand all Loading... |
1940 | 1940 |
1941 void SymbolAccessorSetter(Local<Name> name, Local<Value> value, | 1941 void SymbolAccessorSetter(Local<Name> name, Local<Value> value, |
1942 const v8::PropertyCallbackInfo<void>& info) { | 1942 const v8::PropertyCallbackInfo<void>& info) { |
1943 CHECK(name->IsSymbol()); | 1943 CHECK(name->IsSymbol()); |
1944 Local<Symbol> sym = Local<Symbol>::Cast(name); | 1944 Local<Symbol> sym = Local<Symbol>::Cast(name); |
1945 if (sym->Name()->IsUndefined()) | 1945 if (sym->Name()->IsUndefined()) |
1946 return; | 1946 return; |
1947 SimpleAccessorSetter(Local<String>::Cast(sym->Name()), value, info); | 1947 SimpleAccessorSetter(Local<String>::Cast(sym->Name()), value, info); |
1948 } | 1948 } |
1949 | 1949 |
1950 void EmptyInterceptorGetter(Local<String> name, | 1950 void EmptyInterceptorGetter(Local<Name> name, |
1951 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1951 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1952 } | 1952 } |
1953 | 1953 |
1954 void EmptyInterceptorSetter(Local<String> name, | 1954 void EmptyInterceptorSetter(Local<Name> name, |
1955 Local<Value> value, | 1955 Local<Value> value, |
1956 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1956 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1957 } | 1957 } |
1958 | 1958 |
1959 void InterceptorGetter(Local<String> name, | 1959 void EmptyGenericInterceptorGetter(Local<Name> name, |
1960 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1960 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 1961 } |
| 1962 |
| 1963 void EmptyGenericInterceptorSetter(Local<Name> name, |
| 1964 Local<Value> value, |
| 1965 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 1966 } |
| 1967 |
| 1968 void StringInterceptorGetter(Local<String> name, |
| 1969 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1961 // Intercept names that start with 'interceptor_'. | 1970 // Intercept names that start with 'interceptor_'. |
1962 String::Utf8Value utf8(name); | 1971 String::Utf8Value utf8(name); |
1963 char* name_str = *utf8; | 1972 char* name_str = *utf8; |
1964 char prefix[] = "interceptor_"; | 1973 char prefix[] = "interceptor_"; |
1965 int i; | 1974 int i; |
1966 for (i = 0; name_str[i] && prefix[i]; ++i) { | 1975 for (i = 0; name_str[i] && prefix[i]; ++i) { |
1967 if (name_str[i] != prefix[i]) return; | 1976 if (name_str[i] != prefix[i]) return; |
1968 } | 1977 } |
1969 Handle<Object> self = Handle<Object>::Cast(info.This()); | 1978 Handle<Object> self = Handle<Object>::Cast(info.This()); |
1970 info.GetReturnValue().Set(self->GetHiddenValue(v8_str(name_str + i))); | 1979 info.GetReturnValue().Set(self->GetHiddenValue(v8_str(name_str + i))); |
1971 } | 1980 } |
1972 | 1981 |
1973 void InterceptorSetter(Local<String> name, | 1982 void StringInterceptorSetter(Local<String> name, |
1974 Local<Value> value, | 1983 Local<Value> value, |
1975 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1984 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1976 // Intercept accesses that set certain integer values, for which the name does | 1985 // Intercept accesses that set certain integer values, for which the name does |
1977 // not start with 'accessor_'. | 1986 // not start with 'accessor_'. |
1978 String::Utf8Value utf8(name); | 1987 String::Utf8Value utf8(name); |
1979 char* name_str = *utf8; | 1988 char* name_str = *utf8; |
1980 char prefix[] = "accessor_"; | 1989 char prefix[] = "accessor_"; |
1981 int i; | 1990 int i; |
1982 for (i = 0; name_str[i] && prefix[i]; ++i) { | 1991 for (i = 0; name_str[i] && prefix[i]; ++i) { |
1983 if (name_str[i] != prefix[i]) break; | 1992 if (name_str[i] != prefix[i]) break; |
1984 } | 1993 } |
1985 if (!prefix[i]) return; | 1994 if (!prefix[i]) return; |
1986 | 1995 |
1987 if (value->IsInt32() && value->Int32Value() < 10000) { | 1996 if (value->IsInt32() && value->Int32Value() < 10000) { |
1988 Handle<Object> self = Handle<Object>::Cast(info.This()); | 1997 Handle<Object> self = Handle<Object>::Cast(info.This()); |
1989 self->SetHiddenValue(name, value); | 1998 self->SetHiddenValue(name, value); |
1990 info.GetReturnValue().Set(value); | 1999 info.GetReturnValue().Set(value); |
1991 } | 2000 } |
1992 } | 2001 } |
1993 | 2002 |
| 2003 void InterceptorGetter(Local<Name> generic_name, |
| 2004 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2005 if (generic_name->IsSymbol()) return; |
| 2006 StringInterceptorGetter(Local<String>::Cast(generic_name), info); |
| 2007 } |
| 2008 |
| 2009 void InterceptorSetter(Local<Name> generic_name, |
| 2010 Local<Value> value, |
| 2011 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2012 if (generic_name->IsSymbol()) return; |
| 2013 StringInterceptorSetter(Local<String>::Cast(generic_name), value, info); |
| 2014 } |
| 2015 |
| 2016 void GenericInterceptorGetter(Local<Name> generic_name, |
| 2017 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2018 Local<String> str; |
| 2019 if (generic_name->IsSymbol()) { |
| 2020 Local<Value> name = Local<Symbol>::Cast(generic_name)->Name(); |
| 2021 if (name->IsUndefined()) return; |
| 2022 str = String::Concat(v8_str("_sym_"), Local<String>::Cast(name)); |
| 2023 } else { |
| 2024 Local<String> name = Local<String>::Cast(generic_name); |
| 2025 String::Utf8Value utf8(name); |
| 2026 char* name_str = *utf8; |
| 2027 if (*name_str == '_') return; |
| 2028 str = String::Concat(v8_str("_str_"), name); |
| 2029 } |
| 2030 |
| 2031 Handle<Object> self = Handle<Object>::Cast(info.This()); |
| 2032 info.GetReturnValue().Set(self->Get(str)); |
| 2033 } |
| 2034 |
| 2035 void GenericInterceptorSetter(Local<Name> generic_name, |
| 2036 Local<Value> value, |
| 2037 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2038 Local<String> str; |
| 2039 if (generic_name->IsSymbol()) { |
| 2040 Local<Value> name = Local<Symbol>::Cast(generic_name)->Name(); |
| 2041 if (name->IsUndefined()) return; |
| 2042 str = String::Concat(v8_str("_sym_"), Local<String>::Cast(name)); |
| 2043 } else { |
| 2044 Local<String> name = Local<String>::Cast(generic_name); |
| 2045 String::Utf8Value utf8(name); |
| 2046 char* name_str = *utf8; |
| 2047 if (*name_str == '_') return; |
| 2048 str = String::Concat(v8_str("_str_"), name); |
| 2049 } |
| 2050 |
| 2051 Handle<Object> self = Handle<Object>::Cast(info.This()); |
| 2052 self->Set(str, value); |
| 2053 info.GetReturnValue().Set(value); |
| 2054 } |
| 2055 |
1994 void AddAccessor(Handle<FunctionTemplate> templ, | 2056 void AddAccessor(Handle<FunctionTemplate> templ, |
1995 Handle<String> name, | 2057 Handle<String> name, |
1996 v8::AccessorGetterCallback getter, | 2058 v8::AccessorGetterCallback getter, |
1997 v8::AccessorSetterCallback setter) { | 2059 v8::AccessorSetterCallback setter) { |
1998 templ->PrototypeTemplate()->SetAccessor(name, getter, setter); | 2060 templ->PrototypeTemplate()->SetAccessor(name, getter, setter); |
1999 } | 2061 } |
2000 | 2062 |
2001 void AddInterceptor(Handle<FunctionTemplate> templ, | 2063 void AddInterceptor(Handle<FunctionTemplate> templ, |
2002 v8::NamedPropertyGetterCallback getter, | 2064 v8::NamedPropertyGetterCallback getter, |
2003 v8::NamedPropertySetterCallback setter) { | 2065 v8::NamedPropertySetterCallback setter) { |
2004 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); | 2066 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); |
2005 } | 2067 } |
2006 | 2068 |
2007 | 2069 |
2008 void AddAccessor(Handle<FunctionTemplate> templ, | 2070 void AddAccessor(Handle<FunctionTemplate> templ, |
2009 Handle<Name> name, | 2071 Handle<Name> name, |
2010 v8::AccessorNameGetterCallback getter, | 2072 v8::AccessorNameGetterCallback getter, |
2011 v8::AccessorNameSetterCallback setter) { | 2073 v8::AccessorNameSetterCallback setter) { |
2012 templ->PrototypeTemplate()->SetAccessor(name, getter, setter); | 2074 templ->PrototypeTemplate()->SetAccessor(name, getter, setter); |
2013 } | 2075 } |
2014 | 2076 |
| 2077 void AddInterceptor(Handle<FunctionTemplate> templ, |
| 2078 v8::GenericNamedPropertyGetterCallback getter, |
| 2079 v8::GenericNamedPropertySetterCallback setter) { |
| 2080 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); |
| 2081 } |
| 2082 |
2015 | 2083 |
2016 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) { | 2084 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) { |
2017 v8::HandleScope scope(CcTest::isolate()); | 2085 v8::HandleScope scope(CcTest::isolate()); |
2018 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); | 2086 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); |
2019 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); | 2087 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); |
2020 child->Inherit(parent); | 2088 child->Inherit(parent); |
2021 AddAccessor(parent, v8_str("age"), | 2089 AddAccessor(parent, v8_str("age"), |
2022 SimpleAccessorGetter, SimpleAccessorSetter); | 2090 SimpleAccessorGetter, SimpleAccessorSetter); |
2023 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); | 2091 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); |
2024 LocalContext env; | 2092 LocalContext env; |
2025 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2093 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
2026 CompileRun("var child = new Child;" | 2094 CompileRun("var child = new Child;" |
2027 "child.age = 10;"); | 2095 "child.age = 10;"); |
2028 ExpectBoolean("child.hasOwnProperty('age')", false); | 2096 ExpectBoolean("child.hasOwnProperty('age')", false); |
2029 ExpectInt32("child.age", 10); | 2097 ExpectInt32("child.age", 10); |
2030 ExpectInt32("child.accessor_age", 10); | 2098 ExpectInt32("child.accessor_age", 10); |
2031 } | 2099 } |
2032 | 2100 |
2033 | 2101 |
| 2102 THREADED_TEST(LegacyInterceptorDoesNotSeeSymbols) { |
| 2103 LocalContext env; |
| 2104 v8::Isolate* isolate = CcTest::isolate(); |
| 2105 v8::HandleScope scope(isolate); |
| 2106 Handle<FunctionTemplate> parent = FunctionTemplate::New(isolate); |
| 2107 Handle<FunctionTemplate> child = FunctionTemplate::New(isolate); |
| 2108 v8::Local<v8::Symbol> age = v8::Symbol::New(isolate, v8_str("age")); |
| 2109 |
| 2110 child->Inherit(parent); |
| 2111 AddAccessor(parent, age, SymbolAccessorGetter, SymbolAccessorSetter); |
| 2112 AddInterceptor(child, StringInterceptorGetter, StringInterceptorSetter); |
| 2113 |
| 2114 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
| 2115 env->Global()->Set(v8_str("age"), age); |
| 2116 CompileRun("var child = new Child;" |
| 2117 "child[age] = 10;"); |
| 2118 ExpectInt32("child[age]", 10); |
| 2119 ExpectBoolean("child.hasOwnProperty('age')", false); |
| 2120 ExpectBoolean("child.hasOwnProperty('accessor_age')", true); |
| 2121 } |
| 2122 |
| 2123 |
| 2124 THREADED_TEST(GenericInterceptorDoesSeeSymbols) { |
| 2125 LocalContext env; |
| 2126 v8::Isolate* isolate = CcTest::isolate(); |
| 2127 v8::HandleScope scope(isolate); |
| 2128 Handle<FunctionTemplate> parent = FunctionTemplate::New(isolate); |
| 2129 Handle<FunctionTemplate> child = FunctionTemplate::New(isolate); |
| 2130 v8::Local<v8::Symbol> age = v8::Symbol::New(isolate, v8_str("age")); |
| 2131 v8::Local<v8::Symbol> anon = v8::Symbol::New(isolate); |
| 2132 |
| 2133 child->Inherit(parent); |
| 2134 AddAccessor(parent, age, SymbolAccessorGetter, SymbolAccessorSetter); |
| 2135 AddInterceptor(child, GenericInterceptorGetter, GenericInterceptorSetter); |
| 2136 |
| 2137 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
| 2138 env->Global()->Set(v8_str("age"), age); |
| 2139 env->Global()->Set(v8_str("anon"), anon); |
| 2140 CompileRun("var child = new Child;" |
| 2141 "child[age] = 10;"); |
| 2142 ExpectInt32("child[age]", 10); |
| 2143 ExpectInt32("child._sym_age", 10); |
| 2144 |
| 2145 // Check that it also sees strings. |
| 2146 CompileRun("child.foo = 47"); |
| 2147 ExpectInt32("child.foo", 47); |
| 2148 ExpectInt32("child._str_foo", 47); |
| 2149 |
| 2150 // Check that the interceptor can punt (in this case, on anonymous symbols). |
| 2151 CompileRun("child[anon] = 31337"); |
| 2152 ExpectInt32("child[anon]", 31337); |
| 2153 } |
| 2154 |
| 2155 |
2034 THREADED_TEST(ExecutableAccessorIsPreservedOnAttributeChange) { | 2156 THREADED_TEST(ExecutableAccessorIsPreservedOnAttributeChange) { |
2035 v8::Isolate* isolate = CcTest::isolate(); | 2157 v8::Isolate* isolate = CcTest::isolate(); |
2036 v8::HandleScope scope(isolate); | 2158 v8::HandleScope scope(isolate); |
2037 LocalContext env; | 2159 LocalContext env; |
2038 v8::Local<v8::Value> res = CompileRun("var a = []; a;"); | 2160 v8::Local<v8::Value> res = CompileRun("var a = []; a;"); |
2039 i::Handle<i::JSObject> a(v8::Utils::OpenHandle(v8::Object::Cast(*res))); | 2161 i::Handle<i::JSObject> a(v8::Utils::OpenHandle(v8::Object::Cast(*res))); |
2040 CHECK(a->map()->instance_descriptors()->IsFixedArray()); | 2162 CHECK(a->map()->instance_descriptors()->IsFixedArray()); |
2041 CHECK_GT(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0); | 2163 CHECK_GT(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0); |
2042 CompileRun("Object.defineProperty(a, 'length', { writable: false });"); | 2164 CompileRun("Object.defineProperty(a, 'length', { writable: false });"); |
2043 CHECK_EQ(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0); | 2165 CHECK_EQ(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0); |
(...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 | 2450 |
2329 static void CheckThisIndexedPropertyHandler( | 2451 static void CheckThisIndexedPropertyHandler( |
2330 uint32_t index, | 2452 uint32_t index, |
2331 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2453 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2332 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyHandler)); | 2454 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyHandler)); |
2333 ApiTestFuzzer::Fuzz(); | 2455 ApiTestFuzzer::Fuzz(); |
2334 CHECK(info.This()->Equals(bottom)); | 2456 CHECK(info.This()->Equals(bottom)); |
2335 } | 2457 } |
2336 | 2458 |
2337 static void CheckThisNamedPropertyHandler( | 2459 static void CheckThisNamedPropertyHandler( |
2338 Local<String> name, | 2460 Local<Name> name, |
2339 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2461 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2340 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyHandler)); | 2462 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyHandler)); |
2341 ApiTestFuzzer::Fuzz(); | 2463 ApiTestFuzzer::Fuzz(); |
2342 CHECK(info.This()->Equals(bottom)); | 2464 CHECK(info.This()->Equals(bottom)); |
2343 } | 2465 } |
2344 | 2466 |
2345 void CheckThisIndexedPropertySetter( | 2467 void CheckThisIndexedPropertySetter( |
2346 uint32_t index, | 2468 uint32_t index, |
2347 Local<Value> value, | 2469 Local<Value> value, |
2348 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2470 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2349 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertySetter)); | 2471 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertySetter)); |
2350 ApiTestFuzzer::Fuzz(); | 2472 ApiTestFuzzer::Fuzz(); |
2351 CHECK(info.This()->Equals(bottom)); | 2473 CHECK(info.This()->Equals(bottom)); |
2352 } | 2474 } |
2353 | 2475 |
2354 | 2476 |
2355 void CheckThisNamedPropertySetter( | 2477 void CheckThisNamedPropertySetter( |
2356 Local<String> property, | 2478 Local<Name> property, |
2357 Local<Value> value, | 2479 Local<Value> value, |
2358 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2480 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2359 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertySetter)); | 2481 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertySetter)); |
2360 ApiTestFuzzer::Fuzz(); | 2482 ApiTestFuzzer::Fuzz(); |
2361 CHECK(info.This()->Equals(bottom)); | 2483 CHECK(info.This()->Equals(bottom)); |
2362 } | 2484 } |
2363 | 2485 |
2364 void CheckThisIndexedPropertyQuery( | 2486 void CheckThisIndexedPropertyQuery( |
2365 uint32_t index, | 2487 uint32_t index, |
2366 const v8::PropertyCallbackInfo<v8::Integer>& info) { | 2488 const v8::PropertyCallbackInfo<v8::Integer>& info) { |
2367 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyQuery)); | 2489 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyQuery)); |
2368 ApiTestFuzzer::Fuzz(); | 2490 ApiTestFuzzer::Fuzz(); |
2369 CHECK(info.This()->Equals(bottom)); | 2491 CHECK(info.This()->Equals(bottom)); |
2370 } | 2492 } |
2371 | 2493 |
2372 | 2494 |
2373 void CheckThisNamedPropertyQuery( | 2495 void CheckThisNamedPropertyQuery( |
2374 Local<String> property, | 2496 Local<Name> property, |
2375 const v8::PropertyCallbackInfo<v8::Integer>& info) { | 2497 const v8::PropertyCallbackInfo<v8::Integer>& info) { |
2376 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyQuery)); | 2498 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyQuery)); |
2377 ApiTestFuzzer::Fuzz(); | 2499 ApiTestFuzzer::Fuzz(); |
2378 CHECK(info.This()->Equals(bottom)); | 2500 CHECK(info.This()->Equals(bottom)); |
2379 } | 2501 } |
2380 | 2502 |
2381 | 2503 |
2382 void CheckThisIndexedPropertyDeleter( | 2504 void CheckThisIndexedPropertyDeleter( |
2383 uint32_t index, | 2505 uint32_t index, |
2384 const v8::PropertyCallbackInfo<v8::Boolean>& info) { | 2506 const v8::PropertyCallbackInfo<v8::Boolean>& info) { |
2385 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyDeleter)); | 2507 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyDeleter)); |
2386 ApiTestFuzzer::Fuzz(); | 2508 ApiTestFuzzer::Fuzz(); |
2387 CHECK(info.This()->Equals(bottom)); | 2509 CHECK(info.This()->Equals(bottom)); |
2388 } | 2510 } |
2389 | 2511 |
2390 | 2512 |
2391 void CheckThisNamedPropertyDeleter( | 2513 void CheckThisNamedPropertyDeleter( |
2392 Local<String> property, | 2514 Local<Name> property, |
2393 const v8::PropertyCallbackInfo<v8::Boolean>& info) { | 2515 const v8::PropertyCallbackInfo<v8::Boolean>& info) { |
2394 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyDeleter)); | 2516 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyDeleter)); |
2395 ApiTestFuzzer::Fuzz(); | 2517 ApiTestFuzzer::Fuzz(); |
2396 CHECK(info.This()->Equals(bottom)); | 2518 CHECK(info.This()->Equals(bottom)); |
2397 } | 2519 } |
2398 | 2520 |
2399 | 2521 |
2400 void CheckThisIndexedPropertyEnumerator( | 2522 void CheckThisIndexedPropertyEnumerator( |
2401 const v8::PropertyCallbackInfo<v8::Array>& info) { | 2523 const v8::PropertyCallbackInfo<v8::Array>& info) { |
2402 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyEnumerator)); | 2524 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyEnumerator)); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2457 // Indexed and named deleter. | 2579 // Indexed and named deleter. |
2458 CompileRun("delete obj[0]"); | 2580 CompileRun("delete obj[0]"); |
2459 CompileRun("delete obj.x"); | 2581 CompileRun("delete obj.x"); |
2460 | 2582 |
2461 // Enumerators. | 2583 // Enumerators. |
2462 CompileRun("for (var p in obj) ;"); | 2584 CompileRun("for (var p in obj) ;"); |
2463 } | 2585 } |
2464 | 2586 |
2465 | 2587 |
2466 static void PrePropertyHandlerGet( | 2588 static void PrePropertyHandlerGet( |
2467 Local<String> key, | 2589 Local<Name> key, |
2468 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2590 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2469 ApiTestFuzzer::Fuzz(); | 2591 ApiTestFuzzer::Fuzz(); |
2470 if (v8_str("pre")->Equals(key)) { | 2592 if (v8_str("pre")->Equals(key)) { |
2471 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); | 2593 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); |
2472 } | 2594 } |
2473 } | 2595 } |
2474 | 2596 |
2475 | 2597 |
2476 static void PrePropertyHandlerQuery( | 2598 static void PrePropertyHandlerQuery( |
2477 Local<String> key, | 2599 Local<Name> key, |
2478 const v8::PropertyCallbackInfo<v8::Integer>& info) { | 2600 const v8::PropertyCallbackInfo<v8::Integer>& info) { |
2479 if (v8_str("pre")->Equals(key)) { | 2601 if (v8_str("pre")->Equals(key)) { |
2480 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); | 2602 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); |
2481 } | 2603 } |
2482 } | 2604 } |
2483 | 2605 |
2484 | 2606 |
2485 THREADED_TEST(PrePropertyHandler) { | 2607 THREADED_TEST(PrePropertyHandler) { |
2486 v8::Isolate* isolate = CcTest::isolate(); | 2608 v8::Isolate* isolate = CcTest::isolate(); |
2487 v8::HandleScope scope(isolate); | 2609 v8::HandleScope scope(isolate); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2554 call_recursively_script = v8_compile("callScriptRecursively()"); | 2676 call_recursively_script = v8_compile("callScriptRecursively()"); |
2555 call_recursively_script->Run(); | 2677 call_recursively_script->Run(); |
2556 call_recursively_script = v8::Handle<Script>(); | 2678 call_recursively_script = v8::Handle<Script>(); |
2557 | 2679 |
2558 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); | 2680 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); |
2559 CompileRun("callFunctionRecursively()"); | 2681 CompileRun("callFunctionRecursively()"); |
2560 } | 2682 } |
2561 | 2683 |
2562 | 2684 |
2563 static void ThrowingPropertyHandlerGet( | 2685 static void ThrowingPropertyHandlerGet( |
2564 Local<String> key, | 2686 Local<Name> key, |
2565 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2687 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2688 // Since this interceptor is used on "with" objects, the runtime will look up |
| 2689 // @@unscopables. Punt. |
| 2690 if (key->IsSymbol()) return; |
2566 ApiTestFuzzer::Fuzz(); | 2691 ApiTestFuzzer::Fuzz(); |
2567 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); | 2692 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); |
2568 } | 2693 } |
2569 | 2694 |
2570 | 2695 |
2571 static void ThrowingPropertyHandlerSet( | 2696 static void ThrowingPropertyHandlerSet( |
2572 Local<String> key, | 2697 Local<Name> key, |
2573 Local<Value>, | 2698 Local<Value>, |
2574 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2699 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2575 info.GetIsolate()->ThrowException(key); | 2700 info.GetIsolate()->ThrowException(key); |
2576 info.GetReturnValue().SetUndefined(); // not the same as empty handle | 2701 info.GetReturnValue().SetUndefined(); // not the same as empty handle |
2577 } | 2702 } |
2578 | 2703 |
2579 | 2704 |
2580 THREADED_TEST(CallbackExceptionRegression) { | 2705 THREADED_TEST(CallbackExceptionRegression) { |
2581 v8::Isolate* isolate = CcTest::isolate(); | 2706 v8::Isolate* isolate = CcTest::isolate(); |
2582 v8::HandleScope scope(isolate); | 2707 v8::HandleScope scope(isolate); |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3405 // If it did we would have full access to the hidden properties in | 3530 // If it did we would have full access to the hidden properties in |
3406 // the accessor. | 3531 // the accessor. |
3407 CHECK(obj->SetHiddenValue(key, v8::Integer::New(env->GetIsolate(), 42))); | 3532 CHECK(obj->SetHiddenValue(key, v8::Integer::New(env->GetIsolate(), 42))); |
3408 ExpectFalse("set_called"); | 3533 ExpectFalse("set_called"); |
3409 CHECK_EQ(42, obj->GetHiddenValue(key)->Int32Value()); | 3534 CHECK_EQ(42, obj->GetHiddenValue(key)->Int32Value()); |
3410 } | 3535 } |
3411 | 3536 |
3412 | 3537 |
3413 static bool interceptor_for_hidden_properties_called; | 3538 static bool interceptor_for_hidden_properties_called; |
3414 static void InterceptorForHiddenProperties( | 3539 static void InterceptorForHiddenProperties( |
3415 Local<String> name, const v8::PropertyCallbackInfo<v8::Value>& info) { | 3540 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { |
3416 interceptor_for_hidden_properties_called = true; | 3541 interceptor_for_hidden_properties_called = true; |
3417 } | 3542 } |
3418 | 3543 |
3419 | 3544 |
3420 THREADED_TEST(HiddenPropertiesWithInterceptors) { | 3545 THREADED_TEST(HiddenPropertiesWithInterceptors) { |
3421 LocalContext context; | 3546 LocalContext context; |
3422 v8::Isolate* isolate = context->GetIsolate(); | 3547 v8::Isolate* isolate = context->GetIsolate(); |
3423 v8::HandleScope scope(isolate); | 3548 v8::HandleScope scope(isolate); |
3424 | 3549 |
3425 interceptor_for_hidden_properties_called = false; | 3550 interceptor_for_hidden_properties_called = false; |
(...skipping 2548 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5974 v8_str("donut")); | 6099 v8_str("donut")); |
5975 LocalContext context; | 6100 LocalContext context; |
5976 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6101 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
5977 Local<Script> script = v8_compile("obj.x = 4; obj.x"); | 6102 Local<Script> script = v8_compile("obj.x = 4; obj.x"); |
5978 for (int i = 0; i < 10; i++) { | 6103 for (int i = 0; i < 10; i++) { |
5979 script->Run(); | 6104 script->Run(); |
5980 } | 6105 } |
5981 } | 6106 } |
5982 | 6107 |
5983 | 6108 |
5984 static void XPropertyGetter(Local<String> property, | 6109 static void XPropertyGetter(Local<Name> property, |
5985 const v8::PropertyCallbackInfo<v8::Value>& info) { | 6110 const v8::PropertyCallbackInfo<v8::Value>& info) { |
5986 ApiTestFuzzer::Fuzz(); | 6111 ApiTestFuzzer::Fuzz(); |
5987 CHECK(info.Data()->IsUndefined()); | 6112 CHECK(info.Data()->IsUndefined()); |
5988 info.GetReturnValue().Set(property); | 6113 info.GetReturnValue().Set(property); |
5989 } | 6114 } |
5990 | 6115 |
5991 | 6116 |
5992 THREADED_TEST(NamedInterceptorPropertyRead) { | 6117 THREADED_TEST(NamedInterceptorPropertyRead) { |
5993 v8::Isolate* isolate = CcTest::isolate(); | 6118 v8::Isolate* isolate = CcTest::isolate(); |
5994 v8::HandleScope scope(isolate); | 6119 v8::HandleScope scope(isolate); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6070 | 6195 |
6071 // Return to the original context and force some object to the slow case | 6196 // Return to the original context and force some object to the slow case |
6072 // to cause the NormalizedMapCache to verify. | 6197 // to cause the NormalizedMapCache to verify. |
6073 context1->Enter(); | 6198 context1->Enter(); |
6074 CompileRun("var obj = { x : 0 }; delete obj.x;"); | 6199 CompileRun("var obj = { x : 0 }; delete obj.x;"); |
6075 context1->Exit(); | 6200 context1->Exit(); |
6076 } | 6201 } |
6077 | 6202 |
6078 | 6203 |
6079 static void SetXOnPrototypeGetter( | 6204 static void SetXOnPrototypeGetter( |
6080 Local<String> property, | 6205 Local<Name> property, |
6081 const v8::PropertyCallbackInfo<v8::Value>& info) { | 6206 const v8::PropertyCallbackInfo<v8::Value>& info) { |
6082 // Set x on the prototype object and do not handle the get request. | 6207 // Set x on the prototype object and do not handle the get request. |
6083 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); | 6208 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); |
6084 proto.As<v8::Object>()->Set(v8_str("x"), | 6209 proto.As<v8::Object>()->Set(v8_str("x"), |
6085 v8::Integer::New(info.GetIsolate(), 23)); | 6210 v8::Integer::New(info.GetIsolate(), 23)); |
6086 } | 6211 } |
6087 | 6212 |
6088 | 6213 |
6089 // This is a regression test for http://crbug.com/20104. Map | 6214 // This is a regression test for http://crbug.com/20104. Map |
6090 // transitions should not interfere with post interceptor lookup. | 6215 // transitions should not interfere with post interceptor lookup. |
(...skipping 1436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7527 v8::HandleScope scope(isolate); | 7652 v8::HandleScope scope(isolate); |
7528 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); | 7653 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); |
7529 global->Set(v8_str("f"), | 7654 global->Set(v8_str("f"), |
7530 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); | 7655 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); |
7531 LocalContext context(NULL, global); | 7656 LocalContext context(NULL, global); |
7532 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); | 7657 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); |
7533 v8_compile("f(1, 2, 3)")->Run(); | 7658 v8_compile("f(1, 2, 3)")->Run(); |
7534 } | 7659 } |
7535 | 7660 |
7536 | 7661 |
7537 static void NoBlockGetterX(Local<String> name, | 7662 static void NoBlockGetterX(Local<Name> name, |
7538 const v8::PropertyCallbackInfo<v8::Value>&) { | 7663 const v8::PropertyCallbackInfo<v8::Value>&) { |
7539 } | 7664 } |
7540 | 7665 |
7541 | 7666 |
7542 static void NoBlockGetterI(uint32_t index, | 7667 static void NoBlockGetterI(uint32_t index, |
7543 const v8::PropertyCallbackInfo<v8::Value>&) { | 7668 const v8::PropertyCallbackInfo<v8::Value>&) { |
7544 } | 7669 } |
7545 | 7670 |
7546 | 7671 |
7547 static void PDeleter(Local<String> name, | 7672 static void PDeleter(Local<Name> name, |
7548 const v8::PropertyCallbackInfo<v8::Boolean>& info) { | 7673 const v8::PropertyCallbackInfo<v8::Boolean>& info) { |
7549 if (!name->Equals(v8_str("foo"))) { | 7674 if (!name->Equals(v8_str("foo"))) { |
7550 return; // not intercepted | 7675 return; // not intercepted |
7551 } | 7676 } |
7552 | 7677 |
7553 info.GetReturnValue().Set(false); // intercepted, don't delete the property | 7678 info.GetReturnValue().Set(false); // intercepted, don't delete the property |
7554 } | 7679 } |
7555 | 7680 |
7556 | 7681 |
7557 static void IDeleter(uint32_t index, | 7682 static void IDeleter(uint32_t index, |
(...skipping 26 matching lines...) Expand all Loading... |
7584 CHECK(v8_compile("k.bar")->Run()->IsUndefined()); | 7709 CHECK(v8_compile("k.bar")->Run()->IsUndefined()); |
7585 | 7710 |
7586 CHECK(v8_compile("delete k[2]")->Run()->IsFalse()); | 7711 CHECK(v8_compile("delete k[2]")->Run()->IsFalse()); |
7587 CHECK(v8_compile("delete k[4]")->Run()->IsTrue()); | 7712 CHECK(v8_compile("delete k[4]")->Run()->IsTrue()); |
7588 | 7713 |
7589 CHECK_EQ(v8_compile("k[2]")->Run(), v8_num(2)); | 7714 CHECK_EQ(v8_compile("k[2]")->Run(), v8_num(2)); |
7590 CHECK(v8_compile("k[4]")->Run()->IsUndefined()); | 7715 CHECK(v8_compile("k[4]")->Run()->IsUndefined()); |
7591 } | 7716 } |
7592 | 7717 |
7593 | 7718 |
7594 static void GetK(Local<String> name, | 7719 static void GetK(Local<Name> name, |
7595 const v8::PropertyCallbackInfo<v8::Value>& info) { | 7720 const v8::PropertyCallbackInfo<v8::Value>& info) { |
7596 ApiTestFuzzer::Fuzz(); | 7721 ApiTestFuzzer::Fuzz(); |
7597 if (name->Equals(v8_str("foo")) || | 7722 if (name->Equals(v8_str("foo")) || |
7598 name->Equals(v8_str("bar")) || | 7723 name->Equals(v8_str("bar")) || |
7599 name->Equals(v8_str("baz"))) { | 7724 name->Equals(v8_str("baz"))) { |
7600 info.GetReturnValue().SetUndefined(); | 7725 info.GetReturnValue().SetUndefined(); |
7601 } | 7726 } |
7602 } | 7727 } |
7603 | 7728 |
7604 | 7729 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7718 "var o2 = { __proto__: o1 };" | 7843 "var o2 = { __proto__: o1 };" |
7719 "var o3 = { __proto__: o2 };" | 7844 "var o3 = { __proto__: o2 };" |
7720 "var o4 = { __proto__: o3 };" | 7845 "var o4 = { __proto__: o3 };" |
7721 "for (var i = 0; i < 10; i++) o4.p4;" | 7846 "for (var i = 0; i < 10; i++) o4.p4;" |
7722 "for (var i = 0; i < 10; i++) o3.p3;" | 7847 "for (var i = 0; i < 10; i++) o3.p3;" |
7723 "for (var i = 0; i < 10; i++) o2.p2;" | 7848 "for (var i = 0; i < 10; i++) o2.p2;" |
7724 "for (var i = 0; i < 10; i++) o1.p1;"); | 7849 "for (var i = 0; i < 10; i++) o1.p1;"); |
7725 } | 7850 } |
7726 | 7851 |
7727 | 7852 |
7728 static void PGetter2(Local<String> name, | 7853 static void PGetter2(Local<Name> name, |
7729 const v8::PropertyCallbackInfo<v8::Value>& info) { | 7854 const v8::PropertyCallbackInfo<v8::Value>& info) { |
7730 ApiTestFuzzer::Fuzz(); | 7855 ApiTestFuzzer::Fuzz(); |
7731 p_getter_count2++; | 7856 p_getter_count2++; |
7732 v8::Handle<v8::Object> global = | 7857 v8::Handle<v8::Object> global = |
7733 info.GetIsolate()->GetCurrentContext()->Global(); | 7858 info.GetIsolate()->GetCurrentContext()->Global(); |
7734 CHECK_EQ(info.Holder(), global->Get(v8_str("o1"))); | 7859 CHECK_EQ(info.Holder(), global->Get(v8_str("o1"))); |
7735 if (name->Equals(v8_str("p1"))) { | 7860 if (name->Equals(v8_str("p1"))) { |
7736 CHECK_EQ(info.This(), global->Get(v8_str("o1"))); | 7861 CHECK_EQ(info.This(), global->Get(v8_str("o1"))); |
7737 } else if (name->Equals(v8_str("p2"))) { | 7862 } else if (name->Equals(v8_str("p2"))) { |
7738 CHECK_EQ(info.This(), global->Get(v8_str("o2"))); | 7863 CHECK_EQ(info.This(), global->Get(v8_str("o2"))); |
(...skipping 1868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9607 const v8::PropertyCallbackInfo<v8::Array>& info) { | 9732 const v8::PropertyCallbackInfo<v8::Array>& info) { |
9608 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); | 9733 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); |
9609 result->Set(0, v8::Integer::New(info.GetIsolate(), 7)); | 9734 result->Set(0, v8::Integer::New(info.GetIsolate(), 7)); |
9610 result->Set(1, v8::Object::New(info.GetIsolate())); | 9735 result->Set(1, v8::Object::New(info.GetIsolate())); |
9611 info.GetReturnValue().Set(result); | 9736 info.GetReturnValue().Set(result); |
9612 } | 9737 } |
9613 | 9738 |
9614 | 9739 |
9615 static void NamedPropertyEnumerator( | 9740 static void NamedPropertyEnumerator( |
9616 const v8::PropertyCallbackInfo<v8::Array>& info) { | 9741 const v8::PropertyCallbackInfo<v8::Array>& info) { |
9617 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); | 9742 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); |
9618 result->Set(0, v8_str("x")); | 9743 result->Set(0, v8_str("x")); |
9619 result->Set(1, v8::Object::New(info.GetIsolate())); | 9744 result->Set(1, v8::Object::New(info.GetIsolate())); |
| 9745 result->Set(2, v8::Symbol::GetIterator(info.GetIsolate())); |
9620 info.GetReturnValue().Set(result); | 9746 info.GetReturnValue().Set(result); |
9621 } | 9747 } |
9622 | 9748 |
9623 | 9749 |
9624 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) { | 9750 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) { |
9625 v8::Isolate* isolate = CcTest::isolate(); | 9751 v8::Isolate* isolate = CcTest::isolate(); |
9626 v8::HandleScope handle_scope(isolate); | 9752 v8::HandleScope handle_scope(isolate); |
9627 v8::Handle<v8::ObjectTemplate> obj_template = | 9753 v8::Handle<v8::ObjectTemplate> obj_template = |
9628 v8::ObjectTemplate::New(isolate); | 9754 v8::ObjectTemplate::New(isolate); |
9629 | 9755 |
9630 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7)); | 9756 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7)); |
9631 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42)); | 9757 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42)); |
9632 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL, | 9758 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL, |
9633 IndexedPropertyEnumerator); | 9759 IndexedPropertyEnumerator); |
9634 obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL, | 9760 // TODO(wingo): Types needed to disambiguate between deprecated and new |
| 9761 // SetNamedPropertyHandler implementations. Go back to just passing NULL |
| 9762 // values once deprecated API is removed. |
| 9763 v8::GenericNamedPropertyGetterCallback getter = NULL; |
| 9764 obj_template->SetNamedPropertyHandler(getter, NULL, NULL, NULL, |
9635 NamedPropertyEnumerator); | 9765 NamedPropertyEnumerator); |
9636 | 9766 |
9637 LocalContext context; | 9767 LocalContext context; |
9638 v8::Handle<v8::Object> global = context->Global(); | 9768 v8::Handle<v8::Object> global = context->Global(); |
9639 global->Set(v8_str("object"), obj_template->NewInstance()); | 9769 global->Set(v8_str("object"), obj_template->NewInstance()); |
9640 | 9770 |
9641 v8::Handle<v8::Value> result = | 9771 v8::Handle<v8::Value> result = |
9642 CompileRun("Object.getOwnPropertyNames(object)"); | 9772 CompileRun("Object.getOwnPropertyNames(object)"); |
9643 CHECK(result->IsArray()); | 9773 CHECK(result->IsArray()); |
9644 v8::Handle<v8::Array> result_array = v8::Handle<v8::Array>::Cast(result); | 9774 v8::Handle<v8::Array> result_array = v8::Handle<v8::Array>::Cast(result); |
9645 CHECK_EQ(3, result_array->Length()); | 9775 CHECK_EQ(3, result_array->Length()); |
9646 CHECK(result_array->Get(0)->IsString()); | 9776 CHECK(result_array->Get(0)->IsString()); |
9647 CHECK(result_array->Get(1)->IsString()); | 9777 CHECK(result_array->Get(1)->IsString()); |
9648 CHECK(result_array->Get(2)->IsString()); | 9778 CHECK(result_array->Get(2)->IsString()); |
9649 CHECK_EQ(v8_str("7"), result_array->Get(0)); | 9779 CHECK_EQ(v8_str("7"), result_array->Get(0)); |
9650 CHECK_EQ(v8_str("[object Object]"), result_array->Get(1)); | 9780 CHECK_EQ(v8_str("[object Object]"), result_array->Get(1)); |
9651 CHECK_EQ(v8_str("x"), result_array->Get(2)); | 9781 CHECK_EQ(v8_str("x"), result_array->Get(2)); |
| 9782 |
| 9783 result = CompileRun("var ret; for (var k in object) array.push(k); ret"); |
| 9784 CHECK(result->IsArray()); |
| 9785 result_array = v8::Handle<v8::Array>::Cast(result); |
| 9786 CHECK_EQ(3, result_array->Length()); |
| 9787 CHECK(result_array->Get(0)->IsString()); |
| 9788 CHECK(result_array->Get(1)->IsString()); |
| 9789 CHECK(result_array->Get(2)->IsString()); |
| 9790 CHECK_EQ(v8_str("7"), result_array->Get(0)); |
| 9791 CHECK_EQ(v8_str("[object Object]"), result_array->Get(1)); |
| 9792 CHECK_EQ(v8_str("x"), result_array->Get(2)); |
| 9793 |
| 9794 result = CompileRun("Object.getOwnPropertySymbols(object)"); |
| 9795 CHECK(result->IsArray()); |
| 9796 result_array = v8::Handle<v8::Array>::Cast(result); |
| 9797 CHECK_EQ(1, result_array->Length()); |
| 9798 CHECK_EQ(result_array->Get(0), v8::Symbol::GetIterator(isolate)); |
9652 } | 9799 } |
9653 | 9800 |
9654 | 9801 |
9655 static void ConstTenGetter(Local<String> name, | 9802 static void ConstTenGetter(Local<String> name, |
9656 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9803 const v8::PropertyCallbackInfo<v8::Value>& info) { |
9657 info.GetReturnValue().Set(v8_num(10)); | 9804 info.GetReturnValue().Set(v8_num(10)); |
9658 } | 9805 } |
9659 | 9806 |
9660 | 9807 |
9661 THREADED_TEST(CrossDomainAccessors) { | 9808 THREADED_TEST(CrossDomainAccessors) { |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9915 | 10062 |
9916 value = v8_compile("var p = 'as' + 'df';")->Run(); | 10063 value = v8_compile("var p = 'as' + 'df';")->Run(); |
9917 value = v8_compile("obj[p];")->Run(); | 10064 value = v8_compile("obj[p];")->Run(); |
9918 | 10065 |
9919 context1->Exit(); | 10066 context1->Exit(); |
9920 context0->Exit(); | 10067 context0->Exit(); |
9921 } | 10068 } |
9922 | 10069 |
9923 | 10070 |
9924 static void AccessControlNamedGetter( | 10071 static void AccessControlNamedGetter( |
9925 Local<String>, | 10072 Local<Name>, |
9926 const v8::PropertyCallbackInfo<v8::Value>& info) { | 10073 const v8::PropertyCallbackInfo<v8::Value>& info) { |
9927 info.GetReturnValue().Set(42); | 10074 info.GetReturnValue().Set(42); |
9928 } | 10075 } |
9929 | 10076 |
9930 | 10077 |
9931 static void AccessControlNamedSetter( | 10078 static void AccessControlNamedSetter( |
9932 Local<String>, | 10079 Local<Name>, |
9933 Local<Value> value, | 10080 Local<Value> value, |
9934 const v8::PropertyCallbackInfo<v8::Value>& info) { | 10081 const v8::PropertyCallbackInfo<v8::Value>& info) { |
9935 info.GetReturnValue().Set(value); | 10082 info.GetReturnValue().Set(value); |
9936 } | 10083 } |
9937 | 10084 |
9938 | 10085 |
9939 static void AccessControlIndexedGetter( | 10086 static void AccessControlIndexedGetter( |
9940 uint32_t index, | 10087 uint32_t index, |
9941 const v8::PropertyCallbackInfo<v8::Value>& info) { | 10088 const v8::PropertyCallbackInfo<v8::Value>& info) { |
9942 info.GetReturnValue().Set(v8_num(42)); | 10089 info.GetReturnValue().Set(v8_num(42)); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10047 context->Global()->Set(v8_str("i"), o); | 10194 context->Global()->Set(v8_str("i"), o); |
10048 Local<Value> value = CompileRun("i.x"); | 10195 Local<Value> value = CompileRun("i.x"); |
10049 CHECK_EQ(42, value->Int32Value()); | 10196 CHECK_EQ(42, value->Int32Value()); |
10050 | 10197 |
10051 value = CompileRun("i.f()"); | 10198 value = CompileRun("i.f()"); |
10052 CHECK_EQ(12, value->Int32Value()); | 10199 CHECK_EQ(12, value->Int32Value()); |
10053 } | 10200 } |
10054 | 10201 |
10055 | 10202 |
10056 static void GlobalObjectInstancePropertiesGet( | 10203 static void GlobalObjectInstancePropertiesGet( |
10057 Local<String> key, | 10204 Local<Name> key, |
10058 const v8::PropertyCallbackInfo<v8::Value>&) { | 10205 const v8::PropertyCallbackInfo<v8::Value>&) { |
10059 ApiTestFuzzer::Fuzz(); | 10206 ApiTestFuzzer::Fuzz(); |
10060 } | 10207 } |
10061 | 10208 |
10062 | 10209 |
10063 THREADED_TEST(GlobalObjectInstanceProperties) { | 10210 THREADED_TEST(GlobalObjectInstanceProperties) { |
10064 v8::Isolate* isolate = CcTest::isolate(); | 10211 v8::Isolate* isolate = CcTest::isolate(); |
10065 v8::HandleScope handle_scope(isolate); | 10212 v8::HandleScope handle_scope(isolate); |
10066 | 10213 |
10067 Local<Value> global_object; | 10214 Local<Value> global_object; |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10185 shadow_y_getter_call_count++; | 10332 shadow_y_getter_call_count++; |
10186 info.GetReturnValue().Set(v8_num(shadow_y)); | 10333 info.GetReturnValue().Set(v8_num(shadow_y)); |
10187 } | 10334 } |
10188 | 10335 |
10189 | 10336 |
10190 static void ShadowIndexedGet(uint32_t index, | 10337 static void ShadowIndexedGet(uint32_t index, |
10191 const v8::PropertyCallbackInfo<v8::Value>&) { | 10338 const v8::PropertyCallbackInfo<v8::Value>&) { |
10192 } | 10339 } |
10193 | 10340 |
10194 | 10341 |
10195 static void ShadowNamedGet(Local<String> key, | 10342 static void ShadowNamedGet(Local<Name> key, |
10196 const v8::PropertyCallbackInfo<v8::Value>&) { | 10343 const v8::PropertyCallbackInfo<v8::Value>&) { |
10197 } | 10344 } |
10198 | 10345 |
10199 | 10346 |
10200 THREADED_TEST(ShadowObject) { | 10347 THREADED_TEST(ShadowObject) { |
10201 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; | 10348 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; |
10202 v8::Isolate* isolate = CcTest::isolate(); | 10349 v8::Isolate* isolate = CcTest::isolate(); |
10203 v8::HandleScope handle_scope(isolate); | 10350 v8::HandleScope handle_scope(isolate); |
10204 | 10351 |
10205 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate); | 10352 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate); |
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11308 } | 11455 } |
11309 } | 11456 } |
11310 CHECK_EQ(kIterations, v8::HandleScope::NumberOfHandles(isolate)); | 11457 CHECK_EQ(kIterations, v8::HandleScope::NumberOfHandles(isolate)); |
11311 } | 11458 } |
11312 CHECK_EQ(0, v8::HandleScope::NumberOfHandles(isolate)); | 11459 CHECK_EQ(0, v8::HandleScope::NumberOfHandles(isolate)); |
11313 CHECK_EQ(kNesting * kIterations, Recurse(isolate, kNesting, kIterations)); | 11460 CHECK_EQ(kNesting * kIterations, Recurse(isolate, kNesting, kIterations)); |
11314 } | 11461 } |
11315 | 11462 |
11316 | 11463 |
11317 static void InterceptorHasOwnPropertyGetter( | 11464 static void InterceptorHasOwnPropertyGetter( |
11318 Local<String> name, | 11465 Local<Name> name, |
11319 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11466 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11320 ApiTestFuzzer::Fuzz(); | 11467 ApiTestFuzzer::Fuzz(); |
11321 } | 11468 } |
11322 | 11469 |
11323 | 11470 |
11324 THREADED_TEST(InterceptorHasOwnProperty) { | 11471 THREADED_TEST(InterceptorHasOwnProperty) { |
11325 LocalContext context; | 11472 LocalContext context; |
11326 v8::Isolate* isolate = context->GetIsolate(); | 11473 v8::Isolate* isolate = context->GetIsolate(); |
11327 v8::HandleScope scope(isolate); | 11474 v8::HandleScope scope(isolate); |
11328 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); | 11475 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); |
(...skipping 10 matching lines...) Expand all Loading... |
11339 "o.hasOwnProperty('ostehaps');"); | 11486 "o.hasOwnProperty('ostehaps');"); |
11340 CHECK_EQ(true, value->BooleanValue()); | 11487 CHECK_EQ(true, value->BooleanValue()); |
11341 value = CompileRun( | 11488 value = CompileRun( |
11342 "var p = new constructor();" | 11489 "var p = new constructor();" |
11343 "p.hasOwnProperty('ostehaps');"); | 11490 "p.hasOwnProperty('ostehaps');"); |
11344 CHECK_EQ(false, value->BooleanValue()); | 11491 CHECK_EQ(false, value->BooleanValue()); |
11345 } | 11492 } |
11346 | 11493 |
11347 | 11494 |
11348 static void InterceptorHasOwnPropertyGetterGC( | 11495 static void InterceptorHasOwnPropertyGetterGC( |
11349 Local<String> name, | 11496 Local<Name> name, |
11350 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11497 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11351 ApiTestFuzzer::Fuzz(); | 11498 ApiTestFuzzer::Fuzz(); |
11352 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 11499 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
11353 } | 11500 } |
11354 | 11501 |
11355 | 11502 |
11356 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { | 11503 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { |
11357 LocalContext context; | 11504 LocalContext context; |
11358 v8::Isolate* isolate = context->GetIsolate(); | 11505 v8::Isolate* isolate = context->GetIsolate(); |
11359 v8::HandleScope scope(isolate); | 11506 v8::HandleScope scope(isolate); |
(...skipping 16 matching lines...) Expand all Loading... |
11376 "x = makestr(31415);" | 11523 "x = makestr(31415);" |
11377 "x = makestr(23456);"); | 11524 "x = makestr(23456);"); |
11378 v8::Handle<Value> value = CompileRun( | 11525 v8::Handle<Value> value = CompileRun( |
11379 "var o = new constructor();" | 11526 "var o = new constructor();" |
11380 "o.__proto__ = new String(x);" | 11527 "o.__proto__ = new String(x);" |
11381 "o.hasOwnProperty('ostehaps');"); | 11528 "o.hasOwnProperty('ostehaps');"); |
11382 CHECK_EQ(false, value->BooleanValue()); | 11529 CHECK_EQ(false, value->BooleanValue()); |
11383 } | 11530 } |
11384 | 11531 |
11385 | 11532 |
11386 typedef void (*NamedPropertyGetter)( | 11533 static void CheckInterceptorLoadIC( |
11387 Local<String> property, | 11534 v8::GenericNamedPropertyGetterCallback getter, const char* source, |
11388 const v8::PropertyCallbackInfo<v8::Value>& info); | 11535 int expected) { |
11389 | |
11390 | |
11391 static void CheckInterceptorLoadIC(NamedPropertyGetter getter, | |
11392 const char* source, | |
11393 int expected) { | |
11394 v8::Isolate* isolate = CcTest::isolate(); | 11536 v8::Isolate* isolate = CcTest::isolate(); |
11395 v8::HandleScope scope(isolate); | 11537 v8::HandleScope scope(isolate); |
11396 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); | 11538 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
11397 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data")); | 11539 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data")); |
11398 LocalContext context; | 11540 LocalContext context; |
11399 context->Global()->Set(v8_str("o"), templ->NewInstance()); | 11541 context->Global()->Set(v8_str("o"), templ->NewInstance()); |
11400 v8::Handle<Value> value = CompileRun(source); | 11542 v8::Handle<Value> value = CompileRun(source); |
11401 CHECK_EQ(expected, value->Int32Value()); | 11543 CHECK_EQ(expected, value->Int32Value()); |
11402 } | 11544 } |
11403 | 11545 |
11404 | 11546 |
11405 static void InterceptorLoadICGetter( | 11547 static void InterceptorLoadICGetter( |
11406 Local<String> name, | 11548 Local<Name> name, |
11407 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11549 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11408 ApiTestFuzzer::Fuzz(); | 11550 ApiTestFuzzer::Fuzz(); |
11409 v8::Isolate* isolate = CcTest::isolate(); | 11551 v8::Isolate* isolate = CcTest::isolate(); |
11410 CHECK_EQ(isolate, info.GetIsolate()); | 11552 CHECK_EQ(isolate, info.GetIsolate()); |
11411 CHECK_EQ(v8_str("data"), info.Data()); | 11553 CHECK_EQ(v8_str("data"), info.Data()); |
11412 CHECK_EQ(v8_str("x"), name); | 11554 CHECK_EQ(v8_str("x"), name); |
11413 info.GetReturnValue().Set(v8::Integer::New(isolate, 42)); | 11555 info.GetReturnValue().Set(v8::Integer::New(isolate, 42)); |
11414 } | 11556 } |
11415 | 11557 |
11416 | 11558 |
11417 // This test should hit the load IC for the interceptor case. | 11559 // This test should hit the load IC for the interceptor case. |
11418 THREADED_TEST(InterceptorLoadIC) { | 11560 THREADED_TEST(InterceptorLoadIC) { |
11419 CheckInterceptorLoadIC(InterceptorLoadICGetter, | 11561 CheckInterceptorLoadIC(InterceptorLoadICGetter, |
11420 "var result = 0;" | 11562 "var result = 0;" |
11421 "for (var i = 0; i < 1000; i++) {" | 11563 "for (var i = 0; i < 1000; i++) {" |
11422 " result = o.x;" | 11564 " result = o.x;" |
11423 "}", | 11565 "}", |
11424 42); | 11566 42); |
11425 } | 11567 } |
11426 | 11568 |
11427 | 11569 |
11428 // Below go several tests which verify that JITing for various | 11570 // Below go several tests which verify that JITing for various |
11429 // configurations of interceptor and explicit fields works fine | 11571 // configurations of interceptor and explicit fields works fine |
11430 // (those cases are special cased to get better performance). | 11572 // (those cases are special cased to get better performance). |
11431 | 11573 |
11432 static void InterceptorLoadXICGetter( | 11574 static void InterceptorLoadXICGetter( |
11433 Local<String> name, | 11575 Local<Name> name, |
11434 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11576 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11435 ApiTestFuzzer::Fuzz(); | 11577 ApiTestFuzzer::Fuzz(); |
11436 info.GetReturnValue().Set( | 11578 info.GetReturnValue().Set( |
11437 v8_str("x")->Equals(name) ? | 11579 v8_str("x")->Equals(name) ? |
11438 v8::Handle<v8::Value>(v8::Integer::New(info.GetIsolate(), 42)) : | 11580 v8::Handle<v8::Value>(v8::Integer::New(info.GetIsolate(), 42)) : |
11439 v8::Handle<v8::Value>()); | 11581 v8::Handle<v8::Value>()); |
11440 } | 11582 } |
11441 | 11583 |
11442 | 11584 |
11443 THREADED_TEST(InterceptorLoadICWithFieldOnHolder) { | 11585 THREADED_TEST(InterceptorLoadICWithFieldOnHolder) { |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11539 "for (var i = 0; i < 1000; i++) {" | 11681 "for (var i = 0; i < 1000; i++) {" |
11540 " result += o.y;" | 11682 " result += o.y;" |
11541 "}" | 11683 "}" |
11542 "result;", | 11684 "result;", |
11543 42 * 1000); | 11685 42 * 1000); |
11544 } | 11686 } |
11545 | 11687 |
11546 | 11688 |
11547 static int interceptor_load_not_handled_calls = 0; | 11689 static int interceptor_load_not_handled_calls = 0; |
11548 static void InterceptorLoadNotHandled( | 11690 static void InterceptorLoadNotHandled( |
11549 Local<String> name, | 11691 Local<Name> name, |
11550 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11692 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11551 ++interceptor_load_not_handled_calls; | 11693 ++interceptor_load_not_handled_calls; |
11552 } | 11694 } |
11553 | 11695 |
11554 | 11696 |
11555 // Test how post-interceptor lookups are done in the non-cacheable | 11697 // Test how post-interceptor lookups are done in the non-cacheable |
11556 // case: the interceptor should not be invoked during this lookup. | 11698 // case: the interceptor should not be invoked during this lookup. |
11557 THREADED_TEST(InterceptorLoadICPostInterceptor) { | 11699 THREADED_TEST(InterceptorLoadICPostInterceptor) { |
11558 interceptor_load_not_handled_calls = 0; | 11700 interceptor_load_not_handled_calls = 0; |
11559 CheckInterceptorLoadIC(InterceptorLoadNotHandled, | 11701 CheckInterceptorLoadIC(InterceptorLoadNotHandled, |
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11782 "var result = 0;" | 11924 "var result = 0;" |
11783 "for (var i = 0; i < 10; i++) {" | 11925 "for (var i = 0; i < 10; i++) {" |
11784 " result += o.y;" | 11926 " result += o.y;" |
11785 "}" | 11927 "}" |
11786 "result"); | 11928 "result"); |
11787 CHECK_EQ(42 * 10, value->Int32Value()); | 11929 CHECK_EQ(42 * 10, value->Int32Value()); |
11788 } | 11930 } |
11789 | 11931 |
11790 | 11932 |
11791 static void InterceptorLoadICGetter0( | 11933 static void InterceptorLoadICGetter0( |
11792 Local<String> name, | 11934 Local<Name> name, |
11793 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11935 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11794 ApiTestFuzzer::Fuzz(); | 11936 ApiTestFuzzer::Fuzz(); |
11795 CHECK(v8_str("x")->Equals(name)); | 11937 CHECK(v8_str("x")->Equals(name)); |
11796 info.GetReturnValue().Set(v8::Integer::New(info.GetIsolate(), 0)); | 11938 info.GetReturnValue().Set(v8::Integer::New(info.GetIsolate(), 0)); |
11797 } | 11939 } |
11798 | 11940 |
11799 | 11941 |
11800 THREADED_TEST(InterceptorReturningZero) { | 11942 THREADED_TEST(InterceptorReturningZero) { |
11801 CheckInterceptorLoadIC(InterceptorLoadICGetter0, | 11943 CheckInterceptorLoadIC(InterceptorLoadICGetter0, |
11802 "o.x == undefined ? 1 : 0", | 11944 "o.x == undefined ? 1 : 0", |
11803 0); | 11945 0); |
11804 } | 11946 } |
11805 | 11947 |
11806 | 11948 |
11807 static void InterceptorStoreICSetter( | 11949 static void InterceptorStoreICSetter( |
11808 Local<String> key, | 11950 Local<Name> key, |
11809 Local<Value> value, | 11951 Local<Value> value, |
11810 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11952 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11811 CHECK(v8_str("x")->Equals(key)); | 11953 CHECK(v8_str("x")->Equals(key)); |
11812 CHECK_EQ(42, value->Int32Value()); | 11954 CHECK_EQ(42, value->Int32Value()); |
11813 info.GetReturnValue().Set(value); | 11955 info.GetReturnValue().Set(value); |
11814 } | 11956 } |
11815 | 11957 |
11816 | 11958 |
11817 // This test should hit the store IC for the interceptor case. | 11959 // This test should hit the store IC for the interceptor case. |
11818 THREADED_TEST(InterceptorStoreIC) { | 11960 THREADED_TEST(InterceptorStoreIC) { |
(...skipping 28 matching lines...) Expand all Loading... |
11847 } | 11989 } |
11848 | 11990 |
11849 | 11991 |
11850 | 11992 |
11851 | 11993 |
11852 v8::Handle<Value> call_ic_function; | 11994 v8::Handle<Value> call_ic_function; |
11853 v8::Handle<Value> call_ic_function2; | 11995 v8::Handle<Value> call_ic_function2; |
11854 v8::Handle<Value> call_ic_function3; | 11996 v8::Handle<Value> call_ic_function3; |
11855 | 11997 |
11856 static void InterceptorCallICGetter( | 11998 static void InterceptorCallICGetter( |
11857 Local<String> name, | 11999 Local<Name> name, |
11858 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12000 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11859 ApiTestFuzzer::Fuzz(); | 12001 ApiTestFuzzer::Fuzz(); |
11860 CHECK(v8_str("x")->Equals(name)); | 12002 CHECK(v8_str("x")->Equals(name)); |
11861 info.GetReturnValue().Set(call_ic_function); | 12003 info.GetReturnValue().Set(call_ic_function); |
11862 } | 12004 } |
11863 | 12005 |
11864 | 12006 |
11865 // This test should hit the call IC for the interceptor case. | 12007 // This test should hit the call IC for the interceptor case. |
11866 THREADED_TEST(InterceptorCallIC) { | 12008 THREADED_TEST(InterceptorCallIC) { |
11867 v8::Isolate* isolate = CcTest::isolate(); | 12009 v8::Isolate* isolate = CcTest::isolate(); |
(...skipping 27 matching lines...) Expand all Loading... |
11895 "var result = 0;" | 12037 "var result = 0;" |
11896 "for (var i = 0; i < 7; i++) {" | 12038 "for (var i = 0; i < 7; i++) {" |
11897 " result = o.x(41);" | 12039 " result = o.x(41);" |
11898 "}"); | 12040 "}"); |
11899 CHECK_EQ(42, value->Int32Value()); | 12041 CHECK_EQ(42, value->Int32Value()); |
11900 } | 12042 } |
11901 | 12043 |
11902 | 12044 |
11903 static v8::Handle<Value> call_ic_function4; | 12045 static v8::Handle<Value> call_ic_function4; |
11904 static void InterceptorCallICGetter4( | 12046 static void InterceptorCallICGetter4( |
11905 Local<String> name, | 12047 Local<Name> name, |
11906 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12048 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11907 ApiTestFuzzer::Fuzz(); | 12049 ApiTestFuzzer::Fuzz(); |
11908 CHECK(v8_str("x")->Equals(name)); | 12050 CHECK(v8_str("x")->Equals(name)); |
11909 info.GetReturnValue().Set(call_ic_function4); | 12051 info.GetReturnValue().Set(call_ic_function4); |
11910 } | 12052 } |
11911 | 12053 |
11912 | 12054 |
11913 // This test checks that if interceptor provides a function, | 12055 // This test checks that if interceptor provides a function, |
11914 // even if we cached shadowed variant, interceptor's function | 12056 // even if we cached shadowed variant, interceptor's function |
11915 // is invoked | 12057 // is invoked |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11976 "var result = 0;" | 12118 "var result = 0;" |
11977 "for (var i = 0; i < 1000; i++) {" | 12119 "for (var i = 0; i < 1000; i++) {" |
11978 " result = o.x(42);" | 12120 " result = o.x(42);" |
11979 "}"); | 12121 "}"); |
11980 CHECK_EQ(43, value->Int32Value()); | 12122 CHECK_EQ(43, value->Int32Value()); |
11981 } | 12123 } |
11982 | 12124 |
11983 | 12125 |
11984 static v8::Handle<Value> call_ic_function5; | 12126 static v8::Handle<Value> call_ic_function5; |
11985 static void InterceptorCallICGetter5( | 12127 static void InterceptorCallICGetter5( |
11986 Local<String> name, | 12128 Local<Name> name, |
11987 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12129 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11988 ApiTestFuzzer::Fuzz(); | 12130 ApiTestFuzzer::Fuzz(); |
11989 if (v8_str("x")->Equals(name)) | 12131 if (v8_str("x")->Equals(name)) |
11990 info.GetReturnValue().Set(call_ic_function5); | 12132 info.GetReturnValue().Set(call_ic_function5); |
11991 } | 12133 } |
11992 | 12134 |
11993 | 12135 |
11994 // This test checks that if interceptor provides a function, | 12136 // This test checks that if interceptor provides a function, |
11995 // even if we cached constant function, interceptor's function | 12137 // even if we cached constant function, interceptor's function |
11996 // is invoked | 12138 // is invoked |
(...skipping 13 matching lines...) Expand all Loading... |
12010 "var result = 0;" | 12152 "var result = 0;" |
12011 "for (var i = 0; i < 1000; i++) {" | 12153 "for (var i = 0; i < 1000; i++) {" |
12012 " result = o.x(42);" | 12154 " result = o.x(42);" |
12013 "}"); | 12155 "}"); |
12014 CHECK_EQ(41, value->Int32Value()); | 12156 CHECK_EQ(41, value->Int32Value()); |
12015 } | 12157 } |
12016 | 12158 |
12017 | 12159 |
12018 static v8::Handle<Value> call_ic_function6; | 12160 static v8::Handle<Value> call_ic_function6; |
12019 static void InterceptorCallICGetter6( | 12161 static void InterceptorCallICGetter6( |
12020 Local<String> name, | 12162 Local<Name> name, |
12021 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12163 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12022 ApiTestFuzzer::Fuzz(); | 12164 ApiTestFuzzer::Fuzz(); |
12023 if (v8_str("x")->Equals(name)) | 12165 if (v8_str("x")->Equals(name)) |
12024 info.GetReturnValue().Set(call_ic_function6); | 12166 info.GetReturnValue().Set(call_ic_function6); |
12025 } | 12167 } |
12026 | 12168 |
12027 | 12169 |
12028 // Same test as above, except the code is wrapped in a function | 12170 // Same test as above, except the code is wrapped in a function |
12029 // to test the optimized compiler. | 12171 // to test the optimized compiler. |
12030 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) { | 12172 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12138 " result += o.parseFloat('239');" | 12280 " result += o.parseFloat('239');" |
12139 " }" | 12281 " }" |
12140 " result" | 12282 " result" |
12141 "} catch(e) {" | 12283 "} catch(e) {" |
12142 " e" | 12284 " e" |
12143 "};"); | 12285 "};"); |
12144 CHECK_EQ(239 * 10, value->Int32Value()); | 12286 CHECK_EQ(239 * 10, value->Int32Value()); |
12145 } | 12287 } |
12146 | 12288 |
12147 static void InterceptorCallICFastApi( | 12289 static void InterceptorCallICFastApi( |
12148 Local<String> name, | 12290 Local<Name> name, |
12149 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12291 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12150 ApiTestFuzzer::Fuzz(); | 12292 ApiTestFuzzer::Fuzz(); |
12151 CheckReturnValue(info, FUNCTION_ADDR(InterceptorCallICFastApi)); | 12293 CheckReturnValue(info, FUNCTION_ADDR(InterceptorCallICFastApi)); |
12152 int* call_count = | 12294 int* call_count = |
12153 reinterpret_cast<int*>(v8::External::Cast(*info.Data())->Value()); | 12295 reinterpret_cast<int*>(v8::External::Cast(*info.Data())->Value()); |
12154 ++(*call_count); | 12296 ++(*call_count); |
12155 if ((*call_count) % 20 == 0) { | 12297 if ((*call_count) % 20 == 0) { |
12156 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 12298 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
12157 } | 12299 } |
12158 } | 12300 } |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12714 CHECK(try_catch.HasCaught()); | 12856 CHECK(try_catch.HasCaught()); |
12715 CHECK_EQ(v8_str("TypeError: Illegal invocation"), | 12857 CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
12716 try_catch.Exception()->ToString()); | 12858 try_catch.Exception()->ToString()); |
12717 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12859 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
12718 } | 12860 } |
12719 | 12861 |
12720 | 12862 |
12721 v8::Handle<Value> keyed_call_ic_function; | 12863 v8::Handle<Value> keyed_call_ic_function; |
12722 | 12864 |
12723 static void InterceptorKeyedCallICGetter( | 12865 static void InterceptorKeyedCallICGetter( |
12724 Local<String> name, | 12866 Local<Name> name, |
12725 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12867 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12726 ApiTestFuzzer::Fuzz(); | 12868 ApiTestFuzzer::Fuzz(); |
12727 if (v8_str("x")->Equals(name)) { | 12869 if (v8_str("x")->Equals(name)) { |
12728 info.GetReturnValue().Set(keyed_call_ic_function); | 12870 info.GetReturnValue().Set(keyed_call_ic_function); |
12729 } | 12871 } |
12730 } | 12872 } |
12731 | 12873 |
12732 | 12874 |
12733 // Test the case when we stored cacheable lookup into | 12875 // Test the case when we stored cacheable lookup into |
12734 // a stub, but the function name changed (to another cacheable function). | 12876 // a stub, but the function name changed (to another cacheable function). |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12878 " if (i == 5) { proto.method = function(x) { return x - 1; }; };" | 13020 " if (i == 5) { proto.method = function(x) { return x - 1; }; };" |
12879 " result += o[m](41);" | 13021 " result += o[m](41);" |
12880 "}"); | 13022 "}"); |
12881 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); | 13023 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); |
12882 } | 13024 } |
12883 | 13025 |
12884 | 13026 |
12885 static int interceptor_call_count = 0; | 13027 static int interceptor_call_count = 0; |
12886 | 13028 |
12887 static void InterceptorICRefErrorGetter( | 13029 static void InterceptorICRefErrorGetter( |
12888 Local<String> name, | 13030 Local<Name> name, |
12889 const v8::PropertyCallbackInfo<v8::Value>& info) { | 13031 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12890 ApiTestFuzzer::Fuzz(); | 13032 ApiTestFuzzer::Fuzz(); |
12891 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) { | 13033 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) { |
12892 info.GetReturnValue().Set(call_ic_function2); | 13034 info.GetReturnValue().Set(call_ic_function2); |
12893 } | 13035 } |
12894 } | 13036 } |
12895 | 13037 |
12896 | 13038 |
12897 // This test should hit load and call ICs for the interceptor case. | 13039 // This test should hit load and call ICs for the interceptor case. |
12898 // Once in a while, the interceptor will reply that a property was not | 13040 // Once in a while, the interceptor will reply that a property was not |
(...skipping 23 matching lines...) Expand all Loading... |
12922 " return false;" | 13064 " return false;" |
12923 "};" | 13065 "};" |
12924 "g();"); | 13066 "g();"); |
12925 CHECK_EQ(true, value->BooleanValue()); | 13067 CHECK_EQ(true, value->BooleanValue()); |
12926 } | 13068 } |
12927 | 13069 |
12928 | 13070 |
12929 static int interceptor_ic_exception_get_count = 0; | 13071 static int interceptor_ic_exception_get_count = 0; |
12930 | 13072 |
12931 static void InterceptorICExceptionGetter( | 13073 static void InterceptorICExceptionGetter( |
12932 Local<String> name, | 13074 Local<Name> name, |
12933 const v8::PropertyCallbackInfo<v8::Value>& info) { | 13075 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12934 ApiTestFuzzer::Fuzz(); | 13076 ApiTestFuzzer::Fuzz(); |
12935 if (v8_str("x")->Equals(name) && ++interceptor_ic_exception_get_count < 20) { | 13077 if (v8_str("x")->Equals(name) && ++interceptor_ic_exception_get_count < 20) { |
12936 info.GetReturnValue().Set(call_ic_function3); | 13078 info.GetReturnValue().Set(call_ic_function3); |
12937 } | 13079 } |
12938 if (interceptor_ic_exception_get_count == 20) { | 13080 if (interceptor_ic_exception_get_count == 20) { |
12939 info.GetIsolate()->ThrowException(v8_num(42)); | 13081 info.GetIsolate()->ThrowException(v8_num(42)); |
12940 return; | 13082 return; |
12941 } | 13083 } |
12942 } | 13084 } |
(...skipping 27 matching lines...) Expand all Loading... |
12970 " return false;" | 13112 " return false;" |
12971 "};" | 13113 "};" |
12972 "f();"); | 13114 "f();"); |
12973 CHECK_EQ(true, value->BooleanValue()); | 13115 CHECK_EQ(true, value->BooleanValue()); |
12974 } | 13116 } |
12975 | 13117 |
12976 | 13118 |
12977 static int interceptor_ic_exception_set_count = 0; | 13119 static int interceptor_ic_exception_set_count = 0; |
12978 | 13120 |
12979 static void InterceptorICExceptionSetter( | 13121 static void InterceptorICExceptionSetter( |
12980 Local<String> key, | 13122 Local<Name> key, |
12981 Local<Value> value, | 13123 Local<Value> value, |
12982 const v8::PropertyCallbackInfo<v8::Value>& info) { | 13124 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12983 ApiTestFuzzer::Fuzz(); | 13125 ApiTestFuzzer::Fuzz(); |
12984 if (++interceptor_ic_exception_set_count > 20) { | 13126 if (++interceptor_ic_exception_set_count > 20) { |
12985 info.GetIsolate()->ThrowException(v8_num(42)); | 13127 info.GetIsolate()->ThrowException(v8_num(42)); |
12986 } | 13128 } |
12987 } | 13129 } |
12988 | 13130 |
12989 | 13131 |
12990 // Test interceptor store IC where the interceptor throws an exception | 13132 // Test interceptor store IC where the interceptor throws an exception |
(...skipping 16 matching lines...) Expand all Loading... |
13007 CHECK_EQ(true, value->BooleanValue()); | 13149 CHECK_EQ(true, value->BooleanValue()); |
13008 } | 13150 } |
13009 | 13151 |
13010 | 13152 |
13011 // Test that we ignore null interceptors. | 13153 // Test that we ignore null interceptors. |
13012 THREADED_TEST(NullNamedInterceptor) { | 13154 THREADED_TEST(NullNamedInterceptor) { |
13013 v8::Isolate* isolate = CcTest::isolate(); | 13155 v8::Isolate* isolate = CcTest::isolate(); |
13014 v8::HandleScope scope(isolate); | 13156 v8::HandleScope scope(isolate); |
13015 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); | 13157 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
13016 templ->SetNamedPropertyHandler( | 13158 templ->SetNamedPropertyHandler( |
13017 static_cast<v8::NamedPropertyGetterCallback>(0)); | 13159 static_cast<v8::GenericNamedPropertyGetterCallback>(0)); |
13018 LocalContext context; | 13160 LocalContext context; |
13019 templ->Set(CcTest::isolate(), "x", v8_num(42)); | 13161 templ->Set(CcTest::isolate(), "x", v8_num(42)); |
13020 v8::Handle<v8::Object> obj = templ->NewInstance(); | 13162 v8::Handle<v8::Object> obj = templ->NewInstance(); |
13021 context->Global()->Set(v8_str("obj"), obj); | 13163 context->Global()->Set(v8_str("obj"), obj); |
13022 v8::Handle<Value> value = CompileRun("obj.x"); | 13164 v8::Handle<Value> value = CompileRun("obj.x"); |
13023 CHECK(value->IsInt32()); | 13165 CHECK(value->IsInt32()); |
13024 CHECK_EQ(42, value->Int32Value()); | 13166 CHECK_EQ(42, value->Int32Value()); |
13025 } | 13167 } |
13026 | 13168 |
13027 | 13169 |
(...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15392 } | 15534 } |
15393 info.GetReturnValue().Set(3); | 15535 info.GetReturnValue().Set(3); |
15394 } | 15536 } |
15395 | 15537 |
15396 static void ForceSetSetter(v8::Local<v8::String> name, | 15538 static void ForceSetSetter(v8::Local<v8::String> name, |
15397 v8::Local<v8::Value> value, | 15539 v8::Local<v8::Value> value, |
15398 const v8::PropertyCallbackInfo<void>& info) { | 15540 const v8::PropertyCallbackInfo<void>& info) { |
15399 force_set_set_count++; | 15541 force_set_set_count++; |
15400 } | 15542 } |
15401 | 15543 |
| 15544 static void ForceSetInterceptGetter( |
| 15545 v8::Local<v8::Name> name, |
| 15546 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 15547 CHECK(name->IsString()); |
| 15548 ForceSetGetter(Local<String>::Cast(name), info); |
| 15549 } |
| 15550 |
15402 static void ForceSetInterceptSetter( | 15551 static void ForceSetInterceptSetter( |
15403 v8::Local<v8::String> name, | 15552 v8::Local<v8::Name> name, |
15404 v8::Local<v8::Value> value, | 15553 v8::Local<v8::Value> value, |
15405 const v8::PropertyCallbackInfo<v8::Value>& info) { | 15554 const v8::PropertyCallbackInfo<v8::Value>& info) { |
15406 force_set_set_count++; | 15555 force_set_set_count++; |
15407 info.GetReturnValue().SetUndefined(); | 15556 info.GetReturnValue().SetUndefined(); |
15408 } | 15557 } |
15409 | 15558 |
15410 | 15559 |
15411 TEST(ForceSet) { | 15560 TEST(ForceSet) { |
15412 force_set_get_count = 0; | 15561 force_set_get_count = 0; |
15413 force_set_set_count = 0; | 15562 force_set_set_count = 0; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15454 | 15603 |
15455 | 15604 |
15456 TEST(ForceSetWithInterceptor) { | 15605 TEST(ForceSetWithInterceptor) { |
15457 force_set_get_count = 0; | 15606 force_set_get_count = 0; |
15458 force_set_set_count = 0; | 15607 force_set_set_count = 0; |
15459 pass_on_get = false; | 15608 pass_on_get = false; |
15460 | 15609 |
15461 v8::Isolate* isolate = CcTest::isolate(); | 15610 v8::Isolate* isolate = CcTest::isolate(); |
15462 v8::HandleScope scope(isolate); | 15611 v8::HandleScope scope(isolate); |
15463 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 15612 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
15464 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter); | 15613 templ->SetNamedPropertyHandler(ForceSetInterceptGetter, |
| 15614 ForceSetInterceptSetter); |
15465 LocalContext context(NULL, templ); | 15615 LocalContext context(NULL, templ); |
15466 v8::Handle<v8::Object> global = context->Global(); | 15616 v8::Handle<v8::Object> global = context->Global(); |
15467 | 15617 |
15468 v8::Handle<v8::String> some_property = | 15618 v8::Handle<v8::String> some_property = |
15469 v8::String::NewFromUtf8(isolate, "a"); | 15619 v8::String::NewFromUtf8(isolate, "a"); |
15470 CHECK_EQ(0, force_set_set_count); | 15620 CHECK_EQ(0, force_set_set_count); |
15471 CHECK_EQ(0, force_set_get_count); | 15621 CHECK_EQ(0, force_set_get_count); |
15472 CHECK_EQ(3, global->Get(some_property)->Int32Value()); | 15622 CHECK_EQ(3, global->Get(some_property)->Int32Value()); |
15473 // Setting the property shouldn't override it, just call the setter | 15623 // Setting the property shouldn't override it, just call the setter |
15474 // which in this case does nothing. | 15624 // which in this case does nothing. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15522 CHECK(global->ForceDelete(simple_property)); | 15672 CHECK(global->ForceDelete(simple_property)); |
15523 CHECK(global->Get(simple_property)->IsUndefined()); | 15673 CHECK(global->Get(simple_property)->IsUndefined()); |
15524 } | 15674 } |
15525 | 15675 |
15526 | 15676 |
15527 static int force_delete_interceptor_count = 0; | 15677 static int force_delete_interceptor_count = 0; |
15528 static bool pass_on_delete = false; | 15678 static bool pass_on_delete = false; |
15529 | 15679 |
15530 | 15680 |
15531 static void ForceDeleteDeleter( | 15681 static void ForceDeleteDeleter( |
15532 v8::Local<v8::String> name, | 15682 v8::Local<v8::Name> name, |
15533 const v8::PropertyCallbackInfo<v8::Boolean>& info) { | 15683 const v8::PropertyCallbackInfo<v8::Boolean>& info) { |
15534 force_delete_interceptor_count++; | 15684 force_delete_interceptor_count++; |
15535 if (pass_on_delete) return; | 15685 if (pass_on_delete) return; |
15536 info.GetReturnValue().Set(true); | 15686 info.GetReturnValue().Set(true); |
15537 } | 15687 } |
15538 | 15688 |
15539 | 15689 |
15540 THREADED_TEST(ForceDeleteWithInterceptor) { | 15690 THREADED_TEST(ForceDeleteWithInterceptor) { |
15541 force_delete_interceptor_count = 0; | 15691 force_delete_interceptor_count = 0; |
15542 pass_on_delete = false; | 15692 pass_on_delete = false; |
(...skipping 3072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18615 static void SetterWhichSetsYOnThisTo23( | 18765 static void SetterWhichSetsYOnThisTo23( |
18616 Local<String> name, | 18766 Local<String> name, |
18617 Local<Value> value, | 18767 Local<Value> value, |
18618 const v8::PropertyCallbackInfo<void>& info) { | 18768 const v8::PropertyCallbackInfo<void>& info) { |
18619 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); | 18769 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); |
18620 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); | 18770 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); |
18621 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); | 18771 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); |
18622 } | 18772 } |
18623 | 18773 |
18624 | 18774 |
18625 void FooGetInterceptor(Local<String> name, | 18775 void FooGetInterceptor(Local<Name> name, |
18626 const v8::PropertyCallbackInfo<v8::Value>& info) { | 18776 const v8::PropertyCallbackInfo<v8::Value>& info) { |
18627 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); | 18777 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); |
18628 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); | 18778 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); |
18629 if (!name->Equals(v8_str("foo"))) return; | 18779 if (!name->Equals(v8_str("foo"))) return; |
18630 info.GetReturnValue().Set(v8_num(42)); | 18780 info.GetReturnValue().Set(v8_num(42)); |
18631 } | 18781 } |
18632 | 18782 |
18633 | 18783 |
18634 void FooSetInterceptor(Local<String> name, | 18784 void FooSetInterceptor(Local<Name> name, |
18635 Local<Value> value, | 18785 Local<Value> value, |
18636 const v8::PropertyCallbackInfo<v8::Value>& info) { | 18786 const v8::PropertyCallbackInfo<v8::Value>& info) { |
18637 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); | 18787 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); |
18638 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); | 18788 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); |
18639 if (!name->Equals(v8_str("foo"))) return; | 18789 if (!name->Equals(v8_str("foo"))) return; |
18640 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); | 18790 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); |
18641 info.GetReturnValue().Set(v8_num(23)); | 18791 info.GetReturnValue().Set(v8_num(23)); |
18642 } | 18792 } |
18643 | 18793 |
18644 | 18794 |
(...skipping 26 matching lines...) Expand all Loading... |
18671 script = v8_compile("new C2();"); | 18821 script = v8_compile("new C2();"); |
18672 for (int i = 0; i < 10; i++) { | 18822 for (int i = 0; i < 10; i++) { |
18673 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); | 18823 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); |
18674 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); | 18824 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); |
18675 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); | 18825 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); |
18676 } | 18826 } |
18677 } | 18827 } |
18678 | 18828 |
18679 | 18829 |
18680 static void NamedPropertyGetterWhichReturns42( | 18830 static void NamedPropertyGetterWhichReturns42( |
18681 Local<String> name, | 18831 Local<Name> name, |
18682 const v8::PropertyCallbackInfo<v8::Value>& info) { | 18832 const v8::PropertyCallbackInfo<v8::Value>& info) { |
18683 info.GetReturnValue().Set(v8_num(42)); | 18833 info.GetReturnValue().Set(v8_num(42)); |
18684 } | 18834 } |
18685 | 18835 |
18686 | 18836 |
18687 static void NamedPropertySetterWhichSetsYOnThisTo23( | 18837 static void NamedPropertySetterWhichSetsYOnThisTo23( |
18688 Local<String> name, | 18838 Local<Name> name, |
18689 Local<Value> value, | 18839 Local<Value> value, |
18690 const v8::PropertyCallbackInfo<v8::Value>& info) { | 18840 const v8::PropertyCallbackInfo<v8::Value>& info) { |
18691 if (name->Equals(v8_str("x"))) { | 18841 if (name->Equals(v8_str("x"))) { |
18692 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); | 18842 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); |
18693 } | 18843 } |
18694 } | 18844 } |
18695 | 18845 |
18696 | 18846 |
18697 THREADED_TEST(InterceptorOnConstructorPrototype) { | 18847 THREADED_TEST(InterceptorOnConstructorPrototype) { |
18698 v8::Isolate* isolate = CcTest::isolate(); | 18848 v8::Isolate* isolate = CcTest::isolate(); |
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19986 CHECK(!globalProxy->StrictEquals(global)); | 20136 CHECK(!globalProxy->StrictEquals(global)); |
19987 CHECK(globalProxy->StrictEquals(globalProxy)); | 20137 CHECK(globalProxy->StrictEquals(globalProxy)); |
19988 | 20138 |
19989 CHECK(global->Equals(global)); | 20139 CHECK(global->Equals(global)); |
19990 CHECK(!global->Equals(globalProxy)); | 20140 CHECK(!global->Equals(globalProxy)); |
19991 CHECK(!globalProxy->Equals(global)); | 20141 CHECK(!globalProxy->Equals(global)); |
19992 CHECK(globalProxy->Equals(globalProxy)); | 20142 CHECK(globalProxy->Equals(globalProxy)); |
19993 } | 20143 } |
19994 | 20144 |
19995 | 20145 |
19996 static void Getter(v8::Local<v8::String> property, | 20146 static void Getter(v8::Local<v8::Name> property, |
19997 const v8::PropertyCallbackInfo<v8::Value>& info ) { | 20147 const v8::PropertyCallbackInfo<v8::Value>& info ) { |
19998 info.GetReturnValue().Set(v8_str("42!")); | 20148 info.GetReturnValue().Set(v8_str("42!")); |
19999 } | 20149 } |
20000 | 20150 |
20001 | 20151 |
20002 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { | 20152 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { |
20003 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate()); | 20153 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate()); |
20004 result->Set(0, v8_str("universalAnswer")); | 20154 result->Set(0, v8_str("universalAnswer")); |
20005 info.GetReturnValue().Set(result); | 20155 info.GetReturnValue().Set(result); |
20006 } | 20156 } |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20151 | 20301 |
20152 | 20302 |
20153 void HasOwnPropertyIndexedPropertyGetter( | 20303 void HasOwnPropertyIndexedPropertyGetter( |
20154 uint32_t index, | 20304 uint32_t index, |
20155 const v8::PropertyCallbackInfo<v8::Value>& info) { | 20305 const v8::PropertyCallbackInfo<v8::Value>& info) { |
20156 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); | 20306 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); |
20157 } | 20307 } |
20158 | 20308 |
20159 | 20309 |
20160 void HasOwnPropertyNamedPropertyGetter( | 20310 void HasOwnPropertyNamedPropertyGetter( |
20161 Local<String> property, | 20311 Local<Name> property, |
20162 const v8::PropertyCallbackInfo<v8::Value>& info) { | 20312 const v8::PropertyCallbackInfo<v8::Value>& info) { |
20163 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(v8_str("yes")); | 20313 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(v8_str("yes")); |
20164 } | 20314 } |
20165 | 20315 |
20166 | 20316 |
20167 void HasOwnPropertyIndexedPropertyQuery( | 20317 void HasOwnPropertyIndexedPropertyQuery( |
20168 uint32_t index, const v8::PropertyCallbackInfo<v8::Integer>& info) { | 20318 uint32_t index, const v8::PropertyCallbackInfo<v8::Integer>& info) { |
20169 if (index == 42) info.GetReturnValue().Set(1); | 20319 if (index == 42) info.GetReturnValue().Set(1); |
20170 } | 20320 } |
20171 | 20321 |
20172 | 20322 |
20173 void HasOwnPropertyNamedPropertyQuery( | 20323 void HasOwnPropertyNamedPropertyQuery( |
20174 Local<String> property, | 20324 Local<Name> property, |
20175 const v8::PropertyCallbackInfo<v8::Integer>& info) { | 20325 const v8::PropertyCallbackInfo<v8::Integer>& info) { |
20176 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(1); | 20326 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(1); |
20177 } | 20327 } |
20178 | 20328 |
20179 | 20329 |
20180 void HasOwnPropertyNamedPropertyQuery2( | 20330 void HasOwnPropertyNamedPropertyQuery2( |
20181 Local<String> property, | 20331 Local<Name> property, |
20182 const v8::PropertyCallbackInfo<v8::Integer>& info) { | 20332 const v8::PropertyCallbackInfo<v8::Integer>& info) { |
20183 if (property->Equals(v8_str("bar"))) info.GetReturnValue().Set(1); | 20333 if (property->Equals(v8_str("bar"))) info.GetReturnValue().Set(1); |
20184 } | 20334 } |
20185 | 20335 |
20186 | 20336 |
20187 void HasOwnPropertyAccessorGetter( | 20337 void HasOwnPropertyAccessorGetter( |
20188 Local<String> property, | 20338 Local<String> property, |
20189 const v8::PropertyCallbackInfo<v8::Value>& info) { | 20339 const v8::PropertyCallbackInfo<v8::Value>& info) { |
20190 info.GetReturnValue().Set(v8_str("yes")); | 20340 info.GetReturnValue().Set(v8_str("yes")); |
20191 } | 20341 } |
(...skipping 1958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22150 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); | 22300 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); |
22151 instance_template->SetNamedPropertyHandler(EmptyInterceptor); | 22301 instance_template->SetNamedPropertyHandler(EmptyInterceptor); |
22152 | 22302 |
22153 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); | 22303 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); |
22154 | 22304 |
22155 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); | 22305 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); |
22156 } | 22306 } |
22157 | 22307 |
22158 private: | 22308 private: |
22159 static void EmptyInterceptor( | 22309 static void EmptyInterceptor( |
22160 Local<String> property, | 22310 Local<Name> property, |
22161 const v8::PropertyCallbackInfo<v8::Value>& info) { | 22311 const v8::PropertyCallbackInfo<v8::Value>& info) { |
22162 } | 22312 } |
22163 }; | 22313 }; |
22164 | 22314 |
22165 | 22315 |
22166 class RequestInterruptTestWithMathAbs | 22316 class RequestInterruptTestWithMathAbs |
22167 : public RequestInterruptTestBaseWithSimpleInterrupt { | 22317 : public RequestInterruptTestBaseWithSimpleInterrupt { |
22168 public: | 22318 public: |
22169 virtual void TestBody() { | 22319 virtual void TestBody() { |
22170 env_->Global()->Set(v8_str("WakeUpInterruptor"), Function::New( | 22320 env_->Global()->Set(v8_str("WakeUpInterruptor"), Function::New( |
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22994 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); | 23144 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); |
22995 Local<Function> set = | 23145 Local<Function> set = |
22996 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); | 23146 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); |
22997 Local<Function> get = | 23147 Local<Function> get = |
22998 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); | 23148 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); |
22999 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); | 23149 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); |
23000 Handle<Value> args[] = { v8_num(14) }; | 23150 Handle<Value> args[] = { v8_num(14) }; |
23001 set->Call(x, 1, args); | 23151 set->Call(x, 1, args); |
23002 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); | 23152 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); |
23003 } | 23153 } |
OLD | NEW |