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 8894 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8905 "}" | 8905 "}" |
8906 "proto1.y = function(x) { return x - 1; };" | 8906 "proto1.y = function(x) { return x - 1; };" |
8907 "var result = 0;" | 8907 "var result = 0;" |
8908 "for (var i = 0; i < 7; i++) {" | 8908 "for (var i = 0; i < 7; i++) {" |
8909 " result += o.y(42);" | 8909 " result += o.y(42);" |
8910 "}"); | 8910 "}"); |
8911 CHECK_EQ(41 * 7, value->Int32Value()); | 8911 CHECK_EQ(41 * 7, value->Int32Value()); |
8912 } | 8912 } |
8913 | 8913 |
8914 | 8914 |
8915 static v8::Handle<Value> call_ic_function5; | |
8916 static v8::Handle<Value> InterceptorCallICGetter5(Local<String> name, | |
8917 const AccessorInfo& info) { | |
8918 ApiTestFuzzer::Fuzz(); | |
8919 if (v8_str("x")->Equals(name)) | |
8920 return call_ic_function5; | |
8921 else | |
8922 return Local<Value>(); | |
8923 } | |
8924 | |
8925 | |
8926 // This test checks that if interceptor doesn't provide a function, | 8915 // This test checks that if interceptor doesn't provide a function, |
8927 // cached constant function is used | 8916 // cached constant function is used |
8928 THREADED_TEST(InterceptorCallICConstantFunctionUsed) { | 8917 THREADED_TEST(InterceptorCallICConstantFunctionUsed) { |
8929 v8::HandleScope scope; | 8918 v8::HandleScope scope; |
8930 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); | 8919 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); |
8931 templ->SetNamedPropertyHandler(NoBlockGetterX); | 8920 templ->SetNamedPropertyHandler(NoBlockGetterX); |
8932 LocalContext context; | 8921 LocalContext context; |
8933 context->Global()->Set(v8_str("o"), templ->NewInstance()); | 8922 context->Global()->Set(v8_str("o"), templ->NewInstance()); |
8934 v8::Handle<Value> value = CompileRun( | 8923 v8::Handle<Value> value = CompileRun( |
8935 "function inc(x) { return x + 1; };" | 8924 "function inc(x) { return x + 1; };" |
8936 "inc(1);" | 8925 "inc(1);" |
8937 "o.x = inc;" | 8926 "o.x = inc;" |
8938 "var result = 0;" | 8927 "var result = 0;" |
8939 "for (var i = 0; i < 1000; i++) {" | 8928 "for (var i = 0; i < 1000; i++) {" |
8940 " result = o.x(42);" | 8929 " result = o.x(42);" |
8941 "}"); | 8930 "}"); |
8942 CHECK_EQ(43, value->Int32Value()); | 8931 CHECK_EQ(43, value->Int32Value()); |
8943 } | 8932 } |
8944 | 8933 |
8945 | 8934 |
| 8935 static v8::Handle<Value> call_ic_function5; |
| 8936 static v8::Handle<Value> InterceptorCallICGetter5(Local<String> name, |
| 8937 const AccessorInfo& info) { |
| 8938 ApiTestFuzzer::Fuzz(); |
| 8939 if (v8_str("x")->Equals(name)) |
| 8940 return call_ic_function5; |
| 8941 else |
| 8942 return Local<Value>(); |
| 8943 } |
| 8944 |
| 8945 |
8946 // This test checks that if interceptor provides a function, | 8946 // This test checks that if interceptor provides a function, |
8947 // even if we cached constant function, interceptor's function | 8947 // even if we cached constant function, interceptor's function |
8948 // is invoked | 8948 // is invoked |
8949 THREADED_TEST(InterceptorCallICConstantFunctionNotNeeded) { | 8949 THREADED_TEST(InterceptorCallICConstantFunctionNotNeeded) { |
8950 v8::HandleScope scope; | 8950 v8::HandleScope scope; |
8951 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); | 8951 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); |
8952 templ->SetNamedPropertyHandler(InterceptorCallICGetter5); | 8952 templ->SetNamedPropertyHandler(InterceptorCallICGetter5); |
8953 LocalContext context; | 8953 LocalContext context; |
8954 context->Global()->Set(v8_str("o"), templ->NewInstance()); | 8954 context->Global()->Set(v8_str("o"), templ->NewInstance()); |
8955 call_ic_function5 = | 8955 call_ic_function5 = |
8956 v8_compile("function f(x) { return x - 1; }; f")->Run(); | 8956 v8_compile("function f(x) { return x - 1; }; f")->Run(); |
8957 v8::Handle<Value> value = CompileRun( | 8957 v8::Handle<Value> value = CompileRun( |
8958 "function inc(x) { return x + 1; };" | 8958 "function inc(x) { return x + 1; };" |
8959 "inc(1);" | 8959 "inc(1);" |
8960 "o.x = inc;" | 8960 "o.x = inc;" |
8961 "var result = 0;" | 8961 "var result = 0;" |
8962 "for (var i = 0; i < 1000; i++) {" | 8962 "for (var i = 0; i < 1000; i++) {" |
8963 " result = o.x(42);" | 8963 " result = o.x(42);" |
8964 "}"); | 8964 "}"); |
8965 CHECK_EQ(41, value->Int32Value()); | 8965 CHECK_EQ(41, value->Int32Value()); |
8966 } | 8966 } |
8967 | 8967 |
8968 | 8968 |
| 8969 static v8::Handle<Value> call_ic_function6; |
| 8970 static v8::Handle<Value> InterceptorCallICGetter6(Local<String> name, |
| 8971 const AccessorInfo& info) { |
| 8972 ApiTestFuzzer::Fuzz(); |
| 8973 if (v8_str("x")->Equals(name)) |
| 8974 return call_ic_function6; |
| 8975 else |
| 8976 return Local<Value>(); |
| 8977 } |
| 8978 |
| 8979 |
| 8980 // Same test as above, except the code is wrapped in a function |
| 8981 // to test the optimized compiler. |
| 8982 THREADED_TEST(InterceptorCallICConstantFunctionNotNeededWrapped) { |
| 8983 i::FLAG_allow_natives_syntax = true; |
| 8984 v8::HandleScope scope; |
| 8985 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); |
| 8986 templ->SetNamedPropertyHandler(InterceptorCallICGetter6); |
| 8987 LocalContext context; |
| 8988 context->Global()->Set(v8_str("o"), templ->NewInstance()); |
| 8989 call_ic_function6 = |
| 8990 v8_compile("function f(x) { return x - 1; }; f")->Run(); |
| 8991 v8::Handle<Value> value = CompileRun( |
| 8992 "function inc(x) { return x + 1; };" |
| 8993 "inc(1);" |
| 8994 "o.x = inc;" |
| 8995 "function test() {" |
| 8996 " var result = 0;" |
| 8997 " for (var i = 0; i < 1000; i++) {" |
| 8998 " result = o.x(42);" |
| 8999 " }" |
| 9000 " return result;" |
| 9001 "};" |
| 9002 "test();" |
| 9003 "test();" |
| 9004 "test();" |
| 9005 "%OptimizeFunctionOnNextCall(test);" |
| 9006 "test()"); |
| 9007 CHECK_EQ(41, value->Int32Value()); |
| 9008 } |
| 9009 |
| 9010 |
8969 // Test the case when we stored constant function into | 9011 // Test the case when we stored constant function into |
8970 // a stub, but it got invalidated later on | 9012 // a stub, but it got invalidated later on |
8971 THREADED_TEST(InterceptorCallICInvalidatedConstantFunction) { | 9013 THREADED_TEST(InterceptorCallICInvalidatedConstantFunction) { |
8972 v8::HandleScope scope; | 9014 v8::HandleScope scope; |
8973 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); | 9015 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); |
8974 templ->SetNamedPropertyHandler(NoBlockGetterX); | 9016 templ->SetNamedPropertyHandler(NoBlockGetterX); |
8975 LocalContext context; | 9017 LocalContext context; |
8976 context->Global()->Set(v8_str("o"), templ->NewInstance()); | 9018 context->Global()->Set(v8_str("o"), templ->NewInstance()); |
8977 v8::Handle<Value> value = CompileRun( | 9019 v8::Handle<Value> value = CompileRun( |
8978 "function inc(x) { return x + 1; };" | 9020 "function inc(x) { return x + 1; };" |
(...skipping 6905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15884 CompileRun("throw 'exception';"); | 15926 CompileRun("throw 'exception';"); |
15885 } | 15927 } |
15886 | 15928 |
15887 | 15929 |
15888 TEST(CallCompletedCallbackTwoExceptions) { | 15930 TEST(CallCompletedCallbackTwoExceptions) { |
15889 v8::HandleScope scope; | 15931 v8::HandleScope scope; |
15890 LocalContext env; | 15932 LocalContext env; |
15891 v8::V8::AddCallCompletedCallback(CallCompletedCallbackException); | 15933 v8::V8::AddCallCompletedCallback(CallCompletedCallbackException); |
15892 CompileRun("throw 'first exception';"); | 15934 CompileRun("throw 'first exception';"); |
15893 } | 15935 } |
OLD | NEW |