OLD | NEW |
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 "factory.h" | 5 #include "factory.h" |
6 | 6 |
7 #include "conversions.h" | 7 #include "conversions.h" |
8 #include "isolate-inl.h" | 8 #include "isolate-inl.h" |
9 #include "macro-assembler.h" | 9 #include "macro-assembler.h" |
10 | 10 |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 | 1233 |
1234 Handle<JSFunction> Factory::NewFunction(MaybeHandle<Object> maybe_prototype, | 1234 Handle<JSFunction> Factory::NewFunction(MaybeHandle<Object> maybe_prototype, |
1235 Handle<String> name, | 1235 Handle<String> name, |
1236 InstanceType type, | 1236 InstanceType type, |
1237 int instance_size, | 1237 int instance_size, |
1238 Handle<Code> code, | 1238 Handle<Code> code, |
1239 bool force_initial_map) { | 1239 bool force_initial_map) { |
1240 // Allocate the function | 1240 // Allocate the function |
1241 Handle<JSFunction> function = NewFunction(name, code, maybe_prototype); | 1241 Handle<JSFunction> function = NewFunction(name, code, maybe_prototype); |
1242 | 1242 |
1243 Handle<Object> prototype; | 1243 if (force_initial_map || |
1244 if (maybe_prototype.ToHandle(&prototype) && | 1244 type != JS_OBJECT_TYPE || |
1245 (force_initial_map || | 1245 instance_size != JSObject::kHeaderSize) { |
1246 type != JS_OBJECT_TYPE || | 1246 Handle<Object> prototype = maybe_prototype.ToHandleChecked(); |
1247 instance_size != JSObject::kHeaderSize)) { | |
1248 Handle<Map> initial_map = NewMap(type, instance_size); | 1247 Handle<Map> initial_map = NewMap(type, instance_size); |
1249 if (prototype->IsJSObject()) { | 1248 if (prototype->IsJSObject()) { |
1250 JSObject::SetLocalPropertyIgnoreAttributes( | 1249 JSObject::SetLocalPropertyIgnoreAttributes( |
1251 Handle<JSObject>::cast(prototype), | 1250 Handle<JSObject>::cast(prototype), |
1252 constructor_string(), | 1251 constructor_string(), |
1253 function, | 1252 function, |
1254 DONT_ENUM).Assert(); | 1253 DONT_ENUM).Assert(); |
1255 } else if (!function->shared()->is_generator()) { | 1254 } else if (!function->shared()->is_generator()) { |
1256 prototype = NewFunctionPrototype(function); | 1255 prototype = NewFunctionPrototype(function); |
1257 } | 1256 } |
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2126 UNREACHABLE(); | 2125 UNREACHABLE(); |
2127 type = JS_OBJECT_TYPE; // Keep the compiler happy. | 2126 type = JS_OBJECT_TYPE; // Keep the compiler happy. |
2128 break; | 2127 break; |
2129 } | 2128 } |
2130 | 2129 |
2131 MaybeHandle<Object> maybe_prototype = prototype; | 2130 MaybeHandle<Object> maybe_prototype = prototype; |
2132 if (obj->remove_prototype()) maybe_prototype = MaybeHandle<Object>(); | 2131 if (obj->remove_prototype()) maybe_prototype = MaybeHandle<Object>(); |
2133 | 2132 |
2134 Handle<JSFunction> result = NewFunction( | 2133 Handle<JSFunction> result = NewFunction( |
2135 maybe_prototype, Factory::empty_string(), type, | 2134 maybe_prototype, Factory::empty_string(), type, |
2136 instance_size, code, true); | 2135 instance_size, code, !obj->remove_prototype()); |
2137 | 2136 |
2138 result->shared()->set_length(obj->length()); | 2137 result->shared()->set_length(obj->length()); |
2139 Handle<Object> class_name(obj->class_name(), isolate()); | 2138 Handle<Object> class_name(obj->class_name(), isolate()); |
2140 if (class_name->IsString()) { | 2139 if (class_name->IsString()) { |
2141 result->shared()->set_instance_class_name(*class_name); | 2140 result->shared()->set_instance_class_name(*class_name); |
2142 result->shared()->set_name(*class_name); | 2141 result->shared()->set_name(*class_name); |
2143 } | 2142 } |
2144 result->shared()->set_function_data(*obj); | 2143 result->shared()->set_function_data(*obj); |
2145 result->shared()->set_construct_stub(*construct_stub); | 2144 result->shared()->set_construct_stub(*construct_stub); |
2146 result->shared()->DontAdaptArguments(); | 2145 result->shared()->DontAdaptArguments(); |
2147 | 2146 |
2148 if (obj->remove_prototype()) { | 2147 if (obj->remove_prototype()) { |
2149 ASSERT(result->shared()->IsApiFunction()); | 2148 ASSERT(result->shared()->IsApiFunction()); |
| 2149 ASSERT(!result->has_initial_map()); |
| 2150 ASSERT(!result->has_prototype()); |
2150 return result; | 2151 return result; |
2151 } | 2152 } |
2152 // Down from here is only valid for API functions that can be used as a | 2153 // Down from here is only valid for API functions that can be used as a |
2153 // constructor (don't set the "remove prototype" flag). | 2154 // constructor (don't set the "remove prototype" flag). |
2154 | 2155 |
2155 Handle<Map> map(result->initial_map()); | 2156 Handle<Map> map(result->initial_map()); |
2156 | 2157 |
2157 // Mark as undetectable if needed. | 2158 // Mark as undetectable if needed. |
2158 if (obj->undetectable()) { | 2159 if (obj->undetectable()) { |
2159 map->set_is_undetectable(); | 2160 map->set_is_undetectable(); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2344 return Handle<Object>::null(); | 2345 return Handle<Object>::null(); |
2345 } | 2346 } |
2346 | 2347 |
2347 | 2348 |
2348 Handle<Object> Factory::ToBoolean(bool value) { | 2349 Handle<Object> Factory::ToBoolean(bool value) { |
2349 return value ? true_value() : false_value(); | 2350 return value ? true_value() : false_value(); |
2350 } | 2351 } |
2351 | 2352 |
2352 | 2353 |
2353 } } // namespace v8::internal | 2354 } } // namespace v8::internal |
OLD | NEW |