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

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: Rebase again. 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') | no next file with comments »
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 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 prototype, ro_attribs); 481 prototype, ro_attribs);
482 map->AppendDescriptor(&d); 482 map->AppendDescriptor(&d);
483 } 483 }
484 } 484 }
485 485
486 486
487 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) { 487 Handle<Map> Genesis::CreateSloppyFunctionMap(FunctionMode function_mode) {
488 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 488 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
489 SetFunctionInstanceDescriptor(map, function_mode); 489 SetFunctionInstanceDescriptor(map, function_mode);
490 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); 490 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode));
491 map->set_is_callable();
491 return map; 492 return map;
492 } 493 }
493 494
494 495
495 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { 496 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) {
496 // Allocate the map for function instances. Maps are allocated first and their 497 // Allocate the map for function instances. Maps are allocated first and their
497 // prototypes patched later, once empty function is created. 498 // prototypes patched later, once empty function is created.
498 499
499 // Functions with this map will not have a 'prototype' property, and 500 // Functions with this map will not have a 'prototype' property, and
500 // can not be used as constructors. 501 // can not be used as constructors.
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 } 721 }
721 return strict_poison_function_; 722 return strict_poison_function_;
722 } 723 }
723 724
724 725
725 Handle<Map> Genesis::CreateStrictFunctionMap( 726 Handle<Map> Genesis::CreateStrictFunctionMap(
726 FunctionMode function_mode, Handle<JSFunction> empty_function) { 727 FunctionMode function_mode, Handle<JSFunction> empty_function) {
727 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 728 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
728 SetStrictFunctionInstanceDescriptor(map, function_mode); 729 SetStrictFunctionInstanceDescriptor(map, function_mode);
729 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode)); 730 map->set_function_with_prototype(IsFunctionModeWithPrototype(function_mode));
731 map->set_is_callable();
730 Map::SetPrototype(map, empty_function); 732 Map::SetPrototype(map, empty_function);
731 return map; 733 return map;
732 } 734 }
733 735
734 736
735 Handle<Map> Genesis::CreateStrongFunctionMap( 737 Handle<Map> Genesis::CreateStrongFunctionMap(
736 Handle<JSFunction> empty_function, bool is_constructor) { 738 Handle<JSFunction> empty_function, bool is_constructor) {
737 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 739 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize);
738 SetStrongFunctionInstanceDescriptor(map); 740 SetStrongFunctionInstanceDescriptor(map);
739 map->set_function_with_prototype(is_constructor); 741 map->set_function_with_prototype(is_constructor);
740 Map::SetPrototype(map, empty_function); 742 Map::SetPrototype(map, empty_function);
743 map->set_is_callable();
741 map->set_is_extensible(is_constructor); 744 map->set_is_extensible(is_constructor);
742 map->set_is_strong(); 745 map->set_is_strong();
743 return map; 746 return map;
744 } 747 }
745 748
746 749
747 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { 750 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
748 // Allocate map for the prototype-less strict mode instances. 751 // Allocate map for the prototype-less strict mode instances.
749 Handle<Map> strict_function_without_prototype_map = 752 Handle<Map> strict_function_without_prototype_map =
750 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty); 753 CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 native_context()->set_script_context_table(*script_context_table); 1040 native_context()->set_script_context_table(*script_context_table);
1038 InstallGlobalThisBinding(); 1041 InstallGlobalThisBinding();
1039 1042
1040 Handle<String> object_name = factory->Object_string(); 1043 Handle<String> object_name = factory->Object_string();
1041 JSObject::AddProperty( 1044 JSObject::AddProperty(
1042 global_object, object_name, isolate->object_function(), DONT_ENUM); 1045 global_object, object_name, isolate->object_function(), DONT_ENUM);
1043 1046
1044 Handle<JSObject> global(native_context()->global_object()); 1047 Handle<JSObject> global(native_context()->global_object());
1045 1048
1046 // Install global Function object 1049 // Install global Function object
1047 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize, 1050 Handle<JSFunction> function_function =
1048 empty_function, Builtins::kIllegal); 1051 InstallFunction(global, "Function", JS_FUNCTION_TYPE, JSFunction::kSize,
1052 empty_function, Builtins::kIllegal);
1053 function_function->initial_map()->set_is_callable();
1049 1054
1050 { // --- A r r a y --- 1055 { // --- A r r a y ---
1051 Handle<JSFunction> array_function = 1056 Handle<JSFunction> array_function =
1052 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize, 1057 InstallFunction(global, "Array", JS_ARRAY_TYPE, JSArray::kSize,
1053 isolate->initial_object_prototype(), 1058 isolate->initial_object_prototype(),
1054 Builtins::kArrayCode); 1059 Builtins::kArrayCode);
1055 array_function->shared()->DontAdaptArguments(); 1060 array_function->shared()->DontAdaptArguments();
1056 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode)); 1061 array_function->shared()->set_function_data(Smi::FromInt(kArrayCode));
1057 1062
1058 // This seems a bit hackish, but we need to make sure Array.length 1063 // This seems a bit hackish, but we need to make sure Array.length
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 generator_function_prototype, 2240 generator_function_prototype,
2236 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY)); 2241 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY));
2237 2242
2238 JSObject::AddProperty( 2243 JSObject::AddProperty(
2239 generator_function_prototype, 2244 generator_function_prototype,
2240 factory()->InternalizeUtf8String("prototype"), 2245 factory()->InternalizeUtf8String("prototype"),
2241 generator_object_prototype, 2246 generator_object_prototype,
2242 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY)); 2247 static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2243 2248
2244 static const bool kUseStrictFunctionMap = true; 2249 static const bool kUseStrictFunctionMap = true;
2245 InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE, 2250 Handle<JSFunction> generator_function_function =
2246 JSFunction::kSize, generator_function_prototype, 2251 InstallFunction(builtins, "GeneratorFunction", JS_FUNCTION_TYPE,
2247 Builtins::kIllegal, kUseStrictFunctionMap); 2252 JSFunction::kSize, generator_function_prototype,
2253 Builtins::kIllegal, kUseStrictFunctionMap);
2254 generator_function_function->initial_map()->set_is_callable();
2248 2255
2249 // Create maps for generator functions and their prototypes. Store those 2256 // Create maps for generator functions and their prototypes. Store those
2250 // maps in the native context. The "prototype" property descriptor is 2257 // maps in the native context. The "prototype" property descriptor is
2251 // writable, non-enumerable, and non-configurable (as per ES6 draft 2258 // writable, non-enumerable, and non-configurable (as per ES6 draft
2252 // 04-14-15, section 25.2.4.3). 2259 // 04-14-15, section 25.2.4.3).
2253 Handle<Map> strict_function_map(strict_function_map_writable_prototype_); 2260 Handle<Map> strict_function_map(strict_function_map_writable_prototype_);
2254 // Generator functions do not have "caller" or "arguments" accessors. 2261 // Generator functions do not have "caller" or "arguments" accessors.
2255 Handle<Map> sloppy_generator_function_map = 2262 Handle<Map> sloppy_generator_function_map =
2256 Map::Copy(strict_function_map, "SloppyGeneratorFunction"); 2263 Map::Copy(strict_function_map, "SloppyGeneratorFunction");
2257 Map::SetPrototype(sloppy_generator_function_map, 2264 Map::SetPrototype(sloppy_generator_function_map,
(...skipping 932 matching lines...) Expand 10 before | Expand all | Expand 10 after
3190 } 3197 }
3191 3198
3192 3199
3193 // Called when the top-level V8 mutex is destroyed. 3200 // Called when the top-level V8 mutex is destroyed.
3194 void Bootstrapper::FreeThreadResources() { 3201 void Bootstrapper::FreeThreadResources() {
3195 DCHECK(!IsActive()); 3202 DCHECK(!IsActive());
3196 } 3203 }
3197 3204
3198 } // namespace internal 3205 } // namespace internal
3199 } // namespace v8 3206 } // namespace v8
OLDNEW
« no previous file with comments | « src/array.js ('k') | src/builtins.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698