Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: src/api.cc

Issue 2028983002: Introduce IsUndefined(Isolate*) and IsTheHole(Isolate*) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase master Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/accessors.cc ('k') | src/api-arguments.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api.h" 5 #include "src/api.h"
6 6
7 #include <string.h> // For memcpy, strlen. 7 #include <string.h> // For memcpy, strlen.
8 #ifdef V8_USE_ADDRESS_SANITIZER 8 #ifdef V8_USE_ADDRESS_SANITIZER
9 #include <sanitizer/asan_interface.h> 9 #include <sanitizer/asan_interface.h>
10 #endif // V8_USE_ADDRESS_SANITIZER 10 #endif // V8_USE_ADDRESS_SANITIZER
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 805
806 EscapableHandleScope::EscapableHandleScope(Isolate* v8_isolate) { 806 EscapableHandleScope::EscapableHandleScope(Isolate* v8_isolate) {
807 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); 807 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
808 escape_slot_ = CreateHandle(isolate, isolate->heap()->the_hole_value()); 808 escape_slot_ = CreateHandle(isolate, isolate->heap()->the_hole_value());
809 Initialize(v8_isolate); 809 Initialize(v8_isolate);
810 } 810 }
811 811
812 812
813 i::Object** EscapableHandleScope::Escape(i::Object** escape_value) { 813 i::Object** EscapableHandleScope::Escape(i::Object** escape_value) {
814 i::Heap* heap = reinterpret_cast<i::Isolate*>(GetIsolate())->heap(); 814 i::Heap* heap = reinterpret_cast<i::Isolate*>(GetIsolate())->heap();
815 Utils::ApiCheck(*escape_slot_ == heap->the_hole_value(), 815 Utils::ApiCheck((*escape_slot_)->IsTheHole(heap->isolate()),
816 "EscapeableHandleScope::Escape", 816 "EscapeableHandleScope::Escape", "Escape value set twice");
817 "Escape value set twice");
818 if (escape_value == NULL) { 817 if (escape_value == NULL) {
819 *escape_slot_ = heap->undefined_value(); 818 *escape_slot_ = heap->undefined_value();
820 return NULL; 819 return NULL;
821 } 820 }
822 *escape_slot_ = *escape_value; 821 *escape_slot_ = *escape_value;
823 return escape_slot_; 822 return escape_slot_;
824 } 823 }
825 824
826 825
827 SealHandleScope::SealHandleScope(Isolate* isolate) { 826 SealHandleScope::SealHandleScope(Isolate* isolate) {
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 1067
1069 static Local<ObjectTemplate> ObjectTemplateNew( 1068 static Local<ObjectTemplate> ObjectTemplateNew(
1070 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor, 1069 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor,
1071 bool do_not_cache); 1070 bool do_not_cache);
1072 1071
1073 Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() { 1072 Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() {
1074 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate(); 1073 i::Isolate* i_isolate = Utils::OpenHandle(this)->GetIsolate();
1075 ENTER_V8(i_isolate); 1074 ENTER_V8(i_isolate);
1076 i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(), 1075 i::Handle<i::Object> result(Utils::OpenHandle(this)->prototype_template(),
1077 i_isolate); 1076 i_isolate);
1078 if (result->IsUndefined()) { 1077 if (result->IsUndefined(i_isolate)) {
1079 // Do not cache prototype objects. 1078 // Do not cache prototype objects.
1080 result = Utils::OpenHandle( 1079 result = Utils::OpenHandle(
1081 *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true)); 1080 *ObjectTemplateNew(i_isolate, Local<FunctionTemplate>(), true));
1082 Utils::OpenHandle(this)->set_prototype_template(*result); 1081 Utils::OpenHandle(this)->set_prototype_template(*result);
1083 } 1082 }
1084 return ToApiHandle<ObjectTemplate>(result); 1083 return ToApiHandle<ObjectTemplate>(result);
1085 } 1084 }
1086 1085
1087 1086
1088 static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info, 1087 static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info,
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 1247
1249 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() { 1248 Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() {
1250 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true); 1249 i::Handle<i::FunctionTemplateInfo> handle = Utils::OpenHandle(this, true);
1251 if (!Utils::ApiCheck(!handle.is_null(), 1250 if (!Utils::ApiCheck(!handle.is_null(),
1252 "v8::FunctionTemplate::InstanceTemplate()", 1251 "v8::FunctionTemplate::InstanceTemplate()",
1253 "Reading from empty handle")) { 1252 "Reading from empty handle")) {
1254 return Local<ObjectTemplate>(); 1253 return Local<ObjectTemplate>();
1255 } 1254 }
1256 i::Isolate* isolate = handle->GetIsolate(); 1255 i::Isolate* isolate = handle->GetIsolate();
1257 ENTER_V8(isolate); 1256 ENTER_V8(isolate);
1258 if (handle->instance_template()->IsUndefined()) { 1257 if (handle->instance_template()->IsUndefined(isolate)) {
1259 Local<ObjectTemplate> templ = 1258 Local<ObjectTemplate> templ =
1260 ObjectTemplate::New(isolate, ToApiHandle<FunctionTemplate>(handle)); 1259 ObjectTemplate::New(isolate, ToApiHandle<FunctionTemplate>(handle));
1261 handle->set_instance_template(*Utils::OpenHandle(*templ)); 1260 handle->set_instance_template(*Utils::OpenHandle(*templ));
1262 } 1261 }
1263 i::Handle<i::ObjectTemplateInfo> result( 1262 i::Handle<i::ObjectTemplateInfo> result(
1264 i::ObjectTemplateInfo::cast(handle->instance_template())); 1263 i::ObjectTemplateInfo::cast(handle->instance_template()));
1265 return Utils::ToLocal(result); 1264 return Utils::ToLocal(result);
1266 } 1265 }
1267 1266
1268 1267
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) { 1361 i::Isolate* isolate, v8::Local<FunctionTemplate> constructor) {
1363 return ObjectTemplateNew(isolate, constructor, false); 1362 return ObjectTemplateNew(isolate, constructor, false);
1364 } 1363 }
1365 1364
1366 // Ensure that the object template has a constructor. If no 1365 // Ensure that the object template has a constructor. If no
1367 // constructor is available we create one. 1366 // constructor is available we create one.
1368 static i::Handle<i::FunctionTemplateInfo> EnsureConstructor( 1367 static i::Handle<i::FunctionTemplateInfo> EnsureConstructor(
1369 i::Isolate* isolate, 1368 i::Isolate* isolate,
1370 ObjectTemplate* object_template) { 1369 ObjectTemplate* object_template) {
1371 i::Object* obj = Utils::OpenHandle(object_template)->constructor(); 1370 i::Object* obj = Utils::OpenHandle(object_template)->constructor();
1372 if (!obj ->IsUndefined()) { 1371 if (!obj->IsUndefined(isolate)) {
1373 i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); 1372 i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj);
1374 return i::Handle<i::FunctionTemplateInfo>(info, isolate); 1373 return i::Handle<i::FunctionTemplateInfo>(info, isolate);
1375 } 1374 }
1376 Local<FunctionTemplate> templ = 1375 Local<FunctionTemplate> templ =
1377 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate)); 1376 FunctionTemplate::New(reinterpret_cast<Isolate*>(isolate));
1378 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); 1377 i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ);
1379 constructor->set_instance_template(*Utils::OpenHandle(object_template)); 1378 constructor->set_instance_template(*Utils::OpenHandle(object_template));
1380 Utils::OpenHandle(object_template)->set_constructor(*constructor); 1379 Utils::OpenHandle(object_template)->set_constructor(*constructor);
1381 return constructor; 1380 return constructor;
1382 } 1381 }
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
2251 // Note that this will not cancel termination exceptions. 2250 // Note that this will not cancel termination exceptions.
2252 isolate_->CancelScheduledExceptionFromTryCatch(this); 2251 isolate_->CancelScheduledExceptionFromTryCatch(this);
2253 } 2252 }
2254 isolate_->UnregisterTryCatchHandler(this); 2253 isolate_->UnregisterTryCatchHandler(this);
2255 v8::internal::SimulatorStack::UnregisterCTryCatch(isolate_); 2254 v8::internal::SimulatorStack::UnregisterCTryCatch(isolate_);
2256 } 2255 }
2257 } 2256 }
2258 2257
2259 2258
2260 bool v8::TryCatch::HasCaught() const { 2259 bool v8::TryCatch::HasCaught() const {
2261 return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(); 2260 return !reinterpret_cast<i::Object*>(exception_)->IsTheHole(isolate_);
2262 } 2261 }
2263 2262
2264 2263
2265 bool v8::TryCatch::CanContinue() const { 2264 bool v8::TryCatch::CanContinue() const {
2266 return can_continue_; 2265 return can_continue_;
2267 } 2266 }
2268 2267
2269 2268
2270 bool v8::TryCatch::HasTerminated() const { 2269 bool v8::TryCatch::HasTerminated() const {
2271 return has_terminated_; 2270 return has_terminated_;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2310 2309
2311 2310
2312 v8::Local<Value> v8::TryCatch::StackTrace() const { 2311 v8::Local<Value> v8::TryCatch::StackTrace() const {
2313 auto context = reinterpret_cast<v8::Isolate*>(isolate_)->GetCurrentContext(); 2312 auto context = reinterpret_cast<v8::Isolate*>(isolate_)->GetCurrentContext();
2314 RETURN_TO_LOCAL_UNCHECKED(StackTrace(context), Value); 2313 RETURN_TO_LOCAL_UNCHECKED(StackTrace(context), Value);
2315 } 2314 }
2316 2315
2317 2316
2318 v8::Local<v8::Message> v8::TryCatch::Message() const { 2317 v8::Local<v8::Message> v8::TryCatch::Message() const {
2319 i::Object* message = reinterpret_cast<i::Object*>(message_obj_); 2318 i::Object* message = reinterpret_cast<i::Object*>(message_obj_);
2320 DCHECK(message->IsJSMessageObject() || message->IsTheHole()); 2319 DCHECK(message->IsJSMessageObject() || message->IsTheHole(isolate_));
2321 if (HasCaught() && !message->IsTheHole()) { 2320 if (HasCaught() && !message->IsTheHole(isolate_)) {
2322 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_)); 2321 return v8::Utils::MessageToLocal(i::Handle<i::Object>(message, isolate_));
2323 } else { 2322 } else {
2324 return v8::Local<v8::Message>(); 2323 return v8::Local<v8::Message>();
2325 } 2324 }
2326 } 2325 }
2327 2326
2328 2327
2329 void v8::TryCatch::Reset() { 2328 void v8::TryCatch::Reset() {
2330 if (!rethrow_ && HasCaught() && isolate_->has_scheduled_exception()) { 2329 if (!rethrow_ && HasCaught() && isolate_->has_scheduled_exception()) {
2331 // If an exception was caught but is still scheduled because no API call 2330 // If an exception was caught but is still scheduled because no API call
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
2680 DCHECK(false); 2679 DCHECK(false);
2681 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 2680 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
2682 } 2681 }
2683 i::Handle<i::ObjectHashTable> table( 2682 i::Handle<i::ObjectHashTable> table(
2684 i::ObjectHashTable::cast(weak_collection->table())); 2683 i::ObjectHashTable::cast(weak_collection->table()));
2685 if (!table->IsKey(*key)) { 2684 if (!table->IsKey(*key)) {
2686 DCHECK(false); 2685 DCHECK(false);
2687 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 2686 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
2688 } 2687 }
2689 i::Handle<i::Object> lookup(table->Lookup(key), isolate); 2688 i::Handle<i::Object> lookup(table->Lookup(key), isolate);
2690 if (lookup->IsTheHole()) 2689 if (lookup->IsTheHole(isolate))
2691 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate)); 2690 return v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
2692 return Utils::ToLocal(lookup); 2691 return Utils::ToLocal(lookup);
2693 } 2692 }
2694 2693
2695 2694
2696 bool NativeWeakMap::Has(Local<Value> v8_key) { 2695 bool NativeWeakMap::Has(Local<Value> v8_key) {
2697 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this); 2696 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this);
2698 i::Isolate* isolate = weak_collection->GetIsolate(); 2697 i::Isolate* isolate = weak_collection->GetIsolate();
2699 ENTER_V8(isolate); 2698 ENTER_V8(isolate);
2700 i::HandleScope scope(isolate); 2699 i::HandleScope scope(isolate);
2701 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); 2700 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key);
2702 if (!key->IsJSReceiver() && !key->IsSymbol()) { 2701 if (!key->IsJSReceiver() && !key->IsSymbol()) {
2703 DCHECK(false); 2702 DCHECK(false);
2704 return false; 2703 return false;
2705 } 2704 }
2706 i::Handle<i::ObjectHashTable> table( 2705 i::Handle<i::ObjectHashTable> table(
2707 i::ObjectHashTable::cast(weak_collection->table())); 2706 i::ObjectHashTable::cast(weak_collection->table()));
2708 if (!table->IsKey(*key)) { 2707 if (!table->IsKey(*key)) {
2709 DCHECK(false); 2708 DCHECK(false);
2710 return false; 2709 return false;
2711 } 2710 }
2712 i::Handle<i::Object> lookup(table->Lookup(key), isolate); 2711 i::Handle<i::Object> lookup(table->Lookup(key), isolate);
2713 return !lookup->IsTheHole(); 2712 return !lookup->IsTheHole(isolate);
2714 } 2713 }
2715 2714
2716 2715
2717 bool NativeWeakMap::Delete(Local<Value> v8_key) { 2716 bool NativeWeakMap::Delete(Local<Value> v8_key) {
2718 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this); 2717 i::Handle<i::JSWeakMap> weak_collection = Utils::OpenHandle(this);
2719 i::Isolate* isolate = weak_collection->GetIsolate(); 2718 i::Isolate* isolate = weak_collection->GetIsolate();
2720 ENTER_V8(isolate); 2719 ENTER_V8(isolate);
2721 i::HandleScope scope(isolate); 2720 i::HandleScope scope(isolate);
2722 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key); 2721 i::Handle<i::Object> key = Utils::OpenHandle(*v8_key);
2723 if (!key->IsJSReceiver() && !key->IsSymbol()) { 2722 if (!key->IsJSReceiver() && !key->IsSymbol()) {
(...skipping 2837 matching lines...) Expand 10 before | Expand all | Expand 10 after
5561 proxy_constructor = EnsureConstructor(isolate, *proxy_template); 5560 proxy_constructor = EnsureConstructor(isolate, *proxy_template);
5562 5561
5563 // Set the global template to be the prototype template of 5562 // Set the global template to be the prototype template of
5564 // global proxy template. 5563 // global proxy template.
5565 proxy_constructor->set_prototype_template( 5564 proxy_constructor->set_prototype_template(
5566 *Utils::OpenHandle(*global_template)); 5565 *Utils::OpenHandle(*global_template));
5567 5566
5568 // Migrate security handlers from global_template to 5567 // Migrate security handlers from global_template to
5569 // proxy_template. Temporarily removing access check 5568 // proxy_template. Temporarily removing access check
5570 // information from the global template. 5569 // information from the global template.
5571 if (!global_constructor->access_check_info()->IsUndefined()) { 5570 if (!global_constructor->access_check_info()->IsUndefined(isolate)) {
5572 proxy_constructor->set_access_check_info( 5571 proxy_constructor->set_access_check_info(
5573 global_constructor->access_check_info()); 5572 global_constructor->access_check_info());
5574 proxy_constructor->set_needs_access_check( 5573 proxy_constructor->set_needs_access_check(
5575 global_constructor->needs_access_check()); 5574 global_constructor->needs_access_check());
5576 global_constructor->set_needs_access_check(false); 5575 global_constructor->set_needs_access_check(false);
5577 global_constructor->set_access_check_info( 5576 global_constructor->set_access_check_info(
5578 isolate->heap()->undefined_value()); 5577 isolate->heap()->undefined_value());
5579 } 5578 }
5580 } 5579 }
5581 5580
(...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after
6935 i::Handle<i::String> name, 6934 i::Handle<i::String> name,
6936 i::Handle<i::String> part, 6935 i::Handle<i::String> part,
6937 bool private_symbol) { 6936 bool private_symbol) {
6938 i::Handle<i::JSObject> registry = isolate->GetSymbolRegistry(); 6937 i::Handle<i::JSObject> registry = isolate->GetSymbolRegistry();
6939 i::Handle<i::JSObject> symbols = 6938 i::Handle<i::JSObject> symbols =
6940 i::Handle<i::JSObject>::cast( 6939 i::Handle<i::JSObject>::cast(
6941 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked()); 6940 i::Object::GetPropertyOrElement(registry, part).ToHandleChecked());
6942 i::Handle<i::Object> symbol = 6941 i::Handle<i::Object> symbol =
6943 i::Object::GetPropertyOrElement(symbols, name).ToHandleChecked(); 6942 i::Object::GetPropertyOrElement(symbols, name).ToHandleChecked();
6944 if (!symbol->IsSymbol()) { 6943 if (!symbol->IsSymbol()) {
6945 DCHECK(symbol->IsUndefined()); 6944 DCHECK(symbol->IsUndefined(isolate));
6946 if (private_symbol) 6945 if (private_symbol)
6947 symbol = isolate->factory()->NewPrivateSymbol(); 6946 symbol = isolate->factory()->NewPrivateSymbol();
6948 else 6947 else
6949 symbol = isolate->factory()->NewSymbol(); 6948 symbol = isolate->factory()->NewSymbol();
6950 i::Handle<i::Symbol>::cast(symbol)->set_name(*name); 6949 i::Handle<i::Symbol>::cast(symbol)->set_name(*name);
6951 i::Object::SetPropertyOrElement(symbols, name, symbol, i::STRICT).Assert(); 6950 i::Object::SetPropertyOrElement(symbols, name, symbol, i::STRICT).Assert();
6952 } 6951 }
6953 return i::Handle<i::Symbol>::cast(symbol); 6952 return i::Handle<i::Symbol>::cast(symbol);
6954 } 6953 }
6955 6954
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after
7755 return true; 7754 return true;
7756 } 7755 }
7757 7756
7758 7757
7759 void Isolate::RemoveMessageListeners(MessageCallback that) { 7758 void Isolate::RemoveMessageListeners(MessageCallback that) {
7760 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this); 7759 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(this);
7761 ENTER_V8(isolate); 7760 ENTER_V8(isolate);
7762 i::HandleScope scope(isolate); 7761 i::HandleScope scope(isolate);
7763 NeanderArray listeners(isolate->factory()->message_listeners()); 7762 NeanderArray listeners(isolate->factory()->message_listeners());
7764 for (int i = 0; i < listeners.length(); i++) { 7763 for (int i = 0; i < listeners.length(); i++) {
7765 if (listeners.get(i)->IsUndefined()) continue; // skip deleted ones 7764 if (listeners.get(i)->IsUndefined(isolate)) continue; // skip deleted ones
7766 7765
7767 NeanderObject listener(i::JSObject::cast(listeners.get(i))); 7766 NeanderObject listener(i::JSObject::cast(listeners.get(i)));
7768 i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0))); 7767 i::Handle<i::Foreign> callback_obj(i::Foreign::cast(listener.get(0)));
7769 if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) { 7768 if (callback_obj->foreign_address() == FUNCTION_ADDR(that)) {
7770 listeners.set(i, isolate->heap()->undefined_value()); 7769 listeners.set(i, isolate->heap()->undefined_value());
7771 } 7770 }
7772 } 7771 }
7773 } 7772 }
7774 7773
7775 7774
(...skipping 1041 matching lines...) Expand 10 before | Expand all | Expand 10 after
8817 Address callback_address = 8816 Address callback_address =
8818 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); 8817 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback));
8819 VMState<EXTERNAL> state(isolate); 8818 VMState<EXTERNAL> state(isolate);
8820 ExternalCallbackScope call_scope(isolate, callback_address); 8819 ExternalCallbackScope call_scope(isolate, callback_address);
8821 callback(info); 8820 callback(info);
8822 } 8821 }
8823 8822
8824 8823
8825 } // namespace internal 8824 } // namespace internal
8826 } // namespace v8 8825 } // namespace v8
OLDNEW
« no previous file with comments | « src/accessors.cc ('k') | src/api-arguments.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698