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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/jsregexp-inl.h" | 8 #include "src/jsregexp-inl.h" |
9 #include "src/jsregexp.h" | 9 #include "src/jsregexp.h" |
10 #include "src/runtime/runtime-utils.h" | 10 #include "src/runtime/runtime-utils.h" |
(...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 Handle<Object> global = factory->ToBoolean(flags.is_global()); | 857 Handle<Object> global = factory->ToBoolean(flags.is_global()); |
858 Handle<Object> ignore_case = factory->ToBoolean(flags.is_ignore_case()); | 858 Handle<Object> ignore_case = factory->ToBoolean(flags.is_ignore_case()); |
859 Handle<Object> multiline = factory->ToBoolean(flags.is_multiline()); | 859 Handle<Object> multiline = factory->ToBoolean(flags.is_multiline()); |
860 Handle<Object> sticky = factory->ToBoolean(flags.is_sticky()); | 860 Handle<Object> sticky = factory->ToBoolean(flags.is_sticky()); |
861 | 861 |
862 Map* map = regexp->map(); | 862 Map* map = regexp->map(); |
863 Object* constructor = map->constructor(); | 863 Object* constructor = map->constructor(); |
864 if (!FLAG_harmony_regexps && constructor->IsJSFunction() && | 864 if (!FLAG_harmony_regexps && constructor->IsJSFunction() && |
865 JSFunction::cast(constructor)->initial_map() == map) { | 865 JSFunction::cast(constructor)->initial_map() == map) { |
866 // If we still have the original map, set in-object properties directly. | 866 // If we still have the original map, set in-object properties directly. |
867 regexp->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex, *source); | |
868 // Both true and false are immovable immortal objects so no need for write | 867 // Both true and false are immovable immortal objects so no need for write |
869 // barrier. | 868 // barrier. |
870 regexp->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, *global, | 869 regexp->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex, *global, |
871 SKIP_WRITE_BARRIER); | 870 SKIP_WRITE_BARRIER); |
872 regexp->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, *ignore_case, | 871 regexp->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex, *ignore_case, |
873 SKIP_WRITE_BARRIER); | 872 SKIP_WRITE_BARRIER); |
874 regexp->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, *multiline, | 873 regexp->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex, *multiline, |
875 SKIP_WRITE_BARRIER); | 874 SKIP_WRITE_BARRIER); |
876 regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, | 875 regexp->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex, |
877 Smi::FromInt(0), SKIP_WRITE_BARRIER); | 876 Smi::FromInt(0), SKIP_WRITE_BARRIER); |
878 } else { | 877 } else { |
879 // Map has changed, so use generic, but slower, method. We also end here if | 878 // Map has changed, so use generic, but slower, method. We also end here if |
880 // the --harmony-regexp flag is set, because the initial map does not have | 879 // the --harmony-regexp flag is set, because the initial map does not have |
881 // space for the 'sticky' flag, since it is from the snapshot, but must work | 880 // space for the 'sticky' flag, since it is from the snapshot, but must work |
882 // both with and without --harmony-regexp. When sticky comes out from under | 881 // both with and without --harmony-regexp. When sticky comes out from under |
883 // the flag, we will be able to use the fast initial map. | 882 // the flag, we will be able to use the fast initial map. |
884 PropertyAttributes final = | 883 PropertyAttributes final = |
885 static_cast<PropertyAttributes>(READ_ONLY | DONT_ENUM | DONT_DELETE); | 884 static_cast<PropertyAttributes>(READ_ONLY | DONT_ENUM | DONT_DELETE); |
886 PropertyAttributes writable = | 885 PropertyAttributes writable = |
887 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); | 886 static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); |
888 Handle<Object> zero(Smi::FromInt(0), isolate); | 887 Handle<Object> zero(Smi::FromInt(0), isolate); |
889 JSObject::SetOwnPropertyIgnoreAttributes(regexp, factory->source_string(), | |
890 source, final).Check(); | |
891 JSObject::SetOwnPropertyIgnoreAttributes(regexp, factory->global_string(), | 888 JSObject::SetOwnPropertyIgnoreAttributes(regexp, factory->global_string(), |
892 global, final).Check(); | 889 global, final).Check(); |
893 JSObject::SetOwnPropertyIgnoreAttributes( | 890 JSObject::SetOwnPropertyIgnoreAttributes( |
894 regexp, factory->ignore_case_string(), ignore_case, final).Check(); | 891 regexp, factory->ignore_case_string(), ignore_case, final).Check(); |
895 JSObject::SetOwnPropertyIgnoreAttributes( | 892 JSObject::SetOwnPropertyIgnoreAttributes( |
896 regexp, factory->multiline_string(), multiline, final).Check(); | 893 regexp, factory->multiline_string(), multiline, final).Check(); |
897 if (FLAG_harmony_regexps) { | 894 if (FLAG_harmony_regexps) { |
898 JSObject::SetOwnPropertyIgnoreAttributes(regexp, factory->sticky_string(), | 895 JSObject::SetOwnPropertyIgnoreAttributes(regexp, factory->sticky_string(), |
899 sticky, final).Check(); | 896 sticky, final).Check(); |
900 } | 897 } |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 | 1112 |
1116 | 1113 |
1117 RUNTIME_FUNCTION(RuntimeReference_IsRegExp) { | 1114 RUNTIME_FUNCTION(RuntimeReference_IsRegExp) { |
1118 SealHandleScope shs(isolate); | 1115 SealHandleScope shs(isolate); |
1119 DCHECK(args.length() == 1); | 1116 DCHECK(args.length() == 1); |
1120 CONVERT_ARG_CHECKED(Object, obj, 0); | 1117 CONVERT_ARG_CHECKED(Object, obj, 0); |
1121 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); | 1118 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); |
1122 } | 1119 } |
1123 } | 1120 } |
1124 } // namespace v8::internal | 1121 } // namespace v8::internal |
OLD | NEW |