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 2940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2951 CheckInternalFieldsAreZero(ab); | 2951 CheckInternalFieldsAreZero(ab); |
2952 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); | 2952 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); |
2953 CHECK(!ab->IsExternal()); | 2953 CHECK(!ab->IsExternal()); |
2954 CcTest::heap()->CollectAllGarbage(); | 2954 CcTest::heap()->CollectAllGarbage(); |
2955 | 2955 |
2956 ScopedArrayBufferContents ab_contents(ab->Externalize()); | 2956 ScopedArrayBufferContents ab_contents(ab->Externalize()); |
2957 CHECK(ab->IsExternal()); | 2957 CHECK(ab->IsExternal()); |
2958 | 2958 |
2959 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); | 2959 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); |
2960 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); | 2960 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); |
2961 DCHECK(data != NULL); | 2961 CHECK(data != NULL); |
2962 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust()); | 2962 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust()); |
2963 | 2963 |
2964 v8::Local<v8::Value> result = CompileRun("ab.byteLength"); | 2964 v8::Local<v8::Value> result = CompileRun("ab.byteLength"); |
2965 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); | 2965 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); |
2966 | 2966 |
2967 result = CompileRun( | 2967 result = CompileRun( |
2968 "var u8 = new Uint8Array(ab);" | 2968 "var u8 = new Uint8Array(ab);" |
2969 "u8[0] = 0xFF;" | 2969 "u8[0] = 0xFF;" |
2970 "u8[1] = 0xAA;" | 2970 "u8[1] = 0xAA;" |
2971 "u8.length"); | 2971 "u8.length"); |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3227 CheckInternalFieldsAreZero(ab); | 3227 CheckInternalFieldsAreZero(ab); |
3228 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); | 3228 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); |
3229 CHECK(!ab->IsExternal()); | 3229 CHECK(!ab->IsExternal()); |
3230 CcTest::heap()->CollectAllGarbage(); | 3230 CcTest::heap()->CollectAllGarbage(); |
3231 | 3231 |
3232 ScopedSharedArrayBufferContents ab_contents(ab->Externalize()); | 3232 ScopedSharedArrayBufferContents ab_contents(ab->Externalize()); |
3233 CHECK(ab->IsExternal()); | 3233 CHECK(ab->IsExternal()); |
3234 | 3234 |
3235 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); | 3235 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); |
3236 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); | 3236 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); |
3237 DCHECK(data != NULL); | 3237 CHECK(data != NULL); |
3238 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust()); | 3238 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust()); |
3239 | 3239 |
3240 v8::Local<v8::Value> result = CompileRun("ab.byteLength"); | 3240 v8::Local<v8::Value> result = CompileRun("ab.byteLength"); |
3241 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); | 3241 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); |
3242 | 3242 |
3243 result = CompileRun( | 3243 result = CompileRun( |
3244 "var u8 = new Uint8Array(ab);" | 3244 "var u8 = new Uint8Array(ab);" |
3245 "u8[0] = 0xFF;" | 3245 "u8[0] = 0xFF;" |
3246 "u8[1] = 0xAA;" | 3246 "u8[1] = 0xAA;" |
3247 "u8.length"); | 3247 "u8.length"); |
(...skipping 7321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10569 Local<Object> p = t->GetFunction(context.local()) | 10569 Local<Object> p = t->GetFunction(context.local()) |
10570 .ToLocalChecked() | 10570 .ToLocalChecked() |
10571 ->NewInstance(context.local()) | 10571 ->NewInstance(context.local()) |
10572 .ToLocalChecked(); | 10572 .ToLocalChecked(); |
10573 Local<Object> o = Object::New(context->GetIsolate()); | 10573 Local<Object> o = Object::New(context->GetIsolate()); |
10574 CHECK(o->SetPrototype(context.local(), p).FromJust()); | 10574 CHECK(o->SetPrototype(context.local(), p).FromJust()); |
10575 | 10575 |
10576 int hash = o->GetIdentityHash(); | 10576 int hash = o->GetIdentityHash(); |
10577 USE(hash); | 10577 USE(hash); |
10578 CHECK(o->Set(context.local(), v8_str("foo"), v8_num(42)).FromJust()); | 10578 CHECK(o->Set(context.local(), v8_str("foo"), v8_num(42)).FromJust()); |
10579 DCHECK_EQ(hash, o->GetIdentityHash()); | 10579 CHECK_EQ(hash, o->GetIdentityHash()); |
10580 } | 10580 } |
10581 | 10581 |
10582 | 10582 |
10583 THREADED_TEST(SetPrototype) { | 10583 THREADED_TEST(SetPrototype) { |
10584 LocalContext context; | 10584 LocalContext context; |
10585 v8::Isolate* isolate = context->GetIsolate(); | 10585 v8::Isolate* isolate = context->GetIsolate(); |
10586 v8::HandleScope handle_scope(isolate); | 10586 v8::HandleScope handle_scope(isolate); |
10587 | 10587 |
10588 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); | 10588 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
10589 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 10589 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10878 .ToLocalChecked() | 10878 .ToLocalChecked() |
10879 ->NewInstance(context.local()) | 10879 ->NewInstance(context.local()) |
10880 .ToLocalChecked(); | 10880 .ToLocalChecked(); |
10881 | 10881 |
10882 CHECK(o0->SetPrototype(context.local(), o1).FromJust()); | 10882 CHECK(o0->SetPrototype(context.local(), o1).FromJust()); |
10883 // If setting the prototype leads to the cycle, SetPrototype should | 10883 // If setting the prototype leads to the cycle, SetPrototype should |
10884 // return false and keep VM in sane state. | 10884 // return false and keep VM in sane state. |
10885 v8::TryCatch try_catch(isolate); | 10885 v8::TryCatch try_catch(isolate); |
10886 CHECK(o1->SetPrototype(context.local(), o0).IsNothing()); | 10886 CHECK(o1->SetPrototype(context.local(), o0).IsNothing()); |
10887 CHECK(!try_catch.HasCaught()); | 10887 CHECK(!try_catch.HasCaught()); |
10888 DCHECK(!CcTest::i_isolate()->has_pending_exception()); | 10888 CHECK(!CcTest::i_isolate()->has_pending_exception()); |
10889 | 10889 |
10890 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()") | 10890 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()") |
10891 ->Int32Value(context.local()) | 10891 ->Int32Value(context.local()) |
10892 .FromJust()); | 10892 .FromJust()); |
10893 } | 10893 } |
10894 | 10894 |
10895 | 10895 |
10896 THREADED_TEST(FunctionRemovePrototype) { | 10896 THREADED_TEST(FunctionRemovePrototype) { |
10897 LocalContext context; | 10897 LocalContext context; |
10898 v8::Isolate* isolate = context->GetIsolate(); | 10898 v8::Isolate* isolate = context->GetIsolate(); |
(...skipping 2847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13746 " for (i = 0; i < 100; ++i)\n" | 13746 " for (i = 0; i < 100; ++i)\n" |
13747 " sum = foo(i);\n" | 13747 " sum = foo(i);\n" |
13748 " return sum;\n" | 13748 " return sum;\n" |
13749 "}\n" | 13749 "}\n" |
13750 "function foo(i) { return i * i; }\n" | 13750 "function foo(i) { return i * i; }\n" |
13751 "// Invoke on the runtime function.\n" | 13751 "// Invoke on the runtime function.\n" |
13752 "obj.asdf()"; | 13752 "obj.asdf()"; |
13753 CompileRun(script); | 13753 CompileRun(script); |
13754 bar_func_ = i::Handle<i::JSFunction>::cast( | 13754 bar_func_ = i::Handle<i::JSFunction>::cast( |
13755 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("bar")))); | 13755 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("bar")))); |
13756 DCHECK(!bar_func_.is_null()); | 13756 CHECK(!bar_func_.is_null()); |
13757 | 13757 |
13758 foo_func_ = | 13758 foo_func_ = |
13759 i::Handle<i::JSFunction>::cast( | 13759 i::Handle<i::JSFunction>::cast( |
13760 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("foo")))); | 13760 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("foo")))); |
13761 DCHECK(!foo_func_.is_null()); | 13761 CHECK(!foo_func_.is_null()); |
13762 | 13762 |
13763 v8::Local<v8::Value> value = CompileRun("bar();"); | 13763 v8::Local<v8::Value> value = CompileRun("bar();"); |
13764 CHECK(value->IsNumber()); | 13764 CHECK(value->IsNumber()); |
13765 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); | 13765 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); |
13766 | 13766 |
13767 // Test the optimized codegen path. | 13767 // Test the optimized codegen path. |
13768 value = CompileRun("%OptimizeFunctionOnNextCall(foo);" | 13768 value = CompileRun("%OptimizeFunctionOnNextCall(foo);" |
13769 "bar();"); | 13769 "bar();"); |
13770 CHECK(value->IsNumber()); | 13770 CHECK(value->IsNumber()); |
13771 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); | 13771 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); |
(...skipping 2179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15951 v8::HandleScope scope(args.GetIsolate()); | 15951 v8::HandleScope scope(args.GetIsolate()); |
15952 const char* origin = "capture-stack-trace-test"; | 15952 const char* origin = "capture-stack-trace-test"; |
15953 const int kOverviewTest = 1; | 15953 const int kOverviewTest = 1; |
15954 const int kDetailedTest = 2; | 15954 const int kDetailedTest = 2; |
15955 const int kFunctionName = 3; | 15955 const int kFunctionName = 3; |
15956 const int kDisplayName = 4; | 15956 const int kDisplayName = 4; |
15957 const int kFunctionNameAndDisplayName = 5; | 15957 const int kFunctionNameAndDisplayName = 5; |
15958 const int kDisplayNameIsNotString = 6; | 15958 const int kDisplayNameIsNotString = 6; |
15959 const int kFunctionNameIsNotString = 7; | 15959 const int kFunctionNameIsNotString = 7; |
15960 | 15960 |
15961 DCHECK(args.Length() == 1); | 15961 CHECK(args.Length() == 1); |
15962 | 15962 |
15963 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); | 15963 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
15964 int testGroup = args[0]->Int32Value(context).FromJust(); | 15964 int testGroup = args[0]->Int32Value(context).FromJust(); |
15965 if (testGroup == kOverviewTest) { | 15965 if (testGroup == kOverviewTest) { |
15966 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 15966 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
15967 args.GetIsolate(), 10, v8::StackTrace::kOverview); | 15967 args.GetIsolate(), 10, v8::StackTrace::kOverview); |
15968 CHECK_EQ(4, stackTrace->GetFrameCount()); | 15968 CHECK_EQ(4, stackTrace->GetFrameCount()); |
15969 checkStackFrame(origin, "bar", 2, 10, false, false, | 15969 checkStackFrame(origin, "bar", 2, 10, false, false, |
15970 stackTrace->GetFrame(0)); | 15970 stackTrace->GetFrame(0)); |
15971 checkStackFrame(origin, "foo", 6, 3, false, false, | 15971 checkStackFrame(origin, "foo", 6, 3, false, false, |
(...skipping 5648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21620 "check = function(returned) {\n" | 21620 "check = function(returned) {\n" |
21621 " if (returned !== 1) { throw returned; }\n" | 21621 " if (returned !== 1) { throw returned; }\n" |
21622 "}\n" | 21622 "}\n" |
21623 "check(wrap_set());\n" | 21623 "check(wrap_set());\n" |
21624 "check(wrap_set());\n" | 21624 "check(wrap_set());\n" |
21625 "%%OptimizeFunctionOnNextCall(wrap_set_%d);\n" | 21625 "%%OptimizeFunctionOnNextCall(wrap_set_%d);\n" |
21626 "check(wrap_set());\n", | 21626 "check(wrap_set());\n", |
21627 wrap_function.start(), key, key, key, key, key, key); | 21627 wrap_function.start(), key, key, key, key, key, key); |
21628 v8::TryCatch try_catch(isolate); | 21628 v8::TryCatch try_catch(isolate); |
21629 CompileRun(source.start()); | 21629 CompileRun(source.start()); |
21630 DCHECK(!try_catch.HasCaught()); | 21630 CHECK(!try_catch.HasCaught()); |
21631 CHECK_EQ(9, count); | 21631 CHECK_EQ(9, count); |
21632 } | 21632 } |
21633 }; | 21633 }; |
21634 | 21634 |
21635 | 21635 |
21636 Local<Object> ApiCallOptimizationChecker::data; | 21636 Local<Object> ApiCallOptimizationChecker::data; |
21637 Local<Object> ApiCallOptimizationChecker::receiver; | 21637 Local<Object> ApiCallOptimizationChecker::receiver; |
21638 Local<Object> ApiCallOptimizationChecker::holder; | 21638 Local<Object> ApiCallOptimizationChecker::holder; |
21639 Local<Object> ApiCallOptimizationChecker::callee; | 21639 Local<Object> ApiCallOptimizationChecker::callee; |
21640 int ApiCallOptimizationChecker::count = 0; | 21640 int ApiCallOptimizationChecker::count = 0; |
(...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22858 isolate2->Dispose(); | 22858 isolate2->Dispose(); |
22859 } | 22859 } |
22860 | 22860 |
22861 | 22861 |
22862 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) { | 22862 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) { |
22863 const char* garbage = "garbage garbage garbage garbage garbage garbage"; | 22863 const char* garbage = "garbage garbage garbage garbage garbage garbage"; |
22864 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage); | 22864 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage); |
22865 int length = 16; | 22865 int length = 16; |
22866 v8::ScriptCompiler::CachedData* cached_data = | 22866 v8::ScriptCompiler::CachedData* cached_data = |
22867 new v8::ScriptCompiler::CachedData(data, length); | 22867 new v8::ScriptCompiler::CachedData(data, length); |
22868 DCHECK(!cached_data->rejected); | 22868 CHECK(!cached_data->rejected); |
22869 v8::ScriptOrigin origin(v8_str("origin")); | 22869 v8::ScriptOrigin origin(v8_str("origin")); |
22870 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data); | 22870 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data); |
22871 v8::Local<v8::Script> script = | 22871 v8::Local<v8::Script> script = |
22872 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option); | 22872 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option); |
22873 CHECK(cached_data->rejected); | 22873 CHECK(cached_data->rejected); |
22874 CHECK_EQ(42, script->Run() | 22874 CHECK_EQ(42, script->Run() |
22875 ->Int32Value(CcTest::isolate()->GetCurrentContext()) | 22875 ->Int32Value(CcTest::isolate()->GetCurrentContext()) |
22876 .FromJust()); | 22876 .FromJust()); |
22877 } | 22877 } |
22878 | 22878 |
(...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23825 env2->Global()->Set(env2.local(), v8_str("obj2"), object2).FromJust()); | 23825 env2->Global()->Set(env2.local(), v8_str("obj2"), object2).FromJust()); |
23826 ExpectString("typeof obj2.values", "function"); | 23826 ExpectString("typeof obj2.values", "function"); |
23827 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); | 23827 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); |
23828 | 23828 |
23829 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); | 23829 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); |
23830 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); | 23830 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); |
23831 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); | 23831 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); |
23832 CHECK_EQ(fn2->GetCreationContext(), *ctx2); | 23832 CHECK_EQ(fn2->GetCreationContext(), *ctx2); |
23833 } | 23833 } |
23834 } | 23834 } |
OLD | NEW |