Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: test/cctest/test-api.cc

Issue 467013003: Add interceptor support for symbols (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix nits, update test suite Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 1838 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 1849
1850 // base1 and base2 cannot cross reference to each's prototype 1850 // base1 and base2 cannot cross reference to each's prototype
1851 CHECK(v8_compile("obj.v2")->Run()->IsUndefined()); 1851 CHECK(v8_compile("obj.v2")->Run()->IsUndefined());
1852 CHECK(v8_compile("obj2.v1")->Run()->IsUndefined()); 1852 CHECK(v8_compile("obj2.v1")->Run()->IsUndefined());
1853 } 1853 }
1854 1854
1855 1855
1856 int echo_named_call_count; 1856 int echo_named_call_count;
1857 1857
1858 1858
1859 static void EchoNamedProperty(Local<String> name, 1859 static void EchoNamedProperty(Local<Name> name,
1860 const v8::PropertyCallbackInfo<v8::Value>& info) { 1860 const v8::PropertyCallbackInfo<v8::Value>& info) {
1861 ApiTestFuzzer::Fuzz(); 1861 ApiTestFuzzer::Fuzz();
1862 CHECK_EQ(v8_str("data"), info.Data()); 1862 CHECK_EQ(v8_str("data"), info.Data());
1863 echo_named_call_count++; 1863 echo_named_call_count++;
1864 info.GetReturnValue().Set(name); 1864 info.GetReturnValue().Set(name);
1865 } 1865 }
1866 1866
1867 1867
1868 // Helper functions for Interceptor/Accessor interaction tests 1868 // Helper functions for Interceptor/Accessor interaction tests
1869 1869
(...skipping 21 matching lines...) Expand all
1891 1891
1892 void SymbolAccessorSetter(Local<Name> name, Local<Value> value, 1892 void SymbolAccessorSetter(Local<Name> name, Local<Value> value,
1893 const v8::PropertyCallbackInfo<void>& info) { 1893 const v8::PropertyCallbackInfo<void>& info) {
1894 CHECK(name->IsSymbol()); 1894 CHECK(name->IsSymbol());
1895 Local<Symbol> sym = Local<Symbol>::Cast(name); 1895 Local<Symbol> sym = Local<Symbol>::Cast(name);
1896 if (sym->Name()->IsUndefined()) 1896 if (sym->Name()->IsUndefined())
1897 return; 1897 return;
1898 SimpleAccessorSetter(Local<String>::Cast(sym->Name()), value, info); 1898 SimpleAccessorSetter(Local<String>::Cast(sym->Name()), value, info);
1899 } 1899 }
1900 1900
1901 void EmptyInterceptorGetter(Local<String> name, 1901 void EmptyInterceptorGetter(Local<Name> name,
1902 const v8::PropertyCallbackInfo<v8::Value>& info) { 1902 const v8::PropertyCallbackInfo<v8::Value>& info) {
1903 } 1903 }
1904 1904
1905 void EmptyInterceptorSetter(Local<String> name, 1905 void EmptyInterceptorSetter(Local<Name> name,
1906 Local<Value> value, 1906 Local<Value> value,
1907 const v8::PropertyCallbackInfo<v8::Value>& info) { 1907 const v8::PropertyCallbackInfo<v8::Value>& info) {
1908 } 1908 }
1909 1909
1910 void InterceptorGetter(Local<String> name, 1910 void EmptyGenericInterceptorGetter(Local<Name> name,
1911 const v8::PropertyCallbackInfo<v8::Value>& info) { 1911 const v8::PropertyCallbackInfo<v8::Value>& info) {
1912 }
1913
1914 void EmptyGenericInterceptorSetter(Local<Name> name,
1915 Local<Value> value,
1916 const v8::PropertyCallbackInfo<v8::Value>& info) {
1917 }
1918
1919 void StringInterceptorGetter(Local<String> name,
1920 const v8::PropertyCallbackInfo<v8::Value>& info) {
1912 // Intercept names that start with 'interceptor_'. 1921 // Intercept names that start with 'interceptor_'.
1913 String::Utf8Value utf8(name); 1922 String::Utf8Value utf8(name);
1914 char* name_str = *utf8; 1923 char* name_str = *utf8;
1915 char prefix[] = "interceptor_"; 1924 char prefix[] = "interceptor_";
1916 int i; 1925 int i;
1917 for (i = 0; name_str[i] && prefix[i]; ++i) { 1926 for (i = 0; name_str[i] && prefix[i]; ++i) {
1918 if (name_str[i] != prefix[i]) return; 1927 if (name_str[i] != prefix[i]) return;
1919 } 1928 }
1920 Handle<Object> self = Handle<Object>::Cast(info.This()); 1929 Handle<Object> self = Handle<Object>::Cast(info.This());
1921 info.GetReturnValue().Set(self->GetHiddenValue(v8_str(name_str + i))); 1930 info.GetReturnValue().Set(self->GetHiddenValue(v8_str(name_str + i)));
1922 } 1931 }
1923 1932
1924 void InterceptorSetter(Local<String> name, 1933 void StringInterceptorSetter(Local<String> name,
1925 Local<Value> value, 1934 Local<Value> value,
1926 const v8::PropertyCallbackInfo<v8::Value>& info) { 1935 const v8::PropertyCallbackInfo<v8::Value>& info) {
1927 // Intercept accesses that set certain integer values, for which the name does 1936 // Intercept accesses that set certain integer values, for which the name does
1928 // not start with 'accessor_'. 1937 // not start with 'accessor_'.
1929 String::Utf8Value utf8(name); 1938 String::Utf8Value utf8(name);
1930 char* name_str = *utf8; 1939 char* name_str = *utf8;
1931 char prefix[] = "accessor_"; 1940 char prefix[] = "accessor_";
1932 int i; 1941 int i;
1933 for (i = 0; name_str[i] && prefix[i]; ++i) { 1942 for (i = 0; name_str[i] && prefix[i]; ++i) {
1934 if (name_str[i] != prefix[i]) break; 1943 if (name_str[i] != prefix[i]) break;
1935 } 1944 }
1936 if (!prefix[i]) return; 1945 if (!prefix[i]) return;
1937 1946
1938 if (value->IsInt32() && value->Int32Value() < 10000) { 1947 if (value->IsInt32() && value->Int32Value() < 10000) {
1939 Handle<Object> self = Handle<Object>::Cast(info.This()); 1948 Handle<Object> self = Handle<Object>::Cast(info.This());
1940 self->SetHiddenValue(name, value); 1949 self->SetHiddenValue(name, value);
1941 info.GetReturnValue().Set(value); 1950 info.GetReturnValue().Set(value);
1942 } 1951 }
1943 } 1952 }
1944 1953
1954 void InterceptorGetter(Local<Name> generic_name,
1955 const v8::PropertyCallbackInfo<v8::Value>& info) {
1956 if (generic_name->IsSymbol()) return;
1957 StringInterceptorGetter(Local<String>::Cast(generic_name), info);
1958 }
1959
1960 void InterceptorSetter(Local<Name> generic_name,
1961 Local<Value> value,
1962 const v8::PropertyCallbackInfo<v8::Value>& info) {
1963 if (generic_name->IsSymbol()) return;
1964 StringInterceptorSetter(Local<String>::Cast(generic_name), value, info);
1965 }
1966
1967 void GenericInterceptorGetter(Local<Name> generic_name,
1968 const v8::PropertyCallbackInfo<v8::Value>& info) {
1969 Local<String> str;
1970 if (generic_name->IsSymbol()) {
1971 Local<Value> name = Local<Symbol>::Cast(generic_name)->Name();
1972 if (name->IsUndefined()) return;
1973 str = String::Concat(v8_str("_sym_"), Local<String>::Cast(name));
1974 } else {
1975 Local<String> name = Local<String>::Cast(generic_name);
1976 String::Utf8Value utf8(name);
1977 char* name_str = *utf8;
1978 if (*name_str == '_') return;
1979 str = String::Concat(v8_str("_str_"), name);
1980 }
1981
1982 Handle<Object> self = Handle<Object>::Cast(info.This());
1983 info.GetReturnValue().Set(self->Get(str));
1984 }
1985
1986 void GenericInterceptorSetter(Local<Name> generic_name,
1987 Local<Value> value,
1988 const v8::PropertyCallbackInfo<v8::Value>& info) {
1989 Local<String> str;
1990 if (generic_name->IsSymbol()) {
1991 Local<Value> name = Local<Symbol>::Cast(generic_name)->Name();
1992 if (name->IsUndefined()) return;
1993 str = String::Concat(v8_str("_sym_"), Local<String>::Cast(name));
1994 } else {
1995 Local<String> name = Local<String>::Cast(generic_name);
1996 String::Utf8Value utf8(name);
1997 char* name_str = *utf8;
1998 if (*name_str == '_') return;
1999 str = String::Concat(v8_str("_str_"), name);
2000 }
2001
2002 Handle<Object> self = Handle<Object>::Cast(info.This());
2003 self->Set(str, value);
2004 info.GetReturnValue().Set(value);
2005 }
2006
1945 void AddAccessor(Handle<FunctionTemplate> templ, 2007 void AddAccessor(Handle<FunctionTemplate> templ,
1946 Handle<String> name, 2008 Handle<String> name,
1947 v8::AccessorGetterCallback getter, 2009 v8::AccessorGetterCallback getter,
1948 v8::AccessorSetterCallback setter) { 2010 v8::AccessorSetterCallback setter) {
1949 templ->PrototypeTemplate()->SetAccessor(name, getter, setter); 2011 templ->PrototypeTemplate()->SetAccessor(name, getter, setter);
1950 } 2012 }
1951 2013
1952 void AddInterceptor(Handle<FunctionTemplate> templ, 2014 void AddInterceptor(Handle<FunctionTemplate> templ,
1953 v8::NamedPropertyGetterCallback getter, 2015 v8::NamedPropertyGetterCallback getter,
1954 v8::NamedPropertySetterCallback setter) { 2016 v8::NamedPropertySetterCallback setter) {
1955 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); 2017 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter);
1956 } 2018 }
1957 2019
1958 2020
1959 void AddAccessor(Handle<FunctionTemplate> templ, 2021 void AddAccessor(Handle<FunctionTemplate> templ,
1960 Handle<Name> name, 2022 Handle<Name> name,
1961 v8::AccessorNameGetterCallback getter, 2023 v8::AccessorNameGetterCallback getter,
1962 v8::AccessorNameSetterCallback setter) { 2024 v8::AccessorNameSetterCallback setter) {
1963 templ->PrototypeTemplate()->SetAccessor(name, getter, setter); 2025 templ->PrototypeTemplate()->SetAccessor(name, getter, setter);
1964 } 2026 }
1965 2027
2028 void AddInterceptor(Handle<FunctionTemplate> templ,
2029 v8::GenericNamedPropertyGetterCallback getter,
2030 v8::GenericNamedPropertySetterCallback setter) {
2031 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter);
2032 }
2033
1966 2034
1967 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) { 2035 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) {
1968 v8::HandleScope scope(CcTest::isolate()); 2036 v8::HandleScope scope(CcTest::isolate());
1969 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); 2037 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate());
1970 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); 2038 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate());
1971 child->Inherit(parent); 2039 child->Inherit(parent);
1972 AddAccessor(parent, v8_str("age"), 2040 AddAccessor(parent, v8_str("age"),
1973 SimpleAccessorGetter, SimpleAccessorSetter); 2041 SimpleAccessorGetter, SimpleAccessorSetter);
1974 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); 2042 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter);
1975 LocalContext env; 2043 LocalContext env;
1976 env->Global()->Set(v8_str("Child"), child->GetFunction()); 2044 env->Global()->Set(v8_str("Child"), child->GetFunction());
1977 CompileRun("var child = new Child;" 2045 CompileRun("var child = new Child;"
1978 "child.age = 10;"); 2046 "child.age = 10;");
1979 ExpectBoolean("child.hasOwnProperty('age')", false); 2047 ExpectBoolean("child.hasOwnProperty('age')", false);
1980 ExpectInt32("child.age", 10); 2048 ExpectInt32("child.age", 10);
1981 ExpectInt32("child.accessor_age", 10); 2049 ExpectInt32("child.accessor_age", 10);
1982 } 2050 }
1983 2051
1984 2052
2053 THREADED_TEST(LegacyInterceptorDoesNotSeeSymbols) {
2054 LocalContext env;
2055 v8::Isolate* isolate = CcTest::isolate();
2056 v8::HandleScope scope(isolate);
2057 Handle<FunctionTemplate> parent = FunctionTemplate::New(isolate);
2058 Handle<FunctionTemplate> child = FunctionTemplate::New(isolate);
2059 v8::Local<v8::Symbol> age = v8::Symbol::New(isolate, v8_str("age"));
2060
2061 child->Inherit(parent);
2062 AddAccessor(parent, age, SymbolAccessorGetter, SymbolAccessorSetter);
2063 AddInterceptor(child, StringInterceptorGetter, StringInterceptorSetter);
2064
2065 env->Global()->Set(v8_str("Child"), child->GetFunction());
2066 env->Global()->Set(v8_str("age"), age);
2067 CompileRun("var child = new Child;"
2068 "child[age] = 10;");
2069 ExpectInt32("child[age]", 10);
2070 ExpectBoolean("child.hasOwnProperty('age')", false);
2071 ExpectBoolean("child.hasOwnProperty('accessor_age')", true);
2072 }
2073
2074
2075 THREADED_TEST(GenericInterceptorDoesSeeSymbols) {
2076 LocalContext env;
2077 v8::Isolate* isolate = CcTest::isolate();
2078 v8::HandleScope scope(isolate);
2079 Handle<FunctionTemplate> parent = FunctionTemplate::New(isolate);
2080 Handle<FunctionTemplate> child = FunctionTemplate::New(isolate);
2081 v8::Local<v8::Symbol> age = v8::Symbol::New(isolate, v8_str("age"));
2082 v8::Local<v8::Symbol> anon = v8::Symbol::New(isolate);
2083
2084 child->Inherit(parent);
2085 AddAccessor(parent, age, SymbolAccessorGetter, SymbolAccessorSetter);
2086 AddInterceptor(child, GenericInterceptorGetter, GenericInterceptorSetter);
2087
2088 env->Global()->Set(v8_str("Child"), child->GetFunction());
2089 env->Global()->Set(v8_str("age"), age);
2090 env->Global()->Set(v8_str("anon"), anon);
2091 CompileRun("var child = new Child;"
2092 "child[age] = 10;");
2093 ExpectInt32("child[age]", 10);
2094 ExpectInt32("child._sym_age", 10);
2095
2096 // Check that it also sees strings.
2097 CompileRun("child.foo = 47");
2098 ExpectInt32("child.foo", 47);
2099 ExpectInt32("child._str_foo", 47);
2100
2101 // Check that the interceptor can punt (in this case, on anonymous symbols).
2102 CompileRun("child[anon] = 31337");
2103 ExpectInt32("child[anon]", 31337);
2104 }
2105
2106
1985 THREADED_TEST(ExecutableAccessorIsPreservedOnAttributeChange) { 2107 THREADED_TEST(ExecutableAccessorIsPreservedOnAttributeChange) {
1986 v8::Isolate* isolate = CcTest::isolate(); 2108 v8::Isolate* isolate = CcTest::isolate();
1987 v8::HandleScope scope(isolate); 2109 v8::HandleScope scope(isolate);
1988 LocalContext env; 2110 LocalContext env;
1989 v8::Local<v8::Value> res = CompileRun("var a = []; a;"); 2111 v8::Local<v8::Value> res = CompileRun("var a = []; a;");
1990 i::Handle<i::JSObject> a(v8::Utils::OpenHandle(v8::Object::Cast(*res))); 2112 i::Handle<i::JSObject> a(v8::Utils::OpenHandle(v8::Object::Cast(*res)));
1991 CHECK(a->map()->instance_descriptors()->IsFixedArray()); 2113 CHECK(a->map()->instance_descriptors()->IsFixedArray());
1992 CHECK_GT(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0); 2114 CHECK_GT(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0);
1993 CompileRun("Object.defineProperty(a, 'length', { writable: false });"); 2115 CompileRun("Object.defineProperty(a, 'length', { writable: false });");
1994 CHECK_EQ(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0); 2116 CHECK_EQ(i::FixedArray::cast(a->map()->instance_descriptors())->length(), 0);
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
2280 2402
2281 static void CheckThisIndexedPropertyHandler( 2403 static void CheckThisIndexedPropertyHandler(
2282 uint32_t index, 2404 uint32_t index,
2283 const v8::PropertyCallbackInfo<v8::Value>& info) { 2405 const v8::PropertyCallbackInfo<v8::Value>& info) {
2284 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyHandler)); 2406 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyHandler));
2285 ApiTestFuzzer::Fuzz(); 2407 ApiTestFuzzer::Fuzz();
2286 CHECK(info.This()->Equals(bottom)); 2408 CHECK(info.This()->Equals(bottom));
2287 } 2409 }
2288 2410
2289 static void CheckThisNamedPropertyHandler( 2411 static void CheckThisNamedPropertyHandler(
2290 Local<String> name, 2412 Local<Name> name,
2291 const v8::PropertyCallbackInfo<v8::Value>& info) { 2413 const v8::PropertyCallbackInfo<v8::Value>& info) {
2292 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyHandler)); 2414 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyHandler));
2293 ApiTestFuzzer::Fuzz(); 2415 ApiTestFuzzer::Fuzz();
2294 CHECK(info.This()->Equals(bottom)); 2416 CHECK(info.This()->Equals(bottom));
2295 } 2417 }
2296 2418
2297 void CheckThisIndexedPropertySetter( 2419 void CheckThisIndexedPropertySetter(
2298 uint32_t index, 2420 uint32_t index,
2299 Local<Value> value, 2421 Local<Value> value,
2300 const v8::PropertyCallbackInfo<v8::Value>& info) { 2422 const v8::PropertyCallbackInfo<v8::Value>& info) {
2301 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertySetter)); 2423 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertySetter));
2302 ApiTestFuzzer::Fuzz(); 2424 ApiTestFuzzer::Fuzz();
2303 CHECK(info.This()->Equals(bottom)); 2425 CHECK(info.This()->Equals(bottom));
2304 } 2426 }
2305 2427
2306 2428
2307 void CheckThisNamedPropertySetter( 2429 void CheckThisNamedPropertySetter(
2308 Local<String> property, 2430 Local<Name> property,
2309 Local<Value> value, 2431 Local<Value> value,
2310 const v8::PropertyCallbackInfo<v8::Value>& info) { 2432 const v8::PropertyCallbackInfo<v8::Value>& info) {
2311 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertySetter)); 2433 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertySetter));
2312 ApiTestFuzzer::Fuzz(); 2434 ApiTestFuzzer::Fuzz();
2313 CHECK(info.This()->Equals(bottom)); 2435 CHECK(info.This()->Equals(bottom));
2314 } 2436 }
2315 2437
2316 void CheckThisIndexedPropertyQuery( 2438 void CheckThisIndexedPropertyQuery(
2317 uint32_t index, 2439 uint32_t index,
2318 const v8::PropertyCallbackInfo<v8::Integer>& info) { 2440 const v8::PropertyCallbackInfo<v8::Integer>& info) {
2319 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyQuery)); 2441 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyQuery));
2320 ApiTestFuzzer::Fuzz(); 2442 ApiTestFuzzer::Fuzz();
2321 CHECK(info.This()->Equals(bottom)); 2443 CHECK(info.This()->Equals(bottom));
2322 } 2444 }
2323 2445
2324 2446
2325 void CheckThisNamedPropertyQuery( 2447 void CheckThisNamedPropertyQuery(
2326 Local<String> property, 2448 Local<Name> property,
2327 const v8::PropertyCallbackInfo<v8::Integer>& info) { 2449 const v8::PropertyCallbackInfo<v8::Integer>& info) {
2328 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyQuery)); 2450 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyQuery));
2329 ApiTestFuzzer::Fuzz(); 2451 ApiTestFuzzer::Fuzz();
2330 CHECK(info.This()->Equals(bottom)); 2452 CHECK(info.This()->Equals(bottom));
2331 } 2453 }
2332 2454
2333 2455
2334 void CheckThisIndexedPropertyDeleter( 2456 void CheckThisIndexedPropertyDeleter(
2335 uint32_t index, 2457 uint32_t index,
2336 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 2458 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
2337 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyDeleter)); 2459 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyDeleter));
2338 ApiTestFuzzer::Fuzz(); 2460 ApiTestFuzzer::Fuzz();
2339 CHECK(info.This()->Equals(bottom)); 2461 CHECK(info.This()->Equals(bottom));
2340 } 2462 }
2341 2463
2342 2464
2343 void CheckThisNamedPropertyDeleter( 2465 void CheckThisNamedPropertyDeleter(
2344 Local<String> property, 2466 Local<Name> property,
2345 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 2467 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
2346 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyDeleter)); 2468 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyDeleter));
2347 ApiTestFuzzer::Fuzz(); 2469 ApiTestFuzzer::Fuzz();
2348 CHECK(info.This()->Equals(bottom)); 2470 CHECK(info.This()->Equals(bottom));
2349 } 2471 }
2350 2472
2351 2473
2352 void CheckThisIndexedPropertyEnumerator( 2474 void CheckThisIndexedPropertyEnumerator(
2353 const v8::PropertyCallbackInfo<v8::Array>& info) { 2475 const v8::PropertyCallbackInfo<v8::Array>& info) {
2354 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyEnumerator)); 2476 CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyEnumerator));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2409 // Indexed and named deleter. 2531 // Indexed and named deleter.
2410 CompileRun("delete obj[0]"); 2532 CompileRun("delete obj[0]");
2411 CompileRun("delete obj.x"); 2533 CompileRun("delete obj.x");
2412 2534
2413 // Enumerators. 2535 // Enumerators.
2414 CompileRun("for (var p in obj) ;"); 2536 CompileRun("for (var p in obj) ;");
2415 } 2537 }
2416 2538
2417 2539
2418 static void PrePropertyHandlerGet( 2540 static void PrePropertyHandlerGet(
2419 Local<String> key, 2541 Local<Name> key,
2420 const v8::PropertyCallbackInfo<v8::Value>& info) { 2542 const v8::PropertyCallbackInfo<v8::Value>& info) {
2421 ApiTestFuzzer::Fuzz(); 2543 ApiTestFuzzer::Fuzz();
2422 if (v8_str("pre")->Equals(key)) { 2544 if (v8_str("pre")->Equals(key)) {
2423 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); 2545 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre"));
2424 } 2546 }
2425 } 2547 }
2426 2548
2427 2549
2428 static void PrePropertyHandlerQuery( 2550 static void PrePropertyHandlerQuery(
2429 Local<String> key, 2551 Local<Name> key,
2430 const v8::PropertyCallbackInfo<v8::Integer>& info) { 2552 const v8::PropertyCallbackInfo<v8::Integer>& info) {
2431 if (v8_str("pre")->Equals(key)) { 2553 if (v8_str("pre")->Equals(key)) {
2432 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); 2554 info.GetReturnValue().Set(static_cast<int32_t>(v8::None));
2433 } 2555 }
2434 } 2556 }
2435 2557
2436 2558
2437 THREADED_TEST(PrePropertyHandler) { 2559 THREADED_TEST(PrePropertyHandler) {
2438 v8::Isolate* isolate = CcTest::isolate(); 2560 v8::Isolate* isolate = CcTest::isolate();
2439 v8::HandleScope scope(isolate); 2561 v8::HandleScope scope(isolate);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2506 call_recursively_script = v8_compile("callScriptRecursively()"); 2628 call_recursively_script = v8_compile("callScriptRecursively()");
2507 call_recursively_script->Run(); 2629 call_recursively_script->Run();
2508 call_recursively_script = v8::Handle<Script>(); 2630 call_recursively_script = v8::Handle<Script>();
2509 2631
2510 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); 2632 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0));
2511 CompileRun("callFunctionRecursively()"); 2633 CompileRun("callFunctionRecursively()");
2512 } 2634 }
2513 2635
2514 2636
2515 static void ThrowingPropertyHandlerGet( 2637 static void ThrowingPropertyHandlerGet(
2516 Local<String> key, 2638 Local<Name> key,
2517 const v8::PropertyCallbackInfo<v8::Value>& info) { 2639 const v8::PropertyCallbackInfo<v8::Value>& info) {
2640 // Since this interceptor is used on "with" objects, the runtime will look up
2641 // @@unscopables. Punt.
2642 if (key->IsSymbol()) return;
2518 ApiTestFuzzer::Fuzz(); 2643 ApiTestFuzzer::Fuzz();
2519 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); 2644 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key));
2520 } 2645 }
2521 2646
2522 2647
2523 static void ThrowingPropertyHandlerSet( 2648 static void ThrowingPropertyHandlerSet(
2524 Local<String> key, 2649 Local<Name> key,
2525 Local<Value>, 2650 Local<Value>,
2526 const v8::PropertyCallbackInfo<v8::Value>& info) { 2651 const v8::PropertyCallbackInfo<v8::Value>& info) {
2527 info.GetIsolate()->ThrowException(key); 2652 info.GetIsolate()->ThrowException(key);
2528 info.GetReturnValue().SetUndefined(); // not the same as empty handle 2653 info.GetReturnValue().SetUndefined(); // not the same as empty handle
2529 } 2654 }
2530 2655
2531 2656
2532 THREADED_TEST(CallbackExceptionRegression) { 2657 THREADED_TEST(CallbackExceptionRegression) {
2533 v8::Isolate* isolate = CcTest::isolate(); 2658 v8::Isolate* isolate = CcTest::isolate();
2534 v8::HandleScope scope(isolate); 2659 v8::HandleScope scope(isolate);
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
3320 // If it did we would have full access to the hidden properties in 3445 // If it did we would have full access to the hidden properties in
3321 // the accessor. 3446 // the accessor.
3322 CHECK(obj->SetHiddenValue(key, v8::Integer::New(env->GetIsolate(), 42))); 3447 CHECK(obj->SetHiddenValue(key, v8::Integer::New(env->GetIsolate(), 42)));
3323 ExpectFalse("set_called"); 3448 ExpectFalse("set_called");
3324 CHECK_EQ(42, obj->GetHiddenValue(key)->Int32Value()); 3449 CHECK_EQ(42, obj->GetHiddenValue(key)->Int32Value());
3325 } 3450 }
3326 3451
3327 3452
3328 static bool interceptor_for_hidden_properties_called; 3453 static bool interceptor_for_hidden_properties_called;
3329 static void InterceptorForHiddenProperties( 3454 static void InterceptorForHiddenProperties(
3330 Local<String> name, const v8::PropertyCallbackInfo<v8::Value>& info) { 3455 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
3331 interceptor_for_hidden_properties_called = true; 3456 interceptor_for_hidden_properties_called = true;
3332 } 3457 }
3333 3458
3334 3459
3335 THREADED_TEST(HiddenPropertiesWithInterceptors) { 3460 THREADED_TEST(HiddenPropertiesWithInterceptors) {
3336 LocalContext context; 3461 LocalContext context;
3337 v8::Isolate* isolate = context->GetIsolate(); 3462 v8::Isolate* isolate = context->GetIsolate();
3338 v8::HandleScope scope(isolate); 3463 v8::HandleScope scope(isolate);
3339 3464
3340 interceptor_for_hidden_properties_called = false; 3465 interceptor_for_hidden_properties_called = false;
(...skipping 2548 matching lines...) Expand 10 before | Expand all | Expand 10 after
5889 v8_str("donut")); 6014 v8_str("donut"));
5890 LocalContext context; 6015 LocalContext context;
5891 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6016 context->Global()->Set(v8_str("obj"), templ->NewInstance());
5892 Local<Script> script = v8_compile("obj.x = 4; obj.x"); 6017 Local<Script> script = v8_compile("obj.x = 4; obj.x");
5893 for (int i = 0; i < 10; i++) { 6018 for (int i = 0; i < 10; i++) {
5894 script->Run(); 6019 script->Run();
5895 } 6020 }
5896 } 6021 }
5897 6022
5898 6023
5899 static void XPropertyGetter(Local<String> property, 6024 static void XPropertyGetter(Local<Name> property,
5900 const v8::PropertyCallbackInfo<v8::Value>& info) { 6025 const v8::PropertyCallbackInfo<v8::Value>& info) {
5901 ApiTestFuzzer::Fuzz(); 6026 ApiTestFuzzer::Fuzz();
5902 CHECK(info.Data()->IsUndefined()); 6027 CHECK(info.Data()->IsUndefined());
5903 info.GetReturnValue().Set(property); 6028 info.GetReturnValue().Set(property);
5904 } 6029 }
5905 6030
5906 6031
5907 THREADED_TEST(NamedInterceptorPropertyRead) { 6032 THREADED_TEST(NamedInterceptorPropertyRead) {
5908 v8::Isolate* isolate = CcTest::isolate(); 6033 v8::Isolate* isolate = CcTest::isolate();
5909 v8::HandleScope scope(isolate); 6034 v8::HandleScope scope(isolate);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
5985 6110
5986 // Return to the original context and force some object to the slow case 6111 // Return to the original context and force some object to the slow case
5987 // to cause the NormalizedMapCache to verify. 6112 // to cause the NormalizedMapCache to verify.
5988 context1->Enter(); 6113 context1->Enter();
5989 CompileRun("var obj = { x : 0 }; delete obj.x;"); 6114 CompileRun("var obj = { x : 0 }; delete obj.x;");
5990 context1->Exit(); 6115 context1->Exit();
5991 } 6116 }
5992 6117
5993 6118
5994 static void SetXOnPrototypeGetter( 6119 static void SetXOnPrototypeGetter(
5995 Local<String> property, 6120 Local<Name> property,
5996 const v8::PropertyCallbackInfo<v8::Value>& info) { 6121 const v8::PropertyCallbackInfo<v8::Value>& info) {
5997 // Set x on the prototype object and do not handle the get request. 6122 // Set x on the prototype object and do not handle the get request.
5998 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); 6123 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype();
5999 proto.As<v8::Object>()->Set(v8_str("x"), 6124 proto.As<v8::Object>()->Set(v8_str("x"),
6000 v8::Integer::New(info.GetIsolate(), 23)); 6125 v8::Integer::New(info.GetIsolate(), 23));
6001 } 6126 }
6002 6127
6003 6128
6004 // This is a regression test for http://crbug.com/20104. Map 6129 // This is a regression test for http://crbug.com/20104. Map
6005 // transitions should not interfere with post interceptor lookup. 6130 // transitions should not interfere with post interceptor lookup.
(...skipping 1436 matching lines...) Expand 10 before | Expand all | Expand 10 after
7442 v8::HandleScope scope(isolate); 7567 v8::HandleScope scope(isolate);
7443 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); 7568 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
7444 global->Set(v8_str("f"), 7569 global->Set(v8_str("f"),
7445 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); 7570 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback));
7446 LocalContext context(NULL, global); 7571 LocalContext context(NULL, global);
7447 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); 7572 args_fun = context->Global()->Get(v8_str("f")).As<Function>();
7448 v8_compile("f(1, 2, 3)")->Run(); 7573 v8_compile("f(1, 2, 3)")->Run();
7449 } 7574 }
7450 7575
7451 7576
7452 static void NoBlockGetterX(Local<String> name, 7577 static void NoBlockGetterX(Local<Name> name,
7453 const v8::PropertyCallbackInfo<v8::Value>&) { 7578 const v8::PropertyCallbackInfo<v8::Value>&) {
7454 } 7579 }
7455 7580
7456 7581
7457 static void NoBlockGetterI(uint32_t index, 7582 static void NoBlockGetterI(uint32_t index,
7458 const v8::PropertyCallbackInfo<v8::Value>&) { 7583 const v8::PropertyCallbackInfo<v8::Value>&) {
7459 } 7584 }
7460 7585
7461 7586
7462 static void PDeleter(Local<String> name, 7587 static void PDeleter(Local<Name> name,
7463 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 7588 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
7464 if (!name->Equals(v8_str("foo"))) { 7589 if (!name->Equals(v8_str("foo"))) {
7465 return; // not intercepted 7590 return; // not intercepted
7466 } 7591 }
7467 7592
7468 info.GetReturnValue().Set(false); // intercepted, don't delete the property 7593 info.GetReturnValue().Set(false); // intercepted, don't delete the property
7469 } 7594 }
7470 7595
7471 7596
7472 static void IDeleter(uint32_t index, 7597 static void IDeleter(uint32_t index,
(...skipping 26 matching lines...) Expand all
7499 CHECK(v8_compile("k.bar")->Run()->IsUndefined()); 7624 CHECK(v8_compile("k.bar")->Run()->IsUndefined());
7500 7625
7501 CHECK(v8_compile("delete k[2]")->Run()->IsFalse()); 7626 CHECK(v8_compile("delete k[2]")->Run()->IsFalse());
7502 CHECK(v8_compile("delete k[4]")->Run()->IsTrue()); 7627 CHECK(v8_compile("delete k[4]")->Run()->IsTrue());
7503 7628
7504 CHECK_EQ(v8_compile("k[2]")->Run(), v8_num(2)); 7629 CHECK_EQ(v8_compile("k[2]")->Run(), v8_num(2));
7505 CHECK(v8_compile("k[4]")->Run()->IsUndefined()); 7630 CHECK(v8_compile("k[4]")->Run()->IsUndefined());
7506 } 7631 }
7507 7632
7508 7633
7509 static void GetK(Local<String> name, 7634 static void GetK(Local<Name> name,
7510 const v8::PropertyCallbackInfo<v8::Value>& info) { 7635 const v8::PropertyCallbackInfo<v8::Value>& info) {
7511 ApiTestFuzzer::Fuzz(); 7636 ApiTestFuzzer::Fuzz();
7512 if (name->Equals(v8_str("foo")) || 7637 if (name->Equals(v8_str("foo")) ||
7513 name->Equals(v8_str("bar")) || 7638 name->Equals(v8_str("bar")) ||
7514 name->Equals(v8_str("baz"))) { 7639 name->Equals(v8_str("baz"))) {
7515 info.GetReturnValue().SetUndefined(); 7640 info.GetReturnValue().SetUndefined();
7516 } 7641 }
7517 } 7642 }
7518 7643
7519 7644
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
7633 "var o2 = { __proto__: o1 };" 7758 "var o2 = { __proto__: o1 };"
7634 "var o3 = { __proto__: o2 };" 7759 "var o3 = { __proto__: o2 };"
7635 "var o4 = { __proto__: o3 };" 7760 "var o4 = { __proto__: o3 };"
7636 "for (var i = 0; i < 10; i++) o4.p4;" 7761 "for (var i = 0; i < 10; i++) o4.p4;"
7637 "for (var i = 0; i < 10; i++) o3.p3;" 7762 "for (var i = 0; i < 10; i++) o3.p3;"
7638 "for (var i = 0; i < 10; i++) o2.p2;" 7763 "for (var i = 0; i < 10; i++) o2.p2;"
7639 "for (var i = 0; i < 10; i++) o1.p1;"); 7764 "for (var i = 0; i < 10; i++) o1.p1;");
7640 } 7765 }
7641 7766
7642 7767
7643 static void PGetter2(Local<String> name, 7768 static void PGetter2(Local<Name> name,
7644 const v8::PropertyCallbackInfo<v8::Value>& info) { 7769 const v8::PropertyCallbackInfo<v8::Value>& info) {
7645 ApiTestFuzzer::Fuzz(); 7770 ApiTestFuzzer::Fuzz();
7646 p_getter_count2++; 7771 p_getter_count2++;
7647 v8::Handle<v8::Object> global = 7772 v8::Handle<v8::Object> global =
7648 info.GetIsolate()->GetCurrentContext()->Global(); 7773 info.GetIsolate()->GetCurrentContext()->Global();
7649 CHECK_EQ(info.Holder(), global->Get(v8_str("o1"))); 7774 CHECK_EQ(info.Holder(), global->Get(v8_str("o1")));
7650 if (name->Equals(v8_str("p1"))) { 7775 if (name->Equals(v8_str("p1"))) {
7651 CHECK_EQ(info.This(), global->Get(v8_str("o1"))); 7776 CHECK_EQ(info.This(), global->Get(v8_str("o1")));
7652 } else if (name->Equals(v8_str("p2"))) { 7777 } else if (name->Equals(v8_str("p2"))) {
7653 CHECK_EQ(info.This(), global->Get(v8_str("o2"))); 7778 CHECK_EQ(info.This(), global->Get(v8_str("o2")));
(...skipping 1885 matching lines...) Expand 10 before | Expand all | Expand 10 after
9539 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) { 9664 THREADED_TEST(GetOwnPropertyNamesWithInterceptor) {
9540 v8::Isolate* isolate = CcTest::isolate(); 9665 v8::Isolate* isolate = CcTest::isolate();
9541 v8::HandleScope handle_scope(isolate); 9666 v8::HandleScope handle_scope(isolate);
9542 v8::Handle<v8::ObjectTemplate> obj_template = 9667 v8::Handle<v8::ObjectTemplate> obj_template =
9543 v8::ObjectTemplate::New(isolate); 9668 v8::ObjectTemplate::New(isolate);
9544 9669
9545 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7)); 9670 obj_template->Set(v8_str("7"), v8::Integer::New(CcTest::isolate(), 7));
9546 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42)); 9671 obj_template->Set(v8_str("x"), v8::Integer::New(CcTest::isolate(), 42));
9547 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL, 9672 obj_template->SetIndexedPropertyHandler(NULL, NULL, NULL, NULL,
9548 IndexedPropertyEnumerator); 9673 IndexedPropertyEnumerator);
9549 obj_template->SetNamedPropertyHandler(NULL, NULL, NULL, NULL, 9674 // TODO(wingo): Types needed to disambiguate between deprecated and new
9675 // SetNamedPropertyHandler implementations. Go back to just passing NULL
9676 // values once deprecated API is removed.
9677 v8::GenericNamedPropertyGetterCallback getter = NULL;
9678 obj_template->SetNamedPropertyHandler(getter, NULL, NULL, NULL,
9550 NamedPropertyEnumerator); 9679 NamedPropertyEnumerator);
9551 9680
9552 LocalContext context; 9681 LocalContext context;
9553 v8::Handle<v8::Object> global = context->Global(); 9682 v8::Handle<v8::Object> global = context->Global();
9554 global->Set(v8_str("object"), obj_template->NewInstance()); 9683 global->Set(v8_str("object"), obj_template->NewInstance());
9555 9684
9556 v8::Handle<v8::Value> result = 9685 v8::Handle<v8::Value> result =
9557 CompileRun("Object.getOwnPropertyNames(object)"); 9686 CompileRun("Object.getOwnPropertyNames(object)");
9558 CHECK(result->IsArray()); 9687 CHECK(result->IsArray());
9559 v8::Handle<v8::Array> result_array = v8::Handle<v8::Array>::Cast(result); 9688 v8::Handle<v8::Array> result_array = v8::Handle<v8::Array>::Cast(result);
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
9830 9959
9831 value = v8_compile("var p = 'as' + 'df';")->Run(); 9960 value = v8_compile("var p = 'as' + 'df';")->Run();
9832 value = v8_compile("obj[p];")->Run(); 9961 value = v8_compile("obj[p];")->Run();
9833 9962
9834 context1->Exit(); 9963 context1->Exit();
9835 context0->Exit(); 9964 context0->Exit();
9836 } 9965 }
9837 9966
9838 9967
9839 static void AccessControlNamedGetter( 9968 static void AccessControlNamedGetter(
9840 Local<String>, 9969 Local<Name>,
9841 const v8::PropertyCallbackInfo<v8::Value>& info) { 9970 const v8::PropertyCallbackInfo<v8::Value>& info) {
9842 info.GetReturnValue().Set(42); 9971 info.GetReturnValue().Set(42);
9843 } 9972 }
9844 9973
9845 9974
9846 static void AccessControlNamedSetter( 9975 static void AccessControlNamedSetter(
9847 Local<String>, 9976 Local<Name>,
9848 Local<Value> value, 9977 Local<Value> value,
9849 const v8::PropertyCallbackInfo<v8::Value>& info) { 9978 const v8::PropertyCallbackInfo<v8::Value>& info) {
9850 info.GetReturnValue().Set(value); 9979 info.GetReturnValue().Set(value);
9851 } 9980 }
9852 9981
9853 9982
9854 static void AccessControlIndexedGetter( 9983 static void AccessControlIndexedGetter(
9855 uint32_t index, 9984 uint32_t index,
9856 const v8::PropertyCallbackInfo<v8::Value>& info) { 9985 const v8::PropertyCallbackInfo<v8::Value>& info) {
9857 info.GetReturnValue().Set(v8_num(42)); 9986 info.GetReturnValue().Set(v8_num(42));
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
9962 context->Global()->Set(v8_str("i"), o); 10091 context->Global()->Set(v8_str("i"), o);
9963 Local<Value> value = CompileRun("i.x"); 10092 Local<Value> value = CompileRun("i.x");
9964 CHECK_EQ(42, value->Int32Value()); 10093 CHECK_EQ(42, value->Int32Value());
9965 10094
9966 value = CompileRun("i.f()"); 10095 value = CompileRun("i.f()");
9967 CHECK_EQ(12, value->Int32Value()); 10096 CHECK_EQ(12, value->Int32Value());
9968 } 10097 }
9969 10098
9970 10099
9971 static void GlobalObjectInstancePropertiesGet( 10100 static void GlobalObjectInstancePropertiesGet(
9972 Local<String> key, 10101 Local<Name> key,
9973 const v8::PropertyCallbackInfo<v8::Value>&) { 10102 const v8::PropertyCallbackInfo<v8::Value>&) {
9974 ApiTestFuzzer::Fuzz(); 10103 ApiTestFuzzer::Fuzz();
9975 } 10104 }
9976 10105
9977 10106
9978 THREADED_TEST(GlobalObjectInstanceProperties) { 10107 THREADED_TEST(GlobalObjectInstanceProperties) {
9979 v8::Isolate* isolate = CcTest::isolate(); 10108 v8::Isolate* isolate = CcTest::isolate();
9980 v8::HandleScope handle_scope(isolate); 10109 v8::HandleScope handle_scope(isolate);
9981 10110
9982 Local<Value> global_object; 10111 Local<Value> global_object;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
10100 shadow_y_getter_call_count++; 10229 shadow_y_getter_call_count++;
10101 info.GetReturnValue().Set(v8_num(shadow_y)); 10230 info.GetReturnValue().Set(v8_num(shadow_y));
10102 } 10231 }
10103 10232
10104 10233
10105 static void ShadowIndexedGet(uint32_t index, 10234 static void ShadowIndexedGet(uint32_t index,
10106 const v8::PropertyCallbackInfo<v8::Value>&) { 10235 const v8::PropertyCallbackInfo<v8::Value>&) {
10107 } 10236 }
10108 10237
10109 10238
10110 static void ShadowNamedGet(Local<String> key, 10239 static void ShadowNamedGet(Local<Name> key,
10111 const v8::PropertyCallbackInfo<v8::Value>&) { 10240 const v8::PropertyCallbackInfo<v8::Value>&) {
10112 } 10241 }
10113 10242
10114 10243
10115 THREADED_TEST(ShadowObject) { 10244 THREADED_TEST(ShadowObject) {
10116 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; 10245 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0;
10117 v8::Isolate* isolate = CcTest::isolate(); 10246 v8::Isolate* isolate = CcTest::isolate();
10118 v8::HandleScope handle_scope(isolate); 10247 v8::HandleScope handle_scope(isolate);
10119 10248
10120 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate); 10249 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate);
(...skipping 1102 matching lines...) Expand 10 before | Expand all | Expand 10 after
11223 } 11352 }
11224 } 11353 }
11225 CHECK_EQ(kIterations, v8::HandleScope::NumberOfHandles(isolate)); 11354 CHECK_EQ(kIterations, v8::HandleScope::NumberOfHandles(isolate));
11226 } 11355 }
11227 CHECK_EQ(0, v8::HandleScope::NumberOfHandles(isolate)); 11356 CHECK_EQ(0, v8::HandleScope::NumberOfHandles(isolate));
11228 CHECK_EQ(kNesting * kIterations, Recurse(isolate, kNesting, kIterations)); 11357 CHECK_EQ(kNesting * kIterations, Recurse(isolate, kNesting, kIterations));
11229 } 11358 }
11230 11359
11231 11360
11232 static void InterceptorHasOwnPropertyGetter( 11361 static void InterceptorHasOwnPropertyGetter(
11233 Local<String> name, 11362 Local<Name> name,
11234 const v8::PropertyCallbackInfo<v8::Value>& info) { 11363 const v8::PropertyCallbackInfo<v8::Value>& info) {
11235 ApiTestFuzzer::Fuzz(); 11364 ApiTestFuzzer::Fuzz();
11236 } 11365 }
11237 11366
11238 11367
11239 THREADED_TEST(InterceptorHasOwnProperty) { 11368 THREADED_TEST(InterceptorHasOwnProperty) {
11240 LocalContext context; 11369 LocalContext context;
11241 v8::Isolate* isolate = context->GetIsolate(); 11370 v8::Isolate* isolate = context->GetIsolate();
11242 v8::HandleScope scope(isolate); 11371 v8::HandleScope scope(isolate);
11243 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); 11372 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate);
(...skipping 10 matching lines...) Expand all
11254 "o.hasOwnProperty('ostehaps');"); 11383 "o.hasOwnProperty('ostehaps');");
11255 CHECK_EQ(true, value->BooleanValue()); 11384 CHECK_EQ(true, value->BooleanValue());
11256 value = CompileRun( 11385 value = CompileRun(
11257 "var p = new constructor();" 11386 "var p = new constructor();"
11258 "p.hasOwnProperty('ostehaps');"); 11387 "p.hasOwnProperty('ostehaps');");
11259 CHECK_EQ(false, value->BooleanValue()); 11388 CHECK_EQ(false, value->BooleanValue());
11260 } 11389 }
11261 11390
11262 11391
11263 static void InterceptorHasOwnPropertyGetterGC( 11392 static void InterceptorHasOwnPropertyGetterGC(
11264 Local<String> name, 11393 Local<Name> name,
11265 const v8::PropertyCallbackInfo<v8::Value>& info) { 11394 const v8::PropertyCallbackInfo<v8::Value>& info) {
11266 ApiTestFuzzer::Fuzz(); 11395 ApiTestFuzzer::Fuzz();
11267 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 11396 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
11268 } 11397 }
11269 11398
11270 11399
11271 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { 11400 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) {
11272 LocalContext context; 11401 LocalContext context;
11273 v8::Isolate* isolate = context->GetIsolate(); 11402 v8::Isolate* isolate = context->GetIsolate();
11274 v8::HandleScope scope(isolate); 11403 v8::HandleScope scope(isolate);
(...skipping 16 matching lines...) Expand all
11291 "x = makestr(31415);" 11420 "x = makestr(31415);"
11292 "x = makestr(23456);"); 11421 "x = makestr(23456);");
11293 v8::Handle<Value> value = CompileRun( 11422 v8::Handle<Value> value = CompileRun(
11294 "var o = new constructor();" 11423 "var o = new constructor();"
11295 "o.__proto__ = new String(x);" 11424 "o.__proto__ = new String(x);"
11296 "o.hasOwnProperty('ostehaps');"); 11425 "o.hasOwnProperty('ostehaps');");
11297 CHECK_EQ(false, value->BooleanValue()); 11426 CHECK_EQ(false, value->BooleanValue());
11298 } 11427 }
11299 11428
11300 11429
11301 typedef void (*NamedPropertyGetter)( 11430 static void CheckInterceptorLoadIC(
11302 Local<String> property, 11431 v8::GenericNamedPropertyGetterCallback getter, const char* source,
11303 const v8::PropertyCallbackInfo<v8::Value>& info); 11432 int expected) {
11304
11305
11306 static void CheckInterceptorLoadIC(NamedPropertyGetter getter,
11307 const char* source,
11308 int expected) {
11309 v8::Isolate* isolate = CcTest::isolate(); 11433 v8::Isolate* isolate = CcTest::isolate();
11310 v8::HandleScope scope(isolate); 11434 v8::HandleScope scope(isolate);
11311 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); 11435 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
11312 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data")); 11436 templ->SetNamedPropertyHandler(getter, 0, 0, 0, 0, v8_str("data"));
11313 LocalContext context; 11437 LocalContext context;
11314 context->Global()->Set(v8_str("o"), templ->NewInstance()); 11438 context->Global()->Set(v8_str("o"), templ->NewInstance());
11315 v8::Handle<Value> value = CompileRun(source); 11439 v8::Handle<Value> value = CompileRun(source);
11316 CHECK_EQ(expected, value->Int32Value()); 11440 CHECK_EQ(expected, value->Int32Value());
11317 } 11441 }
11318 11442
11319 11443
11320 static void InterceptorLoadICGetter( 11444 static void InterceptorLoadICGetter(
11321 Local<String> name, 11445 Local<Name> name,
11322 const v8::PropertyCallbackInfo<v8::Value>& info) { 11446 const v8::PropertyCallbackInfo<v8::Value>& info) {
11323 ApiTestFuzzer::Fuzz(); 11447 ApiTestFuzzer::Fuzz();
11324 v8::Isolate* isolate = CcTest::isolate(); 11448 v8::Isolate* isolate = CcTest::isolate();
11325 CHECK_EQ(isolate, info.GetIsolate()); 11449 CHECK_EQ(isolate, info.GetIsolate());
11326 CHECK_EQ(v8_str("data"), info.Data()); 11450 CHECK_EQ(v8_str("data"), info.Data());
11327 CHECK_EQ(v8_str("x"), name); 11451 CHECK_EQ(v8_str("x"), name);
11328 info.GetReturnValue().Set(v8::Integer::New(isolate, 42)); 11452 info.GetReturnValue().Set(v8::Integer::New(isolate, 42));
11329 } 11453 }
11330 11454
11331 11455
11332 // This test should hit the load IC for the interceptor case. 11456 // This test should hit the load IC for the interceptor case.
11333 THREADED_TEST(InterceptorLoadIC) { 11457 THREADED_TEST(InterceptorLoadIC) {
11334 CheckInterceptorLoadIC(InterceptorLoadICGetter, 11458 CheckInterceptorLoadIC(InterceptorLoadICGetter,
11335 "var result = 0;" 11459 "var result = 0;"
11336 "for (var i = 0; i < 1000; i++) {" 11460 "for (var i = 0; i < 1000; i++) {"
11337 " result = o.x;" 11461 " result = o.x;"
11338 "}", 11462 "}",
11339 42); 11463 42);
11340 } 11464 }
11341 11465
11342 11466
11343 // Below go several tests which verify that JITing for various 11467 // Below go several tests which verify that JITing for various
11344 // configurations of interceptor and explicit fields works fine 11468 // configurations of interceptor and explicit fields works fine
11345 // (those cases are special cased to get better performance). 11469 // (those cases are special cased to get better performance).
11346 11470
11347 static void InterceptorLoadXICGetter( 11471 static void InterceptorLoadXICGetter(
11348 Local<String> name, 11472 Local<Name> name,
11349 const v8::PropertyCallbackInfo<v8::Value>& info) { 11473 const v8::PropertyCallbackInfo<v8::Value>& info) {
11350 ApiTestFuzzer::Fuzz(); 11474 ApiTestFuzzer::Fuzz();
11351 info.GetReturnValue().Set( 11475 info.GetReturnValue().Set(
11352 v8_str("x")->Equals(name) ? 11476 v8_str("x")->Equals(name) ?
11353 v8::Handle<v8::Value>(v8::Integer::New(info.GetIsolate(), 42)) : 11477 v8::Handle<v8::Value>(v8::Integer::New(info.GetIsolate(), 42)) :
11354 v8::Handle<v8::Value>()); 11478 v8::Handle<v8::Value>());
11355 } 11479 }
11356 11480
11357 11481
11358 THREADED_TEST(InterceptorLoadICWithFieldOnHolder) { 11482 THREADED_TEST(InterceptorLoadICWithFieldOnHolder) {
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
11454 "for (var i = 0; i < 1000; i++) {" 11578 "for (var i = 0; i < 1000; i++) {"
11455 " result += o.y;" 11579 " result += o.y;"
11456 "}" 11580 "}"
11457 "result;", 11581 "result;",
11458 42 * 1000); 11582 42 * 1000);
11459 } 11583 }
11460 11584
11461 11585
11462 static int interceptor_load_not_handled_calls = 0; 11586 static int interceptor_load_not_handled_calls = 0;
11463 static void InterceptorLoadNotHandled( 11587 static void InterceptorLoadNotHandled(
11464 Local<String> name, 11588 Local<Name> name,
11465 const v8::PropertyCallbackInfo<v8::Value>& info) { 11589 const v8::PropertyCallbackInfo<v8::Value>& info) {
11466 ++interceptor_load_not_handled_calls; 11590 ++interceptor_load_not_handled_calls;
11467 } 11591 }
11468 11592
11469 11593
11470 // Test how post-interceptor lookups are done in the non-cacheable 11594 // Test how post-interceptor lookups are done in the non-cacheable
11471 // case: the interceptor should not be invoked during this lookup. 11595 // case: the interceptor should not be invoked during this lookup.
11472 THREADED_TEST(InterceptorLoadICPostInterceptor) { 11596 THREADED_TEST(InterceptorLoadICPostInterceptor) {
11473 interceptor_load_not_handled_calls = 0; 11597 interceptor_load_not_handled_calls = 0;
11474 CheckInterceptorLoadIC(InterceptorLoadNotHandled, 11598 CheckInterceptorLoadIC(InterceptorLoadNotHandled,
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
11697 "var result = 0;" 11821 "var result = 0;"
11698 "for (var i = 0; i < 10; i++) {" 11822 "for (var i = 0; i < 10; i++) {"
11699 " result += o.y;" 11823 " result += o.y;"
11700 "}" 11824 "}"
11701 "result"); 11825 "result");
11702 CHECK_EQ(42 * 10, value->Int32Value()); 11826 CHECK_EQ(42 * 10, value->Int32Value());
11703 } 11827 }
11704 11828
11705 11829
11706 static void InterceptorLoadICGetter0( 11830 static void InterceptorLoadICGetter0(
11707 Local<String> name, 11831 Local<Name> name,
11708 const v8::PropertyCallbackInfo<v8::Value>& info) { 11832 const v8::PropertyCallbackInfo<v8::Value>& info) {
11709 ApiTestFuzzer::Fuzz(); 11833 ApiTestFuzzer::Fuzz();
11710 CHECK(v8_str("x")->Equals(name)); 11834 CHECK(v8_str("x")->Equals(name));
11711 info.GetReturnValue().Set(v8::Integer::New(info.GetIsolate(), 0)); 11835 info.GetReturnValue().Set(v8::Integer::New(info.GetIsolate(), 0));
11712 } 11836 }
11713 11837
11714 11838
11715 THREADED_TEST(InterceptorReturningZero) { 11839 THREADED_TEST(InterceptorReturningZero) {
11716 CheckInterceptorLoadIC(InterceptorLoadICGetter0, 11840 CheckInterceptorLoadIC(InterceptorLoadICGetter0,
11717 "o.x == undefined ? 1 : 0", 11841 "o.x == undefined ? 1 : 0",
11718 0); 11842 0);
11719 } 11843 }
11720 11844
11721 11845
11722 static void InterceptorStoreICSetter( 11846 static void InterceptorStoreICSetter(
11723 Local<String> key, 11847 Local<Name> key,
11724 Local<Value> value, 11848 Local<Value> value,
11725 const v8::PropertyCallbackInfo<v8::Value>& info) { 11849 const v8::PropertyCallbackInfo<v8::Value>& info) {
11726 CHECK(v8_str("x")->Equals(key)); 11850 CHECK(v8_str("x")->Equals(key));
11727 CHECK_EQ(42, value->Int32Value()); 11851 CHECK_EQ(42, value->Int32Value());
11728 info.GetReturnValue().Set(value); 11852 info.GetReturnValue().Set(value);
11729 } 11853 }
11730 11854
11731 11855
11732 // This test should hit the store IC for the interceptor case. 11856 // This test should hit the store IC for the interceptor case.
11733 THREADED_TEST(InterceptorStoreIC) { 11857 THREADED_TEST(InterceptorStoreIC) {
(...skipping 28 matching lines...) Expand all
11762 } 11886 }
11763 11887
11764 11888
11765 11889
11766 11890
11767 v8::Handle<Value> call_ic_function; 11891 v8::Handle<Value> call_ic_function;
11768 v8::Handle<Value> call_ic_function2; 11892 v8::Handle<Value> call_ic_function2;
11769 v8::Handle<Value> call_ic_function3; 11893 v8::Handle<Value> call_ic_function3;
11770 11894
11771 static void InterceptorCallICGetter( 11895 static void InterceptorCallICGetter(
11772 Local<String> name, 11896 Local<Name> name,
11773 const v8::PropertyCallbackInfo<v8::Value>& info) { 11897 const v8::PropertyCallbackInfo<v8::Value>& info) {
11774 ApiTestFuzzer::Fuzz(); 11898 ApiTestFuzzer::Fuzz();
11775 CHECK(v8_str("x")->Equals(name)); 11899 CHECK(v8_str("x")->Equals(name));
11776 info.GetReturnValue().Set(call_ic_function); 11900 info.GetReturnValue().Set(call_ic_function);
11777 } 11901 }
11778 11902
11779 11903
11780 // This test should hit the call IC for the interceptor case. 11904 // This test should hit the call IC for the interceptor case.
11781 THREADED_TEST(InterceptorCallIC) { 11905 THREADED_TEST(InterceptorCallIC) {
11782 v8::Isolate* isolate = CcTest::isolate(); 11906 v8::Isolate* isolate = CcTest::isolate();
(...skipping 27 matching lines...) Expand all
11810 "var result = 0;" 11934 "var result = 0;"
11811 "for (var i = 0; i < 7; i++) {" 11935 "for (var i = 0; i < 7; i++) {"
11812 " result = o.x(41);" 11936 " result = o.x(41);"
11813 "}"); 11937 "}");
11814 CHECK_EQ(42, value->Int32Value()); 11938 CHECK_EQ(42, value->Int32Value());
11815 } 11939 }
11816 11940
11817 11941
11818 static v8::Handle<Value> call_ic_function4; 11942 static v8::Handle<Value> call_ic_function4;
11819 static void InterceptorCallICGetter4( 11943 static void InterceptorCallICGetter4(
11820 Local<String> name, 11944 Local<Name> name,
11821 const v8::PropertyCallbackInfo<v8::Value>& info) { 11945 const v8::PropertyCallbackInfo<v8::Value>& info) {
11822 ApiTestFuzzer::Fuzz(); 11946 ApiTestFuzzer::Fuzz();
11823 CHECK(v8_str("x")->Equals(name)); 11947 CHECK(v8_str("x")->Equals(name));
11824 info.GetReturnValue().Set(call_ic_function4); 11948 info.GetReturnValue().Set(call_ic_function4);
11825 } 11949 }
11826 11950
11827 11951
11828 // This test checks that if interceptor provides a function, 11952 // This test checks that if interceptor provides a function,
11829 // even if we cached shadowed variant, interceptor's function 11953 // even if we cached shadowed variant, interceptor's function
11830 // is invoked 11954 // is invoked
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
11891 "var result = 0;" 12015 "var result = 0;"
11892 "for (var i = 0; i < 1000; i++) {" 12016 "for (var i = 0; i < 1000; i++) {"
11893 " result = o.x(42);" 12017 " result = o.x(42);"
11894 "}"); 12018 "}");
11895 CHECK_EQ(43, value->Int32Value()); 12019 CHECK_EQ(43, value->Int32Value());
11896 } 12020 }
11897 12021
11898 12022
11899 static v8::Handle<Value> call_ic_function5; 12023 static v8::Handle<Value> call_ic_function5;
11900 static void InterceptorCallICGetter5( 12024 static void InterceptorCallICGetter5(
11901 Local<String> name, 12025 Local<Name> name,
11902 const v8::PropertyCallbackInfo<v8::Value>& info) { 12026 const v8::PropertyCallbackInfo<v8::Value>& info) {
11903 ApiTestFuzzer::Fuzz(); 12027 ApiTestFuzzer::Fuzz();
11904 if (v8_str("x")->Equals(name)) 12028 if (v8_str("x")->Equals(name))
11905 info.GetReturnValue().Set(call_ic_function5); 12029 info.GetReturnValue().Set(call_ic_function5);
11906 } 12030 }
11907 12031
11908 12032
11909 // This test checks that if interceptor provides a function, 12033 // This test checks that if interceptor provides a function,
11910 // even if we cached constant function, interceptor's function 12034 // even if we cached constant function, interceptor's function
11911 // is invoked 12035 // is invoked
(...skipping 13 matching lines...) Expand all
11925 "var result = 0;" 12049 "var result = 0;"
11926 "for (var i = 0; i < 1000; i++) {" 12050 "for (var i = 0; i < 1000; i++) {"
11927 " result = o.x(42);" 12051 " result = o.x(42);"
11928 "}"); 12052 "}");
11929 CHECK_EQ(41, value->Int32Value()); 12053 CHECK_EQ(41, value->Int32Value());
11930 } 12054 }
11931 12055
11932 12056
11933 static v8::Handle<Value> call_ic_function6; 12057 static v8::Handle<Value> call_ic_function6;
11934 static void InterceptorCallICGetter6( 12058 static void InterceptorCallICGetter6(
11935 Local<String> name, 12059 Local<Name> name,
11936 const v8::PropertyCallbackInfo<v8::Value>& info) { 12060 const v8::PropertyCallbackInfo<v8::Value>& info) {
11937 ApiTestFuzzer::Fuzz(); 12061 ApiTestFuzzer::Fuzz();
11938 if (v8_str("x")->Equals(name)) 12062 if (v8_str("x")->Equals(name))
11939 info.GetReturnValue().Set(call_ic_function6); 12063 info.GetReturnValue().Set(call_ic_function6);
11940 } 12064 }
11941 12065
11942 12066
11943 // Same test as above, except the code is wrapped in a function 12067 // Same test as above, except the code is wrapped in a function
11944 // to test the optimized compiler. 12068 // to test the optimized compiler.
11945 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) { 12069 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) {
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
12053 " result += o.parseFloat('239');" 12177 " result += o.parseFloat('239');"
12054 " }" 12178 " }"
12055 " result" 12179 " result"
12056 "} catch(e) {" 12180 "} catch(e) {"
12057 " e" 12181 " e"
12058 "};"); 12182 "};");
12059 CHECK_EQ(239 * 10, value->Int32Value()); 12183 CHECK_EQ(239 * 10, value->Int32Value());
12060 } 12184 }
12061 12185
12062 static void InterceptorCallICFastApi( 12186 static void InterceptorCallICFastApi(
12063 Local<String> name, 12187 Local<Name> name,
12064 const v8::PropertyCallbackInfo<v8::Value>& info) { 12188 const v8::PropertyCallbackInfo<v8::Value>& info) {
12065 ApiTestFuzzer::Fuzz(); 12189 ApiTestFuzzer::Fuzz();
12066 CheckReturnValue(info, FUNCTION_ADDR(InterceptorCallICFastApi)); 12190 CheckReturnValue(info, FUNCTION_ADDR(InterceptorCallICFastApi));
12067 int* call_count = 12191 int* call_count =
12068 reinterpret_cast<int*>(v8::External::Cast(*info.Data())->Value()); 12192 reinterpret_cast<int*>(v8::External::Cast(*info.Data())->Value());
12069 ++(*call_count); 12193 ++(*call_count);
12070 if ((*call_count) % 20 == 0) { 12194 if ((*call_count) % 20 == 0) {
12071 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 12195 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
12072 } 12196 }
12073 } 12197 }
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
12629 CHECK(try_catch.HasCaught()); 12753 CHECK(try_catch.HasCaught());
12630 CHECK_EQ(v8_str("TypeError: Illegal invocation"), 12754 CHECK_EQ(v8_str("TypeError: Illegal invocation"),
12631 try_catch.Exception()->ToString()); 12755 try_catch.Exception()->ToString());
12632 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12756 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
12633 } 12757 }
12634 12758
12635 12759
12636 v8::Handle<Value> keyed_call_ic_function; 12760 v8::Handle<Value> keyed_call_ic_function;
12637 12761
12638 static void InterceptorKeyedCallICGetter( 12762 static void InterceptorKeyedCallICGetter(
12639 Local<String> name, 12763 Local<Name> name,
12640 const v8::PropertyCallbackInfo<v8::Value>& info) { 12764 const v8::PropertyCallbackInfo<v8::Value>& info) {
12641 ApiTestFuzzer::Fuzz(); 12765 ApiTestFuzzer::Fuzz();
12642 if (v8_str("x")->Equals(name)) { 12766 if (v8_str("x")->Equals(name)) {
12643 info.GetReturnValue().Set(keyed_call_ic_function); 12767 info.GetReturnValue().Set(keyed_call_ic_function);
12644 } 12768 }
12645 } 12769 }
12646 12770
12647 12771
12648 // Test the case when we stored cacheable lookup into 12772 // Test the case when we stored cacheable lookup into
12649 // a stub, but the function name changed (to another cacheable function). 12773 // a stub, but the function name changed (to another cacheable function).
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
12793 " if (i == 5) { proto.method = function(x) { return x - 1; }; };" 12917 " if (i == 5) { proto.method = function(x) { return x - 1; }; };"
12794 " result += o[m](41);" 12918 " result += o[m](41);"
12795 "}"); 12919 "}");
12796 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value()); 12920 CHECK_EQ(42*5 + 40*5, context->Global()->Get(v8_str("result"))->Int32Value());
12797 } 12921 }
12798 12922
12799 12923
12800 static int interceptor_call_count = 0; 12924 static int interceptor_call_count = 0;
12801 12925
12802 static void InterceptorICRefErrorGetter( 12926 static void InterceptorICRefErrorGetter(
12803 Local<String> name, 12927 Local<Name> name,
12804 const v8::PropertyCallbackInfo<v8::Value>& info) { 12928 const v8::PropertyCallbackInfo<v8::Value>& info) {
12805 ApiTestFuzzer::Fuzz(); 12929 ApiTestFuzzer::Fuzz();
12806 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) { 12930 if (v8_str("x")->Equals(name) && interceptor_call_count++ < 20) {
12807 info.GetReturnValue().Set(call_ic_function2); 12931 info.GetReturnValue().Set(call_ic_function2);
12808 } 12932 }
12809 } 12933 }
12810 12934
12811 12935
12812 // This test should hit load and call ICs for the interceptor case. 12936 // This test should hit load and call ICs for the interceptor case.
12813 // Once in a while, the interceptor will reply that a property was not 12937 // Once in a while, the interceptor will reply that a property was not
(...skipping 23 matching lines...) Expand all
12837 " return false;" 12961 " return false;"
12838 "};" 12962 "};"
12839 "g();"); 12963 "g();");
12840 CHECK_EQ(true, value->BooleanValue()); 12964 CHECK_EQ(true, value->BooleanValue());
12841 } 12965 }
12842 12966
12843 12967
12844 static int interceptor_ic_exception_get_count = 0; 12968 static int interceptor_ic_exception_get_count = 0;
12845 12969
12846 static void InterceptorICExceptionGetter( 12970 static void InterceptorICExceptionGetter(
12847 Local<String> name, 12971 Local<Name> name,
12848 const v8::PropertyCallbackInfo<v8::Value>& info) { 12972 const v8::PropertyCallbackInfo<v8::Value>& info) {
12849 ApiTestFuzzer::Fuzz(); 12973 ApiTestFuzzer::Fuzz();
12850 if (v8_str("x")->Equals(name) && ++interceptor_ic_exception_get_count < 20) { 12974 if (v8_str("x")->Equals(name) && ++interceptor_ic_exception_get_count < 20) {
12851 info.GetReturnValue().Set(call_ic_function3); 12975 info.GetReturnValue().Set(call_ic_function3);
12852 } 12976 }
12853 if (interceptor_ic_exception_get_count == 20) { 12977 if (interceptor_ic_exception_get_count == 20) {
12854 info.GetIsolate()->ThrowException(v8_num(42)); 12978 info.GetIsolate()->ThrowException(v8_num(42));
12855 return; 12979 return;
12856 } 12980 }
12857 } 12981 }
(...skipping 27 matching lines...) Expand all
12885 " return false;" 13009 " return false;"
12886 "};" 13010 "};"
12887 "f();"); 13011 "f();");
12888 CHECK_EQ(true, value->BooleanValue()); 13012 CHECK_EQ(true, value->BooleanValue());
12889 } 13013 }
12890 13014
12891 13015
12892 static int interceptor_ic_exception_set_count = 0; 13016 static int interceptor_ic_exception_set_count = 0;
12893 13017
12894 static void InterceptorICExceptionSetter( 13018 static void InterceptorICExceptionSetter(
12895 Local<String> key, 13019 Local<Name> key,
12896 Local<Value> value, 13020 Local<Value> value,
12897 const v8::PropertyCallbackInfo<v8::Value>& info) { 13021 const v8::PropertyCallbackInfo<v8::Value>& info) {
12898 ApiTestFuzzer::Fuzz(); 13022 ApiTestFuzzer::Fuzz();
12899 if (++interceptor_ic_exception_set_count > 20) { 13023 if (++interceptor_ic_exception_set_count > 20) {
12900 info.GetIsolate()->ThrowException(v8_num(42)); 13024 info.GetIsolate()->ThrowException(v8_num(42));
12901 } 13025 }
12902 } 13026 }
12903 13027
12904 13028
12905 // Test interceptor store IC where the interceptor throws an exception 13029 // Test interceptor store IC where the interceptor throws an exception
(...skipping 16 matching lines...) Expand all
12922 CHECK_EQ(true, value->BooleanValue()); 13046 CHECK_EQ(true, value->BooleanValue());
12923 } 13047 }
12924 13048
12925 13049
12926 // Test that we ignore null interceptors. 13050 // Test that we ignore null interceptors.
12927 THREADED_TEST(NullNamedInterceptor) { 13051 THREADED_TEST(NullNamedInterceptor) {
12928 v8::Isolate* isolate = CcTest::isolate(); 13052 v8::Isolate* isolate = CcTest::isolate();
12929 v8::HandleScope scope(isolate); 13053 v8::HandleScope scope(isolate);
12930 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); 13054 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
12931 templ->SetNamedPropertyHandler( 13055 templ->SetNamedPropertyHandler(
12932 static_cast<v8::NamedPropertyGetterCallback>(0)); 13056 static_cast<v8::GenericNamedPropertyGetterCallback>(0));
12933 LocalContext context; 13057 LocalContext context;
12934 templ->Set(CcTest::isolate(), "x", v8_num(42)); 13058 templ->Set(CcTest::isolate(), "x", v8_num(42));
12935 v8::Handle<v8::Object> obj = templ->NewInstance(); 13059 v8::Handle<v8::Object> obj = templ->NewInstance();
12936 context->Global()->Set(v8_str("obj"), obj); 13060 context->Global()->Set(v8_str("obj"), obj);
12937 v8::Handle<Value> value = CompileRun("obj.x"); 13061 v8::Handle<Value> value = CompileRun("obj.x");
12938 CHECK(value->IsInt32()); 13062 CHECK(value->IsInt32());
12939 CHECK_EQ(42, value->Int32Value()); 13063 CHECK_EQ(42, value->Int32Value());
12940 } 13064 }
12941 13065
12942 13066
(...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after
15307 } 15431 }
15308 info.GetReturnValue().Set(3); 15432 info.GetReturnValue().Set(3);
15309 } 15433 }
15310 15434
15311 static void ForceSetSetter(v8::Local<v8::String> name, 15435 static void ForceSetSetter(v8::Local<v8::String> name,
15312 v8::Local<v8::Value> value, 15436 v8::Local<v8::Value> value,
15313 const v8::PropertyCallbackInfo<void>& info) { 15437 const v8::PropertyCallbackInfo<void>& info) {
15314 force_set_set_count++; 15438 force_set_set_count++;
15315 } 15439 }
15316 15440
15441 static void ForceSetInterceptGetter(
15442 v8::Local<v8::Name> name,
15443 const v8::PropertyCallbackInfo<v8::Value>& info) {
15444 CHECK(name->IsString());
15445 ForceSetGetter(Local<String>::Cast(name), info);
15446 }
15447
15317 static void ForceSetInterceptSetter( 15448 static void ForceSetInterceptSetter(
15318 v8::Local<v8::String> name, 15449 v8::Local<v8::Name> name,
15319 v8::Local<v8::Value> value, 15450 v8::Local<v8::Value> value,
15320 const v8::PropertyCallbackInfo<v8::Value>& info) { 15451 const v8::PropertyCallbackInfo<v8::Value>& info) {
15321 force_set_set_count++; 15452 force_set_set_count++;
15322 info.GetReturnValue().SetUndefined(); 15453 info.GetReturnValue().SetUndefined();
15323 } 15454 }
15324 15455
15325 15456
15326 TEST(ForceSet) { 15457 TEST(ForceSet) {
15327 force_set_get_count = 0; 15458 force_set_get_count = 0;
15328 force_set_set_count = 0; 15459 force_set_set_count = 0;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
15369 15500
15370 15501
15371 TEST(ForceSetWithInterceptor) { 15502 TEST(ForceSetWithInterceptor) {
15372 force_set_get_count = 0; 15503 force_set_get_count = 0;
15373 force_set_set_count = 0; 15504 force_set_set_count = 0;
15374 pass_on_get = false; 15505 pass_on_get = false;
15375 15506
15376 v8::Isolate* isolate = CcTest::isolate(); 15507 v8::Isolate* isolate = CcTest::isolate();
15377 v8::HandleScope scope(isolate); 15508 v8::HandleScope scope(isolate);
15378 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 15509 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15379 templ->SetNamedPropertyHandler(ForceSetGetter, ForceSetInterceptSetter); 15510 templ->SetNamedPropertyHandler(ForceSetInterceptGetter,
15511 ForceSetInterceptSetter);
15380 LocalContext context(NULL, templ); 15512 LocalContext context(NULL, templ);
15381 v8::Handle<v8::Object> global = context->Global(); 15513 v8::Handle<v8::Object> global = context->Global();
15382 15514
15383 v8::Handle<v8::String> some_property = 15515 v8::Handle<v8::String> some_property =
15384 v8::String::NewFromUtf8(isolate, "a"); 15516 v8::String::NewFromUtf8(isolate, "a");
15385 CHECK_EQ(0, force_set_set_count); 15517 CHECK_EQ(0, force_set_set_count);
15386 CHECK_EQ(0, force_set_get_count); 15518 CHECK_EQ(0, force_set_get_count);
15387 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 15519 CHECK_EQ(3, global->Get(some_property)->Int32Value());
15388 // Setting the property shouldn't override it, just call the setter 15520 // Setting the property shouldn't override it, just call the setter
15389 // which in this case does nothing. 15521 // which in this case does nothing.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
15437 CHECK(global->ForceDelete(simple_property)); 15569 CHECK(global->ForceDelete(simple_property));
15438 CHECK(global->Get(simple_property)->IsUndefined()); 15570 CHECK(global->Get(simple_property)->IsUndefined());
15439 } 15571 }
15440 15572
15441 15573
15442 static int force_delete_interceptor_count = 0; 15574 static int force_delete_interceptor_count = 0;
15443 static bool pass_on_delete = false; 15575 static bool pass_on_delete = false;
15444 15576
15445 15577
15446 static void ForceDeleteDeleter( 15578 static void ForceDeleteDeleter(
15447 v8::Local<v8::String> name, 15579 v8::Local<v8::Name> name,
15448 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 15580 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
15449 force_delete_interceptor_count++; 15581 force_delete_interceptor_count++;
15450 if (pass_on_delete) return; 15582 if (pass_on_delete) return;
15451 info.GetReturnValue().Set(true); 15583 info.GetReturnValue().Set(true);
15452 } 15584 }
15453 15585
15454 15586
15455 THREADED_TEST(ForceDeleteWithInterceptor) { 15587 THREADED_TEST(ForceDeleteWithInterceptor) {
15456 force_delete_interceptor_count = 0; 15588 force_delete_interceptor_count = 0;
15457 pass_on_delete = false; 15589 pass_on_delete = false;
(...skipping 3072 matching lines...) Expand 10 before | Expand all | Expand 10 after
18530 static void SetterWhichSetsYOnThisTo23( 18662 static void SetterWhichSetsYOnThisTo23(
18531 Local<String> name, 18663 Local<String> name,
18532 Local<Value> value, 18664 Local<Value> value,
18533 const v8::PropertyCallbackInfo<void>& info) { 18665 const v8::PropertyCallbackInfo<void>& info) {
18534 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18666 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18535 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18667 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18536 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 18668 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23));
18537 } 18669 }
18538 18670
18539 18671
18540 void FooGetInterceptor(Local<String> name, 18672 void FooGetInterceptor(Local<Name> name,
18541 const v8::PropertyCallbackInfo<v8::Value>& info) { 18673 const v8::PropertyCallbackInfo<v8::Value>& info) {
18542 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18674 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18543 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18675 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18544 if (!name->Equals(v8_str("foo"))) return; 18676 if (!name->Equals(v8_str("foo"))) return;
18545 info.GetReturnValue().Set(v8_num(42)); 18677 info.GetReturnValue().Set(v8_num(42));
18546 } 18678 }
18547 18679
18548 18680
18549 void FooSetInterceptor(Local<String> name, 18681 void FooSetInterceptor(Local<Name> name,
18550 Local<Value> value, 18682 Local<Value> value,
18551 const v8::PropertyCallbackInfo<v8::Value>& info) { 18683 const v8::PropertyCallbackInfo<v8::Value>& info) {
18552 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18684 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18553 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18685 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18554 if (!name->Equals(v8_str("foo"))) return; 18686 if (!name->Equals(v8_str("foo"))) return;
18555 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 18687 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23));
18556 info.GetReturnValue().Set(v8_num(23)); 18688 info.GetReturnValue().Set(v8_num(23));
18557 } 18689 }
18558 18690
18559 18691
(...skipping 26 matching lines...) Expand all
18586 script = v8_compile("new C2();"); 18718 script = v8_compile("new C2();");
18587 for (int i = 0; i < 10; i++) { 18719 for (int i = 0; i < 10; i++) {
18588 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); 18720 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run());
18589 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); 18721 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value());
18590 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); 18722 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value());
18591 } 18723 }
18592 } 18724 }
18593 18725
18594 18726
18595 static void NamedPropertyGetterWhichReturns42( 18727 static void NamedPropertyGetterWhichReturns42(
18596 Local<String> name, 18728 Local<Name> name,
18597 const v8::PropertyCallbackInfo<v8::Value>& info) { 18729 const v8::PropertyCallbackInfo<v8::Value>& info) {
18598 info.GetReturnValue().Set(v8_num(42)); 18730 info.GetReturnValue().Set(v8_num(42));
18599 } 18731 }
18600 18732
18601 18733
18602 static void NamedPropertySetterWhichSetsYOnThisTo23( 18734 static void NamedPropertySetterWhichSetsYOnThisTo23(
18603 Local<String> name, 18735 Local<Name> name,
18604 Local<Value> value, 18736 Local<Value> value,
18605 const v8::PropertyCallbackInfo<v8::Value>& info) { 18737 const v8::PropertyCallbackInfo<v8::Value>& info) {
18606 if (name->Equals(v8_str("x"))) { 18738 if (name->Equals(v8_str("x"))) {
18607 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 18739 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23));
18608 } 18740 }
18609 } 18741 }
18610 18742
18611 18743
18612 THREADED_TEST(InterceptorOnConstructorPrototype) { 18744 THREADED_TEST(InterceptorOnConstructorPrototype) {
18613 v8::Isolate* isolate = CcTest::isolate(); 18745 v8::Isolate* isolate = CcTest::isolate();
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after
19901 CHECK(!globalProxy->StrictEquals(global)); 20033 CHECK(!globalProxy->StrictEquals(global));
19902 CHECK(globalProxy->StrictEquals(globalProxy)); 20034 CHECK(globalProxy->StrictEquals(globalProxy));
19903 20035
19904 CHECK(global->Equals(global)); 20036 CHECK(global->Equals(global));
19905 CHECK(!global->Equals(globalProxy)); 20037 CHECK(!global->Equals(globalProxy));
19906 CHECK(!globalProxy->Equals(global)); 20038 CHECK(!globalProxy->Equals(global));
19907 CHECK(globalProxy->Equals(globalProxy)); 20039 CHECK(globalProxy->Equals(globalProxy));
19908 } 20040 }
19909 20041
19910 20042
19911 static void Getter(v8::Local<v8::String> property, 20043 static void Getter(v8::Local<v8::Name> property,
19912 const v8::PropertyCallbackInfo<v8::Value>& info ) { 20044 const v8::PropertyCallbackInfo<v8::Value>& info ) {
19913 info.GetReturnValue().Set(v8_str("42!")); 20045 info.GetReturnValue().Set(v8_str("42!"));
19914 } 20046 }
19915 20047
19916 20048
19917 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { 20049 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
19918 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate()); 20050 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate());
19919 result->Set(0, v8_str("universalAnswer")); 20051 result->Set(0, v8_str("universalAnswer"));
19920 info.GetReturnValue().Set(result); 20052 info.GetReturnValue().Set(result);
19921 } 20053 }
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
20066 20198
20067 20199
20068 void HasOwnPropertyIndexedPropertyGetter( 20200 void HasOwnPropertyIndexedPropertyGetter(
20069 uint32_t index, 20201 uint32_t index,
20070 const v8::PropertyCallbackInfo<v8::Value>& info) { 20202 const v8::PropertyCallbackInfo<v8::Value>& info) {
20071 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); 20203 if (index == 42) info.GetReturnValue().Set(v8_str("yes"));
20072 } 20204 }
20073 20205
20074 20206
20075 void HasOwnPropertyNamedPropertyGetter( 20207 void HasOwnPropertyNamedPropertyGetter(
20076 Local<String> property, 20208 Local<Name> property,
20077 const v8::PropertyCallbackInfo<v8::Value>& info) { 20209 const v8::PropertyCallbackInfo<v8::Value>& info) {
20078 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(v8_str("yes")); 20210 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(v8_str("yes"));
20079 } 20211 }
20080 20212
20081 20213
20082 void HasOwnPropertyIndexedPropertyQuery( 20214 void HasOwnPropertyIndexedPropertyQuery(
20083 uint32_t index, const v8::PropertyCallbackInfo<v8::Integer>& info) { 20215 uint32_t index, const v8::PropertyCallbackInfo<v8::Integer>& info) {
20084 if (index == 42) info.GetReturnValue().Set(1); 20216 if (index == 42) info.GetReturnValue().Set(1);
20085 } 20217 }
20086 20218
20087 20219
20088 void HasOwnPropertyNamedPropertyQuery( 20220 void HasOwnPropertyNamedPropertyQuery(
20089 Local<String> property, 20221 Local<Name> property,
20090 const v8::PropertyCallbackInfo<v8::Integer>& info) { 20222 const v8::PropertyCallbackInfo<v8::Integer>& info) {
20091 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(1); 20223 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(1);
20092 } 20224 }
20093 20225
20094 20226
20095 void HasOwnPropertyNamedPropertyQuery2( 20227 void HasOwnPropertyNamedPropertyQuery2(
20096 Local<String> property, 20228 Local<Name> property,
20097 const v8::PropertyCallbackInfo<v8::Integer>& info) { 20229 const v8::PropertyCallbackInfo<v8::Integer>& info) {
20098 if (property->Equals(v8_str("bar"))) info.GetReturnValue().Set(1); 20230 if (property->Equals(v8_str("bar"))) info.GetReturnValue().Set(1);
20099 } 20231 }
20100 20232
20101 20233
20102 void HasOwnPropertyAccessorGetter( 20234 void HasOwnPropertyAccessorGetter(
20103 Local<String> property, 20235 Local<String> property,
20104 const v8::PropertyCallbackInfo<v8::Value>& info) { 20236 const v8::PropertyCallbackInfo<v8::Value>& info) {
20105 info.GetReturnValue().Set(v8_str("yes")); 20237 info.GetReturnValue().Set(v8_str("yes"));
20106 } 20238 }
(...skipping 1959 matching lines...) Expand 10 before | Expand all | Expand 10 after
22066 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); 22198 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate();
22067 instance_template->SetNamedPropertyHandler(EmptyInterceptor); 22199 instance_template->SetNamedPropertyHandler(EmptyInterceptor);
22068 22200
22069 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); 22201 env_->Global()->Set(v8_str("Klass"), t->GetFunction());
22070 22202
22071 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); 22203 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }");
22072 } 22204 }
22073 22205
22074 private: 22206 private:
22075 static void EmptyInterceptor( 22207 static void EmptyInterceptor(
22076 Local<String> property, 22208 Local<Name> property,
22077 const v8::PropertyCallbackInfo<v8::Value>& info) { 22209 const v8::PropertyCallbackInfo<v8::Value>& info) {
22078 } 22210 }
22079 }; 22211 };
22080 22212
22081 22213
22082 class RequestInterruptTestWithMathAbs 22214 class RequestInterruptTestWithMathAbs
22083 : public RequestInterruptTestBaseWithSimpleInterrupt { 22215 : public RequestInterruptTestBaseWithSimpleInterrupt {
22084 public: 22216 public:
22085 virtual void TestBody() { 22217 virtual void TestBody() {
22086 env_->Global()->Set(v8_str("WakeUpInterruptor"), Function::New( 22218 env_->Global()->Set(v8_str("WakeUpInterruptor"), Function::New(
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
22910 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); 23042 desc = x->GetOwnPropertyDescriptor(v8_str("p1"));
22911 Local<Function> set = 23043 Local<Function> set =
22912 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); 23044 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set")));
22913 Local<Function> get = 23045 Local<Function> get =
22914 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); 23046 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get")));
22915 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); 23047 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL));
22916 Handle<Value> args[] = { v8_num(14) }; 23048 Handle<Value> args[] = { v8_num(14) };
22917 set->Call(x, 1, args); 23049 set->Call(x, 1, args);
22918 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); 23050 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL));
22919 } 23051 }
OLDNEW
« src/objects.cc ('K') | « test/cctest/test-accessors.cc ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698