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 1185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1196 Handle<Context> context, | 1196 Handle<Context> context, |
1197 PretenureFlag pretenure) { | 1197 PretenureFlag pretenure) { |
1198 AllocationSpace space = pretenure == TENURED ? OLD_POINTER_SPACE : NEW_SPACE; | 1198 AllocationSpace space = pretenure == TENURED ? OLD_POINTER_SPACE : NEW_SPACE; |
1199 Handle<JSFunction> result = New<JSFunction>(map, space); | 1199 Handle<JSFunction> result = New<JSFunction>(map, space); |
1200 InitializeFunction(result, info, context); | 1200 InitializeFunction(result, info, context); |
1201 return result; | 1201 return result; |
1202 } | 1202 } |
1203 | 1203 |
1204 | 1204 |
1205 Handle<JSFunction> Factory::NewFunction(Handle<String> name, | 1205 Handle<JSFunction> Factory::NewFunction(Handle<String> name, |
1206 Handle<Code> code, | 1206 MaybeHandle<Object> maybe_prototype, |
1207 MaybeHandle<Object> maybe_prototype) { | 1207 MaybeHandle<Code> maybe_code) { |
1208 Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); | 1208 Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); |
1209 ASSERT(info->strict_mode() == SLOPPY); | 1209 ASSERT(info->strict_mode() == SLOPPY); |
1210 info->set_code(*code); | 1210 Handle<Code> code; |
| 1211 if (maybe_code.ToHandle(&code)) { |
| 1212 info->set_code(*code); |
| 1213 } |
1211 Handle<Context> context(isolate()->context()->native_context()); | 1214 Handle<Context> context(isolate()->context()->native_context()); |
1212 Handle<Map> map = maybe_prototype.is_null() | 1215 Handle<Map> map = maybe_prototype.is_null() |
1213 ? isolate()->sloppy_function_without_prototype_map() | 1216 ? isolate()->sloppy_function_without_prototype_map() |
1214 : isolate()->sloppy_function_map(); | 1217 : isolate()->sloppy_function_map(); |
1215 Handle<JSFunction> result = NewFunction(map, info, context); | 1218 Handle<JSFunction> result = NewFunction(map, info, context); |
1216 Handle<Object> prototype; | 1219 Handle<Object> prototype; |
1217 if (maybe_prototype.ToHandle(&prototype)) { | 1220 if (maybe_prototype.ToHandle(&prototype)) { |
1218 result->set_prototype_or_initial_map(*prototype); | 1221 result->set_prototype_or_initial_map(*prototype); |
1219 } | 1222 } |
1220 return result; | 1223 return result; |
1221 } | 1224 } |
1222 | 1225 |
1223 | 1226 |
1224 Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name, | 1227 Handle<JSFunction> Factory::NewFunction(Handle<String> name) { |
1225 Handle<Object> prototype) { | 1228 return NewFunction(name, the_hole_value(), MaybeHandle<Code>()); |
1226 Handle<SharedFunctionInfo> info = NewSharedFunctionInfo(name); | |
1227 ASSERT(info->strict_mode() == SLOPPY); | |
1228 Handle<Context> context(isolate()->context()->native_context()); | |
1229 Handle<Map> map = isolate()->sloppy_function_map(); | |
1230 Handle<JSFunction> result = NewFunction(map, info, context); | |
1231 result->set_prototype_or_initial_map(*prototype); | |
1232 return result; | |
1233 } | 1229 } |
1234 | 1230 |
1235 | 1231 |
1236 Handle<JSFunction> Factory::NewFunction(MaybeHandle<Object> maybe_prototype, | 1232 Handle<JSFunction> Factory::NewFunction(MaybeHandle<Object> maybe_prototype, |
1237 Handle<String> name, | 1233 Handle<String> name, |
1238 InstanceType type, | 1234 InstanceType type, |
1239 int instance_size, | 1235 int instance_size, |
1240 Handle<Code> code, | 1236 Handle<Code> code, |
1241 bool force_initial_map) { | 1237 bool force_initial_map) { |
1242 // Allocate the function | 1238 // Allocate the function |
1243 Handle<JSFunction> function = NewFunction(name, code, maybe_prototype); | 1239 Handle<JSFunction> function = NewFunction(name, maybe_prototype, code); |
1244 | 1240 |
1245 if (force_initial_map || | 1241 if (force_initial_map || |
1246 type != JS_OBJECT_TYPE || | 1242 type != JS_OBJECT_TYPE || |
1247 instance_size != JSObject::kHeaderSize) { | 1243 instance_size != JSObject::kHeaderSize) { |
1248 Handle<Object> prototype = maybe_prototype.ToHandleChecked(); | 1244 Handle<Object> prototype = maybe_prototype.ToHandleChecked(); |
1249 Handle<Map> initial_map = NewMap( | 1245 Handle<Map> initial_map = NewMap( |
1250 type, instance_size, GetInitialFastElementsKind()); | 1246 type, instance_size, GetInitialFastElementsKind()); |
1251 if (prototype->IsTheHole() && !function->shared()->is_generator()) { | 1247 if (prototype->IsTheHole() && !function->shared()->is_generator()) { |
1252 prototype = NewFunctionPrototype(function); | 1248 prototype = NewFunctionPrototype(function); |
1253 } | 1249 } |
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2324 return Handle<Object>::null(); | 2320 return Handle<Object>::null(); |
2325 } | 2321 } |
2326 | 2322 |
2327 | 2323 |
2328 Handle<Object> Factory::ToBoolean(bool value) { | 2324 Handle<Object> Factory::ToBoolean(bool value) { |
2329 return value ? true_value() : false_value(); | 2325 return value ? true_value() : false_value(); |
2330 } | 2326 } |
2331 | 2327 |
2332 | 2328 |
2333 } } // namespace v8::internal | 2329 } } // namespace v8::internal |
OLD | NEW |