Chromium Code Reviews| 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 3995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4006 CHECK_EQ(4, a4->Length()); | 4006 CHECK_EQ(4, a4->Length()); |
| 4007 CHECK_EQ(17, a4->Get(0)->Int32Value()); | 4007 CHECK_EQ(17, a4->Get(0)->Int32Value()); |
| 4008 CHECK_EQ(18, a4->Get(1)->Int32Value()); | 4008 CHECK_EQ(18, a4->Get(1)->Int32Value()); |
| 4009 CHECK_EQ(19, a4->Get(2)->Int32Value()); | 4009 CHECK_EQ(19, a4->Get(2)->Int32Value()); |
| 4010 CHECK_EQ(20, a4->Get(3)->Int32Value()); | 4010 CHECK_EQ(20, a4->Get(3)->Int32Value()); |
| 4011 } | 4011 } |
| 4012 | 4012 |
| 4013 | 4013 |
| 4014 THREADED_TEST(FunctionCall) { | 4014 THREADED_TEST(FunctionCall) { |
| 4015 LocalContext context; | 4015 LocalContext context; |
| 4016 v8::HandleScope scope(context->GetIsolate()); | 4016 v8::Isolate* isolate = context->GetIsolate(); |
| 4017 v8::HandleScope scope(isolate); | |
| 4017 CompileRun( | 4018 CompileRun( |
| 4018 "function Foo() {" | 4019 "function Foo() {" |
| 4019 " var result = [];" | 4020 " var result = [];" |
| 4020 " for (var i = 0; i < arguments.length; i++) {" | 4021 " for (var i = 0; i < arguments.length; i++) {" |
| 4021 " result.push(arguments[i]);" | 4022 " result.push(arguments[i]);" |
| 4022 " }" | 4023 " }" |
| 4023 " return result;" | 4024 " return result;" |
| 4025 "}" | |
| 4026 "function ReturnThisSloppy() {" | |
| 4027 " return this;" | |
| 4028 "}" | |
| 4029 "function ReturnThisStrict() {" | |
| 4030 " 'use strict';" | |
| 4031 " return this;" | |
| 4024 "}"); | 4032 "}"); |
| 4025 Local<Function> Foo = | 4033 Local<Function> Foo = |
| 4026 Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); | 4034 Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); |
| 4035 Local<Function> ReturnThisSloppy = | |
| 4036 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisSloppy"))); | |
| 4037 Local<Function> ReturnThisStrict = | |
| 4038 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisStrict"))); | |
| 4027 | 4039 |
| 4028 v8::Handle<Value>* args0 = NULL; | 4040 v8::Handle<Value>* args0 = NULL; |
| 4029 Local<v8::Array> a0 = Local<v8::Array>::Cast(Foo->Call(Foo, 0, args0)); | 4041 Local<v8::Array> a0 = Local<v8::Array>::Cast(Foo->Call(Foo, 0, args0)); |
| 4030 CHECK_EQ(0, a0->Length()); | 4042 CHECK_EQ(0, a0->Length()); |
| 4031 | 4043 |
| 4032 v8::Handle<Value> args1[] = { v8_num(1.1) }; | 4044 v8::Handle<Value> args1[] = { v8_num(1.1) }; |
| 4033 Local<v8::Array> a1 = Local<v8::Array>::Cast(Foo->Call(Foo, 1, args1)); | 4045 Local<v8::Array> a1 = Local<v8::Array>::Cast(Foo->Call(Foo, 1, args1)); |
| 4034 CHECK_EQ(1, a1->Length()); | 4046 CHECK_EQ(1, a1->Length()); |
| 4035 CHECK_EQ(1.1, a1->Get(v8::Integer::New(0))->NumberValue()); | 4047 CHECK_EQ(1.1, a1->Get(v8::Integer::New(0))->NumberValue()); |
| 4036 | 4048 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 4053 v8::Handle<Value> args4[] = { v8_num(7.7), | 4065 v8::Handle<Value> args4[] = { v8_num(7.7), |
| 4054 v8_num(8.8), | 4066 v8_num(8.8), |
| 4055 v8_num(9.9), | 4067 v8_num(9.9), |
| 4056 v8_num(10.11) }; | 4068 v8_num(10.11) }; |
| 4057 Local<v8::Array> a4 = Local<v8::Array>::Cast(Foo->Call(Foo, 4, args4)); | 4069 Local<v8::Array> a4 = Local<v8::Array>::Cast(Foo->Call(Foo, 4, args4)); |
| 4058 CHECK_EQ(4, a4->Length()); | 4070 CHECK_EQ(4, a4->Length()); |
| 4059 CHECK_EQ(7.7, a4->Get(v8::Integer::New(0))->NumberValue()); | 4071 CHECK_EQ(7.7, a4->Get(v8::Integer::New(0))->NumberValue()); |
| 4060 CHECK_EQ(8.8, a4->Get(v8::Integer::New(1))->NumberValue()); | 4072 CHECK_EQ(8.8, a4->Get(v8::Integer::New(1))->NumberValue()); |
| 4061 CHECK_EQ(9.9, a4->Get(v8::Integer::New(2))->NumberValue()); | 4073 CHECK_EQ(9.9, a4->Get(v8::Integer::New(2))->NumberValue()); |
| 4062 CHECK_EQ(10.11, a4->Get(v8::Integer::New(3))->NumberValue()); | 4074 CHECK_EQ(10.11, a4->Get(v8::Integer::New(3))->NumberValue()); |
| 4075 | |
| 4076 Local<v8::Value> r1 = ReturnThisSloppy->Call(v8::Undefined(isolate), 0, NULL); | |
| 4077 CHECK(r1->StrictEquals(context->Global())); | |
| 4078 Local<v8::Value> r2 = ReturnThisSloppy->Call(v8::Null(isolate), 0, NULL); | |
| 4079 CHECK(r2->StrictEquals(context->Global())); | |
| 4080 Local<v8::Value> r3 = ReturnThisSloppy->Call(v8_num(42), 0, NULL); | |
| 4081 CHECK(r3->IsNumberObject()); | |
| 4082 CHECK_EQ(42.0, r3.As<v8::NumberObject>()->ValueOf()); | |
| 4083 Local<v8::Value> r4 = ReturnThisSloppy->Call(v8_str("hello"), 0, NULL); | |
| 4084 CHECK(r4->IsStringObject()); | |
| 4085 CHECK(r4.As<v8::StringObject>()->ValueOf()->StrictEquals(v8_str("hello"))); | |
| 4086 Local<v8::Value> r5 = ReturnThisSloppy->Call(v8::True(isolate), 0, NULL); | |
| 4087 CHECK(r5->IsBooleanObject()); | |
| 4088 CHECK(r5.As<v8::BooleanObject>()->ValueOf()); | |
| 4089 | |
| 4090 Local<v8::Value> r6 = ReturnThisStrict->Call(v8::Undefined(isolate), 0, NULL); | |
| 4091 CHECK(r6->IsUndefined()); | |
| 4092 Local<v8::Value> r7 = ReturnThisStrict->Call(v8::Null(isolate), 0, NULL); | |
| 4093 CHECK(r7->IsNull()); | |
| 4094 Local<v8::Value> r8 = ReturnThisStrict->Call(v8_num(42), 0, NULL); | |
| 4095 CHECK(r8->StrictEquals(v8_num(42))); | |
| 4096 Local<v8::Value> r9 = ReturnThisStrict->Call(v8_str("hello"), 0, NULL); | |
| 4097 CHECK(r9->StrictEquals(v8_str("hello"))); | |
| 4098 Local<v8::Value> r10 = ReturnThisStrict->Call(v8::True(isolate), 0, NULL); | |
| 4099 CHECK(r10->StrictEquals(v8::True(isolate))); | |
| 4063 } | 4100 } |
| 4064 | 4101 |
| 4065 | 4102 |
| 4066 static const char* js_code_causing_out_of_memory = | 4103 static const char* js_code_causing_out_of_memory = |
| 4067 "var a = new Array(); while(true) a.push(a);"; | 4104 "var a = new Array(); while(true) a.push(a);"; |
| 4068 | 4105 |
| 4069 | 4106 |
| 4070 // These tests run for a long time and prevent us from running tests | 4107 // These tests run for a long time and prevent us from running tests |
| 4071 // that come after them so they cannot run in parallel. | 4108 // that come after them so they cannot run in parallel. |
| 4072 TEST(OutOfMemory) { | 4109 TEST(OutOfMemory) { |
| (...skipping 6098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10171 if (args.IsConstructCall()) { | 10208 if (args.IsConstructCall()) { |
| 10172 if (args[0]->IsInt32()) { | 10209 if (args[0]->IsInt32()) { |
| 10173 args.GetReturnValue().Set(v8_num(-args[0]->Int32Value())); | 10210 args.GetReturnValue().Set(v8_num(-args[0]->Int32Value())); |
| 10174 return; | 10211 return; |
| 10175 } | 10212 } |
| 10176 } | 10213 } |
| 10177 | 10214 |
| 10178 args.GetReturnValue().Set(args[0]); | 10215 args.GetReturnValue().Set(args[0]); |
| 10179 } | 10216 } |
| 10180 | 10217 |
| 10218 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | |
| 10219 args.GetReturnValue().Set(args.This()); | |
| 10220 } | |
| 10221 | |
| 10181 | 10222 |
| 10182 // Test that a call handler can be set for objects which will allow | 10223 // Test that a call handler can be set for objects which will allow |
| 10183 // non-function objects created through the API to be called as | 10224 // non-function objects created through the API to be called as |
| 10184 // functions. | 10225 // functions. |
| 10185 THREADED_TEST(CallAsFunction) { | 10226 THREADED_TEST(CallAsFunction) { |
| 10186 LocalContext context; | 10227 LocalContext context; |
| 10187 v8::HandleScope scope(context->GetIsolate()); | 10228 v8::HandleScope scope(context->GetIsolate()); |
| 10188 | 10229 |
| 10189 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 10230 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
| 10190 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 10231 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10284 CHECK_EQ("22", *exception_value1); | 10325 CHECK_EQ("22", *exception_value1); |
| 10285 try_catch.Reset(); | 10326 try_catch.Reset(); |
| 10286 | 10327 |
| 10287 v8::Handle<Value> args[] = { v8_num(23) }; | 10328 v8::Handle<Value> args[] = { v8_num(23) }; |
| 10288 value = instance->CallAsFunction(instance, 1, args); | 10329 value = instance->CallAsFunction(instance, 1, args); |
| 10289 CHECK(try_catch.HasCaught()); | 10330 CHECK(try_catch.HasCaught()); |
| 10290 String::Utf8Value exception_value2(try_catch.Exception()); | 10331 String::Utf8Value exception_value2(try_catch.Exception()); |
| 10291 CHECK_EQ("23", *exception_value2); | 10332 CHECK_EQ("23", *exception_value2); |
| 10292 try_catch.Reset(); | 10333 try_catch.Reset(); |
| 10293 } | 10334 } |
| 10335 | |
| 10336 { v8::Isolate* isolate = context->GetIsolate(); | |
| 10337 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | |
| 10338 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | |
| 10339 instance_template->SetCallAsFunctionHandler(ReturnThis); | |
| 10340 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | |
| 10341 | |
| 10342 Local<v8::Value> a1 = instance->CallAsFunction(v8::Undefined(isolate), 0, NU LL); | |
|
Michael Starzinger
2013/09/30 11:17:41
nit: 80 characters limit throughout this file.
yusukesuzuki
2013/09/30 11:32:19
Done.
| |
| 10343 CHECK(a1->StrictEquals(instance)); | |
| 10344 Local<v8::Value> a2 = instance->CallAsFunction(v8::Null(isolate), 0, NULL); | |
| 10345 CHECK(a2->StrictEquals(instance)); | |
| 10346 Local<v8::Value> a3 = instance->CallAsFunction(v8_num(42), 0, NULL); | |
| 10347 CHECK(a3->StrictEquals(instance)); | |
| 10348 Local<v8::Value> a4 = instance->CallAsFunction(v8_str("hello"), 0, NULL); | |
| 10349 CHECK(a4->StrictEquals(instance)); | |
| 10350 Local<v8::Value> a5 = instance->CallAsFunction(v8::True(isolate), 0, NULL); | |
| 10351 CHECK(a5->StrictEquals(instance)); | |
| 10352 } | |
| 10353 | |
| 10354 { v8::Isolate* isolate = context->GetIsolate(); | |
| 10355 CompileRun( | |
| 10356 "function ReturnThisSloppy() {" | |
| 10357 " return this;" | |
| 10358 "}" | |
| 10359 "function ReturnThisStrict() {" | |
| 10360 " 'use strict';" | |
| 10361 " return this;" | |
| 10362 "}"); | |
| 10363 Local<Function> ReturnThisSloppy = | |
| 10364 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisSloppy")) ); | |
| 10365 Local<Function> ReturnThisStrict = | |
| 10366 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisStrict")) ); | |
| 10367 | |
| 10368 Local<v8::Value> a1 = ReturnThisSloppy->CallAsFunction(v8::Undefined(isolate ), 0, NULL); | |
| 10369 CHECK(a1->StrictEquals(context->Global())); | |
| 10370 Local<v8::Value> a2 = ReturnThisSloppy->CallAsFunction(v8::Null(isolate), 0, NULL); | |
| 10371 CHECK(a2->StrictEquals(context->Global())); | |
| 10372 Local<v8::Value> a3 = ReturnThisSloppy->CallAsFunction(v8_num(42), 0, NULL); | |
| 10373 CHECK(a3->IsNumberObject()); | |
| 10374 CHECK_EQ(42.0, a3.As<v8::NumberObject>()->ValueOf()); | |
| 10375 Local<v8::Value> a4 = ReturnThisSloppy->CallAsFunction(v8_str("hello"), 0, N ULL); | |
| 10376 CHECK(a4->IsStringObject()); | |
| 10377 CHECK(a4.As<v8::StringObject>()->ValueOf()->StrictEquals(v8_str("hello"))); | |
| 10378 Local<v8::Value> a5 = ReturnThisSloppy->CallAsFunction(v8::True(isolate), 0, NULL); | |
| 10379 CHECK(a5->IsBooleanObject()); | |
| 10380 CHECK(a5.As<v8::BooleanObject>()->ValueOf()); | |
| 10381 | |
| 10382 Local<v8::Value> a6 = ReturnThisStrict->CallAsFunction(v8::Undefined(isolate ), 0, NULL); | |
| 10383 CHECK(a6->IsUndefined()); | |
| 10384 Local<v8::Value> a7 = ReturnThisStrict->CallAsFunction(v8::Null(isolate), 0, NULL); | |
| 10385 CHECK(a7->IsNull()); | |
| 10386 Local<v8::Value> a8 = ReturnThisStrict->CallAsFunction(v8_num(42), 0, NULL); | |
| 10387 CHECK(a8->StrictEquals(v8_num(42))); | |
| 10388 Local<v8::Value> a9 = ReturnThisStrict->CallAsFunction(v8_str("hello"), 0, N ULL); | |
| 10389 CHECK(a9->StrictEquals(v8_str("hello"))); | |
| 10390 Local<v8::Value> a10 = ReturnThisStrict->CallAsFunction(v8::True(isolate), 0 , NULL); | |
| 10391 CHECK(a10->StrictEquals(v8::True(isolate))); | |
| 10392 } | |
| 10294 } | 10393 } |
| 10295 | 10394 |
| 10296 | 10395 |
| 10297 // Check whether a non-function object is callable. | 10396 // Check whether a non-function object is callable. |
| 10298 THREADED_TEST(CallableObject) { | 10397 THREADED_TEST(CallableObject) { |
| 10299 LocalContext context; | 10398 LocalContext context; |
| 10300 v8::HandleScope scope(context->GetIsolate()); | 10399 v8::HandleScope scope(context->GetIsolate()); |
| 10301 | 10400 |
| 10302 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); | 10401 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); |
| 10303 instance_template->SetCallAsFunctionHandler(call_as_function); | 10402 instance_template->SetCallAsFunctionHandler(call_as_function); |
| (...skipping 10303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 20607 } | 20706 } |
| 20608 for (int i = 0; i < runs; i++) { | 20707 for (int i = 0; i < runs; i++) { |
| 20609 Local<String> expected; | 20708 Local<String> expected; |
| 20610 if (i != 0) { | 20709 if (i != 0) { |
| 20611 CHECK_EQ(v8_str("escape value"), values[i]); | 20710 CHECK_EQ(v8_str("escape value"), values[i]); |
| 20612 } else { | 20711 } else { |
| 20613 CHECK(values[i].IsEmpty()); | 20712 CHECK(values[i].IsEmpty()); |
| 20614 } | 20713 } |
| 20615 } | 20714 } |
| 20616 } | 20715 } |
| OLD | NEW |