OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/api.h" | 8 #include "src/api.h" |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
11 #include "src/deoptimizer.h" | 11 #include "src/deoptimizer.h" |
12 #include "src/execution.h" | 12 #include "src/execution.h" |
13 #include "src/factory.h" | 13 #include "src/factory.h" |
14 #include "src/frames-inl.h" | 14 #include "src/frames-inl.h" |
15 #include "src/isolate.h" | 15 #include "src/isolate.h" |
16 #include "src/list-inl.h" | 16 #include "src/list-inl.h" |
17 #include "src/property-details.h" | 17 #include "src/property-details.h" |
18 #include "src/prototype.h" | 18 #include "src/prototype.h" |
19 | 19 |
20 namespace v8 { | 20 namespace v8 { |
21 namespace internal { | 21 namespace internal { |
22 | 22 |
23 | 23 |
24 // We have a slight impedance mismatch between the external API and the way we | |
25 // use callbacks internally: Externally, callbacks can only be used with | |
26 // v8::Object, but internally we even have callbacks on entities which are | |
27 // higher in the hierarchy, so we can only return i::Object here, not | |
28 // i::JSObject. | |
29 Handle<Object> GetThisFrom(const v8::PropertyCallbackInfo<v8::Value>& info) { | |
30 return Utils::OpenHandle(*v8::Local<v8::Value>(info.This())); | |
31 } | |
32 | |
33 | |
34 Handle<AccessorInfo> Accessors::MakeAccessor( | 24 Handle<AccessorInfo> Accessors::MakeAccessor( |
35 Isolate* isolate, | 25 Isolate* isolate, |
36 Handle<String> name, | 26 Handle<String> name, |
37 AccessorGetterCallback getter, | 27 AccessorGetterCallback getter, |
38 AccessorSetterCallback setter, | 28 AccessorSetterCallback setter, |
39 PropertyAttributes attributes) { | 29 PropertyAttributes attributes) { |
40 Factory* factory = isolate->factory(); | 30 Factory* factory = isolate->factory(); |
41 Handle<ExecutableAccessorInfo> info = factory->NewExecutableAccessorInfo(); | 31 Handle<ExecutableAccessorInfo> info = factory->NewExecutableAccessorInfo(); |
42 info->set_property_attributes(attributes); | 32 info->set_property_attributes(attributes); |
43 info->set_all_can_read(false); | 33 info->set_all_can_read(false); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 return value; | 155 return value; |
166 } | 156 } |
167 | 157 |
168 | 158 |
169 void Accessors::ArrayLengthGetter( | 159 void Accessors::ArrayLengthGetter( |
170 v8::Local<v8::String> name, | 160 v8::Local<v8::String> name, |
171 const v8::PropertyCallbackInfo<v8::Value>& info) { | 161 const v8::PropertyCallbackInfo<v8::Value>& info) { |
172 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 162 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
173 DisallowHeapAllocation no_allocation; | 163 DisallowHeapAllocation no_allocation; |
174 HandleScope scope(isolate); | 164 HandleScope scope(isolate); |
175 Object* object = *GetThisFrom(info); | 165 JSArray* holder = JSArray::cast(*Utils::OpenHandle(*info.Holder())); |
176 // Traverse the prototype chain until we reach an array. | 166 Object* result = holder->length(); |
177 JSArray* holder = FindInstanceOf<JSArray>(isolate, object); | |
178 Object* result; | |
179 if (holder != NULL) { | |
180 result = holder->length(); | |
181 } else { | |
182 result = Smi::FromInt(0); | |
183 } | |
184 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); | 167 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); |
185 } | 168 } |
186 | 169 |
187 | 170 |
188 void Accessors::ArrayLengthSetter( | 171 void Accessors::ArrayLengthSetter( |
189 v8::Local<v8::String> name, | 172 v8::Local<v8::String> name, |
190 v8::Local<v8::Value> val, | 173 v8::Local<v8::Value> val, |
191 const v8::PropertyCallbackInfo<void>& info) { | 174 const v8::PropertyCallbackInfo<void>& info) { |
192 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 175 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
193 HandleScope scope(isolate); | 176 HandleScope scope(isolate); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 // | 230 // |
248 // Accessors::StringLength | 231 // Accessors::StringLength |
249 // | 232 // |
250 | 233 |
251 void Accessors::StringLengthGetter( | 234 void Accessors::StringLengthGetter( |
252 v8::Local<v8::String> name, | 235 v8::Local<v8::String> name, |
253 const v8::PropertyCallbackInfo<v8::Value>& info) { | 236 const v8::PropertyCallbackInfo<v8::Value>& info) { |
254 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 237 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
255 DisallowHeapAllocation no_allocation; | 238 DisallowHeapAllocation no_allocation; |
256 HandleScope scope(isolate); | 239 HandleScope scope(isolate); |
257 Object* value = *GetThisFrom(info); | 240 |
258 Object* result; | 241 // We have a slight impedance mismatch between the external API and the way we |
259 if (value->IsJSValue()) value = JSValue::cast(value)->value(); | 242 // use callbacks internally: Externally, callbacks can only be used with |
260 if (value->IsString()) { | 243 // v8::Object, but internally we have callbacks on entities which are higher |
261 result = Smi::FromInt(String::cast(value)->length()); | 244 // in the hierarchy, in this case for String values. |
262 } else { | 245 |
263 // If object is not a string we return 0 to be compatible with WebKit. | 246 Object* value = *Utils::OpenHandle(*v8::Local<v8::Value>(info.This())); |
264 // Note: Firefox returns the length of ToString(object). | 247 if (!value->IsString()) { |
265 result = Smi::FromInt(0); | 248 // Not a string value. That means that we either got a String wrapper or |
| 249 // a Value with a String wrapper in its prototype chain. |
| 250 value = JSValue::cast(*Utils::OpenHandle(*info.Holder()))->value(); |
266 } | 251 } |
| 252 Object* result = Smi::FromInt(String::cast(value)->length()); |
267 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); | 253 info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate))); |
268 } | 254 } |
269 | 255 |
270 | 256 |
271 void Accessors::StringLengthSetter( | 257 void Accessors::StringLengthSetter( |
272 v8::Local<v8::String> name, | 258 v8::Local<v8::String> name, |
273 v8::Local<v8::Value> value, | 259 v8::Local<v8::Value> value, |
274 const v8::PropertyCallbackInfo<void>& info) { | 260 const v8::PropertyCallbackInfo<void>& info) { |
275 UNREACHABLE(); | 261 UNREACHABLE(); |
276 } | 262 } |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 &ScriptEvalFromFunctionNameSetter, | 818 &ScriptEvalFromFunctionNameSetter, |
833 attributes); | 819 attributes); |
834 } | 820 } |
835 | 821 |
836 | 822 |
837 // | 823 // |
838 // Accessors::FunctionPrototype | 824 // Accessors::FunctionPrototype |
839 // | 825 // |
840 | 826 |
841 static Handle<Object> GetFunctionPrototype(Isolate* isolate, | 827 static Handle<Object> GetFunctionPrototype(Isolate* isolate, |
842 Handle<Object> receiver) { | 828 Handle<JSFunction> function) { |
843 Handle<JSFunction> function; | |
844 { | |
845 DisallowHeapAllocation no_allocation; | |
846 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, *receiver); | |
847 if (function_raw == NULL) return isolate->factory()->undefined_value(); | |
848 while (!function_raw->should_have_prototype()) { | |
849 PrototypeIterator iter(isolate, function_raw); | |
850 function_raw = FindInstanceOf<JSFunction>(isolate, iter.GetCurrent()); | |
851 // There has to be one because we hit the getter. | |
852 ASSERT(function_raw != NULL); | |
853 } | |
854 function = Handle<JSFunction>(function_raw, isolate); | |
855 } | |
856 | |
857 if (!function->has_prototype()) { | 829 if (!function->has_prototype()) { |
858 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); | 830 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); |
859 JSFunction::SetPrototype(function, proto); | 831 JSFunction::SetPrototype(function, proto); |
860 } | 832 } |
861 return Handle<Object>(function->prototype(), isolate); | 833 return Handle<Object>(function->prototype(), isolate); |
862 } | 834 } |
863 | 835 |
864 | 836 |
865 static Handle<Object> SetFunctionPrototype(Isolate* isolate, | 837 static Handle<Object> SetFunctionPrototype(Isolate* isolate, |
866 Handle<JSObject> receiver, | 838 Handle<JSObject> receiver, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 Isolate* isolate = function->GetIsolate(); | 884 Isolate* isolate = function->GetIsolate(); |
913 return SetFunctionPrototype(isolate, function, prototype); | 885 return SetFunctionPrototype(isolate, function, prototype); |
914 } | 886 } |
915 | 887 |
916 | 888 |
917 void Accessors::FunctionPrototypeGetter( | 889 void Accessors::FunctionPrototypeGetter( |
918 v8::Local<v8::String> name, | 890 v8::Local<v8::String> name, |
919 const v8::PropertyCallbackInfo<v8::Value>& info) { | 891 const v8::PropertyCallbackInfo<v8::Value>& info) { |
920 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 892 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
921 HandleScope scope(isolate); | 893 HandleScope scope(isolate); |
922 Handle<Object> object = GetThisFrom(info); | 894 Handle<JSFunction> function = |
923 Handle<Object> result = GetFunctionPrototype(isolate, object); | 895 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); |
| 896 Handle<Object> result = GetFunctionPrototype(isolate, function); |
924 info.GetReturnValue().Set(Utils::ToLocal(result)); | 897 info.GetReturnValue().Set(Utils::ToLocal(result)); |
925 } | 898 } |
926 | 899 |
927 | 900 |
928 void Accessors::FunctionPrototypeSetter( | 901 void Accessors::FunctionPrototypeSetter( |
929 v8::Local<v8::String> name, | 902 v8::Local<v8::String> name, |
930 v8::Local<v8::Value> val, | 903 v8::Local<v8::Value> val, |
931 const v8::PropertyCallbackInfo<void>& info) { | 904 const v8::PropertyCallbackInfo<void>& info) { |
932 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 905 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
933 HandleScope scope(isolate); | 906 HandleScope scope(isolate); |
(...skipping 18 matching lines...) Expand all Loading... |
952 // | 925 // |
953 // Accessors::FunctionLength | 926 // Accessors::FunctionLength |
954 // | 927 // |
955 | 928 |
956 | 929 |
957 void Accessors::FunctionLengthGetter( | 930 void Accessors::FunctionLengthGetter( |
958 v8::Local<v8::String> name, | 931 v8::Local<v8::String> name, |
959 const v8::PropertyCallbackInfo<v8::Value>& info) { | 932 const v8::PropertyCallbackInfo<v8::Value>& info) { |
960 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 933 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
961 HandleScope scope(isolate); | 934 HandleScope scope(isolate); |
962 Handle<Object> object = GetThisFrom(info); | 935 Handle<JSFunction> function = |
963 MaybeHandle<JSFunction> maybe_function; | 936 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); |
964 | |
965 { | |
966 DisallowHeapAllocation no_allocation; | |
967 JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object); | |
968 if (function != NULL) maybe_function = Handle<JSFunction>(function); | |
969 } | |
970 | 937 |
971 int length = 0; | 938 int length = 0; |
972 Handle<JSFunction> function; | 939 if (function->shared()->is_compiled()) { |
973 if (maybe_function.ToHandle(&function)) { | 940 length = function->shared()->length(); |
974 if (function->shared()->is_compiled()) { | 941 } else { |
| 942 // If the function isn't compiled yet, the length is not computed |
| 943 // correctly yet. Compile it now and return the right length. |
| 944 if (Compiler::EnsureCompiled(function, KEEP_EXCEPTION)) { |
975 length = function->shared()->length(); | 945 length = function->shared()->length(); |
976 } else { | 946 } |
977 // If the function isn't compiled yet, the length is not computed | 947 if (isolate->has_pending_exception()) { |
978 // correctly yet. Compile it now and return the right length. | 948 isolate->OptionalRescheduleException(false); |
979 if (Compiler::EnsureCompiled(function, KEEP_EXCEPTION)) { | |
980 length = function->shared()->length(); | |
981 } | |
982 if (isolate->has_pending_exception()) { | |
983 isolate->OptionalRescheduleException(false); | |
984 } | |
985 } | 949 } |
986 } | 950 } |
987 Handle<Object> result(Smi::FromInt(length), isolate); | 951 Handle<Object> result(Smi::FromInt(length), isolate); |
988 info.GetReturnValue().Set(Utils::ToLocal(result)); | 952 info.GetReturnValue().Set(Utils::ToLocal(result)); |
989 } | 953 } |
990 | 954 |
991 | 955 |
992 void Accessors::FunctionLengthSetter( | 956 void Accessors::FunctionLengthSetter( |
993 v8::Local<v8::String> name, | 957 v8::Local<v8::String> name, |
994 v8::Local<v8::Value> val, | 958 v8::Local<v8::Value> val, |
(...skipping 15 matching lines...) Expand all Loading... |
1010 // | 974 // |
1011 // Accessors::FunctionName | 975 // Accessors::FunctionName |
1012 // | 976 // |
1013 | 977 |
1014 | 978 |
1015 void Accessors::FunctionNameGetter( | 979 void Accessors::FunctionNameGetter( |
1016 v8::Local<v8::String> name, | 980 v8::Local<v8::String> name, |
1017 const v8::PropertyCallbackInfo<v8::Value>& info) { | 981 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1018 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 982 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
1019 HandleScope scope(isolate); | 983 HandleScope scope(isolate); |
1020 Handle<Object> object = GetThisFrom(info); | 984 Handle<JSFunction> function = |
1021 MaybeHandle<JSFunction> maybe_function; | 985 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); |
1022 | 986 Handle<Object> result(function->shared()->name(), isolate); |
1023 { | |
1024 DisallowHeapAllocation no_allocation; | |
1025 JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object); | |
1026 if (function != NULL) maybe_function = Handle<JSFunction>(function); | |
1027 } | |
1028 | |
1029 Handle<JSFunction> function; | |
1030 Handle<Object> result; | |
1031 if (maybe_function.ToHandle(&function)) { | |
1032 result = Handle<Object>(function->shared()->name(), isolate); | |
1033 } else { | |
1034 result = isolate->factory()->undefined_value(); | |
1035 } | |
1036 info.GetReturnValue().Set(Utils::ToLocal(result)); | 987 info.GetReturnValue().Set(Utils::ToLocal(result)); |
1037 } | 988 } |
1038 | 989 |
1039 | 990 |
1040 void Accessors::FunctionNameSetter( | 991 void Accessors::FunctionNameSetter( |
1041 v8::Local<v8::String> name, | 992 v8::Local<v8::String> name, |
1042 v8::Local<v8::Value> val, | 993 v8::Local<v8::Value> val, |
1043 const v8::PropertyCallbackInfo<void>& info) { | 994 const v8::PropertyCallbackInfo<void>& info) { |
1044 // Do nothing. | 995 // Do nothing. |
1045 } | 996 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 Handle<Object> Accessors::FunctionGetArguments(Handle<JSFunction> function) { | 1110 Handle<Object> Accessors::FunctionGetArguments(Handle<JSFunction> function) { |
1160 return GetFunctionArguments(function->GetIsolate(), function); | 1111 return GetFunctionArguments(function->GetIsolate(), function); |
1161 } | 1112 } |
1162 | 1113 |
1163 | 1114 |
1164 void Accessors::FunctionArgumentsGetter( | 1115 void Accessors::FunctionArgumentsGetter( |
1165 v8::Local<v8::String> name, | 1116 v8::Local<v8::String> name, |
1166 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1117 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1167 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 1118 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
1168 HandleScope scope(isolate); | 1119 HandleScope scope(isolate); |
1169 Handle<Object> object = GetThisFrom(info); | 1120 Handle<JSFunction> function = |
1170 MaybeHandle<JSFunction> maybe_function; | 1121 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); |
1171 | 1122 Handle<Object> result = GetFunctionArguments(isolate, function); |
1172 { | |
1173 DisallowHeapAllocation no_allocation; | |
1174 JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object); | |
1175 if (function != NULL) maybe_function = Handle<JSFunction>(function); | |
1176 } | |
1177 | |
1178 Handle<JSFunction> function; | |
1179 Handle<Object> result; | |
1180 if (maybe_function.ToHandle(&function)) { | |
1181 result = GetFunctionArguments(isolate, function); | |
1182 } else { | |
1183 result = isolate->factory()->undefined_value(); | |
1184 } | |
1185 info.GetReturnValue().Set(Utils::ToLocal(result)); | 1123 info.GetReturnValue().Set(Utils::ToLocal(result)); |
1186 } | 1124 } |
1187 | 1125 |
1188 | 1126 |
1189 void Accessors::FunctionArgumentsSetter( | 1127 void Accessors::FunctionArgumentsSetter( |
1190 v8::Local<v8::String> name, | 1128 v8::Local<v8::String> name, |
1191 v8::Local<v8::Value> val, | 1129 v8::Local<v8::Value> val, |
1192 const v8::PropertyCallbackInfo<void>& info) { | 1130 const v8::PropertyCallbackInfo<void>& info) { |
1193 // Do nothing. | 1131 // Do nothing. |
1194 } | 1132 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 } | 1252 } |
1315 return Handle<JSFunction>(caller); | 1253 return Handle<JSFunction>(caller); |
1316 } | 1254 } |
1317 | 1255 |
1318 | 1256 |
1319 void Accessors::FunctionCallerGetter( | 1257 void Accessors::FunctionCallerGetter( |
1320 v8::Local<v8::String> name, | 1258 v8::Local<v8::String> name, |
1321 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1259 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1322 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); | 1260 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
1323 HandleScope scope(isolate); | 1261 HandleScope scope(isolate); |
1324 Handle<Object> object = GetThisFrom(info); | 1262 Handle<JSFunction> function = |
1325 MaybeHandle<JSFunction> maybe_function; | 1263 Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder())); |
1326 { | |
1327 DisallowHeapAllocation no_allocation; | |
1328 JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object); | |
1329 if (function != NULL) maybe_function = Handle<JSFunction>(function); | |
1330 } | |
1331 Handle<JSFunction> function; | |
1332 Handle<Object> result; | 1264 Handle<Object> result; |
1333 if (maybe_function.ToHandle(&function)) { | 1265 MaybeHandle<JSFunction> maybe_caller; |
1334 MaybeHandle<JSFunction> maybe_caller; | 1266 maybe_caller = FindCaller(isolate, function); |
1335 maybe_caller = FindCaller(isolate, function); | 1267 Handle<JSFunction> caller; |
1336 Handle<JSFunction> caller; | 1268 if (maybe_caller.ToHandle(&caller)) { |
1337 if (maybe_caller.ToHandle(&caller)) { | 1269 result = caller; |
1338 result = caller; | |
1339 } else { | |
1340 result = isolate->factory()->null_value(); | |
1341 } | |
1342 } else { | 1270 } else { |
1343 result = isolate->factory()->undefined_value(); | 1271 result = isolate->factory()->null_value(); |
1344 } | 1272 } |
1345 info.GetReturnValue().Set(Utils::ToLocal(result)); | 1273 info.GetReturnValue().Set(Utils::ToLocal(result)); |
1346 } | 1274 } |
1347 | 1275 |
1348 | 1276 |
1349 void Accessors::FunctionCallerSetter( | 1277 void Accessors::FunctionCallerSetter( |
1350 v8::Local<v8::String> name, | 1278 v8::Local<v8::String> name, |
1351 v8::Local<v8::Value> val, | 1279 v8::Local<v8::Value> val, |
1352 const v8::PropertyCallbackInfo<void>& info) { | 1280 const v8::PropertyCallbackInfo<void>& info) { |
1353 // Do nothing. | 1281 // Do nothing. |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1423 info->set_data(Smi::FromInt(index)); | 1351 info->set_data(Smi::FromInt(index)); |
1424 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); | 1352 Handle<Object> getter = v8::FromCData(isolate, &ModuleGetExport); |
1425 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); | 1353 Handle<Object> setter = v8::FromCData(isolate, &ModuleSetExport); |
1426 info->set_getter(*getter); | 1354 info->set_getter(*getter); |
1427 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 1355 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
1428 return info; | 1356 return info; |
1429 } | 1357 } |
1430 | 1358 |
1431 | 1359 |
1432 } } // namespace v8::internal | 1360 } } // namespace v8::internal |
OLD | NEW |