OLD | NEW |
---|---|
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
134 delete delete_these_arrays_on_tear_down_; | 134 delete delete_these_arrays_on_tear_down_; |
135 delete_these_arrays_on_tear_down_ = NULL; | 135 delete_these_arrays_on_tear_down_ = NULL; |
136 } | 136 } |
137 | 137 |
138 extensions_cache_.Initialize(false); // Yes, symmetrical | 138 extensions_cache_.Initialize(false); // Yes, symmetrical |
139 } | 139 } |
140 | 140 |
141 | 141 |
142 class Genesis BASE_EMBEDDED { | 142 class Genesis BASE_EMBEDDED { |
143 public: | 143 public: |
144 Genesis(Handle<Object> global_object, | 144 Genesis(Isolate* isolate, |
145 Handle<Object> global_object, | |
145 v8::Handle<v8::ObjectTemplate> global_template, | 146 v8::Handle<v8::ObjectTemplate> global_template, |
146 v8::ExtensionConfiguration* extensions); | 147 v8::ExtensionConfiguration* extensions); |
147 ~Genesis() { } | 148 ~Genesis() { } |
148 | 149 |
149 Handle<Context> result() { return result_; } | 150 Handle<Context> result() { return result_; } |
150 | 151 |
151 Genesis* previous() { return previous_; } | 152 Genesis* previous() { return previous_; } |
152 | 153 |
154 Isolate* isolate() const { return isolate_; } | |
155 Factory* factory() const { return isolate_->factory(); } | |
156 Heap* heap() const { return isolate_->heap(); } | |
153 private: | 157 private: |
Mads Ager (chromium)
2011/04/06 07:34:15
Could you leave a blank line before the private se
| |
154 Handle<Context> global_context_; | 158 Handle<Context> global_context_; |
159 Isolate* isolate_; | |
155 | 160 |
156 // There may be more than one active genesis object: When GC is | 161 // There may be more than one active genesis object: When GC is |
157 // triggered during environment creation there may be weak handle | 162 // triggered during environment creation there may be weak handle |
158 // processing callbacks which may create new environments. | 163 // processing callbacks which may create new environments. |
159 Genesis* previous_; | 164 Genesis* previous_; |
160 | 165 |
161 Handle<Context> global_context() { return global_context_; } | 166 Handle<Context> global_context() { return global_context_; } |
162 | 167 |
163 // Creates some basic objects. Used for creating a context from scratch. | 168 // Creates some basic objects. Used for creating a context from scratch. |
164 void CreateRoots(); | 169 void CreateRoots(); |
165 // Creates the empty function. Used for creating a context from scratch. | 170 // Creates the empty function. Used for creating a context from scratch. |
166 Handle<JSFunction> CreateEmptyFunction(); | 171 Handle<JSFunction> CreateEmptyFunction(Isolate* isolate); |
167 // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 | 172 // Creates the ThrowTypeError function. ECMA 5th Ed. 13.2.3 |
168 Handle<JSFunction> CreateThrowTypeErrorFunction(Builtins::Name builtin); | 173 Handle<JSFunction> CreateThrowTypeErrorFunction(Builtins::Name builtin); |
169 | 174 |
170 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); | 175 void CreateStrictModeFunctionMaps(Handle<JSFunction> empty); |
171 // Creates the global objects using the global and the template passed in | 176 // Creates the global objects using the global and the template passed in |
172 // through the API. We call this regardless of whether we are building a | 177 // through the API. We call this regardless of whether we are building a |
173 // context from scratch or using a deserialized one from the partial snapshot | 178 // context from scratch or using a deserialized one from the partial snapshot |
174 // but in the latter case we don't use the objects it produces directly, as | 179 // but in the latter case we don't use the objects it produces directly, as |
175 // we have to used the deserialized ones that are linked together with the | 180 // we have to used the deserialized ones that are linked together with the |
176 // rest of the context snapshot. | 181 // rest of the context snapshot. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 PrototypePropertyMode prototype_mode, | 237 PrototypePropertyMode prototype_mode, |
233 Handle<JSFunction> empty_function, | 238 Handle<JSFunction> empty_function, |
234 Handle<FixedArray> arguments_callbacks, | 239 Handle<FixedArray> arguments_callbacks, |
235 Handle<FixedArray> caller_callbacks); | 240 Handle<FixedArray> caller_callbacks); |
236 | 241 |
237 Handle<DescriptorArray> ComputeStrictFunctionInstanceDescriptor( | 242 Handle<DescriptorArray> ComputeStrictFunctionInstanceDescriptor( |
238 PrototypePropertyMode propertyMode, | 243 PrototypePropertyMode propertyMode, |
239 Handle<FixedArray> arguments, | 244 Handle<FixedArray> arguments, |
240 Handle<FixedArray> caller); | 245 Handle<FixedArray> caller); |
241 | 246 |
242 static bool CompileBuiltin(int index); | 247 static bool CompileBuiltin(Isolate* isolate, int index); |
243 static bool CompileNative(Vector<const char> name, Handle<String> source); | 248 static bool CompileNative(Vector<const char> name, Handle<String> source); |
244 static bool CompileScriptCached(Vector<const char> name, | 249 static bool CompileScriptCached(Vector<const char> name, |
245 Handle<String> source, | 250 Handle<String> source, |
246 SourceCodeCache* cache, | 251 SourceCodeCache* cache, |
247 v8::Extension* extension, | 252 v8::Extension* extension, |
248 Handle<Context> top_context, | 253 Handle<Context> top_context, |
249 bool use_runtime_context); | 254 bool use_runtime_context); |
250 | 255 |
251 Handle<Context> result_; | 256 Handle<Context> result_; |
252 | 257 |
253 // Function instance maps. Function literal maps are created initially with | 258 // Function instance maps. Function literal maps are created initially with |
254 // a read only prototype for the processing of JS builtins. Later the function | 259 // a read only prototype for the processing of JS builtins. Later the function |
255 // instance maps are replaced in order to make prototype writable. | 260 // instance maps are replaced in order to make prototype writable. |
256 // These are the final, writable prototype, maps. | 261 // These are the final, writable prototype, maps. |
257 Handle<Map> function_instance_map_writable_prototype_; | 262 Handle<Map> function_instance_map_writable_prototype_; |
258 Handle<Map> strict_mode_function_instance_map_writable_prototype_; | 263 Handle<Map> strict_mode_function_instance_map_writable_prototype_; |
259 | 264 |
260 BootstrapperActive active_; | 265 BootstrapperActive active_; |
261 friend class Bootstrapper; | 266 friend class Bootstrapper; |
262 }; | 267 }; |
263 | 268 |
264 | 269 |
265 void Bootstrapper::Iterate(ObjectVisitor* v) { | 270 void Bootstrapper::Iterate(ObjectVisitor* v) { |
266 extensions_cache_.Iterate(v); | 271 extensions_cache_.Iterate(v); |
267 v->Synchronize("Extensions"); | 272 v->Synchronize("Extensions"); |
268 } | 273 } |
269 | 274 |
270 | 275 |
271 Handle<Context> Bootstrapper::CreateEnvironment( | 276 Handle<Context> Bootstrapper::CreateEnvironment( |
277 Isolate* isolate, | |
272 Handle<Object> global_object, | 278 Handle<Object> global_object, |
273 v8::Handle<v8::ObjectTemplate> global_template, | 279 v8::Handle<v8::ObjectTemplate> global_template, |
274 v8::ExtensionConfiguration* extensions) { | 280 v8::ExtensionConfiguration* extensions) { |
275 HandleScope scope; | 281 HandleScope scope; |
276 Handle<Context> env; | 282 Handle<Context> env; |
277 Genesis genesis(global_object, global_template, extensions); | 283 Genesis genesis(isolate, global_object, global_template, extensions); |
278 env = genesis.result(); | 284 env = genesis.result(); |
279 if (!env.is_null()) { | 285 if (!env.is_null()) { |
280 if (InstallExtensions(env, extensions)) { | 286 if (InstallExtensions(env, extensions)) { |
281 return env; | 287 return env; |
282 } | 288 } |
283 } | 289 } |
284 return Handle<Context>(); | 290 return Handle<Context>(); |
285 } | 291 } |
286 | 292 |
287 | 293 |
288 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { | 294 static void SetObjectPrototype(Handle<JSObject> object, Handle<Object> proto) { |
289 // object.__proto__ = proto; | 295 // object.__proto__ = proto; |
296 Factory* factory = object->GetIsolate()->factory(); | |
290 Handle<Map> old_to_map = Handle<Map>(object->map()); | 297 Handle<Map> old_to_map = Handle<Map>(object->map()); |
291 Handle<Map> new_to_map = FACTORY->CopyMapDropTransitions(old_to_map); | 298 Handle<Map> new_to_map = factory->CopyMapDropTransitions(old_to_map); |
292 new_to_map->set_prototype(*proto); | 299 new_to_map->set_prototype(*proto); |
293 object->set_map(*new_to_map); | 300 object->set_map(*new_to_map); |
294 } | 301 } |
295 | 302 |
296 | 303 |
297 void Bootstrapper::DetachGlobal(Handle<Context> env) { | 304 void Bootstrapper::DetachGlobal(Handle<Context> env) { |
298 Factory* factory = Isolate::Current()->factory(); | 305 Factory* factory = env->GetIsolate()->factory(); |
299 JSGlobalProxy::cast(env->global_proxy())->set_context(*factory->null_value()); | 306 JSGlobalProxy::cast(env->global_proxy())->set_context(*factory->null_value()); |
300 SetObjectPrototype(Handle<JSObject>(env->global_proxy()), | 307 SetObjectPrototype(Handle<JSObject>(env->global_proxy()), |
301 factory->null_value()); | 308 factory->null_value()); |
302 env->set_global_proxy(env->global()); | 309 env->set_global_proxy(env->global()); |
303 env->global()->set_global_receiver(env->global()); | 310 env->global()->set_global_receiver(env->global()); |
304 } | 311 } |
305 | 312 |
306 | 313 |
307 void Bootstrapper::ReattachGlobal(Handle<Context> env, | 314 void Bootstrapper::ReattachGlobal(Handle<Context> env, |
308 Handle<Object> global_object) { | 315 Handle<Object> global_object) { |
309 ASSERT(global_object->IsJSGlobalProxy()); | 316 ASSERT(global_object->IsJSGlobalProxy()); |
310 Handle<JSGlobalProxy> global = Handle<JSGlobalProxy>::cast(global_object); | 317 Handle<JSGlobalProxy> global = Handle<JSGlobalProxy>::cast(global_object); |
311 env->global()->set_global_receiver(*global); | 318 env->global()->set_global_receiver(*global); |
312 env->set_global_proxy(*global); | 319 env->set_global_proxy(*global); |
313 SetObjectPrototype(global, Handle<JSObject>(env->global())); | 320 SetObjectPrototype(global, Handle<JSObject>(env->global())); |
314 global->set_context(*env); | 321 global->set_context(*env); |
315 } | 322 } |
316 | 323 |
317 | 324 |
318 static Handle<JSFunction> InstallFunction(Handle<JSObject> target, | 325 static Handle<JSFunction> InstallFunction(Handle<JSObject> target, |
319 const char* name, | 326 const char* name, |
320 InstanceType type, | 327 InstanceType type, |
321 int instance_size, | 328 int instance_size, |
322 Handle<JSObject> prototype, | 329 Handle<JSObject> prototype, |
323 Builtins::Name call, | 330 Builtins::Name call, |
324 bool is_ecma_native) { | 331 bool is_ecma_native) { |
325 Isolate* isolate = Isolate::Current(); | 332 Isolate* isolate = target->GetIsolate(); |
326 Factory* factory = isolate->factory(); | 333 Factory* factory = isolate->factory(); |
327 Handle<String> symbol = factory->LookupAsciiSymbol(name); | 334 Handle<String> symbol = factory->LookupAsciiSymbol(name); |
328 Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); | 335 Handle<Code> call_code = Handle<Code>(isolate->builtins()->builtin(call)); |
329 Handle<JSFunction> function = prototype.is_null() ? | 336 Handle<JSFunction> function = prototype.is_null() ? |
330 factory->NewFunctionWithoutPrototype(symbol, call_code) : | 337 factory->NewFunctionWithoutPrototype(symbol, call_code) : |
331 factory->NewFunctionWithPrototype(symbol, | 338 factory->NewFunctionWithPrototype(symbol, |
332 type, | 339 type, |
333 instance_size, | 340 instance_size, |
334 prototype, | 341 prototype, |
335 call_code, | 342 call_code, |
336 is_ecma_native); | 343 is_ecma_native); |
337 SetLocalPropertyNoThrow(target, symbol, function, DONT_ENUM); | 344 SetLocalPropertyNoThrow(target, symbol, function, DONT_ENUM); |
338 if (is_ecma_native) { | 345 if (is_ecma_native) { |
339 function->shared()->set_instance_class_name(*symbol); | 346 function->shared()->set_instance_class_name(*symbol); |
340 } | 347 } |
341 return function; | 348 return function; |
342 } | 349 } |
343 | 350 |
344 | 351 |
345 Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( | 352 Handle<DescriptorArray> Genesis::ComputeFunctionInstanceDescriptor( |
346 PrototypePropertyMode prototypeMode) { | 353 PrototypePropertyMode prototypeMode) { |
347 Factory* factory = Isolate::Current()->factory(); | |
348 Handle<DescriptorArray> descriptors = | 354 Handle<DescriptorArray> descriptors = |
349 factory->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); | 355 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5) ; |
350 PropertyAttributes attributes = | 356 PropertyAttributes attributes = |
351 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 357 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
352 | 358 |
353 { // Add length. | 359 { // Add length. |
354 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionLength); | 360 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionLength); |
355 CallbacksDescriptor d(*factory->length_symbol(), *proxy, attributes); | 361 CallbacksDescriptor d(*factory()->length_symbol(), *proxy, attributes); |
356 descriptors->Set(0, &d); | 362 descriptors->Set(0, &d); |
357 } | 363 } |
358 { // Add name. | 364 { // Add name. |
359 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionName); | 365 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionName); |
360 CallbacksDescriptor d(*factory->name_symbol(), *proxy, attributes); | 366 CallbacksDescriptor d(*factory()->name_symbol(), *proxy, attributes); |
361 descriptors->Set(1, &d); | 367 descriptors->Set(1, &d); |
362 } | 368 } |
363 { // Add arguments. | 369 { // Add arguments. |
364 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionArguments); | 370 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionArguments); |
365 CallbacksDescriptor d(*factory->arguments_symbol(), *proxy, attributes); | 371 CallbacksDescriptor d(*factory()->arguments_symbol(), *proxy, attributes); |
366 descriptors->Set(2, &d); | 372 descriptors->Set(2, &d); |
367 } | 373 } |
368 { // Add caller. | 374 { // Add caller. |
369 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionCaller); | 375 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionCaller); |
370 CallbacksDescriptor d(*factory->caller_symbol(), *proxy, attributes); | 376 CallbacksDescriptor d(*factory()->caller_symbol(), *proxy, attributes); |
371 descriptors->Set(3, &d); | 377 descriptors->Set(3, &d); |
372 } | 378 } |
373 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 379 if (prototypeMode != DONT_ADD_PROTOTYPE) { |
374 // Add prototype. | 380 // Add prototype. |
375 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { | 381 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { |
376 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); | 382 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); |
377 } | 383 } |
378 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionPrototype); | 384 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionPrototype); |
379 CallbacksDescriptor d(*factory->prototype_symbol(), *proxy, attributes); | 385 CallbacksDescriptor d(*factory()->prototype_symbol(), *proxy, attributes); |
380 descriptors->Set(4, &d); | 386 descriptors->Set(4, &d); |
381 } | 387 } |
382 descriptors->Sort(); | 388 descriptors->Sort(); |
383 return descriptors; | 389 return descriptors; |
384 } | 390 } |
385 | 391 |
386 | 392 |
387 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { | 393 Handle<Map> Genesis::CreateFunctionMap(PrototypePropertyMode prototype_mode) { |
388 Handle<Map> map = FACTORY->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 394 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
389 Handle<DescriptorArray> descriptors = | 395 Handle<DescriptorArray> descriptors = |
390 ComputeFunctionInstanceDescriptor(prototype_mode); | 396 ComputeFunctionInstanceDescriptor(prototype_mode); |
391 map->set_instance_descriptors(*descriptors); | 397 map->set_instance_descriptors(*descriptors); |
392 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); | 398 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); |
393 return map; | 399 return map; |
394 } | 400 } |
395 | 401 |
396 | 402 |
397 Handle<JSFunction> Genesis::CreateEmptyFunction() { | 403 Handle<JSFunction> Genesis::CreateEmptyFunction(Isolate* isolate) { |
398 // Allocate the map for function instances. Maps are allocated first and their | 404 // Allocate the map for function instances. Maps are allocated first and their |
399 // prototypes patched later, once empty function is created. | 405 // prototypes patched later, once empty function is created. |
400 | 406 |
401 // Please note that the prototype property for function instances must be | 407 // Please note that the prototype property for function instances must be |
402 // writable. | 408 // writable. |
403 Handle<Map> function_instance_map = | 409 Handle<Map> function_instance_map = |
404 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); | 410 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); |
405 global_context()->set_function_instance_map(*function_instance_map); | 411 global_context()->set_function_instance_map(*function_instance_map); |
406 | 412 |
407 // Functions with this map will not have a 'prototype' property, and | 413 // Functions with this map will not have a 'prototype' property, and |
408 // can not be used as constructors. | 414 // can not be used as constructors. |
409 Handle<Map> function_without_prototype_map = | 415 Handle<Map> function_without_prototype_map = |
410 CreateFunctionMap(DONT_ADD_PROTOTYPE); | 416 CreateFunctionMap(DONT_ADD_PROTOTYPE); |
411 global_context()->set_function_without_prototype_map( | 417 global_context()->set_function_without_prototype_map( |
412 *function_without_prototype_map); | 418 *function_without_prototype_map); |
413 | 419 |
414 // Allocate the function map. This map is temporary, used only for processing | 420 // Allocate the function map. This map is temporary, used only for processing |
415 // of builtins. | 421 // of builtins. |
416 // Later the map is replaced with writable prototype map, allocated below. | 422 // Later the map is replaced with writable prototype map, allocated below. |
417 Handle<Map> function_map = CreateFunctionMap(ADD_READONLY_PROTOTYPE); | 423 Handle<Map> function_map = CreateFunctionMap(ADD_READONLY_PROTOTYPE); |
418 global_context()->set_function_map(*function_map); | 424 global_context()->set_function_map(*function_map); |
419 | 425 |
420 // The final map for functions. Writeable prototype. | 426 // The final map for functions. Writeable prototype. |
421 // This map is installed in MakeFunctionInstancePrototypeWritable. | 427 // This map is installed in MakeFunctionInstancePrototypeWritable. |
422 function_instance_map_writable_prototype_ = | 428 function_instance_map_writable_prototype_ = |
423 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); | 429 CreateFunctionMap(ADD_WRITEABLE_PROTOTYPE); |
424 | 430 |
425 Isolate* isolate = Isolate::Current(); | |
426 Factory* factory = isolate->factory(); | 431 Factory* factory = isolate->factory(); |
427 Heap* heap = isolate->heap(); | 432 Heap* heap = isolate->heap(); |
428 | 433 |
429 Handle<String> object_name = Handle<String>(heap->Object_symbol()); | 434 Handle<String> object_name = Handle<String>(heap->Object_symbol()); |
430 | 435 |
431 { // --- O b j e c t --- | 436 { // --- O b j e c t --- |
432 Handle<JSFunction> object_fun = | 437 Handle<JSFunction> object_fun = |
433 factory->NewFunction(object_name, factory->null_value()); | 438 factory->NewFunction(object_name, factory->null_value()); |
434 Handle<Map> object_function_map = | 439 Handle<Map> object_function_map = |
435 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); | 440 factory->NewMap(JS_OBJECT_TYPE, JSObject::kHeaderSize); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
484 empty_fm->set_prototype(global_context()->object_function()->prototype()); | 489 empty_fm->set_prototype(global_context()->object_function()->prototype()); |
485 empty_function->set_map(*empty_fm); | 490 empty_function->set_map(*empty_fm); |
486 return empty_function; | 491 return empty_function; |
487 } | 492 } |
488 | 493 |
489 | 494 |
490 Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( | 495 Handle<DescriptorArray> Genesis::ComputeStrictFunctionInstanceDescriptor( |
491 PrototypePropertyMode prototypeMode, | 496 PrototypePropertyMode prototypeMode, |
492 Handle<FixedArray> arguments, | 497 Handle<FixedArray> arguments, |
493 Handle<FixedArray> caller) { | 498 Handle<FixedArray> caller) { |
494 Factory* factory = Isolate::Current()->factory(); | |
495 Handle<DescriptorArray> descriptors = | 499 Handle<DescriptorArray> descriptors = |
496 factory->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5); | 500 factory()->NewDescriptorArray(prototypeMode == DONT_ADD_PROTOTYPE ? 4 : 5) ; |
497 PropertyAttributes attributes = static_cast<PropertyAttributes>( | 501 PropertyAttributes attributes = static_cast<PropertyAttributes>( |
498 DONT_ENUM | DONT_DELETE | READ_ONLY); | 502 DONT_ENUM | DONT_DELETE | READ_ONLY); |
499 | 503 |
500 { // length | 504 { // length |
501 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionLength); | 505 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionLength); |
502 CallbacksDescriptor d(*factory->length_symbol(), *proxy, attributes); | 506 CallbacksDescriptor d(*factory()->length_symbol(), *proxy, attributes); |
503 descriptors->Set(0, &d); | 507 descriptors->Set(0, &d); |
504 } | 508 } |
505 { // name | 509 { // name |
506 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionName); | 510 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionName); |
507 CallbacksDescriptor d(*factory->name_symbol(), *proxy, attributes); | 511 CallbacksDescriptor d(*factory()->name_symbol(), *proxy, attributes); |
508 descriptors->Set(1, &d); | 512 descriptors->Set(1, &d); |
509 } | 513 } |
510 { // arguments | 514 { // arguments |
511 CallbacksDescriptor d(*factory->arguments_symbol(), *arguments, attributes); | 515 CallbacksDescriptor d(*factory()->arguments_symbol(), |
516 *arguments, | |
517 attributes); | |
512 descriptors->Set(2, &d); | 518 descriptors->Set(2, &d); |
513 } | 519 } |
514 { // caller | 520 { // caller |
515 CallbacksDescriptor d(*factory->caller_symbol(), *caller, attributes); | 521 CallbacksDescriptor d(*factory()->caller_symbol(), *caller, attributes); |
516 descriptors->Set(3, &d); | 522 descriptors->Set(3, &d); |
517 } | 523 } |
518 | 524 |
519 // prototype | 525 // prototype |
520 if (prototypeMode != DONT_ADD_PROTOTYPE) { | 526 if (prototypeMode != DONT_ADD_PROTOTYPE) { |
521 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { | 527 if (prototypeMode == ADD_WRITEABLE_PROTOTYPE) { |
522 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); | 528 attributes = static_cast<PropertyAttributes>(attributes & ~READ_ONLY); |
523 } | 529 } |
524 Handle<Proxy> proxy = factory->NewProxy(&Accessors::FunctionPrototype); | 530 Handle<Proxy> proxy = factory()->NewProxy(&Accessors::FunctionPrototype); |
525 CallbacksDescriptor d(*factory->prototype_symbol(), *proxy, attributes); | 531 CallbacksDescriptor d(*factory()->prototype_symbol(), *proxy, attributes); |
526 descriptors->Set(4, &d); | 532 descriptors->Set(4, &d); |
527 } | 533 } |
528 | 534 |
529 descriptors->Sort(); | 535 descriptors->Sort(); |
530 return descriptors; | 536 return descriptors; |
531 } | 537 } |
532 | 538 |
533 | 539 |
534 // ECMAScript 5th Edition, 13.2.3 | 540 // ECMAScript 5th Edition, 13.2.3 |
535 Handle<JSFunction> Genesis::CreateThrowTypeErrorFunction( | 541 Handle<JSFunction> Genesis::CreateThrowTypeErrorFunction( |
536 Builtins::Name builtin) { | 542 Builtins::Name builtin) { |
537 Isolate* isolate = Isolate::Current(); | 543 Handle<String> name = factory()->LookupAsciiSymbol("ThrowTypeError"); |
538 Factory* factory = isolate->factory(); | |
539 | |
540 Handle<String> name = factory->LookupAsciiSymbol("ThrowTypeError"); | |
541 Handle<JSFunction> throw_type_error = | 544 Handle<JSFunction> throw_type_error = |
542 factory->NewFunctionWithoutPrototype(name, kStrictMode); | 545 factory()->NewFunctionWithoutPrototype(name, kStrictMode); |
543 Handle<Code> code = Handle<Code>( | 546 Handle<Code> code = Handle<Code>( |
544 isolate->builtins()->builtin(builtin)); | 547 isolate()->builtins()->builtin(builtin)); |
545 | 548 |
546 throw_type_error->set_map(global_context()->strict_mode_function_map()); | 549 throw_type_error->set_map(global_context()->strict_mode_function_map()); |
547 throw_type_error->set_code(*code); | 550 throw_type_error->set_code(*code); |
548 throw_type_error->shared()->set_code(*code); | 551 throw_type_error->shared()->set_code(*code); |
549 throw_type_error->shared()->DontAdaptArguments(); | 552 throw_type_error->shared()->DontAdaptArguments(); |
550 | 553 |
551 PreventExtensions(throw_type_error); | 554 PreventExtensions(throw_type_error); |
552 | 555 |
553 return throw_type_error; | 556 return throw_type_error; |
554 } | 557 } |
555 | 558 |
556 | 559 |
557 Handle<Map> Genesis::CreateStrictModeFunctionMap( | 560 Handle<Map> Genesis::CreateStrictModeFunctionMap( |
558 PrototypePropertyMode prototype_mode, | 561 PrototypePropertyMode prototype_mode, |
559 Handle<JSFunction> empty_function, | 562 Handle<JSFunction> empty_function, |
560 Handle<FixedArray> arguments_callbacks, | 563 Handle<FixedArray> arguments_callbacks, |
561 Handle<FixedArray> caller_callbacks) { | 564 Handle<FixedArray> caller_callbacks) { |
562 Handle<Map> map = FACTORY->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); | 565 Handle<Map> map = factory()->NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); |
563 Handle<DescriptorArray> descriptors = | 566 Handle<DescriptorArray> descriptors = |
564 ComputeStrictFunctionInstanceDescriptor(prototype_mode, | 567 ComputeStrictFunctionInstanceDescriptor(prototype_mode, |
565 arguments_callbacks, | 568 arguments_callbacks, |
566 caller_callbacks); | 569 caller_callbacks); |
567 map->set_instance_descriptors(*descriptors); | 570 map->set_instance_descriptors(*descriptors); |
568 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); | 571 map->set_function_with_prototype(prototype_mode != DONT_ADD_PROTOTYPE); |
569 map->set_prototype(*empty_function); | 572 map->set_prototype(*empty_function); |
570 return map; | 573 return map; |
571 } | 574 } |
572 | 575 |
573 | 576 |
574 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { | 577 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) { |
575 // Create the callbacks arrays for ThrowTypeError functions. | 578 // Create the callbacks arrays for ThrowTypeError functions. |
576 // The get/set callacks are filled in after the maps are created below. | 579 // The get/set callacks are filled in after the maps are created below. |
577 Factory* factory = Isolate::Current()->factory(); | 580 Factory* factory = empty->GetIsolate()->factory(); |
578 Handle<FixedArray> arguments = factory->NewFixedArray(2, TENURED); | 581 Handle<FixedArray> arguments = factory->NewFixedArray(2, TENURED); |
579 Handle<FixedArray> caller = factory->NewFixedArray(2, TENURED); | 582 Handle<FixedArray> caller = factory->NewFixedArray(2, TENURED); |
580 | 583 |
581 // Allocate map for the strict mode function instances. | 584 // Allocate map for the strict mode function instances. |
582 Handle<Map> strict_mode_function_instance_map = | 585 Handle<Map> strict_mode_function_instance_map = |
583 CreateStrictModeFunctionMap( | 586 CreateStrictModeFunctionMap( |
584 ADD_WRITEABLE_PROTOTYPE, empty, arguments, caller); | 587 ADD_WRITEABLE_PROTOTYPE, empty, arguments, caller); |
585 global_context()->set_strict_mode_function_instance_map( | 588 global_context()->set_strict_mode_function_instance_map( |
586 *strict_mode_function_instance_map); | 589 *strict_mode_function_instance_map); |
587 | 590 |
(...skipping 28 matching lines...) Expand all Loading... | |
616 // Complete the callback fixed arrays. | 619 // Complete the callback fixed arrays. |
617 arguments->set(0, *arguments_throw); | 620 arguments->set(0, *arguments_throw); |
618 arguments->set(1, *arguments_throw); | 621 arguments->set(1, *arguments_throw); |
619 caller->set(0, *caller_throw); | 622 caller->set(0, *caller_throw); |
620 caller->set(1, *caller_throw); | 623 caller->set(1, *caller_throw); |
621 } | 624 } |
622 | 625 |
623 | 626 |
624 static void AddToWeakGlobalContextList(Context* context) { | 627 static void AddToWeakGlobalContextList(Context* context) { |
625 ASSERT(context->IsGlobalContext()); | 628 ASSERT(context->IsGlobalContext()); |
626 Heap* heap = Isolate::Current()->heap(); | 629 Heap* heap = context->GetIsolate()->heap(); |
627 #ifdef DEBUG | 630 #ifdef DEBUG |
628 { // NOLINT | 631 { // NOLINT |
629 ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); | 632 ASSERT(context->get(Context::NEXT_CONTEXT_LINK)->IsUndefined()); |
630 // Check that context is not in the list yet. | 633 // Check that context is not in the list yet. |
631 for (Object* current = heap->global_contexts_list(); | 634 for (Object* current = heap->global_contexts_list(); |
632 !current->IsUndefined(); | 635 !current->IsUndefined(); |
633 current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { | 636 current = Context::cast(current)->get(Context::NEXT_CONTEXT_LINK)) { |
634 ASSERT(current != context); | 637 ASSERT(current != context); |
635 } | 638 } |
636 } | 639 } |
637 #endif | 640 #endif |
638 context->set(Context::NEXT_CONTEXT_LINK, heap->global_contexts_list()); | 641 context->set(Context::NEXT_CONTEXT_LINK, heap->global_contexts_list()); |
639 heap->set_global_contexts_list(context); | 642 heap->set_global_contexts_list(context); |
640 } | 643 } |
641 | 644 |
642 | 645 |
643 void Genesis::CreateRoots() { | 646 void Genesis::CreateRoots() { |
644 Isolate* isolate = Isolate::Current(); | |
645 // Allocate the global context FixedArray first and then patch the | 647 // Allocate the global context FixedArray first and then patch the |
646 // closure and extension object later (we need the empty function | 648 // closure and extension object later (we need the empty function |
647 // and the global object, but in order to create those, we need the | 649 // and the global object, but in order to create those, we need the |
648 // global context). | 650 // global context). |
649 global_context_ = Handle<Context>::cast(isolate->global_handles()->Create( | 651 global_context_ = Handle<Context>::cast(isolate()->global_handles()->Create( |
650 *isolate->factory()->NewGlobalContext())); | 652 *factory()->NewGlobalContext())); |
651 AddToWeakGlobalContextList(*global_context_); | 653 AddToWeakGlobalContextList(*global_context_); |
652 isolate->set_context(*global_context()); | 654 isolate()->set_context(*global_context()); |
653 | 655 |
654 // Allocate the message listeners object. | 656 // Allocate the message listeners object. |
655 { | 657 { |
656 v8::NeanderArray listeners; | 658 v8::NeanderArray listeners; |
657 global_context()->set_message_listeners(*listeners.value()); | 659 global_context()->set_message_listeners(*listeners.value()); |
658 } | 660 } |
659 } | 661 } |
660 | 662 |
661 | 663 |
662 Handle<JSGlobalProxy> Genesis::CreateNewGlobals( | 664 Handle<JSGlobalProxy> Genesis::CreateNewGlobals( |
(...skipping 22 matching lines...) Expand all Loading... | |
685 Handle<FunctionTemplateInfo> global_constructor = | 687 Handle<FunctionTemplateInfo> global_constructor = |
686 Handle<FunctionTemplateInfo>( | 688 Handle<FunctionTemplateInfo>( |
687 FunctionTemplateInfo::cast(data->constructor())); | 689 FunctionTemplateInfo::cast(data->constructor())); |
688 Handle<Object> proto_template(global_constructor->prototype_template()); | 690 Handle<Object> proto_template(global_constructor->prototype_template()); |
689 if (!proto_template->IsUndefined()) { | 691 if (!proto_template->IsUndefined()) { |
690 js_global_template = | 692 js_global_template = |
691 Handle<ObjectTemplateInfo>::cast(proto_template); | 693 Handle<ObjectTemplateInfo>::cast(proto_template); |
692 } | 694 } |
693 } | 695 } |
694 | 696 |
695 Isolate* isolate = Isolate::Current(); | |
696 Factory* factory = isolate->factory(); | |
697 Heap* heap = isolate->heap(); | |
698 | |
699 if (js_global_template.is_null()) { | 697 if (js_global_template.is_null()) { |
700 Handle<String> name = Handle<String>(heap->empty_symbol()); | 698 Handle<String> name = Handle<String>(heap()->empty_symbol()); |
701 Handle<Code> code = Handle<Code>(isolate->builtins()->builtin( | 699 Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( |
702 Builtins::kIllegal)); | 700 Builtins::kIllegal)); |
703 js_global_function = | 701 js_global_function = |
704 factory->NewFunction(name, JS_GLOBAL_OBJECT_TYPE, | 702 factory()->NewFunction(name, JS_GLOBAL_OBJECT_TYPE, |
705 JSGlobalObject::kSize, code, true); | 703 JSGlobalObject::kSize, code, true); |
Mads Ager (chromium)
2011/04/06 07:34:15
Indentation is off.
| |
706 // Change the constructor property of the prototype of the | 704 // Change the constructor property of the prototype of the |
707 // hidden global function to refer to the Object function. | 705 // hidden global function to refer to the Object function. |
708 Handle<JSObject> prototype = | 706 Handle<JSObject> prototype = |
709 Handle<JSObject>( | 707 Handle<JSObject>( |
710 JSObject::cast(js_global_function->instance_prototype())); | 708 JSObject::cast(js_global_function->instance_prototype())); |
711 SetLocalPropertyNoThrow( | 709 SetLocalPropertyNoThrow( |
712 prototype, | 710 prototype, |
713 factory->constructor_symbol(), | 711 factory()->constructor_symbol(), |
714 isolate->object_function(), | 712 isolate()->object_function(), |
715 NONE); | 713 NONE); |
716 } else { | 714 } else { |
717 Handle<FunctionTemplateInfo> js_global_constructor( | 715 Handle<FunctionTemplateInfo> js_global_constructor( |
718 FunctionTemplateInfo::cast(js_global_template->constructor())); | 716 FunctionTemplateInfo::cast(js_global_template->constructor())); |
719 js_global_function = | 717 js_global_function = |
720 factory->CreateApiFunction(js_global_constructor, | 718 factory()->CreateApiFunction(js_global_constructor, |
721 factory->InnerGlobalObject); | 719 factory()->InnerGlobalObject); |
722 } | 720 } |
723 | 721 |
724 js_global_function->initial_map()->set_is_hidden_prototype(); | 722 js_global_function->initial_map()->set_is_hidden_prototype(); |
725 Handle<GlobalObject> inner_global = | 723 Handle<GlobalObject> inner_global = |
726 factory->NewGlobalObject(js_global_function); | 724 factory()->NewGlobalObject(js_global_function); |
727 if (inner_global_out != NULL) { | 725 if (inner_global_out != NULL) { |
728 *inner_global_out = inner_global; | 726 *inner_global_out = inner_global; |
729 } | 727 } |
730 | 728 |
731 // Step 2: create or re-initialize the global proxy object. | 729 // Step 2: create or re-initialize the global proxy object. |
732 Handle<JSFunction> global_proxy_function; | 730 Handle<JSFunction> global_proxy_function; |
733 if (global_template.IsEmpty()) { | 731 if (global_template.IsEmpty()) { |
734 Handle<String> name = Handle<String>(heap->empty_symbol()); | 732 Handle<String> name = Handle<String>(heap()->empty_symbol()); |
735 Handle<Code> code = Handle<Code>(isolate->builtins()->builtin( | 733 Handle<Code> code = Handle<Code>(isolate()->builtins()->builtin( |
736 Builtins::kIllegal)); | 734 Builtins::kIllegal)); |
737 global_proxy_function = | 735 global_proxy_function = |
738 factory->NewFunction(name, JS_GLOBAL_PROXY_TYPE, | 736 factory()->NewFunction(name, JS_GLOBAL_PROXY_TYPE, |
739 JSGlobalProxy::kSize, code, true); | 737 JSGlobalProxy::kSize, code, true); |
740 } else { | 738 } else { |
741 Handle<ObjectTemplateInfo> data = | 739 Handle<ObjectTemplateInfo> data = |
742 v8::Utils::OpenHandle(*global_template); | 740 v8::Utils::OpenHandle(*global_template); |
743 Handle<FunctionTemplateInfo> global_constructor( | 741 Handle<FunctionTemplateInfo> global_constructor( |
744 FunctionTemplateInfo::cast(data->constructor())); | 742 FunctionTemplateInfo::cast(data->constructor())); |
745 global_proxy_function = | 743 global_proxy_function = |
746 factory->CreateApiFunction(global_constructor, | 744 factory()->CreateApiFunction(global_constructor, |
747 factory->OuterGlobalObject); | 745 factory()->OuterGlobalObject); |
748 } | 746 } |
749 | 747 |
750 Handle<String> global_name = factory->LookupAsciiSymbol("global"); | 748 Handle<String> global_name = factory()->LookupAsciiSymbol("global"); |
751 global_proxy_function->shared()->set_instance_class_name(*global_name); | 749 global_proxy_function->shared()->set_instance_class_name(*global_name); |
752 global_proxy_function->initial_map()->set_is_access_check_needed(true); | 750 global_proxy_function->initial_map()->set_is_access_check_needed(true); |
753 | 751 |
754 // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects | 752 // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects |
755 // Return the global proxy. | 753 // Return the global proxy. |
756 | 754 |
757 if (global_object.location() != NULL) { | 755 if (global_object.location() != NULL) { |
758 ASSERT(global_object->IsJSGlobalProxy()); | 756 ASSERT(global_object->IsJSGlobalProxy()); |
759 return ReinitializeJSGlobalProxy( | 757 return ReinitializeJSGlobalProxy( |
760 global_proxy_function, | 758 global_proxy_function, |
761 Handle<JSGlobalProxy>::cast(global_object)); | 759 Handle<JSGlobalProxy>::cast(global_object)); |
762 } else { | 760 } else { |
763 return Handle<JSGlobalProxy>::cast( | 761 return Handle<JSGlobalProxy>::cast( |
764 factory->NewJSObject(global_proxy_function, TENURED)); | 762 factory()->NewJSObject(global_proxy_function, TENURED)); |
765 } | 763 } |
766 } | 764 } |
767 | 765 |
768 | 766 |
769 void Genesis::HookUpGlobalProxy(Handle<GlobalObject> inner_global, | 767 void Genesis::HookUpGlobalProxy(Handle<GlobalObject> inner_global, |
770 Handle<JSGlobalProxy> global_proxy) { | 768 Handle<JSGlobalProxy> global_proxy) { |
771 // Set the global context for the global object. | 769 // Set the global context for the global object. |
772 inner_global->set_global_context(*global_context()); | 770 inner_global->set_global_context(*global_context()); |
773 inner_global->set_global_receiver(*global_proxy); | 771 inner_global->set_global_receiver(*global_proxy); |
774 global_proxy->set_context(*global_context()); | 772 global_proxy->set_context(*global_context()); |
775 global_context()->set_global_proxy(*global_proxy); | 773 global_context()->set_global_proxy(*global_proxy); |
776 } | 774 } |
777 | 775 |
778 | 776 |
779 void Genesis::HookUpInnerGlobal(Handle<GlobalObject> inner_global) { | 777 void Genesis::HookUpInnerGlobal(Handle<GlobalObject> inner_global) { |
780 Handle<GlobalObject> inner_global_from_snapshot( | 778 Handle<GlobalObject> inner_global_from_snapshot( |
781 GlobalObject::cast(global_context_->extension())); | 779 GlobalObject::cast(global_context_->extension())); |
782 Handle<JSBuiltinsObject> builtins_global(global_context_->builtins()); | 780 Handle<JSBuiltinsObject> builtins_global(global_context_->builtins()); |
783 global_context_->set_extension(*inner_global); | 781 global_context_->set_extension(*inner_global); |
784 global_context_->set_global(*inner_global); | 782 global_context_->set_global(*inner_global); |
785 global_context_->set_security_token(*inner_global); | 783 global_context_->set_security_token(*inner_global); |
786 static const PropertyAttributes attributes = | 784 static const PropertyAttributes attributes = |
787 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); | 785 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
788 ForceSetProperty(builtins_global, | 786 ForceSetProperty(builtins_global, |
789 FACTORY->LookupAsciiSymbol("global"), | 787 factory()->LookupAsciiSymbol("global"), |
790 inner_global, | 788 inner_global, |
791 attributes); | 789 attributes); |
792 // Setup the reference from the global object to the builtins object. | 790 // Setup the reference from the global object to the builtins object. |
793 JSGlobalObject::cast(*inner_global)->set_builtins(*builtins_global); | 791 JSGlobalObject::cast(*inner_global)->set_builtins(*builtins_global); |
794 TransferNamedProperties(inner_global_from_snapshot, inner_global); | 792 TransferNamedProperties(inner_global_from_snapshot, inner_global); |
795 TransferIndexedProperties(inner_global_from_snapshot, inner_global); | 793 TransferIndexedProperties(inner_global_from_snapshot, inner_global); |
796 } | 794 } |
797 | 795 |
798 | 796 |
799 // This is only called if we are not using snapshots. The equivalent | 797 // This is only called if we are not using snapshots. The equivalent |
800 // work in the snapshot case is done in HookUpInnerGlobal. | 798 // work in the snapshot case is done in HookUpInnerGlobal. |
801 void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, | 799 void Genesis::InitializeGlobal(Handle<GlobalObject> inner_global, |
802 Handle<JSFunction> empty_function) { | 800 Handle<JSFunction> empty_function) { |
803 // --- G l o b a l C o n t e x t --- | 801 // --- G l o b a l C o n t e x t --- |
804 // Use the empty function as closure (no scope info). | 802 // Use the empty function as closure (no scope info). |
805 global_context()->set_closure(*empty_function); | 803 global_context()->set_closure(*empty_function); |
806 global_context()->set_fcontext(*global_context()); | 804 global_context()->set_fcontext(*global_context()); |
807 global_context()->set_previous(NULL); | 805 global_context()->set_previous(NULL); |
808 // Set extension and global object. | 806 // Set extension and global object. |
809 global_context()->set_extension(*inner_global); | 807 global_context()->set_extension(*inner_global); |
810 global_context()->set_global(*inner_global); | 808 global_context()->set_global(*inner_global); |
811 // Security setup: Set the security token of the global object to | 809 // Security setup: Set the security token of the global object to |
812 // its the inner global. This makes the security check between two | 810 // its the inner global. This makes the security check between two |
813 // different contexts fail by default even in case of global | 811 // different contexts fail by default even in case of global |
814 // object reinitialization. | 812 // object reinitialization. |
815 global_context()->set_security_token(*inner_global); | 813 global_context()->set_security_token(*inner_global); |
816 | 814 |
817 Isolate* isolate = Isolate::Current(); | 815 Isolate* isolate = inner_global->GetIsolate(); |
818 Factory* factory = isolate->factory(); | 816 Factory* factory = isolate->factory(); |
819 Heap* heap = isolate->heap(); | 817 Heap* heap = isolate->heap(); |
820 | 818 |
821 Handle<String> object_name = Handle<String>(heap->Object_symbol()); | 819 Handle<String> object_name = Handle<String>(heap->Object_symbol()); |
822 SetLocalPropertyNoThrow(inner_global, object_name, | 820 SetLocalPropertyNoThrow(inner_global, object_name, |
823 isolate->object_function(), DONT_ENUM); | 821 isolate->object_function(), DONT_ENUM); |
824 | 822 |
825 Handle<JSObject> global = Handle<JSObject>(global_context()->global()); | 823 Handle<JSObject> global = Handle<JSObject>(global_context()->global()); |
826 | 824 |
827 // Install global Function object | 825 // Install global Function object |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1157 } | 1155 } |
1158 | 1156 |
1159 // Initialize the out of memory slot. | 1157 // Initialize the out of memory slot. |
1160 global_context()->set_out_of_memory(heap->false_value()); | 1158 global_context()->set_out_of_memory(heap->false_value()); |
1161 | 1159 |
1162 // Initialize the data slot. | 1160 // Initialize the data slot. |
1163 global_context()->set_data(heap->undefined_value()); | 1161 global_context()->set_data(heap->undefined_value()); |
1164 } | 1162 } |
1165 | 1163 |
1166 | 1164 |
1167 bool Genesis::CompileBuiltin(int index) { | 1165 bool Genesis::CompileBuiltin(Isolate* isolate, int index) { |
1168 Vector<const char> name = Natives::GetScriptName(index); | 1166 Vector<const char> name = Natives::GetScriptName(index); |
1169 Handle<String> source_code = | 1167 Handle<String> source_code = |
1170 Isolate::Current()->bootstrapper()->NativesSourceLookup(index); | 1168 isolate->bootstrapper()->NativesSourceLookup(index); |
1171 return CompileNative(name, source_code); | 1169 return CompileNative(name, source_code); |
1172 } | 1170 } |
1173 | 1171 |
1174 | 1172 |
1175 bool Genesis::CompileNative(Vector<const char> name, Handle<String> source) { | 1173 bool Genesis::CompileNative(Vector<const char> name, Handle<String> source) { |
1176 HandleScope scope; | 1174 HandleScope scope; |
1177 Isolate* isolate = Isolate::Current(); | 1175 Isolate* isolate = source->GetIsolate(); |
1178 #ifdef ENABLE_DEBUGGER_SUPPORT | 1176 #ifdef ENABLE_DEBUGGER_SUPPORT |
1179 isolate->debugger()->set_compiling_natives(true); | 1177 isolate->debugger()->set_compiling_natives(true); |
1180 #endif | 1178 #endif |
1181 bool result = CompileScriptCached(name, | 1179 bool result = CompileScriptCached(name, |
1182 source, | 1180 source, |
1183 NULL, | 1181 NULL, |
1184 NULL, | 1182 NULL, |
1185 Handle<Context>(isolate->context()), | 1183 Handle<Context>(isolate->context()), |
1186 true); | 1184 true); |
1187 ASSERT(isolate->has_pending_exception() != result); | 1185 ASSERT(isolate->has_pending_exception() != result); |
1188 if (!result) isolate->clear_pending_exception(); | 1186 if (!result) isolate->clear_pending_exception(); |
1189 #ifdef ENABLE_DEBUGGER_SUPPORT | 1187 #ifdef ENABLE_DEBUGGER_SUPPORT |
1190 isolate->debugger()->set_compiling_natives(false); | 1188 isolate->debugger()->set_compiling_natives(false); |
1191 #endif | 1189 #endif |
1192 return result; | 1190 return result; |
1193 } | 1191 } |
1194 | 1192 |
1195 | 1193 |
1196 bool Genesis::CompileScriptCached(Vector<const char> name, | 1194 bool Genesis::CompileScriptCached(Vector<const char> name, |
1197 Handle<String> source, | 1195 Handle<String> source, |
1198 SourceCodeCache* cache, | 1196 SourceCodeCache* cache, |
1199 v8::Extension* extension, | 1197 v8::Extension* extension, |
1200 Handle<Context> top_context, | 1198 Handle<Context> top_context, |
1201 bool use_runtime_context) { | 1199 bool use_runtime_context) { |
1202 Factory* factory = Isolate::Current()->factory(); | 1200 Factory* factory = source->GetIsolate()->factory(); |
1203 HandleScope scope; | 1201 HandleScope scope; |
1204 Handle<SharedFunctionInfo> function_info; | 1202 Handle<SharedFunctionInfo> function_info; |
1205 | 1203 |
1206 // If we can't find the function in the cache, we compile a new | 1204 // If we can't find the function in the cache, we compile a new |
1207 // function and insert it into the cache. | 1205 // function and insert it into the cache. |
1208 if (cache == NULL || !cache->Lookup(name, &function_info)) { | 1206 if (cache == NULL || !cache->Lookup(name, &function_info)) { |
1209 ASSERT(source->IsAsciiRepresentation()); | 1207 ASSERT(source->IsAsciiRepresentation()); |
1210 Handle<String> script_name = factory->NewStringFromUtf8(name); | 1208 Handle<String> script_name = factory->NewStringFromUtf8(name); |
1211 function_info = Compiler::Compile( | 1209 function_info = Compiler::Compile( |
1212 source, | 1210 source, |
(...skipping 27 matching lines...) Expand all Loading... | |
1240 : top_context->global()); | 1238 : top_context->global()); |
1241 bool has_pending_exception; | 1239 bool has_pending_exception; |
1242 Handle<Object> result = | 1240 Handle<Object> result = |
1243 Execution::Call(fun, receiver, 0, NULL, &has_pending_exception); | 1241 Execution::Call(fun, receiver, 0, NULL, &has_pending_exception); |
1244 if (has_pending_exception) return false; | 1242 if (has_pending_exception) return false; |
1245 return true; | 1243 return true; |
1246 } | 1244 } |
1247 | 1245 |
1248 | 1246 |
1249 #define INSTALL_NATIVE(Type, name, var) \ | 1247 #define INSTALL_NATIVE(Type, name, var) \ |
1250 Handle<String> var##_name = factory->LookupAsciiSymbol(name); \ | 1248 Handle<String> var##_name = factory()->LookupAsciiSymbol(name); \ |
1251 Object* var##_native = \ | 1249 Object* var##_native = \ |
1252 global_context()->builtins()->GetPropertyNoExceptionThrown(*var##_name); \ | 1250 global_context()->builtins()->GetPropertyNoExceptionThrown(*var##_name); \ |
1253 global_context()->set_##var(Type::cast(var##_native)); | 1251 global_context()->set_##var(Type::cast(var##_native)); |
1254 | 1252 |
1255 | 1253 |
1256 void Genesis::InstallNativeFunctions() { | 1254 void Genesis::InstallNativeFunctions() { |
1257 Factory* factory = Isolate::Current()->factory(); | |
1258 HandleScope scope; | 1255 HandleScope scope; |
1259 INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); | 1256 INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); |
1260 INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); | 1257 INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); |
1261 INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); | 1258 INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); |
1262 INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); | 1259 INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); |
1263 INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); | 1260 INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); |
1264 INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); | 1261 INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); |
1265 INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun); | 1262 INSTALL_NATIVE(JSFunction, "ToUint32", to_uint32_fun); |
1266 INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun); | 1263 INSTALL_NATIVE(JSFunction, "ToInt32", to_int32_fun); |
1267 INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun); | 1264 INSTALL_NATIVE(JSFunction, "GlobalEval", global_eval_fun); |
1268 INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun); | 1265 INSTALL_NATIVE(JSFunction, "Instantiate", instantiate_fun); |
1269 INSTALL_NATIVE(JSFunction, "ConfigureTemplateInstance", | 1266 INSTALL_NATIVE(JSFunction, "ConfigureTemplateInstance", |
1270 configure_instance_fun); | 1267 configure_instance_fun); |
1271 INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun); | 1268 INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun); |
1272 INSTALL_NATIVE(JSObject, "functionCache", function_cache); | 1269 INSTALL_NATIVE(JSObject, "functionCache", function_cache); |
1273 } | 1270 } |
1274 | 1271 |
1275 #undef INSTALL_NATIVE | 1272 #undef INSTALL_NATIVE |
1276 | 1273 |
1277 | 1274 |
1278 bool Genesis::InstallNatives() { | 1275 bool Genesis::InstallNatives() { |
1279 HandleScope scope; | 1276 HandleScope scope; |
1280 Isolate* isolate = Isolate::Current(); | |
1281 Factory* factory = isolate->factory(); | |
1282 Heap* heap = isolate->heap(); | |
1283 | 1277 |
1284 // Create a function for the builtins object. Allocate space for the | 1278 // Create a function for the builtins object. Allocate space for the |
1285 // JavaScript builtins, a reference to the builtins object | 1279 // JavaScript builtins, a reference to the builtins object |
1286 // (itself) and a reference to the global_context directly in the object. | 1280 // (itself) and a reference to the global_context directly in the object. |
1287 Handle<Code> code = Handle<Code>( | 1281 Handle<Code> code = Handle<Code>( |
1288 isolate->builtins()->builtin(Builtins::kIllegal)); | 1282 isolate()->builtins()->builtin(Builtins::kIllegal)); |
1289 Handle<JSFunction> builtins_fun = | 1283 Handle<JSFunction> builtins_fun = |
1290 factory->NewFunction(factory->empty_symbol(), JS_BUILTINS_OBJECT_TYPE, | 1284 factory()->NewFunction(factory()->empty_symbol(), |
1291 JSBuiltinsObject::kSize, code, true); | 1285 JS_BUILTINS_OBJECT_TYPE, |
1286 JSBuiltinsObject::kSize, code, true); | |
1292 | 1287 |
1293 Handle<String> name = factory->LookupAsciiSymbol("builtins"); | 1288 Handle<String> name = factory()->LookupAsciiSymbol("builtins"); |
1294 builtins_fun->shared()->set_instance_class_name(*name); | 1289 builtins_fun->shared()->set_instance_class_name(*name); |
1295 | 1290 |
1296 // Allocate the builtins object. | 1291 // Allocate the builtins object. |
1297 Handle<JSBuiltinsObject> builtins = | 1292 Handle<JSBuiltinsObject> builtins = |
1298 Handle<JSBuiltinsObject>::cast(factory->NewGlobalObject(builtins_fun)); | 1293 Handle<JSBuiltinsObject>::cast(factory()->NewGlobalObject(builtins_fun)); |
1299 builtins->set_builtins(*builtins); | 1294 builtins->set_builtins(*builtins); |
1300 builtins->set_global_context(*global_context()); | 1295 builtins->set_global_context(*global_context()); |
1301 builtins->set_global_receiver(*builtins); | 1296 builtins->set_global_receiver(*builtins); |
1302 | 1297 |
1303 // Setup the 'global' properties of the builtins object. The | 1298 // Setup the 'global' properties of the builtins object. The |
1304 // 'global' property that refers to the global object is the only | 1299 // 'global' property that refers to the global object is the only |
1305 // way to get from code running in the builtins context to the | 1300 // way to get from code running in the builtins context to the |
1306 // global object. | 1301 // global object. |
1307 static const PropertyAttributes attributes = | 1302 static const PropertyAttributes attributes = |
1308 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); | 1303 static_cast<PropertyAttributes>(READ_ONLY | DONT_DELETE); |
1309 Handle<String> global_symbol = factory->LookupAsciiSymbol("global"); | 1304 Handle<String> global_symbol = factory()->LookupAsciiSymbol("global"); |
1310 Handle<Object> global_obj(global_context()->global()); | 1305 Handle<Object> global_obj(global_context()->global()); |
1311 SetLocalPropertyNoThrow(builtins, global_symbol, global_obj, attributes); | 1306 SetLocalPropertyNoThrow(builtins, global_symbol, global_obj, attributes); |
1312 | 1307 |
1313 // Setup the reference from the global object to the builtins object. | 1308 // Setup the reference from the global object to the builtins object. |
1314 JSGlobalObject::cast(global_context()->global())->set_builtins(*builtins); | 1309 JSGlobalObject::cast(global_context()->global())->set_builtins(*builtins); |
1315 | 1310 |
1316 // Create a bridge function that has context in the global context. | 1311 // Create a bridge function that has context in the global context. |
1317 Handle<JSFunction> bridge = | 1312 Handle<JSFunction> bridge = |
1318 factory->NewFunction(factory->empty_symbol(), factory->undefined_value()); | 1313 factory()->NewFunction(factory()->empty_symbol(), factory()->undefined_val ue()); |
Mads Ager (chromium)
2011/04/06 07:34:15
Line too long.
| |
1319 ASSERT(bridge->context() == *isolate->global_context()); | 1314 ASSERT(bridge->context() == *isolate()->global_context()); |
1320 | 1315 |
1321 // Allocate the builtins context. | 1316 // Allocate the builtins context. |
1322 Handle<Context> context = | 1317 Handle<Context> context = |
1323 factory->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); | 1318 factory()->NewFunctionContext(Context::MIN_CONTEXT_SLOTS, bridge); |
1324 context->set_global(*builtins); // override builtins global object | 1319 context->set_global(*builtins); // override builtins global object |
1325 | 1320 |
1326 global_context()->set_runtime_context(*context); | 1321 global_context()->set_runtime_context(*context); |
1327 | 1322 |
1328 { // -- S c r i p t | 1323 { // -- S c r i p t |
1329 // Builtin functions for Script. | 1324 // Builtin functions for Script. |
1330 Handle<JSFunction> script_fun = | 1325 Handle<JSFunction> script_fun = |
1331 InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, | 1326 InstallFunction(builtins, "Script", JS_VALUE_TYPE, JSValue::kSize, |
1332 isolate->initial_object_prototype(), | 1327 isolate()->initial_object_prototype(), |
1333 Builtins::kIllegal, false); | 1328 Builtins::kIllegal, false); |
1334 Handle<JSObject> prototype = | 1329 Handle<JSObject> prototype = |
1335 factory->NewJSObject(isolate->object_function(), TENURED); | 1330 factory()->NewJSObject(isolate()->object_function(), TENURED); |
1336 SetPrototype(script_fun, prototype); | 1331 SetPrototype(script_fun, prototype); |
1337 global_context()->set_script_function(*script_fun); | 1332 global_context()->set_script_function(*script_fun); |
1338 | 1333 |
1339 // Add 'source' and 'data' property to scripts. | 1334 // Add 'source' and 'data' property to scripts. |
1340 PropertyAttributes common_attributes = | 1335 PropertyAttributes common_attributes = |
1341 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 1336 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); |
1342 Handle<Proxy> proxy_source = factory->NewProxy(&Accessors::ScriptSource); | 1337 Handle<Proxy> proxy_source = factory()->NewProxy(&Accessors::ScriptSource); |
1343 Handle<DescriptorArray> script_descriptors = | 1338 Handle<DescriptorArray> script_descriptors = |
1344 factory->CopyAppendProxyDescriptor( | 1339 factory()->CopyAppendProxyDescriptor( |
1345 factory->empty_descriptor_array(), | 1340 factory()->empty_descriptor_array(), |
1346 factory->LookupAsciiSymbol("source"), | 1341 factory()->LookupAsciiSymbol("source"), |
1347 proxy_source, | 1342 proxy_source, |
1348 common_attributes); | 1343 common_attributes); |
1349 Handle<Proxy> proxy_name = factory->NewProxy(&Accessors::ScriptName); | 1344 Handle<Proxy> proxy_name = factory()->NewProxy(&Accessors::ScriptName); |
1350 script_descriptors = | 1345 script_descriptors = |
1351 factory->CopyAppendProxyDescriptor( | 1346 factory()->CopyAppendProxyDescriptor( |
1352 script_descriptors, | 1347 script_descriptors, |
1353 factory->LookupAsciiSymbol("name"), | 1348 factory()->LookupAsciiSymbol("name"), |
1354 proxy_name, | 1349 proxy_name, |
1355 common_attributes); | 1350 common_attributes); |
1356 Handle<Proxy> proxy_id = factory->NewProxy(&Accessors::ScriptId); | 1351 Handle<Proxy> proxy_id = factory()->NewProxy(&Accessors::ScriptId); |
1357 script_descriptors = | 1352 script_descriptors = |
1358 factory->CopyAppendProxyDescriptor( | 1353 factory()->CopyAppendProxyDescriptor( |
1359 script_descriptors, | 1354 script_descriptors, |
1360 factory->LookupAsciiSymbol("id"), | 1355 factory()->LookupAsciiSymbol("id"), |
1361 proxy_id, | 1356 proxy_id, |
1362 common_attributes); | 1357 common_attributes); |
1363 Handle<Proxy> proxy_line_offset = | 1358 Handle<Proxy> proxy_line_offset = |
1364 factory->NewProxy(&Accessors::ScriptLineOffset); | 1359 factory()->NewProxy(&Accessors::ScriptLineOffset); |
1365 script_descriptors = | 1360 script_descriptors = |
1366 factory->CopyAppendProxyDescriptor( | 1361 factory()->CopyAppendProxyDescriptor( |
1367 script_descriptors, | 1362 script_descriptors, |
1368 factory->LookupAsciiSymbol("line_offset"), | 1363 factory()->LookupAsciiSymbol("line_offset"), |
1369 proxy_line_offset, | 1364 proxy_line_offset, |
1370 common_attributes); | 1365 common_attributes); |
1371 Handle<Proxy> proxy_column_offset = | 1366 Handle<Proxy> proxy_column_offset = |
1372 factory->NewProxy(&Accessors::ScriptColumnOffset); | 1367 factory()->NewProxy(&Accessors::ScriptColumnOffset); |
1373 script_descriptors = | 1368 script_descriptors = |
1374 factory->CopyAppendProxyDescriptor( | 1369 factory()->CopyAppendProxyDescriptor( |
1375 script_descriptors, | 1370 script_descriptors, |
1376 factory->LookupAsciiSymbol("column_offset"), | 1371 factory()->LookupAsciiSymbol("column_offset"), |
1377 proxy_column_offset, | 1372 proxy_column_offset, |
1378 common_attributes); | 1373 common_attributes); |
1379 Handle<Proxy> proxy_data = factory->NewProxy(&Accessors::ScriptData); | 1374 Handle<Proxy> proxy_data = factory()->NewProxy(&Accessors::ScriptData); |
1380 script_descriptors = | 1375 script_descriptors = |
1381 factory->CopyAppendProxyDescriptor( | 1376 factory()->CopyAppendProxyDescriptor( |
1382 script_descriptors, | 1377 script_descriptors, |
1383 factory->LookupAsciiSymbol("data"), | 1378 factory()->LookupAsciiSymbol("data"), |
1384 proxy_data, | 1379 proxy_data, |
1385 common_attributes); | 1380 common_attributes); |
1386 Handle<Proxy> proxy_type = factory->NewProxy(&Accessors::ScriptType); | 1381 Handle<Proxy> proxy_type = factory()->NewProxy(&Accessors::ScriptType); |
1387 script_descriptors = | 1382 script_descriptors = |
1388 factory->CopyAppendProxyDescriptor( | 1383 factory()->CopyAppendProxyDescriptor( |
1389 script_descriptors, | 1384 script_descriptors, |
1390 factory->LookupAsciiSymbol("type"), | 1385 factory()->LookupAsciiSymbol("type"), |
1391 proxy_type, | 1386 proxy_type, |
1392 common_attributes); | 1387 common_attributes); |
1393 Handle<Proxy> proxy_compilation_type = | 1388 Handle<Proxy> proxy_compilation_type = |
1394 factory->NewProxy(&Accessors::ScriptCompilationType); | 1389 factory()->NewProxy(&Accessors::ScriptCompilationType); |
1395 script_descriptors = | 1390 script_descriptors = |
1396 factory->CopyAppendProxyDescriptor( | 1391 factory()->CopyAppendProxyDescriptor( |
1397 script_descriptors, | 1392 script_descriptors, |
1398 factory->LookupAsciiSymbol("compilation_type"), | 1393 factory()->LookupAsciiSymbol("compilation_type"), |
1399 proxy_compilation_type, | 1394 proxy_compilation_type, |
1400 common_attributes); | 1395 common_attributes); |
1401 Handle<Proxy> proxy_line_ends = | 1396 Handle<Proxy> proxy_line_ends = |
1402 factory->NewProxy(&Accessors::ScriptLineEnds); | 1397 factory()->NewProxy(&Accessors::ScriptLineEnds); |
1403 script_descriptors = | 1398 script_descriptors = |
1404 factory->CopyAppendProxyDescriptor( | 1399 factory()->CopyAppendProxyDescriptor( |
1405 script_descriptors, | 1400 script_descriptors, |
1406 factory->LookupAsciiSymbol("line_ends"), | 1401 factory()->LookupAsciiSymbol("line_ends"), |
1407 proxy_line_ends, | 1402 proxy_line_ends, |
1408 common_attributes); | 1403 common_attributes); |
1409 Handle<Proxy> proxy_context_data = | 1404 Handle<Proxy> proxy_context_data = |
1410 factory->NewProxy(&Accessors::ScriptContextData); | 1405 factory()->NewProxy(&Accessors::ScriptContextData); |
1411 script_descriptors = | 1406 script_descriptors = |
1412 factory->CopyAppendProxyDescriptor( | 1407 factory()->CopyAppendProxyDescriptor( |
1413 script_descriptors, | 1408 script_descriptors, |
1414 factory->LookupAsciiSymbol("context_data"), | 1409 factory()->LookupAsciiSymbol("context_data"), |
1415 proxy_context_data, | 1410 proxy_context_data, |
1416 common_attributes); | 1411 common_attributes); |
1417 Handle<Proxy> proxy_eval_from_script = | 1412 Handle<Proxy> proxy_eval_from_script = |
1418 factory->NewProxy(&Accessors::ScriptEvalFromScript); | 1413 factory()->NewProxy(&Accessors::ScriptEvalFromScript); |
1419 script_descriptors = | 1414 script_descriptors = |
1420 factory->CopyAppendProxyDescriptor( | 1415 factory()->CopyAppendProxyDescriptor( |
1421 script_descriptors, | 1416 script_descriptors, |
1422 factory->LookupAsciiSymbol("eval_from_script"), | 1417 factory()->LookupAsciiSymbol("eval_from_script"), |
1423 proxy_eval_from_script, | 1418 proxy_eval_from_script, |
1424 common_attributes); | 1419 common_attributes); |
1425 Handle<Proxy> proxy_eval_from_script_position = | 1420 Handle<Proxy> proxy_eval_from_script_position = |
1426 factory->NewProxy(&Accessors::ScriptEvalFromScriptPosition); | 1421 factory()->NewProxy(&Accessors::ScriptEvalFromScriptPosition); |
1427 script_descriptors = | 1422 script_descriptors = |
1428 factory->CopyAppendProxyDescriptor( | 1423 factory()->CopyAppendProxyDescriptor( |
1429 script_descriptors, | 1424 script_descriptors, |
1430 factory->LookupAsciiSymbol("eval_from_script_position"), | 1425 factory()->LookupAsciiSymbol("eval_from_script_position"), |
1431 proxy_eval_from_script_position, | 1426 proxy_eval_from_script_position, |
1432 common_attributes); | 1427 common_attributes); |
1433 Handle<Proxy> proxy_eval_from_function_name = | 1428 Handle<Proxy> proxy_eval_from_function_name = |
1434 factory->NewProxy(&Accessors::ScriptEvalFromFunctionName); | 1429 factory()->NewProxy(&Accessors::ScriptEvalFromFunctionName); |
1435 script_descriptors = | 1430 script_descriptors = |
1436 factory->CopyAppendProxyDescriptor( | 1431 factory()->CopyAppendProxyDescriptor( |
1437 script_descriptors, | 1432 script_descriptors, |
1438 factory->LookupAsciiSymbol("eval_from_function_name"), | 1433 factory()->LookupAsciiSymbol("eval_from_function_name"), |
1439 proxy_eval_from_function_name, | 1434 proxy_eval_from_function_name, |
1440 common_attributes); | 1435 common_attributes); |
1441 | 1436 |
1442 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); | 1437 Handle<Map> script_map = Handle<Map>(script_fun->initial_map()); |
1443 script_map->set_instance_descriptors(*script_descriptors); | 1438 script_map->set_instance_descriptors(*script_descriptors); |
1444 | 1439 |
1445 // Allocate the empty script. | 1440 // Allocate the empty script. |
1446 Handle<Script> script = factory->NewScript(factory->empty_string()); | 1441 Handle<Script> script = factory()->NewScript(factory()->empty_string()); |
1447 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); | 1442 script->set_type(Smi::FromInt(Script::TYPE_NATIVE)); |
1448 heap->public_set_empty_script(*script); | 1443 heap()->public_set_empty_script(*script); |
1449 } | 1444 } |
1450 { | 1445 { |
1451 // Builtin function for OpaqueReference -- a JSValue-based object, | 1446 // Builtin function for OpaqueReference -- a JSValue-based object, |
1452 // that keeps its field isolated from JavaScript code. It may store | 1447 // that keeps its field isolate()d from JavaScript code. It may store |
Mads Ager (chromium)
2011/04/06 07:34:15
Whoops. :)
| |
1453 // objects, that JavaScript code may not access. | 1448 // objects, that JavaScript code may not access. |
1454 Handle<JSFunction> opaque_reference_fun = | 1449 Handle<JSFunction> opaque_reference_fun = |
1455 InstallFunction(builtins, "OpaqueReference", JS_VALUE_TYPE, | 1450 InstallFunction(builtins, "OpaqueReference", JS_VALUE_TYPE, |
1456 JSValue::kSize, | 1451 JSValue::kSize, |
1457 isolate->initial_object_prototype(), | 1452 isolate()->initial_object_prototype(), |
1458 Builtins::kIllegal, false); | 1453 Builtins::kIllegal, false); |
1459 Handle<JSObject> prototype = | 1454 Handle<JSObject> prototype = |
1460 factory->NewJSObject(isolate->object_function(), TENURED); | 1455 factory()->NewJSObject(isolate()->object_function(), TENURED); |
1461 SetPrototype(opaque_reference_fun, prototype); | 1456 SetPrototype(opaque_reference_fun, prototype); |
1462 global_context()->set_opaque_reference_function(*opaque_reference_fun); | 1457 global_context()->set_opaque_reference_function(*opaque_reference_fun); |
1463 } | 1458 } |
1464 | 1459 |
1465 { // --- I n t e r n a l A r r a y --- | 1460 { // --- I n t e r n a l A r r a y --- |
1466 // An array constructor on the builtins object that works like | 1461 // An array constructor on the builtins object that works like |
1467 // the public Array constructor, except that its prototype | 1462 // the public Array constructor, except that its prototype |
1468 // doesn't inherit from Object.prototype. | 1463 // doesn't inherit from Object.prototype. |
1469 // To be used only for internal work by builtins. Instances | 1464 // To be used only for internal work by builtins. Instances |
1470 // must not be leaked to user code. | 1465 // must not be leaked to user code. |
1471 // Only works correctly when called as a constructor. The normal | 1466 // Only works correctly when called as a constructor. The normal |
1472 // Array code uses Array.prototype as prototype when called as | 1467 // Array code uses Array.prototype as prototype when called as |
1473 // a function. | 1468 // a function. |
1474 Handle<JSFunction> array_function = | 1469 Handle<JSFunction> array_function = |
1475 InstallFunction(builtins, | 1470 InstallFunction(builtins, |
1476 "InternalArray", | 1471 "InternalArray", |
1477 JS_ARRAY_TYPE, | 1472 JS_ARRAY_TYPE, |
1478 JSArray::kSize, | 1473 JSArray::kSize, |
1479 isolate->initial_object_prototype(), | 1474 isolate()->initial_object_prototype(), |
1480 Builtins::kArrayCode, | 1475 Builtins::kArrayCode, |
1481 true); | 1476 true); |
1482 Handle<JSObject> prototype = | 1477 Handle<JSObject> prototype = |
1483 factory->NewJSObject(isolate->object_function(), TENURED); | 1478 factory()->NewJSObject(isolate()->object_function(), TENURED); |
1484 SetPrototype(array_function, prototype); | 1479 SetPrototype(array_function, prototype); |
1485 | 1480 |
1486 array_function->shared()->set_construct_stub( | 1481 array_function->shared()->set_construct_stub( |
1487 isolate->builtins()->builtin(Builtins::kArrayConstructCode)); | 1482 isolate()->builtins()->builtin(Builtins::kArrayConstructCode)); |
1488 array_function->shared()->DontAdaptArguments(); | 1483 array_function->shared()->DontAdaptArguments(); |
1489 | 1484 |
1490 // Make "length" magic on instances. | 1485 // Make "length" magic on instances. |
1491 Handle<DescriptorArray> array_descriptors = | 1486 Handle<DescriptorArray> array_descriptors = |
1492 factory->CopyAppendProxyDescriptor( | 1487 factory()->CopyAppendProxyDescriptor( |
1493 factory->empty_descriptor_array(), | 1488 factory()->empty_descriptor_array(), |
1494 factory->length_symbol(), | 1489 factory()->length_symbol(), |
1495 factory->NewProxy(&Accessors::ArrayLength), | 1490 factory()->NewProxy(&Accessors::ArrayLength), |
1496 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); | 1491 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE)); |
1497 | 1492 |
1498 array_function->initial_map()->set_instance_descriptors( | 1493 array_function->initial_map()->set_instance_descriptors( |
1499 *array_descriptors); | 1494 *array_descriptors); |
1500 } | 1495 } |
1501 | 1496 |
1502 if (FLAG_disable_native_files) { | 1497 if (FLAG_disable_native_files) { |
1503 PrintF("Warning: Running without installed natives!\n"); | 1498 PrintF("Warning: Running without installed natives!\n"); |
1504 return true; | 1499 return true; |
1505 } | 1500 } |
1506 | 1501 |
1507 // Install natives. | 1502 // Install natives. |
1508 for (int i = Natives::GetDebuggerCount(); | 1503 for (int i = Natives::GetDebuggerCount(); |
1509 i < Natives::GetBuiltinsCount(); | 1504 i < Natives::GetBuiltinsCount(); |
1510 i++) { | 1505 i++) { |
1511 Vector<const char> name = Natives::GetScriptName(i); | 1506 Vector<const char> name = Natives::GetScriptName(i); |
1512 if (!CompileBuiltin(i)) return false; | 1507 if (!CompileBuiltin(isolate(), i)) return false; |
1513 // TODO(ager): We really only need to install the JS builtin | 1508 // TODO(ager): We really only need to install the JS builtin |
1514 // functions on the builtins object after compiling and running | 1509 // functions on the builtins object after compiling and running |
1515 // runtime.js. | 1510 // runtime.js. |
1516 if (!InstallJSBuiltins(builtins)) return false; | 1511 if (!InstallJSBuiltins(builtins)) return false; |
1517 } | 1512 } |
1518 | 1513 |
1519 InstallNativeFunctions(); | 1514 InstallNativeFunctions(); |
1520 | 1515 |
1521 // Store the map for the string prototype after the natives has been compiled | 1516 // Store the map for the string prototype after the natives has been compiled |
1522 // and the String function has been setup. | 1517 // and the String function has been setup. |
1523 Handle<JSFunction> string_function(global_context()->string_function()); | 1518 Handle<JSFunction> string_function(global_context()->string_function()); |
1524 ASSERT(JSObject::cast( | 1519 ASSERT(JSObject::cast( |
1525 string_function->initial_map()->prototype())->HasFastProperties()); | 1520 string_function->initial_map()->prototype())->HasFastProperties()); |
1526 global_context()->set_string_function_prototype_map( | 1521 global_context()->set_string_function_prototype_map( |
1527 HeapObject::cast(string_function->initial_map()->prototype())->map()); | 1522 HeapObject::cast(string_function->initial_map()->prototype())->map()); |
1528 | 1523 |
1529 InstallBuiltinFunctionIds(); | 1524 InstallBuiltinFunctionIds(); |
1530 | 1525 |
1531 // Install Function.prototype.call and apply. | 1526 // Install Function.prototype.call and apply. |
1532 { Handle<String> key = factory->function_class_symbol(); | 1527 { Handle<String> key = factory()->function_class_symbol(); |
1533 Handle<JSFunction> function = | 1528 Handle<JSFunction> function = |
1534 Handle<JSFunction>::cast(GetProperty(isolate->global(), key)); | 1529 Handle<JSFunction>::cast(GetProperty(isolate()->global(), key)); |
1535 Handle<JSObject> proto = | 1530 Handle<JSObject> proto = |
1536 Handle<JSObject>(JSObject::cast(function->instance_prototype())); | 1531 Handle<JSObject>(JSObject::cast(function->instance_prototype())); |
1537 | 1532 |
1538 // Install the call and the apply functions. | 1533 // Install the call and the apply functions. |
1539 Handle<JSFunction> call = | 1534 Handle<JSFunction> call = |
1540 InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize, | 1535 InstallFunction(proto, "call", JS_OBJECT_TYPE, JSObject::kHeaderSize, |
1541 Handle<JSObject>::null(), | 1536 Handle<JSObject>::null(), |
1542 Builtins::kFunctionCall, | 1537 Builtins::kFunctionCall, |
1543 false); | 1538 false); |
1544 Handle<JSFunction> apply = | 1539 Handle<JSFunction> apply = |
(...skipping 21 matching lines...) Expand all Loading... | |
1566 { | 1561 { |
1567 // RegExpResult initial map. | 1562 // RegExpResult initial map. |
1568 | 1563 |
1569 // Find global.Array.prototype to inherit from. | 1564 // Find global.Array.prototype to inherit from. |
1570 Handle<JSFunction> array_constructor(global_context()->array_function()); | 1565 Handle<JSFunction> array_constructor(global_context()->array_function()); |
1571 Handle<JSObject> array_prototype( | 1566 Handle<JSObject> array_prototype( |
1572 JSObject::cast(array_constructor->instance_prototype())); | 1567 JSObject::cast(array_constructor->instance_prototype())); |
1573 | 1568 |
1574 // Add initial map. | 1569 // Add initial map. |
1575 Handle<Map> initial_map = | 1570 Handle<Map> initial_map = |
1576 factory->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); | 1571 factory()->NewMap(JS_ARRAY_TYPE, JSRegExpResult::kSize); |
1577 initial_map->set_constructor(*array_constructor); | 1572 initial_map->set_constructor(*array_constructor); |
1578 | 1573 |
1579 // Set prototype on map. | 1574 // Set prototype on map. |
1580 initial_map->set_non_instance_prototype(false); | 1575 initial_map->set_non_instance_prototype(false); |
1581 initial_map->set_prototype(*array_prototype); | 1576 initial_map->set_prototype(*array_prototype); |
1582 | 1577 |
1583 // Update map with length accessor from Array and add "index" and "input". | 1578 // Update map with length accessor from Array and add "index" and "input". |
1584 Handle<Map> array_map(global_context()->js_array_map()); | 1579 Handle<Map> array_map(global_context()->js_array_map()); |
1585 Handle<DescriptorArray> array_descriptors( | 1580 Handle<DescriptorArray> array_descriptors( |
1586 array_map->instance_descriptors()); | 1581 array_map->instance_descriptors()); |
1587 ASSERT_EQ(1, array_descriptors->number_of_descriptors()); | 1582 ASSERT_EQ(1, array_descriptors->number_of_descriptors()); |
1588 | 1583 |
1589 Handle<DescriptorArray> reresult_descriptors = | 1584 Handle<DescriptorArray> reresult_descriptors = |
1590 factory->NewDescriptorArray(3); | 1585 factory()->NewDescriptorArray(3); |
1591 | 1586 |
1592 reresult_descriptors->CopyFrom(0, *array_descriptors, 0); | 1587 reresult_descriptors->CopyFrom(0, *array_descriptors, 0); |
1593 | 1588 |
1594 int enum_index = 0; | 1589 int enum_index = 0; |
1595 { | 1590 { |
1596 FieldDescriptor index_field(heap->index_symbol(), | 1591 FieldDescriptor index_field(heap()->index_symbol(), |
1597 JSRegExpResult::kIndexIndex, | 1592 JSRegExpResult::kIndexIndex, |
1598 NONE, | 1593 NONE, |
1599 enum_index++); | 1594 enum_index++); |
1600 reresult_descriptors->Set(1, &index_field); | 1595 reresult_descriptors->Set(1, &index_field); |
1601 } | 1596 } |
1602 | 1597 |
1603 { | 1598 { |
1604 FieldDescriptor input_field(heap->input_symbol(), | 1599 FieldDescriptor input_field(heap()->input_symbol(), |
1605 JSRegExpResult::kInputIndex, | 1600 JSRegExpResult::kInputIndex, |
1606 NONE, | 1601 NONE, |
1607 enum_index++); | 1602 enum_index++); |
1608 reresult_descriptors->Set(2, &input_field); | 1603 reresult_descriptors->Set(2, &input_field); |
1609 } | 1604 } |
1610 reresult_descriptors->Sort(); | 1605 reresult_descriptors->Sort(); |
1611 | 1606 |
1612 initial_map->set_inobject_properties(2); | 1607 initial_map->set_inobject_properties(2); |
1613 initial_map->set_pre_allocated_property_fields(2); | 1608 initial_map->set_pre_allocated_property_fields(2); |
1614 initial_map->set_unused_property_fields(0); | 1609 initial_map->set_unused_property_fields(0); |
1615 initial_map->set_instance_descriptors(*reresult_descriptors); | 1610 initial_map->set_instance_descriptors(*reresult_descriptors); |
1616 | 1611 |
1617 global_context()->set_regexp_result_map(*initial_map); | 1612 global_context()->set_regexp_result_map(*initial_map); |
1618 } | 1613 } |
1619 | 1614 |
1620 | 1615 |
1621 #ifdef DEBUG | 1616 #ifdef DEBUG |
1622 builtins->Verify(); | 1617 builtins->Verify(); |
1623 #endif | 1618 #endif |
1624 | 1619 |
1625 return true; | 1620 return true; |
1626 } | 1621 } |
1627 | 1622 |
1628 | 1623 |
1629 static Handle<JSObject> ResolveBuiltinIdHolder( | 1624 static Handle<JSObject> ResolveBuiltinIdHolder( |
1630 Handle<Context> global_context, | 1625 Handle<Context> global_context, |
1631 const char* holder_expr) { | 1626 const char* holder_expr) { |
1632 Factory* factory = Isolate::Current()->factory(); | 1627 Factory* factory = global_context->GetIsolate()->factory(); |
1633 Handle<GlobalObject> global(global_context->global()); | 1628 Handle<GlobalObject> global(global_context->global()); |
1634 const char* period_pos = strchr(holder_expr, '.'); | 1629 const char* period_pos = strchr(holder_expr, '.'); |
1635 if (period_pos == NULL) { | 1630 if (period_pos == NULL) { |
1636 return Handle<JSObject>::cast( | 1631 return Handle<JSObject>::cast( |
1637 GetProperty(global, factory->LookupAsciiSymbol(holder_expr))); | 1632 GetProperty(global, factory->LookupAsciiSymbol(holder_expr))); |
1638 } | 1633 } |
1639 ASSERT_EQ(".prototype", period_pos); | 1634 ASSERT_EQ(".prototype", period_pos); |
1640 Vector<const char> property(holder_expr, | 1635 Vector<const char> property(holder_expr, |
1641 static_cast<int>(period_pos - holder_expr)); | 1636 static_cast<int>(period_pos - holder_expr)); |
1642 Handle<JSFunction> function = Handle<JSFunction>::cast( | 1637 Handle<JSFunction> function = Handle<JSFunction>::cast( |
1643 GetProperty(global, factory->LookupSymbol(property))); | 1638 GetProperty(global, factory->LookupSymbol(property))); |
1644 return Handle<JSObject>(JSObject::cast(function->prototype())); | 1639 return Handle<JSObject>(JSObject::cast(function->prototype())); |
1645 } | 1640 } |
1646 | 1641 |
1647 | 1642 |
1648 static void InstallBuiltinFunctionId(Handle<JSObject> holder, | 1643 static void InstallBuiltinFunctionId(Handle<JSObject> holder, |
1649 const char* function_name, | 1644 const char* function_name, |
1650 BuiltinFunctionId id) { | 1645 BuiltinFunctionId id) { |
1651 Handle<String> name = FACTORY->LookupAsciiSymbol(function_name); | 1646 Factory* factory = holder->GetIsolate()->factory(); |
1647 Handle<String> name = factory->LookupAsciiSymbol(function_name); | |
1652 Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); | 1648 Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); |
1653 Handle<JSFunction> function(JSFunction::cast(function_object)); | 1649 Handle<JSFunction> function(JSFunction::cast(function_object)); |
1654 function->shared()->set_function_data(Smi::FromInt(id)); | 1650 function->shared()->set_function_data(Smi::FromInt(id)); |
1655 } | 1651 } |
1656 | 1652 |
1657 | 1653 |
1658 void Genesis::InstallBuiltinFunctionIds() { | 1654 void Genesis::InstallBuiltinFunctionIds() { |
1659 HandleScope scope; | 1655 HandleScope scope; |
1660 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ | 1656 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ |
1661 { \ | 1657 { \ |
1662 Handle<JSObject> holder = ResolveBuiltinIdHolder( \ | 1658 Handle<JSObject> holder = ResolveBuiltinIdHolder( \ |
1663 global_context(), #holder_expr); \ | 1659 global_context(), #holder_expr); \ |
1664 BuiltinFunctionId id = k##name; \ | 1660 BuiltinFunctionId id = k##name; \ |
1665 InstallBuiltinFunctionId(holder, #fun_name, id); \ | 1661 InstallBuiltinFunctionId(holder, #fun_name, id); \ |
1666 } | 1662 } |
1667 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) | 1663 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) |
1668 #undef INSTALL_BUILTIN_ID | 1664 #undef INSTALL_BUILTIN_ID |
1669 } | 1665 } |
1670 | 1666 |
1671 | 1667 |
1672 // Do not forget to update macros.py with named constant | 1668 // Do not forget to update macros.py with named constant |
1673 // of cache id. | 1669 // of cache id. |
1674 #define JSFUNCTION_RESULT_CACHE_LIST(F) \ | 1670 #define JSFUNCTION_RESULT_CACHE_LIST(F) \ |
1675 F(16, global_context()->regexp_function()) | 1671 F(16, global_context()->regexp_function()) |
1676 | 1672 |
1677 | 1673 |
1678 static FixedArray* CreateCache(int size, JSFunction* factory) { | 1674 static FixedArray* CreateCache(int size, JSFunction* factory_function) { |
1675 Factory* factory = factory_function->GetIsolate()->factory(); | |
1679 // Caches are supposed to live for a long time, allocate in old space. | 1676 // Caches are supposed to live for a long time, allocate in old space. |
1680 int array_size = JSFunctionResultCache::kEntriesIndex + 2 * size; | 1677 int array_size = JSFunctionResultCache::kEntriesIndex + 2 * size; |
1681 // Cannot use cast as object is not fully initialized yet. | 1678 // Cannot use cast as object is not fully initialized yet. |
1682 JSFunctionResultCache* cache = reinterpret_cast<JSFunctionResultCache*>( | 1679 JSFunctionResultCache* cache = reinterpret_cast<JSFunctionResultCache*>( |
1683 *FACTORY->NewFixedArrayWithHoles(array_size, TENURED)); | 1680 *factory->NewFixedArrayWithHoles(array_size, TENURED)); |
1684 cache->set(JSFunctionResultCache::kFactoryIndex, factory); | 1681 cache->set(JSFunctionResultCache::kFactoryIndex, factory_function); |
1685 cache->MakeZeroSize(); | 1682 cache->MakeZeroSize(); |
1686 return cache; | 1683 return cache; |
1687 } | 1684 } |
1688 | 1685 |
1689 | 1686 |
1690 void Genesis::InstallJSFunctionResultCaches() { | 1687 void Genesis::InstallJSFunctionResultCaches() { |
1691 const int kNumberOfCaches = 0 + | 1688 const int kNumberOfCaches = 0 + |
1692 #define F(size, func) + 1 | 1689 #define F(size, func) + 1 |
1693 JSFUNCTION_RESULT_CACHE_LIST(F) | 1690 JSFUNCTION_RESULT_CACHE_LIST(F) |
1694 #undef F | 1691 #undef F |
(...skipping 18 matching lines...) Expand all Loading... | |
1713 | 1710 |
1714 void Genesis::InitializeNormalizedMapCaches() { | 1711 void Genesis::InitializeNormalizedMapCaches() { |
1715 Handle<FixedArray> array( | 1712 Handle<FixedArray> array( |
1716 FACTORY->NewFixedArray(NormalizedMapCache::kEntries, TENURED)); | 1713 FACTORY->NewFixedArray(NormalizedMapCache::kEntries, TENURED)); |
1717 global_context()->set_normalized_map_cache(NormalizedMapCache::cast(*array)); | 1714 global_context()->set_normalized_map_cache(NormalizedMapCache::cast(*array)); |
1718 } | 1715 } |
1719 | 1716 |
1720 | 1717 |
1721 bool Bootstrapper::InstallExtensions(Handle<Context> global_context, | 1718 bool Bootstrapper::InstallExtensions(Handle<Context> global_context, |
1722 v8::ExtensionConfiguration* extensions) { | 1719 v8::ExtensionConfiguration* extensions) { |
1723 Isolate* isolate = Isolate::Current(); | 1720 Isolate* isolate = global_context->GetIsolate(); |
1724 BootstrapperActive active; | 1721 BootstrapperActive active; |
1725 SaveContext saved_context(isolate); | 1722 SaveContext saved_context(isolate); |
1726 isolate->set_context(*global_context); | 1723 isolate->set_context(*global_context); |
1727 if (!Genesis::InstallExtensions(global_context, extensions)) return false; | 1724 if (!Genesis::InstallExtensions(global_context, extensions)) return false; |
1728 Genesis::InstallSpecialObjects(global_context); | 1725 Genesis::InstallSpecialObjects(global_context); |
1729 return true; | 1726 return true; |
1730 } | 1727 } |
1731 | 1728 |
1732 | 1729 |
1733 void Genesis::InstallSpecialObjects(Handle<Context> global_context) { | 1730 void Genesis::InstallSpecialObjects(Handle<Context> global_context) { |
1734 Factory* factory = Isolate::Current()->factory(); | 1731 Factory* factory = global_context->GetIsolate()->factory(); |
1735 HandleScope scope; | 1732 HandleScope scope; |
1736 Handle<JSGlobalObject> js_global( | 1733 Handle<JSGlobalObject> js_global( |
1737 JSGlobalObject::cast(global_context->global())); | 1734 JSGlobalObject::cast(global_context->global())); |
1738 // Expose the natives in global if a name for it is specified. | 1735 // Expose the natives in global if a name for it is specified. |
1739 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { | 1736 if (FLAG_expose_natives_as != NULL && strlen(FLAG_expose_natives_as) != 0) { |
1740 Handle<String> natives_string = | 1737 Handle<String> natives_string = |
1741 factory->LookupAsciiSymbol(FLAG_expose_natives_as); | 1738 factory->LookupAsciiSymbol(FLAG_expose_natives_as); |
1742 SetLocalPropertyNoThrow(js_global, natives_string, | 1739 SetLocalPropertyNoThrow(js_global, natives_string, |
1743 Handle<JSObject>(js_global->builtins()), DONT_ENUM); | 1740 Handle<JSObject>(js_global->builtins()), DONT_ENUM); |
1744 } | 1741 } |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1860 if (!result) { | 1857 if (!result) { |
1861 isolate->clear_pending_exception(); | 1858 isolate->clear_pending_exception(); |
1862 } | 1859 } |
1863 current->set_state(v8::INSTALLED); | 1860 current->set_state(v8::INSTALLED); |
1864 return result; | 1861 return result; |
1865 } | 1862 } |
1866 | 1863 |
1867 | 1864 |
1868 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { | 1865 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { |
1869 HandleScope scope; | 1866 HandleScope scope; |
1867 Factory* factory = builtins->GetIsolate()->factory(); | |
1870 for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { | 1868 for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { |
1871 Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); | 1869 Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); |
1872 Handle<String> name = FACTORY->LookupAsciiSymbol(Builtins::GetName(id)); | 1870 Handle<String> name = factory->LookupAsciiSymbol(Builtins::GetName(id)); |
1873 Object* function_object = builtins->GetPropertyNoExceptionThrown(*name); | 1871 Object* function_object = builtins->GetPropertyNoExceptionThrown(*name); |
1874 Handle<JSFunction> function | 1872 Handle<JSFunction> function |
1875 = Handle<JSFunction>(JSFunction::cast(function_object)); | 1873 = Handle<JSFunction>(JSFunction::cast(function_object)); |
1876 builtins->set_javascript_builtin(id, *function); | 1874 builtins->set_javascript_builtin(id, *function); |
1877 Handle<SharedFunctionInfo> shared | 1875 Handle<SharedFunctionInfo> shared |
1878 = Handle<SharedFunctionInfo>(function->shared()); | 1876 = Handle<SharedFunctionInfo>(function->shared()); |
1879 if (!EnsureCompiled(shared, CLEAR_EXCEPTION)) return false; | 1877 if (!EnsureCompiled(shared, CLEAR_EXCEPTION)) return false; |
1880 // Set the code object on the function object. | 1878 // Set the code object on the function object. |
1881 function->ReplaceCode(function->shared()->code()); | 1879 function->ReplaceCode(function->shared()->code()); |
1882 builtins->set_javascript_builtin_code(id, shared->code()); | 1880 builtins->set_javascript_builtin_code(id, shared->code()); |
(...skipping 28 matching lines...) Expand all Loading... | |
1911 return true; | 1909 return true; |
1912 } | 1910 } |
1913 | 1911 |
1914 | 1912 |
1915 bool Genesis::ConfigureApiObject(Handle<JSObject> object, | 1913 bool Genesis::ConfigureApiObject(Handle<JSObject> object, |
1916 Handle<ObjectTemplateInfo> object_template) { | 1914 Handle<ObjectTemplateInfo> object_template) { |
1917 ASSERT(!object_template.is_null()); | 1915 ASSERT(!object_template.is_null()); |
1918 ASSERT(object->IsInstanceOf( | 1916 ASSERT(object->IsInstanceOf( |
1919 FunctionTemplateInfo::cast(object_template->constructor()))); | 1917 FunctionTemplateInfo::cast(object_template->constructor()))); |
1920 | 1918 |
1921 Isolate* isolate = Isolate::Current(); | |
1922 bool pending_exception = false; | 1919 bool pending_exception = false; |
1923 Handle<JSObject> obj = | 1920 Handle<JSObject> obj = |
1924 Execution::InstantiateObject(object_template, &pending_exception); | 1921 Execution::InstantiateObject(object_template, &pending_exception); |
1925 if (pending_exception) { | 1922 if (pending_exception) { |
1926 ASSERT(isolate->has_pending_exception()); | 1923 ASSERT(isolate()->has_pending_exception()); |
1927 isolate->clear_pending_exception(); | 1924 isolate()->clear_pending_exception(); |
1928 return false; | 1925 return false; |
1929 } | 1926 } |
1930 TransferObject(obj, object); | 1927 TransferObject(obj, object); |
1931 return true; | 1928 return true; |
1932 } | 1929 } |
1933 | 1930 |
1934 | 1931 |
1935 void Genesis::TransferNamedProperties(Handle<JSObject> from, | 1932 void Genesis::TransferNamedProperties(Handle<JSObject> from, |
1936 Handle<JSObject> to) { | 1933 Handle<JSObject> to) { |
1937 if (from->HasFastProperties()) { | 1934 if (from->HasFastProperties()) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2016 // Cloning the elements array is sufficient. | 2013 // Cloning the elements array is sufficient. |
2017 Handle<FixedArray> from_elements = | 2014 Handle<FixedArray> from_elements = |
2018 Handle<FixedArray>(FixedArray::cast(from->elements())); | 2015 Handle<FixedArray>(FixedArray::cast(from->elements())); |
2019 Handle<FixedArray> to_elements = FACTORY->CopyFixedArray(from_elements); | 2016 Handle<FixedArray> to_elements = FACTORY->CopyFixedArray(from_elements); |
2020 to->set_elements(*to_elements); | 2017 to->set_elements(*to_elements); |
2021 } | 2018 } |
2022 | 2019 |
2023 | 2020 |
2024 void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { | 2021 void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) { |
2025 HandleScope outer; | 2022 HandleScope outer; |
2023 Factory* factory = from->GetIsolate()->factory(); | |
2026 | 2024 |
2027 ASSERT(!from->IsJSArray()); | 2025 ASSERT(!from->IsJSArray()); |
2028 ASSERT(!to->IsJSArray()); | 2026 ASSERT(!to->IsJSArray()); |
2029 | 2027 |
2030 TransferNamedProperties(from, to); | 2028 TransferNamedProperties(from, to); |
2031 TransferIndexedProperties(from, to); | 2029 TransferIndexedProperties(from, to); |
2032 | 2030 |
2033 // Transfer the prototype (new map is needed). | 2031 // Transfer the prototype (new map is needed). |
2034 Handle<Map> old_to_map = Handle<Map>(to->map()); | 2032 Handle<Map> old_to_map = Handle<Map>(to->map()); |
2035 Handle<Map> new_to_map = FACTORY->CopyMapDropTransitions(old_to_map); | 2033 Handle<Map> new_to_map = factory->CopyMapDropTransitions(old_to_map); |
2036 new_to_map->set_prototype(from->map()->prototype()); | 2034 new_to_map->set_prototype(from->map()->prototype()); |
2037 to->set_map(*new_to_map); | 2035 to->set_map(*new_to_map); |
2038 } | 2036 } |
2039 | 2037 |
2040 | 2038 |
2041 void Genesis::MakeFunctionInstancePrototypeWritable() { | 2039 void Genesis::MakeFunctionInstancePrototypeWritable() { |
2042 // The maps with writable prototype are created in CreateEmptyFunction | 2040 // The maps with writable prototype are created in CreateEmptyFunction |
2043 // and CreateStrictModeFunctionMaps respectively. Initially the maps are | 2041 // and CreateStrictModeFunctionMaps respectively. Initially the maps are |
2044 // created with read-only prototype for JS builtins processing. | 2042 // created with read-only prototype for JS builtins processing. |
2045 ASSERT(!function_instance_map_writable_prototype_.is_null()); | 2043 ASSERT(!function_instance_map_writable_prototype_.is_null()); |
2046 ASSERT(!strict_mode_function_instance_map_writable_prototype_.is_null()); | 2044 ASSERT(!strict_mode_function_instance_map_writable_prototype_.is_null()); |
2047 | 2045 |
2048 // Replace function instance maps to make prototype writable. | 2046 // Replace function instance maps to make prototype writable. |
2049 global_context()->set_function_map( | 2047 global_context()->set_function_map( |
2050 *function_instance_map_writable_prototype_); | 2048 *function_instance_map_writable_prototype_); |
2051 global_context()->set_strict_mode_function_map( | 2049 global_context()->set_strict_mode_function_map( |
2052 *strict_mode_function_instance_map_writable_prototype_); | 2050 *strict_mode_function_instance_map_writable_prototype_); |
2053 } | 2051 } |
2054 | 2052 |
2055 | 2053 |
2056 Genesis::Genesis(Handle<Object> global_object, | 2054 Genesis::Genesis(Isolate* isolate, |
2055 Handle<Object> global_object, | |
2057 v8::Handle<v8::ObjectTemplate> global_template, | 2056 v8::Handle<v8::ObjectTemplate> global_template, |
2058 v8::ExtensionConfiguration* extensions) { | 2057 v8::ExtensionConfiguration* extensions) { |
2059 Isolate* isolate = Isolate::Current(); | |
2060 result_ = Handle<Context>::null(); | 2058 result_ = Handle<Context>::null(); |
2061 // If V8 isn't running and cannot be initialized, just return. | 2059 // If V8 isn't running and cannot be initialized, just return. |
2062 if (!V8::IsRunning() && !V8::Initialize(NULL)) return; | 2060 if (!V8::IsRunning() && !V8::Initialize(NULL)) return; |
2063 | 2061 |
2064 // Before creating the roots we must save the context and restore it | 2062 // Before creating the roots we must save the context and restore it |
2065 // on all function exits. | 2063 // on all function exits. |
2066 HandleScope scope; | 2064 HandleScope scope; |
2067 SaveContext saved_context(isolate); | 2065 SaveContext saved_context(isolate); |
2068 | 2066 |
2069 Handle<Context> new_context = Snapshot::NewContextFromSnapshot(); | 2067 Handle<Context> new_context = Snapshot::NewContextFromSnapshot(); |
2070 if (!new_context.is_null()) { | 2068 if (!new_context.is_null()) { |
2071 global_context_ = | 2069 global_context_ = |
2072 Handle<Context>::cast(isolate->global_handles()->Create(*new_context)); | 2070 Handle<Context>::cast(isolate->global_handles()->Create(*new_context)); |
2073 AddToWeakGlobalContextList(*global_context_); | 2071 AddToWeakGlobalContextList(*global_context_); |
2074 isolate->set_context(*global_context_); | 2072 isolate->set_context(*global_context_); |
2075 isolate->counters()->contexts_created_by_snapshot()->Increment(); | 2073 isolate->counters()->contexts_created_by_snapshot()->Increment(); |
2076 Handle<GlobalObject> inner_global; | 2074 Handle<GlobalObject> inner_global; |
2077 Handle<JSGlobalProxy> global_proxy = | 2075 Handle<JSGlobalProxy> global_proxy = |
2078 CreateNewGlobals(global_template, | 2076 CreateNewGlobals(global_template, |
2079 global_object, | 2077 global_object, |
2080 &inner_global); | 2078 &inner_global); |
2081 | 2079 |
2082 HookUpGlobalProxy(inner_global, global_proxy); | 2080 HookUpGlobalProxy(inner_global, global_proxy); |
2083 HookUpInnerGlobal(inner_global); | 2081 HookUpInnerGlobal(inner_global); |
2084 | 2082 |
2085 if (!ConfigureGlobalObjects(global_template)) return; | 2083 if (!ConfigureGlobalObjects(global_template)) return; |
2086 } else { | 2084 } else { |
2087 // We get here if there was no context snapshot. | 2085 // We get here if there was no context snapshot. |
2088 CreateRoots(); | 2086 CreateRoots(); |
2089 Handle<JSFunction> empty_function = CreateEmptyFunction(); | 2087 Handle<JSFunction> empty_function = CreateEmptyFunction(isolate); |
2090 CreateStrictModeFunctionMaps(empty_function); | 2088 CreateStrictModeFunctionMaps(empty_function); |
2091 Handle<GlobalObject> inner_global; | 2089 Handle<GlobalObject> inner_global; |
2092 Handle<JSGlobalProxy> global_proxy = | 2090 Handle<JSGlobalProxy> global_proxy = |
2093 CreateNewGlobals(global_template, global_object, &inner_global); | 2091 CreateNewGlobals(global_template, global_object, &inner_global); |
2094 HookUpGlobalProxy(inner_global, global_proxy); | 2092 HookUpGlobalProxy(inner_global, global_proxy); |
2095 InitializeGlobal(inner_global, empty_function); | 2093 InitializeGlobal(inner_global, empty_function); |
2096 InstallJSFunctionResultCaches(); | 2094 InstallJSFunctionResultCaches(); |
2097 InitializeNormalizedMapCaches(); | 2095 InitializeNormalizedMapCaches(); |
2098 if (!InstallNatives()) return; | 2096 if (!InstallNatives()) return; |
2099 | 2097 |
(...skipping 29 matching lines...) Expand all Loading... | |
2129 return from + sizeof(NestingCounterType); | 2127 return from + sizeof(NestingCounterType); |
2130 } | 2128 } |
2131 | 2129 |
2132 | 2130 |
2133 // Called when the top-level V8 mutex is destroyed. | 2131 // Called when the top-level V8 mutex is destroyed. |
2134 void Bootstrapper::FreeThreadResources() { | 2132 void Bootstrapper::FreeThreadResources() { |
2135 ASSERT(!IsActive()); | 2133 ASSERT(!IsActive()); |
2136 } | 2134 } |
2137 | 2135 |
2138 } } // namespace v8::internal | 2136 } } // namespace v8::internal |
OLD | NEW |