Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 6728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6739 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 6739 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); |
| 6740 templ->SetClassName(v8_str("Fun")); | 6740 templ->SetClassName(v8_str("Fun")); |
| 6741 Local<Function> cons = templ->GetFunction(); | 6741 Local<Function> cons = templ->GetFunction(); |
| 6742 context->Global()->Set(v8_str("Fun"), cons); | 6742 context->Global()->Set(v8_str("Fun"), cons); |
| 6743 Local<v8::Object> inst = cons->NewInstance(); | 6743 Local<v8::Object> inst = cons->NewInstance(); |
| 6744 i::Handle<i::JSObject> obj = v8::Utils::OpenHandle(*inst); | 6744 i::Handle<i::JSObject> obj = v8::Utils::OpenHandle(*inst); |
| 6745 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); | 6745 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); |
| 6746 CHECK(value->BooleanValue()); | 6746 CHECK(value->BooleanValue()); |
| 6747 } | 6747 } |
| 6748 | 6748 |
| 6749 | |
| 6750 static Handle<Value> ConstructorCallback(const Arguments& args) { | |
| 6751 ApiTestFuzzer::Fuzz(); | |
| 6752 if (args[0]->IsInt32()) { | |
|
Mads Ager (chromium)
2011/05/05 09:03:33
Add a test where the input is a string, undefined,
| |
| 6753 Local<Object> This; | |
| 6754 | |
| 6755 if (args.IsConstructCall()) { | |
| 6756 Local<Object> Holder = args.Holder(); | |
| 6757 This = Object::New(); | |
| 6758 Local<Value> proto = Holder->GetPrototype(); | |
| 6759 if (proto->IsObject()) { | |
| 6760 This->SetPrototype(proto); | |
| 6761 } | |
| 6762 } else { | |
| 6763 This = args.This(); | |
| 6764 } | |
| 6765 | |
| 6766 This->Set(v8_str("a"), v8_num(args[0]->Int32Value())); | |
| 6767 return This; | |
| 6768 } | |
| 6769 | |
| 6770 return args[0]; | |
| 6771 } | |
| 6772 | |
| 6773 | |
| 6774 THREADED_TEST(ConstructorForObject) { | |
| 6775 v8::HandleScope handle_scope; | |
| 6776 LocalContext context; | |
| 6777 | |
| 6778 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); | |
| 6779 instance_template->SetCallAsFunctionHandler(ConstructorCallback); | |
| 6780 Local<Object> instance = instance_template->NewInstance(); | |
| 6781 context->Global()->Set(v8_str("obj"), instance); | |
| 6782 v8::TryCatch try_catch; | |
| 6783 Local<Value> value; | |
| 6784 CHECK(!try_catch.HasCaught()); | |
| 6785 | |
| 6786 value = CompileRun("(function() { var o = new obj(28); return o.a; })()"); | |
| 6787 CHECK(!try_catch.HasCaught()); | |
| 6788 CHECK_EQ(28, value->Int32Value()); | |
| 6789 | |
| 6790 Local<Value> args[] = { v8_num(29) }; | |
| 6791 Local<Object> object = instance->CallAsConstructor(1, args); | |
| 6792 Local<Value> value2 = object->Get(v8_str("a")); | |
| 6793 CHECK(!try_catch.HasCaught()); | |
| 6794 CHECK_EQ(29, value2->Int32Value()); | |
| 6795 } | |
| 6796 | |
| 6797 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); | |
| 6798 Local<Object> instance = instance_template->NewInstance(); | |
| 6799 context->Global()->Set(v8_str("obj2"), instance); | |
| 6800 v8::TryCatch try_catch; | |
| 6801 Local<Value> value; | |
| 6802 CHECK(!try_catch.HasCaught()); | |
| 6803 | |
| 6804 value = CompileRun("new obj2(28)"); | |
| 6805 CHECK(try_catch.HasCaught()); | |
| 6806 String::AsciiValue exception_value1(try_catch.Exception()); | |
| 6807 CHECK_EQ("TypeError: object is not a function", *exception_value1); | |
| 6808 try_catch.Reset(); | |
| 6809 | |
| 6810 Local<Value> args[] = { v8_num(29) }; | |
| 6811 Local<Object> object = instance->CallAsConstructor(1, args); | |
| 6812 CHECK(try_catch.HasCaught()); | |
| 6813 String::AsciiValue exception_value2(try_catch.Exception()); | |
| 6814 CHECK_EQ("TypeError: #<Object> is not a function", *exception_value2); | |
| 6815 try_catch.Reset(); | |
| 6816 } | |
| 6817 | |
| 6818 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); | |
| 6819 instance_template->SetCallAsFunctionHandler(ThrowValue); | |
| 6820 Local<Object> instance = instance_template->NewInstance(); | |
| 6821 context->Global()->Set(v8_str("obj3"), instance); | |
| 6822 v8::TryCatch try_catch; | |
| 6823 Local<Value> value; | |
| 6824 CHECK(!try_catch.HasCaught()); | |
| 6825 | |
| 6826 value = CompileRun("new obj3(22)"); | |
| 6827 CHECK(try_catch.HasCaught()); | |
| 6828 String::AsciiValue exception_value1(try_catch.Exception()); | |
| 6829 CHECK_EQ(*exception_value1, "22"); | |
| 6830 try_catch.Reset(); | |
| 6831 | |
| 6832 Local<Value> args[] = { v8_num(23) }; | |
| 6833 Local<Object> object = instance->CallAsConstructor(1, args); | |
| 6834 CHECK(try_catch.HasCaught()); | |
| 6835 String::AsciiValue exception_value2(try_catch.Exception()); | |
| 6836 CHECK_EQ(*exception_value2, "23"); | |
| 6837 try_catch.Reset(); | |
| 6838 } | |
| 6839 } | |
| 6840 | |
| 6841 | |
| 6749 THREADED_TEST(FunctionDescriptorException) { | 6842 THREADED_TEST(FunctionDescriptorException) { |
| 6750 v8::HandleScope handle_scope; | 6843 v8::HandleScope handle_scope; |
| 6751 LocalContext context; | 6844 LocalContext context; |
| 6752 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 6845 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); |
| 6753 templ->SetClassName(v8_str("Fun")); | 6846 templ->SetClassName(v8_str("Fun")); |
| 6754 Local<Function> cons = templ->GetFunction(); | 6847 Local<Function> cons = templ->GetFunction(); |
| 6755 context->Global()->Set(v8_str("Fun"), cons); | 6848 context->Global()->Set(v8_str("Fun"), cons); |
| 6756 Local<Value> value = CompileRun( | 6849 Local<Value> value = CompileRun( |
| 6757 "function test() {" | 6850 "function test() {" |
| 6758 " try {" | 6851 " try {" |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7021 context->Global()->Set(v8_str("obj2"), instance); | 7114 context->Global()->Set(v8_str("obj2"), instance); |
| 7022 v8::TryCatch try_catch; | 7115 v8::TryCatch try_catch; |
| 7023 Local<Value> value; | 7116 Local<Value> value; |
| 7024 CHECK(!try_catch.HasCaught()); | 7117 CHECK(!try_catch.HasCaught()); |
| 7025 | 7118 |
| 7026 // Call an object without call-as-function handler through the JS | 7119 // Call an object without call-as-function handler through the JS |
| 7027 value = CompileRun("obj2(28)"); | 7120 value = CompileRun("obj2(28)"); |
| 7028 CHECK(value.IsEmpty()); | 7121 CHECK(value.IsEmpty()); |
| 7029 CHECK(try_catch.HasCaught()); | 7122 CHECK(try_catch.HasCaught()); |
| 7030 String::AsciiValue exception_value1(try_catch.Exception()); | 7123 String::AsciiValue exception_value1(try_catch.Exception()); |
| 7031 CHECK_EQ(*exception_value1, | 7124 CHECK_EQ("TypeError: Property 'obj2' of object #<Object> is not a function", |
| 7032 "TypeError: Property 'obj2' of object " | 7125 *exception_value1); |
| 7033 "#<Object> is not a function"); | |
| 7034 try_catch.Reset(); | 7126 try_catch.Reset(); |
| 7035 | 7127 |
| 7036 // Call an object without call-as-function handler through the API | 7128 // Call an object without call-as-function handler through the API |
| 7037 value = CompileRun("obj2(28)"); | 7129 value = CompileRun("obj2(28)"); |
| 7038 v8::Handle<Value> args[] = { v8_num(28) }; | 7130 v8::Handle<Value> args[] = { v8_num(28) }; |
| 7039 value = instance->CallAsFunction(instance, 1, args); | 7131 value = instance->CallAsFunction(instance, 1, args); |
| 7040 CHECK(value.IsEmpty()); | 7132 CHECK(value.IsEmpty()); |
| 7041 CHECK(try_catch.HasCaught()); | 7133 CHECK(try_catch.HasCaught()); |
| 7042 String::AsciiValue exception_value2(try_catch.Exception()); | 7134 String::AsciiValue exception_value2(try_catch.Exception()); |
| 7043 CHECK_EQ(*exception_value2, "TypeError: [object Object] is not a function"); | 7135 CHECK_EQ("TypeError: [object Object] is not a function", *exception_value2); |
| 7044 try_catch.Reset(); | 7136 try_catch.Reset(); |
| 7045 } | 7137 } |
| 7046 | 7138 |
| 7047 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 7139 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); |
| 7048 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 7140 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
| 7049 instance_template->SetCallAsFunctionHandler(ThrowValue); | 7141 instance_template->SetCallAsFunctionHandler(ThrowValue); |
| 7050 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 7142 Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
| 7051 context->Global()->Set(v8_str("obj3"), instance); | 7143 context->Global()->Set(v8_str("obj3"), instance); |
| 7052 v8::TryCatch try_catch; | 7144 v8::TryCatch try_catch; |
| 7053 Local<Value> value; | 7145 Local<Value> value; |
| (...skipping 7104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 14158 | 14250 |
| 14159 // Disallow but setting a global callback that will allow the calls. | 14251 // Disallow but setting a global callback that will allow the calls. |
| 14160 context->AllowCodeGenerationFromStrings(false); | 14252 context->AllowCodeGenerationFromStrings(false); |
| 14161 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationAllowed); | 14253 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationAllowed); |
| 14162 CheckCodeGenerationAllowed(); | 14254 CheckCodeGenerationAllowed(); |
| 14163 | 14255 |
| 14164 // Set a callback that disallows the code generation. | 14256 // Set a callback that disallows the code generation. |
| 14165 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); | 14257 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); |
| 14166 CheckCodeGenerationDisallowed(); | 14258 CheckCodeGenerationDisallowed(); |
| 14167 } | 14259 } |
| OLD | NEW |