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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 CHECK(env->GetIsolate()->InContext()); | 179 CHECK(env->GetIsolate()->InContext()); |
180 CHECK(env->GetIsolate() == CcTest::isolate()); | 180 CHECK(env->GetIsolate() == CcTest::isolate()); |
181 env->Exit(); | 181 env->Exit(); |
182 CHECK(!env->GetIsolate()->InContext()); | 182 CHECK(!env->GetIsolate()->InContext()); |
183 CHECK(env->GetIsolate() == CcTest::isolate()); | 183 CHECK(env->GetIsolate() == CcTest::isolate()); |
184 } | 184 } |
185 | 185 |
186 | 186 |
187 static void TestSignature(const char* loop_js, Local<Value> receiver) { | 187 static void TestSignature(const char* loop_js, Local<Value> receiver) { |
188 i::ScopedVector<char> source(200); | 188 i::ScopedVector<char> source(200); |
189 i::OS::SNPrintF(source, | 189 i::SNPrintF(source, |
190 "for (var i = 0; i < 10; i++) {" | 190 "for (var i = 0; i < 10; i++) {" |
191 " %s" | 191 " %s" |
192 "}", | 192 "}", |
193 loop_js); | 193 loop_js); |
194 signature_callback_count = 0; | 194 signature_callback_count = 0; |
195 signature_expected_receiver = receiver; | 195 signature_expected_receiver = receiver; |
196 bool expected_to_throw = receiver.IsEmpty(); | 196 bool expected_to_throw = receiver.IsEmpty(); |
197 v8::TryCatch try_catch; | 197 v8::TryCatch try_catch; |
198 CompileRun(source.start()); | 198 CompileRun(source.start()); |
199 CHECK_EQ(expected_to_throw, try_catch.HasCaught()); | 199 CHECK_EQ(expected_to_throw, try_catch.HasCaught()); |
200 if (!expected_to_throw) { | 200 if (!expected_to_throw) { |
201 CHECK_EQ(10, signature_callback_count); | 201 CHECK_EQ(10, signature_callback_count); |
202 } else { | 202 } else { |
203 CHECK_EQ(v8_str("TypeError: Illegal invocation"), | 203 CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 "var obj = {};" | 256 "var obj = {};" |
257 "copy_props(obj);" | 257 "copy_props(obj);" |
258 "var unrel = new UnrelFun();" | 258 "var unrel = new UnrelFun();" |
259 "copy_props(unrel);"); | 259 "copy_props(unrel);"); |
260 // Test with and without ICs | 260 // Test with and without ICs |
261 const char* test_objects[] = { | 261 const char* test_objects[] = { |
262 "fun_instance", "sub_fun_instance", "obj", "unrel" }; | 262 "fun_instance", "sub_fun_instance", "obj", "unrel" }; |
263 unsigned bad_signature_start_offset = 2; | 263 unsigned bad_signature_start_offset = 2; |
264 for (unsigned i = 0; i < ARRAY_SIZE(test_objects); i++) { | 264 for (unsigned i = 0; i < ARRAY_SIZE(test_objects); i++) { |
265 i::ScopedVector<char> source(200); | 265 i::ScopedVector<char> source(200); |
266 i::OS::SNPrintF( | 266 i::SNPrintF( |
267 source, "var test_object = %s; test_object", test_objects[i]); | 267 source, "var test_object = %s; test_object", test_objects[i]); |
268 Local<Value> test_object = CompileRun(source.start()); | 268 Local<Value> test_object = CompileRun(source.start()); |
269 TestSignature("test_object.prop();", test_object); | 269 TestSignature("test_object.prop();", test_object); |
270 TestSignature("test_object.accessor;", test_object); | 270 TestSignature("test_object.accessor;", test_object); |
271 TestSignature("test_object[accessor_key];", test_object); | 271 TestSignature("test_object[accessor_key];", test_object); |
272 TestSignature("test_object.accessor = 1;", test_object); | 272 TestSignature("test_object.accessor = 1;", test_object); |
273 TestSignature("test_object[accessor_key] = 1;", test_object); | 273 TestSignature("test_object[accessor_key] = 1;", test_object); |
274 if (i >= bad_signature_start_offset) test_object = Local<Value>(); | 274 if (i >= bad_signature_start_offset) test_object = Local<Value>(); |
275 TestSignature("test_object.prop_sig();", test_object); | 275 TestSignature("test_object.prop_sig();", test_object); |
276 TestSignature("test_object.accessor_sig;", test_object); | 276 TestSignature("test_object.accessor_sig;", test_object); |
(...skipping 2797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3074 | 3074 |
3075 static void CheckIsNeutered(v8::Handle<v8::TypedArray> ta) { | 3075 static void CheckIsNeutered(v8::Handle<v8::TypedArray> ta) { |
3076 CHECK_EQ(0, static_cast<int>(ta->ByteLength())); | 3076 CHECK_EQ(0, static_cast<int>(ta->ByteLength())); |
3077 CHECK_EQ(0, static_cast<int>(ta->Length())); | 3077 CHECK_EQ(0, static_cast<int>(ta->Length())); |
3078 CHECK_EQ(0, static_cast<int>(ta->ByteOffset())); | 3078 CHECK_EQ(0, static_cast<int>(ta->ByteOffset())); |
3079 } | 3079 } |
3080 | 3080 |
3081 | 3081 |
3082 static void CheckIsTypedArrayVarNeutered(const char* name) { | 3082 static void CheckIsTypedArrayVarNeutered(const char* name) { |
3083 i::ScopedVector<char> source(1024); | 3083 i::ScopedVector<char> source(1024); |
3084 i::OS::SNPrintF(source, | 3084 i::SNPrintF(source, |
3085 "%s.byteLength == 0 && %s.byteOffset == 0 && %s.length == 0", | 3085 "%s.byteLength == 0 && %s.byteOffset == 0 && %s.length == 0", |
3086 name, name, name); | 3086 name, name, name); |
3087 CHECK(CompileRun(source.start())->IsTrue()); | 3087 CHECK(CompileRun(source.start())->IsTrue()); |
3088 v8::Handle<v8::TypedArray> ta = | 3088 v8::Handle<v8::TypedArray> ta = |
3089 v8::Handle<v8::TypedArray>::Cast(CompileRun(name)); | 3089 v8::Handle<v8::TypedArray>::Cast(CompileRun(name)); |
3090 CheckIsNeutered(ta); | 3090 CheckIsNeutered(ta); |
3091 } | 3091 } |
3092 | 3092 |
3093 | 3093 |
3094 template <typename TypedArray, int kElementSize> | 3094 template <typename TypedArray, int kElementSize> |
(...skipping 3628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6723 Context::New(CcTest::isolate(), &extensions); | 6723 Context::New(CcTest::isolate(), &extensions); |
6724 CHECK_EQ(0, *context); | 6724 CHECK_EQ(0, *context); |
6725 } | 6725 } |
6726 | 6726 |
6727 | 6727 |
6728 TEST(ExtensionWithSourceLength) { | 6728 TEST(ExtensionWithSourceLength) { |
6729 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; | 6729 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; |
6730 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { | 6730 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { |
6731 v8::HandleScope handle_scope(CcTest::isolate()); | 6731 v8::HandleScope handle_scope(CcTest::isolate()); |
6732 i::ScopedVector<char> extension_name(32); | 6732 i::ScopedVector<char> extension_name(32); |
6733 i::OS::SNPrintF(extension_name, "ext #%d", source_len); | 6733 i::SNPrintF(extension_name, "ext #%d", source_len); |
6734 v8::RegisterExtension(new Extension(extension_name.start(), | 6734 v8::RegisterExtension(new Extension(extension_name.start(), |
6735 kEmbeddedExtensionSource, 0, 0, | 6735 kEmbeddedExtensionSource, 0, 0, |
6736 source_len)); | 6736 source_len)); |
6737 const char* extension_names[1] = { extension_name.start() }; | 6737 const char* extension_names[1] = { extension_name.start() }; |
6738 v8::ExtensionConfiguration extensions(1, extension_names); | 6738 v8::ExtensionConfiguration extensions(1, extension_names); |
6739 v8::Handle<Context> context = | 6739 v8::Handle<Context> context = |
6740 Context::New(CcTest::isolate(), &extensions); | 6740 Context::New(CcTest::isolate(), &extensions); |
6741 if (source_len == kEmbeddedExtensionSourceValidLen) { | 6741 if (source_len == kEmbeddedExtensionSourceValidLen) { |
6742 Context::Scope lock(context); | 6742 Context::Scope lock(context); |
6743 v8::Handle<Value> result = CompileRun("Ret54321()"); | 6743 v8::Handle<Value> result = CompileRun("Ret54321()"); |
(...skipping 3557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10301 t2->InstanceTemplate()->Set(v8_str("fuz2"), v8_num(2)); | 10301 t2->InstanceTemplate()->Set(v8_str("fuz2"), v8_num(2)); |
10302 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); | 10302 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
10303 t3->SetHiddenPrototype(true); | 10303 t3->SetHiddenPrototype(true); |
10304 t3->InstanceTemplate()->Set(v8_str("boo"), v8_num(3)); | 10304 t3->InstanceTemplate()->Set(v8_str("boo"), v8_num(3)); |
10305 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate); | 10305 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate); |
10306 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); | 10306 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); |
10307 | 10307 |
10308 // Force dictionary-based properties. | 10308 // Force dictionary-based properties. |
10309 i::ScopedVector<char> name_buf(1024); | 10309 i::ScopedVector<char> name_buf(1024); |
10310 for (int i = 1; i <= 1000; i++) { | 10310 for (int i = 1; i <= 1000; i++) { |
10311 i::OS::SNPrintF(name_buf, "sdf%d", i); | 10311 i::SNPrintF(name_buf, "sdf%d", i); |
10312 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); | 10312 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); |
10313 } | 10313 } |
10314 | 10314 |
10315 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 10315 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); |
10316 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 10316 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); |
10317 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 10317 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); |
10318 Local<v8::Object> o4 = t4->GetFunction()->NewInstance(); | 10318 Local<v8::Object> o4 = t4->GetFunction()->NewInstance(); |
10319 | 10319 |
10320 // Create prototype chain of hidden prototypes. | 10320 // Create prototype chain of hidden prototypes. |
10321 CHECK(o4->SetPrototype(o3)); | 10321 CHECK(o4->SetPrototype(o3)); |
(...skipping 5987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16309 // The repeated loads and stores ensure the ICs are exercised. | 16309 // The repeated loads and stores ensure the ICs are exercised. |
16310 const char* boundary_program = | 16310 const char* boundary_program = |
16311 "var res = 0;" | 16311 "var res = 0;" |
16312 "for (var i = 0; i < 16; i++) {" | 16312 "for (var i = 0; i < 16; i++) {" |
16313 " ext_array[i] = %lld;" | 16313 " ext_array[i] = %lld;" |
16314 " if (i > 8) {" | 16314 " if (i > 8) {" |
16315 " res = ext_array[i];" | 16315 " res = ext_array[i];" |
16316 " }" | 16316 " }" |
16317 "}" | 16317 "}" |
16318 "res;"; | 16318 "res;"; |
16319 i::OS::SNPrintF(test_buf, | 16319 i::SNPrintF(test_buf, |
16320 boundary_program, | 16320 boundary_program, |
16321 low); | 16321 low); |
16322 result = CompileRun(test_buf.start()); | 16322 result = CompileRun(test_buf.start()); |
16323 CHECK_EQ(low, result->IntegerValue()); | 16323 CHECK_EQ(low, result->IntegerValue()); |
16324 | 16324 |
16325 i::OS::SNPrintF(test_buf, | 16325 i::SNPrintF(test_buf, |
16326 boundary_program, | 16326 boundary_program, |
16327 high); | 16327 high); |
16328 result = CompileRun(test_buf.start()); | 16328 result = CompileRun(test_buf.start()); |
16329 CHECK_EQ(high, result->IntegerValue()); | 16329 CHECK_EQ(high, result->IntegerValue()); |
16330 | 16330 |
16331 // Check misprediction of type in IC. | 16331 // Check misprediction of type in IC. |
16332 result = CompileRun("var tmp_array = ext_array;" | 16332 result = CompileRun("var tmp_array = ext_array;" |
16333 "var sum = 0;" | 16333 "var sum = 0;" |
16334 "for (var i = 0; i < 8; i++) {" | 16334 "for (var i = 0; i < 8; i++) {" |
16335 " tmp_array[i] = i;" | 16335 " tmp_array[i] = i;" |
16336 " sum += tmp_array[i];" | 16336 " sum += tmp_array[i];" |
16337 " if (i == 4) {" | 16337 " if (i == 4) {" |
16338 " tmp_array = {};" | 16338 " tmp_array = {};" |
16339 " }" | 16339 " }" |
16340 "}" | 16340 "}" |
16341 "sum;"); | 16341 "sum;"); |
16342 // Force GC to trigger verification. | 16342 // Force GC to trigger verification. |
16343 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 16343 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
16344 CHECK_EQ(28, result->Int32Value()); | 16344 CHECK_EQ(28, result->Int32Value()); |
16345 | 16345 |
16346 // Make sure out-of-range loads do not throw. | 16346 // Make sure out-of-range loads do not throw. |
16347 i::OS::SNPrintF(test_buf, | 16347 i::SNPrintF(test_buf, |
16348 "var caught_exception = false;" | 16348 "var caught_exception = false;" |
16349 "try {" | 16349 "try {" |
16350 " ext_array[%d];" | 16350 " ext_array[%d];" |
16351 "} catch (e) {" | 16351 "} catch (e) {" |
16352 " caught_exception = true;" | 16352 " caught_exception = true;" |
16353 "}" | 16353 "}" |
16354 "caught_exception;", | 16354 "caught_exception;", |
16355 element_count); | 16355 element_count); |
16356 result = CompileRun(test_buf.start()); | 16356 result = CompileRun(test_buf.start()); |
16357 CHECK_EQ(false, result->BooleanValue()); | 16357 CHECK_EQ(false, result->BooleanValue()); |
16358 | 16358 |
16359 // Make sure out-of-range stores do not throw. | 16359 // Make sure out-of-range stores do not throw. |
16360 i::OS::SNPrintF(test_buf, | 16360 i::SNPrintF(test_buf, |
16361 "var caught_exception = false;" | 16361 "var caught_exception = false;" |
16362 "try {" | 16362 "try {" |
16363 " ext_array[%d] = 1;" | 16363 " ext_array[%d] = 1;" |
16364 "} catch (e) {" | 16364 "} catch (e) {" |
16365 " caught_exception = true;" | 16365 " caught_exception = true;" |
16366 "}" | 16366 "}" |
16367 "caught_exception;", | 16367 "caught_exception;", |
16368 element_count); | 16368 element_count); |
16369 result = CompileRun(test_buf.start()); | 16369 result = CompileRun(test_buf.start()); |
16370 CHECK_EQ(false, result->BooleanValue()); | 16370 CHECK_EQ(false, result->BooleanValue()); |
16371 | 16371 |
16372 // Check other boundary conditions, values and operations. | 16372 // Check other boundary conditions, values and operations. |
16373 result = CompileRun("for (var i = 0; i < 8; i++) {" | 16373 result = CompileRun("for (var i = 0; i < 8; i++) {" |
16374 " ext_array[7] = undefined;" | 16374 " ext_array[7] = undefined;" |
16375 "}" | 16375 "}" |
16376 "ext_array[7];"); | 16376 "ext_array[7];"); |
16377 CHECK_EQ(0, result->Int32Value()); | 16377 CHECK_EQ(0, result->Int32Value()); |
16378 if (array_type == v8::kExternalFloat64Array || | 16378 if (array_type == v8::kExternalFloat64Array || |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16440 "var expected_results = [0, 10, 0, -10];"; | 16440 "var expected_results = [0, 10, 0, -10];"; |
16441 const char* pixel_data = | 16441 const char* pixel_data = |
16442 "var source_data = [0.6, 10.6];" | 16442 "var source_data = [0.6, 10.6];" |
16443 "var expected_results = [1, 11];"; | 16443 "var expected_results = [1, 11];"; |
16444 bool is_unsigned = | 16444 bool is_unsigned = |
16445 (array_type == v8::kExternalUint8Array || | 16445 (array_type == v8::kExternalUint8Array || |
16446 array_type == v8::kExternalUint16Array || | 16446 array_type == v8::kExternalUint16Array || |
16447 array_type == v8::kExternalUint32Array); | 16447 array_type == v8::kExternalUint32Array); |
16448 bool is_pixel_data = array_type == v8::kExternalUint8ClampedArray; | 16448 bool is_pixel_data = array_type == v8::kExternalUint8ClampedArray; |
16449 | 16449 |
16450 i::OS::SNPrintF(test_buf, | 16450 i::SNPrintF(test_buf, |
16451 "%s" | 16451 "%s" |
16452 "var all_passed = true;" | 16452 "var all_passed = true;" |
16453 "for (var i = 0; i < source_data.length; i++) {" | 16453 "for (var i = 0; i < source_data.length; i++) {" |
16454 " for (var j = 0; j < 8; j++) {" | 16454 " for (var j = 0; j < 8; j++) {" |
16455 " ext_array[j] = source_data[i];" | 16455 " ext_array[j] = source_data[i];" |
16456 " }" | 16456 " }" |
16457 " all_passed = all_passed &&" | 16457 " all_passed = all_passed &&" |
16458 " (ext_array[5] == expected_results[i]);" | 16458 " (ext_array[5] == expected_results[i]);" |
16459 "}" | 16459 "}" |
16460 "all_passed;", | 16460 "all_passed;", |
16461 (is_unsigned ? | 16461 (is_unsigned ? |
16462 unsigned_data : | 16462 unsigned_data : |
16463 (is_pixel_data ? pixel_data : signed_data))); | 16463 (is_pixel_data ? pixel_data : signed_data))); |
16464 result = CompileRun(test_buf.start()); | 16464 result = CompileRun(test_buf.start()); |
16465 CHECK_EQ(true, result->BooleanValue()); | 16465 CHECK_EQ(true, result->BooleanValue()); |
16466 } | 16466 } |
16467 | 16467 |
16468 i::Handle<ExternalArrayClass> array( | 16468 i::Handle<ExternalArrayClass> array( |
16469 ExternalArrayClass::cast(jsobj->elements())); | 16469 ExternalArrayClass::cast(jsobj->elements())); |
16470 for (int i = 0; i < element_count; i++) { | 16470 for (int i = 0; i < element_count; i++) { |
16471 array->set(i, static_cast<ElementType>(i)); | 16471 array->set(i, static_cast<ElementType>(i)); |
16472 } | 16472 } |
16473 | 16473 |
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17534 "}\n" | 17534 "}\n" |
17535 "function foo() {\n" | 17535 "function foo() {\n" |
17536 "\n" | 17536 "\n" |
17537 " bar();\n" | 17537 " bar();\n" |
17538 "}\n" | 17538 "}\n" |
17539 "foo();\n" | 17539 "foo();\n" |
17540 "}\n" | 17540 "}\n" |
17541 "eval('(' + outer +')()%s');"; | 17541 "eval('(' + outer +')()%s');"; |
17542 | 17542 |
17543 i::ScopedVector<char> code(1024); | 17543 i::ScopedVector<char> code(1024); |
17544 i::OS::SNPrintF(code, source, "//# sourceURL=eval_url"); | 17544 i::SNPrintF(code, source, "//# sourceURL=eval_url"); |
17545 CHECK(CompileRun(code.start())->IsUndefined()); | 17545 CHECK(CompileRun(code.start())->IsUndefined()); |
17546 i::OS::SNPrintF(code, source, "//@ sourceURL=eval_url"); | 17546 i::SNPrintF(code, source, "//@ sourceURL=eval_url"); |
17547 CHECK(CompileRun(code.start())->IsUndefined()); | 17547 CHECK(CompileRun(code.start())->IsUndefined()); |
17548 } | 17548 } |
17549 | 17549 |
17550 | 17550 |
17551 static int scriptIdInStack[2]; | 17551 static int scriptIdInStack[2]; |
17552 | 17552 |
17553 void AnalyzeScriptIdInStack( | 17553 void AnalyzeScriptIdInStack( |
17554 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17554 const v8::FunctionCallbackInfo<v8::Value>& args) { |
17555 v8::HandleScope scope(args.GetIsolate()); | 17555 v8::HandleScope scope(args.GetIsolate()); |
17556 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 17556 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17617 "}\n" | 17617 "}\n" |
17618 "function foo() {\n" | 17618 "function foo() {\n" |
17619 "\n" | 17619 "\n" |
17620 " bar();\n" | 17620 " bar();\n" |
17621 "}\n" | 17621 "}\n" |
17622 "foo();\n" | 17622 "foo();\n" |
17623 "}\n" | 17623 "}\n" |
17624 "outer()\n%s"; | 17624 "outer()\n%s"; |
17625 | 17625 |
17626 i::ScopedVector<char> code(1024); | 17626 i::ScopedVector<char> code(1024); |
17627 i::OS::SNPrintF(code, source, "//# sourceURL=source_url"); | 17627 i::SNPrintF(code, source, "//# sourceURL=source_url"); |
17628 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); | 17628 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); |
17629 i::OS::SNPrintF(code, source, "//@ sourceURL=source_url"); | 17629 i::SNPrintF(code, source, "//@ sourceURL=source_url"); |
17630 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); | 17630 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); |
17631 } | 17631 } |
17632 | 17632 |
17633 | 17633 |
17634 void AnalyzeStackOfDynamicScriptWithSourceURL( | 17634 void AnalyzeStackOfDynamicScriptWithSourceURL( |
17635 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17635 const v8::FunctionCallbackInfo<v8::Value>& args) { |
17636 v8::HandleScope scope(args.GetIsolate()); | 17636 v8::HandleScope scope(args.GetIsolate()); |
17637 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 17637 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
17638 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 17638 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
17639 CHECK_EQ(4, stackTrace->GetFrameCount()); | 17639 CHECK_EQ(4, stackTrace->GetFrameCount()); |
(...skipping 23 matching lines...) Expand all Loading... |
17663 "}\n" | 17663 "}\n" |
17664 "function foo() {\n" | 17664 "function foo() {\n" |
17665 "\n" | 17665 "\n" |
17666 " bar();\n" | 17666 " bar();\n" |
17667 "}\n" | 17667 "}\n" |
17668 "foo();\n" | 17668 "foo();\n" |
17669 "}\n" | 17669 "}\n" |
17670 "outer()\n%s"; | 17670 "outer()\n%s"; |
17671 | 17671 |
17672 i::ScopedVector<char> code(1024); | 17672 i::ScopedVector<char> code(1024); |
17673 i::OS::SNPrintF(code, source, "//# sourceURL=source_url"); | 17673 i::SNPrintF(code, source, "//# sourceURL=source_url"); |
17674 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined()); | 17674 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined()); |
17675 i::OS::SNPrintF(code, source, "//@ sourceURL=source_url"); | 17675 i::SNPrintF(code, source, "//@ sourceURL=source_url"); |
17676 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined()); | 17676 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 0)->IsUndefined()); |
17677 } | 17677 } |
17678 | 17678 |
17679 | 17679 |
17680 TEST(DynamicWithSourceURLInStackTraceString) { | 17680 TEST(DynamicWithSourceURLInStackTraceString) { |
17681 LocalContext context; | 17681 LocalContext context; |
17682 v8::HandleScope scope(context->GetIsolate()); | 17682 v8::HandleScope scope(context->GetIsolate()); |
17683 | 17683 |
17684 const char *source = | 17684 const char *source = |
17685 "function outer() {\n" | 17685 "function outer() {\n" |
17686 " function foo() {\n" | 17686 " function foo() {\n" |
17687 " FAIL.FAIL;\n" | 17687 " FAIL.FAIL;\n" |
17688 " }\n" | 17688 " }\n" |
17689 " foo();\n" | 17689 " foo();\n" |
17690 "}\n" | 17690 "}\n" |
17691 "outer()\n%s"; | 17691 "outer()\n%s"; |
17692 | 17692 |
17693 i::ScopedVector<char> code(1024); | 17693 i::ScopedVector<char> code(1024); |
17694 i::OS::SNPrintF(code, source, "//# sourceURL=source_url"); | 17694 i::SNPrintF(code, source, "//# sourceURL=source_url"); |
17695 v8::TryCatch try_catch; | 17695 v8::TryCatch try_catch; |
17696 CompileRunWithOrigin(code.start(), "", 0, 0); | 17696 CompileRunWithOrigin(code.start(), "", 0, 0); |
17697 CHECK(try_catch.HasCaught()); | 17697 CHECK(try_catch.HasCaught()); |
17698 v8::String::Utf8Value stack(try_catch.StackTrace()); | 17698 v8::String::Utf8Value stack(try_catch.StackTrace()); |
17699 CHECK(strstr(*stack, "at foo (source_url:3:5)") != NULL); | 17699 CHECK(strstr(*stack, "at foo (source_url:3:5)") != NULL); |
17700 } | 17700 } |
17701 | 17701 |
17702 | 17702 |
17703 static void CreateGarbageInOldSpace() { | 17703 static void CreateGarbageInOldSpace() { |
17704 i::Factory* factory = CcTest::i_isolate()->factory(); | 17704 i::Factory* factory = CcTest::i_isolate()->factory(); |
(...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19422 ExpectTrue("function f() { return isDefaultIsolate; }; f()"); | 19422 ExpectTrue("function f() { return isDefaultIsolate; }; f()"); |
19423 } | 19423 } |
19424 } | 19424 } |
19425 | 19425 |
19426 | 19426 |
19427 static int CalcFibonacci(v8::Isolate* isolate, int limit) { | 19427 static int CalcFibonacci(v8::Isolate* isolate, int limit) { |
19428 v8::Isolate::Scope isolate_scope(isolate); | 19428 v8::Isolate::Scope isolate_scope(isolate); |
19429 v8::HandleScope scope(isolate); | 19429 v8::HandleScope scope(isolate); |
19430 LocalContext context(isolate); | 19430 LocalContext context(isolate); |
19431 i::ScopedVector<char> code(1024); | 19431 i::ScopedVector<char> code(1024); |
19432 i::OS::SNPrintF(code, "function fib(n) {" | 19432 i::SNPrintF(code, "function fib(n) {" |
19433 " if (n <= 2) return 1;" | 19433 " if (n <= 2) return 1;" |
19434 " return fib(n-1) + fib(n-2);" | 19434 " return fib(n-1) + fib(n-2);" |
19435 "}" | 19435 "}" |
19436 "fib(%d)", limit); | 19436 "fib(%d)", limit); |
19437 Local<Value> value = CompileRun(code.start()); | 19437 Local<Value> value = CompileRun(code.start()); |
19438 CHECK(value->IsNumber()); | 19438 CHECK(value->IsNumber()); |
19439 return static_cast<int>(value->NumberValue()); | 19439 return static_cast<int>(value->NumberValue()); |
19440 } | 19440 } |
19441 | 19441 |
19442 class IsolateThread : public v8::internal::Thread { | 19442 class IsolateThread : public v8::internal::Thread { |
19443 public: | 19443 public: |
19444 IsolateThread(v8::Isolate* isolate, int fib_limit) | 19444 IsolateThread(v8::Isolate* isolate, int fib_limit) |
19445 : Thread("IsolateThread"), | 19445 : Thread("IsolateThread"), |
19446 isolate_(isolate), | 19446 isolate_(isolate), |
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20633 } | 20633 } |
20634 | 20634 |
20635 | 20635 |
20636 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { | 20636 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { |
20637 int32_t level = args[0]->Int32Value(); | 20637 int32_t level = args[0]->Int32Value(); |
20638 if (level < 3) { | 20638 if (level < 3) { |
20639 level++; | 20639 level++; |
20640 i::OS::Print("Entering recursion level %d.\n", level); | 20640 i::OS::Print("Entering recursion level %d.\n", level); |
20641 char script[64]; | 20641 char script[64]; |
20642 i::Vector<char> script_vector(script, sizeof(script)); | 20642 i::Vector<char> script_vector(script, sizeof(script)); |
20643 i::OS::SNPrintF(script_vector, "recursion(%d)", level); | 20643 i::SNPrintF(script_vector, "recursion(%d)", level); |
20644 CompileRun(script_vector.start()); | 20644 CompileRun(script_vector.start()); |
20645 i::OS::Print("Leaving recursion level %d.\n", level); | 20645 i::OS::Print("Leaving recursion level %d.\n", level); |
20646 CHECK_EQ(0, callback_fired); | 20646 CHECK_EQ(0, callback_fired); |
20647 } else { | 20647 } else { |
20648 i::OS::Print("Recursion ends.\n"); | 20648 i::OS::Print("Recursion ends.\n"); |
20649 CHECK_EQ(0, callback_fired); | 20649 CHECK_EQ(0, callback_fired); |
20650 } | 20650 } |
20651 } | 20651 } |
20652 | 20652 |
20653 | 20653 |
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21699 } | 21699 } |
21700 | 21700 |
21701 | 21701 |
21702 void CheckCorrectThrow(const char* script) { | 21702 void CheckCorrectThrow(const char* script) { |
21703 // Test that the script, when wrapped into a try-catch, triggers the catch | 21703 // Test that the script, when wrapped into a try-catch, triggers the catch |
21704 // clause due to failed access check throwing an exception. | 21704 // clause due to failed access check throwing an exception. |
21705 // The subsequent try-catch should run without any exception. | 21705 // The subsequent try-catch should run without any exception. |
21706 access_check_fail_thrown = false; | 21706 access_check_fail_thrown = false; |
21707 catch_callback_called = false; | 21707 catch_callback_called = false; |
21708 i::ScopedVector<char> source(1024); | 21708 i::ScopedVector<char> source(1024); |
21709 i::OS::SNPrintF(source, "try { %s; } catch (e) { catcher(e); }", script); | 21709 i::SNPrintF(source, "try { %s; } catch (e) { catcher(e); }", script); |
21710 CompileRun(source.start()); | 21710 CompileRun(source.start()); |
21711 CHECK(access_check_fail_thrown); | 21711 CHECK(access_check_fail_thrown); |
21712 CHECK(catch_callback_called); | 21712 CHECK(catch_callback_called); |
21713 | 21713 |
21714 access_check_fail_thrown = false; | 21714 access_check_fail_thrown = false; |
21715 catch_callback_called = false; | 21715 catch_callback_called = false; |
21716 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };"); | 21716 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };"); |
21717 CHECK(!access_check_fail_thrown); | 21717 CHECK(!access_check_fail_thrown); |
21718 CHECK(!catch_callback_called); | 21718 CHECK(!catch_callback_called); |
21719 } | 21719 } |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22413 receiver = Local<Object>::Cast(CompileRun( | 22413 receiver = Local<Object>::Cast(CompileRun( |
22414 "var receiver_subclass = function_receiver;\n" | 22414 "var receiver_subclass = function_receiver;\n" |
22415 "receiver_subclass")); | 22415 "receiver_subclass")); |
22416 } | 22416 } |
22417 } | 22417 } |
22418 // With no signature, the holder is not set. | 22418 // With no signature, the holder is not set. |
22419 if (signature_type == kNoSignature) holder = receiver; | 22419 if (signature_type == kNoSignature) holder = receiver; |
22420 // build wrap_function | 22420 // build wrap_function |
22421 i::ScopedVector<char> wrap_function(200); | 22421 i::ScopedVector<char> wrap_function(200); |
22422 if (global) { | 22422 if (global) { |
22423 i::OS::SNPrintF( | 22423 i::SNPrintF( |
22424 wrap_function, | 22424 wrap_function, |
22425 "function wrap_f_%d() { var f = g_f; return f(); }\n" | 22425 "function wrap_f_%d() { var f = g_f; return f(); }\n" |
22426 "function wrap_get_%d() { return this.g_acc; }\n" | 22426 "function wrap_get_%d() { return this.g_acc; }\n" |
22427 "function wrap_set_%d() { return this.g_acc = 1; }\n", | 22427 "function wrap_set_%d() { return this.g_acc = 1; }\n", |
22428 key, key, key); | 22428 key, key, key); |
22429 } else { | 22429 } else { |
22430 i::OS::SNPrintF( | 22430 i::SNPrintF( |
22431 wrap_function, | 22431 wrap_function, |
22432 "function wrap_f_%d() { return receiver_subclass.f(); }\n" | 22432 "function wrap_f_%d() { return receiver_subclass.f(); }\n" |
22433 "function wrap_get_%d() { return receiver_subclass.acc; }\n" | 22433 "function wrap_get_%d() { return receiver_subclass.acc; }\n" |
22434 "function wrap_set_%d() { return receiver_subclass.acc = 1; }\n", | 22434 "function wrap_set_%d() { return receiver_subclass.acc = 1; }\n", |
22435 key, key, key); | 22435 key, key, key); |
22436 } | 22436 } |
22437 // build source string | 22437 // build source string |
22438 i::ScopedVector<char> source(1000); | 22438 i::ScopedVector<char> source(1000); |
22439 i::OS::SNPrintF( | 22439 i::SNPrintF( |
22440 source, | 22440 source, |
22441 "%s\n" // wrap functions | 22441 "%s\n" // wrap functions |
22442 "function wrap_f() { return wrap_f_%d(); }\n" | 22442 "function wrap_f() { return wrap_f_%d(); }\n" |
22443 "function wrap_get() { return wrap_get_%d(); }\n" | 22443 "function wrap_get() { return wrap_get_%d(); }\n" |
22444 "function wrap_set() { return wrap_set_%d(); }\n" | 22444 "function wrap_set() { return wrap_set_%d(); }\n" |
22445 "check = function(returned) {\n" | 22445 "check = function(returned) {\n" |
22446 " if (returned !== 'returned') { throw returned; }\n" | 22446 " if (returned !== 'returned') { throw returned; }\n" |
22447 "}\n" | 22447 "}\n" |
22448 "\n" | 22448 "\n" |
22449 "check(wrap_f());\n" | 22449 "check(wrap_f());\n" |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22799 call_eval_context = v8::Context::New(isolate); | 22799 call_eval_context = v8::Context::New(isolate); |
22800 v8::Context::Scope scope(call_eval_context); | 22800 v8::Context::Scope scope(call_eval_context); |
22801 call_eval_bound_function = | 22801 call_eval_bound_function = |
22802 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); | 22802 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); |
22803 } | 22803 } |
22804 env->Global()->Set(v8_str("CallEval"), | 22804 env->Global()->Set(v8_str("CallEval"), |
22805 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); | 22805 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); |
22806 Local<Value> result = CompileRun("CallEval();"); | 22806 Local<Value> result = CompileRun("CallEval();"); |
22807 CHECK_EQ(result, v8::Integer::New(isolate, 1)); | 22807 CHECK_EQ(result, v8::Integer::New(isolate, 1)); |
22808 } | 22808 } |
OLD | NEW |