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

Side by Side Diff: src/bootstrapper.cc

Issue 1316933002: [es6] Initial steps towards a correct implementation of IsCallable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: ia32, arm and arm64 ports. Misc cleanups. Created 5 years, 3 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/array.js ('k') | src/builtins.cc » ('j') | src/execution.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/bootstrapper.h" 5 #include "src/bootstrapper.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/base/utils/random-number-generator.h" 9 #include "src/base/utils/random-number-generator.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 prototype, ro_attribs); 460 prototype, ro_attribs);
461 map->AppendDescriptor(&d); 461 map->AppendDescriptor(&d);
462 } 462 }
463 } 463 }
464 464
465 465
466 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) { 466 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) {
467 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 467 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
468 SetFunctionInstanceDescriptor(map, function_mode); 468 SetFunctionInstanceDescriptor(map, function_mode);
469 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); 469 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode));
470 map->set_is_callable();
470 return map; 471 return map;
471 } 472 }
472 473
473 474
474 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { 475 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
475 // Allocate the map for function instances. Maps are allocated first and their 476 // Allocate the map for function instances. Maps are allocated first and their
476 // prototypes patched later, once empty function is created. 477 // prototypes patched later, once empty function is created.
477 478
478 // Functions with this map will not have a 'prototype' property, and 479 // Functions with this map will not have a 'prototype' property, and
479 // can not be used as constructors. 480 // can not be used as constructors.
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 } 700 }
700 return strict_poison_function_; 701 return strict_poison_function_;
701 } 702 }
702 703
703 704
704 Handle<Map> Genesis::CreateStrictFunctionMap( 705 Handle<Map> Genesis::CreateStrictFunctionMap(
705 FunctionMode function_mode, Handle<JSFunction> empty_function) { 706 FunctionMode function_mode, Handle<JSFunction> empty_function) {
706 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 707 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
707 SetStrictFunctionInstanceDescriptor(map, function_mode); 708 SetStrictFunctionInstanceDescriptor(map, function_mode);
708 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); 709 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode));
710 map->set_is_callable();
709 Map::SetPrototype(map, empty_function); 711 Map::SetPrototype(map, empty_function);
710 return map; 712 return map;
711 } 713 }
712 714
713 715
714 Handle<Map> Genesis::CreateStrongFunctionMap( 716 Handle<Map> Genesis::CreateStrongFunctionMap(
715 Handle<JSFunction> empty_function, bool is_constructor) { 717 Handle<JSFunction> empty_function, bool is_constructor) {
716 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 718 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
717 SetStrongFunctionInstanceDescriptor(map); 719 SetStrongFunctionInstanceDescriptor(map);
718 map->set_function_with_prototype(is_constructor); 720 map->set_function_with_prototype(is_constructor);
719 Map::SetPrototype(map, empty_function); 721 Map::SetPrototype(map, empty_function);
722 map->set_is_callable();
720 map->set_is_extensible(is_constructor); 723 map->set_is_extensible(is_constructor);
721 map->set_is_strong(); 724 map->set_is_strong();
722 return map; 725 return map;
723 } 726 }
724 727
725 728
726 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { 729 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
727 // Allocate map for the prototype-less strict mode instances. 730 // Allocate map for the prototype-less strict mode instances.
728 Handle<Map> strict_function_without_prototype_map = 731 Handle<Map> strict_function_without_prototype_map =
729 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty); 732 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 native_context()->set_script_context_table(*script_context_table); 1019 native_context()->set_script_context_table(*script_context_table);
1017 InstallGlobalThisBinding(); 1020 InstallGlobalThisBinding();
1018 1021
1019 Handle<String> object_name = factory->Object_string(); 1022 Handle<String> object_name = factory->Object_string();
1020 JSObject::AddProperty( 1023 JSObject::AddProperty(
1021 global_object, object_name, isolate->object_function(), DONT_ENUM); 1024 global_object, object_name, isolate->object_function(), DONT_ENUM);
1022 1025
1023 Handle<JSObject> global(native_context()->global_object()); 1026 Handle<JSObject> global(native_context()->global_object());
1024 1027
1025 // Install global Function object 1028 // Install global Function object
1026 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, 1029 Handle<JSFunction> function_function =
1027 empty_function, Builtins::kIllegal); 1030 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
1031 empty_function, Builtins::kIllegal);
1032 function_function->initial_map()->set_is_callable();
1028 1033
1029 { // --- A r r a y --- 1034 { // --- A r r a y ---
1030 Handle<JSFunction> array_function = 1035 Handle<JSFunction> array_function =
1031 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, 1036 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
1032 isolate->initial_object_prototype(), 1037 isolate->initial_object_prototype(),
1033 Builtins::kArrayCode); 1038 Builtins::kArrayCode);
1034 array_function->shared()->DontAdaptArguments(); 1039 array_function->shared()->DontAdaptArguments();
1035 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); 1040 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode));
1036 1041
1037 // This seems a bit hackish, but we need to make sure Array.length 1042 // This seems a bit hackish, but we need to make sure Array.length
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after
2243 generator_function_prototype, 2248 generator_function_prototype,
2244 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY)); 2249 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY));
2245 2250
2246 JSObject::AddProperty( 2251 JSObject::AddProperty(
2247 generator_function_prototype, 2252 generator_function_prototype,
2248 factory()->InternalizeUtf8String("prototype"), 2253 factory()->InternalizeUtf8String("prototype"),
2249 generator_object_prototype, 2254 generator_object_prototype,
2250 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); 2255 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2251 2256
2252 static const bool kUseStrictFunctionMap = true; 2257 static const bool kUseStrictFunctionMap = true;
2253 InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE, 2258 Handle<JSFunction> generator_function_function =
2254 JSFunction::kSize, generator_function_prototype, 2259 InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE,
2255 Builtins::kIllegal, kUseStrictFunctionMap); 2260 JSFunction::kSize, generator_function_prototype,
2261 Builtins::kIllegal, kUseStrictFunctionMap);
2262 generator_function_function->initial_map()->set_is_callable();
2256 2263
2257 // Create maps for generator functions and their prototypes. Store those 2264 // Create maps for generator functions and their prototypes. Store those
2258 // maps in the native context. The "prototype" property descriptor is 2265 // maps in the native context. The "prototype" property descriptor is
2259 // writable, non-enumerable, and non-configurable (as per ES6 draft 2266 // writable, non-enumerable, and non-configurable (as per ES6 draft
2260 // 04-14-15, section 25.2.4.3). 2267 // 04-14-15, section 25.2.4.3).
2261 Handle<Map> strict_function_map(strict_function_map_writable_prototype_); 2268 Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
2262 // Generator functions do not have "caller" or "arguments" accessors. 2269 // Generator functions do not have "caller" or "arguments" accessors.
2263 Handle<Map> sloppy_generator_function_map = 2270 Handle<Map> sloppy_generator_function_map =
2264 Map::Copy(strict_function_map, "SloppyGeneratorFunction"); 2271 Map::Copy(strict_function_map, "SloppyGeneratorFunction");
2265 Map::SetPrototype(sloppy_generator_function_map, 2272 Map::SetPrototype(sloppy_generator_function_map,
(...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after
3181 } 3188 }
3182 3189
3183 3190
3184 // Called when the top-level V8 mutex is destroyed. 3191 // Called when the top-level V8 mutex is destroyed.
3185 void Bootstrapper::FreeThreadResources() { 3192 void Bootstrapper::FreeThreadResources() {
3186 DCHECK(!IsActive()); 3193 DCHECK(!IsActive());
3187 } 3194 }
3188 3195
3189 } // namespace internal 3196 } // namespace internal
3190 } // namespace v8 3197 } // namespace v8
OLDNEW
« no previous file with comments | « src/array.js ('k') | src/builtins.cc » ('j') | src/execution.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698