OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/extensions/externalize-string-extension.h" | 10 #include "src/extensions/externalize-string-extension.h" |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
289 Isolate* isolate_; | 289 Isolate* isolate_; |
290 Handle<Context> result_; | 290 Handle<Context> result_; |
291 Handle<Context> native_context_; | 291 Handle<Context> native_context_; |
292 | 292 |
293 // Function maps. Function maps are created initially with a read only | 293 // Function maps. Function maps are created initially with a read only |
294 // prototype for the processing of JS builtins. Later the function maps are | 294 // prototype for the processing of JS builtins. Later the function maps are |
295 // replaced in order to make prototype writable. These are the final, writable | 295 // replaced in order to make prototype writable. These are the final, writable |
296 // prototype, maps. | 296 // prototype, maps. |
297 Handle<Map> sloppy_function_map_writable_prototype_; | 297 Handle<Map> sloppy_function_map_writable_prototype_; |
298 Handle<Map> strict_function_map_writable_prototype_; | 298 Handle<Map> strict_function_map_writable_prototype_; |
299 Handle<JSFunction> strict_poison_function; | 299 Handle<JSFunction> strict_poison_function_; |
300 Handle<JSFunction> generator_poison_function; | 300 Handle<JSFunction> generator_poison_function; |
301 | 301 |
302 BootstrapperActive active_; | 302 BootstrapperActive active_; |
303 friend class Bootstrapper; | 303 friend class Bootstrapper; |
304 }; | 304 }; |
305 | 305 |
306 | 306 |
307 void Bootstrapper::Iterate(ObjectVisitor* v) { | 307 void Bootstrapper::Iterate(ObjectVisitor* v) { |
308 extensions_cache_.Iterate(v); | 308 extensions_cache_.Iterate(v); |
309 v->Synchronize(VisitorSynchronization::kExtensions); | 309 v->Synchronize(VisitorSynchronization::kExtensions); |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
607 Handle<AccessorInfo> name = | 607 Handle<AccessorInfo> name = |
608 Accessors::FunctionNameInfo(isolate(), ro_attribs); | 608 Accessors::FunctionNameInfo(isolate(), ro_attribs); |
609 { // Add name. | 609 { // Add name. |
610 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, | 610 AccessorConstantDescriptor d(Handle<Name>(Name::cast(name->name())), name, |
611 ro_attribs); | 611 ro_attribs); |
612 map->AppendDescriptor(&d); | 612 map->AppendDescriptor(&d); |
613 } | 613 } |
614 } | 614 } |
615 | 615 |
616 | 616 |
617 // ECMAScript 5th Edition, 13.2.3 | 617 // ECMAScript 6th Edition, 9.2.7.1 |
618 Handle<JSFunction> Genesis::GetStrictPoisonFunction() { | 618 Handle<JSFunction> Genesis::GetStrictPoisonFunction() { |
619 if (strict_poison_function.is_null()) { | 619 if (strict_poison_function_.is_null()) { |
620 Handle<String> name = factory()->InternalizeOneByteString( | 620 Handle<String> name = factory()->InternalizeOneByteString( |
621 STATIC_CHAR_VECTOR("ThrowTypeError")); | 621 STATIC_CHAR_VECTOR("ThrowTypeError")); |
622 Handle<Code> code(isolate()->builtins()->builtin( | 622 Handle<Code> code(isolate()->builtins()->builtin( |
623 Builtins::kStrictModePoisonPill)); | 623 Builtins::kStrictModePoisonPill)); |
624 strict_poison_function = factory()->NewFunctionWithoutPrototype(name, code); | 624 Handle<JSFunction> function = |
625 strict_poison_function->set_map(native_context()->sloppy_function_map()); | 625 factory()->NewFunctionWithoutPrototype(name, code); |
626 strict_poison_function->shared()->DontAdaptArguments(); | 626 function->set_map(native_context()->sloppy_function_map()); |
627 function->shared()->DontAdaptArguments(); | |
627 | 628 |
628 JSObject::PreventExtensions(strict_poison_function).Assert(); | 629 // %ThrowTypeError% must not have a name property. |
630 JSReceiver::DeleteProperty(function, factory()->name_string()).Assert(); | |
adamk
2015/04/07 20:02:58
So this'll put this into "slow" mode, but we don't
arv (Not doing code reviews)
2015/04/07 20:10:16
Yes. But that is fine since the would have to extr
| |
631 | |
632 // length needs to be non configurable | |
633 LookupIterator it(function, factory()->length_string()); | |
634 CHECK_EQ(LookupIterator::ACCESSOR, it.state()); | |
adamk
2015/04/07 20:02:58
Seems like this could be a DCHECK_EQ just as well.
arv (Not doing code reviews)
2015/04/07 20:10:16
It had to be CHECK before when I was using lower l
| |
635 DCHECK(it.HolderIsReceiverOrHiddenPrototype()); | |
636 Handle<Object> value(Smi::FromInt(function->shared()->length()), isolate()); | |
637 JSObject::SetOwnPropertyIgnoreAttributes( | |
adamk
2015/04/07 20:02:57
So does this end up getting rid of the accessor? B
arv (Not doing code reviews)
2015/04/07 20:10:16
Yes. But let me expand the test to make sure that
| |
638 function, factory()->length_string(), value, | |
639 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY)) | |
640 .Assert(); | |
641 | |
642 JSObject::PreventExtensions(function).Assert(); | |
643 | |
644 strict_poison_function_ = function; | |
629 } | 645 } |
630 return strict_poison_function; | 646 return strict_poison_function_; |
631 } | 647 } |
632 | 648 |
633 | 649 |
634 Handle<JSFunction> Genesis::GetGeneratorPoisonFunction() { | 650 Handle<JSFunction> Genesis::GetGeneratorPoisonFunction() { |
635 if (generator_poison_function.is_null()) { | 651 if (generator_poison_function.is_null()) { |
636 Handle<String> name = factory()->InternalizeOneByteString( | 652 Handle<String> name = factory()->InternalizeOneByteString( |
637 STATIC_CHAR_VECTOR("ThrowTypeError")); | 653 STATIC_CHAR_VECTOR("ThrowTypeError")); |
638 Handle<Code> code(isolate()->builtins()->builtin( | 654 Handle<Code> code(isolate()->builtins()->builtin( |
639 Builtins::kGeneratorPoisonPill)); | 655 Builtins::kGeneratorPoisonPill)); |
640 generator_poison_function = factory()->NewFunctionWithoutPrototype( | 656 generator_poison_function = factory()->NewFunctionWithoutPrototype( |
(...skipping 2322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2963 return from + sizeof(NestingCounterType); | 2979 return from + sizeof(NestingCounterType); |
2964 } | 2980 } |
2965 | 2981 |
2966 | 2982 |
2967 // Called when the top-level V8 mutex is destroyed. | 2983 // Called when the top-level V8 mutex is destroyed. |
2968 void Bootstrapper::FreeThreadResources() { | 2984 void Bootstrapper::FreeThreadResources() { |
2969 DCHECK(!IsActive()); | 2985 DCHECK(!IsActive()); |
2970 } | 2986 } |
2971 | 2987 |
2972 } } // namespace v8::internal | 2988 } } // namespace v8::internal |
OLD | NEW |