| 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 <stdlib.h> | 5 #include <stdlib.h> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 return *clone; | 50 return *clone; |
| 51 } | 51 } |
| 52 | 52 |
| 53 | 53 |
| 54 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { | 54 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { |
| 55 DCHECK(args.length() == 0); | 55 DCHECK(args.length() == 0); |
| 56 return isolate->heap()->home_object_symbol(); | 56 return isolate->heap()->home_object_symbol(); |
| 57 } | 57 } |
| 58 | 58 |
| 59 | 59 |
| 60 static Object* LoadFromSuper(Isolate* isolate, Handle<Object> receiver, | |
| 61 Handle<JSObject> home_object, Handle<Name> name) { | |
| 62 if (home_object->IsAccessCheckNeeded() && | |
| 63 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_GET)) { | |
| 64 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET); | |
| 65 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | |
| 66 } | |
| 67 | |
| 68 PrototypeIterator iter(isolate, home_object); | |
| 69 Handle<Object> proto = PrototypeIterator::GetCurrent(iter); | |
| 70 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); | |
| 71 | |
| 72 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); | |
| 73 Handle<Object> result; | |
| 74 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); | |
| 75 return *result; | |
| 76 } | |
| 77 | |
| 78 | |
| 79 RUNTIME_FUNCTION(Runtime_DefineClass) { | 60 RUNTIME_FUNCTION(Runtime_DefineClass) { |
| 80 HandleScope scope(isolate); | 61 HandleScope scope(isolate); |
| 81 DCHECK(args.length() == 6); | 62 DCHECK(args.length() == 6); |
| 82 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); | 63 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); |
| 83 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); | 64 CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); |
| 84 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 2); | 65 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 2); |
| 85 CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); | 66 CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); |
| 86 CONVERT_SMI_ARG_CHECKED(start_position, 4); | 67 CONVERT_SMI_ARG_CHECKED(start_position, 4); |
| 87 CONVERT_SMI_ARG_CHECKED(end_position, 5); | 68 CONVERT_SMI_ARG_CHECKED(end_position, 5); |
| 88 | 69 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 return isolate->ThrowIllegalOperation(); | 183 return isolate->ThrowIllegalOperation(); |
| 203 } | 184 } |
| 204 | 185 |
| 205 Handle<String> source(String::cast(Handle<Script>::cast(script)->source())); | 186 Handle<String> source(String::cast(Handle<Script>::cast(script)->source())); |
| 206 return *isolate->factory()->NewSubString( | 187 return *isolate->factory()->NewSubString( |
| 207 source, Handle<Smi>::cast(start_position)->value(), | 188 source, Handle<Smi>::cast(start_position)->value(), |
| 208 Handle<Smi>::cast(end_position)->value()); | 189 Handle<Smi>::cast(end_position)->value()); |
| 209 } | 190 } |
| 210 | 191 |
| 211 | 192 |
| 193 static Object* LoadFromSuper(Isolate* isolate, Handle<Object> receiver, |
| 194 Handle<JSObject> home_object, Handle<Name> name) { |
| 195 if (home_object->IsAccessCheckNeeded() && |
| 196 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_GET)) { |
| 197 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET); |
| 198 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| 199 } |
| 200 |
| 201 PrototypeIterator iter(isolate, home_object); |
| 202 Handle<Object> proto = PrototypeIterator::GetCurrent(iter); |
| 203 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); |
| 204 |
| 205 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); |
| 206 Handle<Object> result; |
| 207 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); |
| 208 return *result; |
| 209 } |
| 210 |
| 211 |
| 212 static Object* LoadElementFromSuper(Isolate* isolate, Handle<Object> receiver, |
| 213 Handle<JSObject> home_object, |
| 214 uint32_t index) { |
| 215 if (home_object->IsAccessCheckNeeded() && |
| 216 !isolate->MayIndexedAccess(home_object, index, v8::ACCESS_GET)) { |
| 217 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET); |
| 218 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); |
| 219 } |
| 220 |
| 221 PrototypeIterator iter(isolate, home_object); |
| 222 Handle<Object> proto = PrototypeIterator::GetCurrent(iter); |
| 223 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); |
| 224 |
| 225 Handle<Object> result; |
| 226 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 227 isolate, result, |
| 228 Object::GetElementWithReceiver(isolate, proto, receiver, index)); |
| 229 return *result; |
| 230 } |
| 231 |
| 232 |
| 212 RUNTIME_FUNCTION(Runtime_LoadFromSuper) { | 233 RUNTIME_FUNCTION(Runtime_LoadFromSuper) { |
| 213 HandleScope scope(isolate); | 234 HandleScope scope(isolate); |
| 214 DCHECK(args.length() == 3); | 235 DCHECK(args.length() == 3); |
| 215 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | 236 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
| 216 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | 237 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| 217 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2); | 238 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2); |
| 218 | 239 |
| 219 return LoadFromSuper(isolate, receiver, home_object, name); | 240 return LoadFromSuper(isolate, receiver, home_object, name); |
| 220 } | 241 } |
| 221 | 242 |
| 222 | 243 |
| 223 RUNTIME_FUNCTION(Runtime_LoadKeyedFromSuper) { | 244 RUNTIME_FUNCTION(Runtime_LoadKeyedFromSuper) { |
| 224 HandleScope scope(isolate); | 245 HandleScope scope(isolate); |
| 225 DCHECK(args.length() == 3); | 246 DCHECK(args.length() == 3); |
| 226 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | 247 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
| 227 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | 248 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| 228 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2); | 249 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2); |
| 229 | 250 |
| 251 uint32_t index; |
| 252 if (key->ToArrayIndex(&index)) { |
| 253 return LoadElementFromSuper(isolate, receiver, home_object, index); |
| 254 } |
| 255 |
| 230 Handle<Name> name; | 256 Handle<Name> name; |
| 231 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, | 257 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, |
| 232 Runtime::ToName(isolate, key)); | 258 Runtime::ToName(isolate, key)); |
| 233 uint32_t index; | |
| 234 if (name->AsArrayIndex(&index)) { | 259 if (name->AsArrayIndex(&index)) { |
| 235 // TODO(dslomov): Implement. | 260 return LoadElementFromSuper(isolate, receiver, home_object, index); |
| 236 return ThrowUnsupportedSuper(isolate); | |
| 237 } | 261 } |
| 238 return LoadFromSuper(isolate, receiver, home_object, name); | 262 return LoadFromSuper(isolate, receiver, home_object, name); |
| 239 } | 263 } |
| 240 | 264 |
| 241 | 265 |
| 242 static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object, | 266 static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object, |
| 243 Handle<Object> receiver, Handle<Name> name, | 267 Handle<Object> receiver, Handle<Name> name, |
| 244 Handle<Object> value, StrictMode strict_mode) { | 268 Handle<Object> value, StrictMode strict_mode) { |
| 245 if (home_object->IsAccessCheckNeeded() && | 269 if (home_object->IsAccessCheckNeeded() && |
| 246 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_SET)) { | 270 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_SET)) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 DCHECK(args.length() == 4); | 343 DCHECK(args.length() == 4); |
| 320 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | 344 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); |
| 321 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | 345 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); |
| 322 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2); | 346 CONVERT_ARG_HANDLE_CHECKED(Object, key, 2); |
| 323 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3); | 347 CONVERT_ARG_HANDLE_CHECKED(Object, value, 3); |
| 324 | 348 |
| 325 return StoreKeyedToSuper(isolate, home_object, receiver, key, value, SLOPPY); | 349 return StoreKeyedToSuper(isolate, home_object, receiver, key, value, SLOPPY); |
| 326 } | 350 } |
| 327 } | 351 } |
| 328 } // namespace v8::internal | 352 } // namespace v8::internal |
| OLD | NEW |