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 <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/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 HandleScope scope(isolate); | 263 HandleScope scope(isolate); |
264 DCHECK(args.length() == 1); | 264 DCHECK(args.length() == 1); |
265 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); | 265 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
266 Handle<Object> result; | 266 Handle<Object> result; |
267 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 267 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
268 JSObject::PreventExtensions(obj)); | 268 JSObject::PreventExtensions(obj)); |
269 return *result; | 269 return *result; |
270 } | 270 } |
271 | 271 |
272 | 272 |
273 RUNTIME_FUNCTION(Runtime_ToMethod) { | |
274 HandleScope scope(isolate); | |
275 DCHECK(args.length() == 2); | |
276 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); | |
277 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | |
278 Handle<JSFunction> clone = JSFunction::CloneClosure(fun); | |
279 Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol()); | |
280 JSObject::SetOwnPropertyIgnoreAttributes(clone, home_object_symbol, | |
281 home_object, DONT_ENUM).Assert(); | |
282 return *clone; | |
283 } | |
284 | |
285 | |
286 RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { | |
287 DCHECK(args.length() == 0); | |
288 return isolate->heap()->home_object_symbol(); | |
289 } | |
290 | |
291 | |
292 RUNTIME_FUNCTION(Runtime_LoadFromSuper) { | |
293 HandleScope scope(isolate); | |
294 DCHECK(args.length() == 3); | |
295 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | |
296 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | |
297 CONVERT_ARG_HANDLE_CHECKED(Name, name, 2); | |
298 | |
299 if (home_object->IsAccessCheckNeeded() && | |
300 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_GET)) { | |
301 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_GET); | |
302 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | |
303 } | |
304 | |
305 PrototypeIterator iter(isolate, home_object); | |
306 Handle<Object> proto = PrototypeIterator::GetCurrent(iter); | |
307 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); | |
308 | |
309 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); | |
310 Handle<Object> result; | |
311 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); | |
312 return *result; | |
313 } | |
314 | |
315 | |
316 static Object* StoreToSuper(Isolate* isolate, Handle<JSObject> home_object, | |
317 Handle<Object> receiver, Handle<Name> name, | |
318 Handle<Object> value, StrictMode strict_mode) { | |
319 if (home_object->IsAccessCheckNeeded() && | |
320 !isolate->MayNamedAccess(home_object, name, v8::ACCESS_SET)) { | |
321 isolate->ReportFailedAccessCheck(home_object, v8::ACCESS_SET); | |
322 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | |
323 } | |
324 | |
325 PrototypeIterator iter(isolate, home_object); | |
326 Handle<Object> proto = PrototypeIterator::GetCurrent(iter); | |
327 if (!proto->IsJSReceiver()) return isolate->heap()->undefined_value(); | |
328 | |
329 LookupIterator it(receiver, name, Handle<JSReceiver>::cast(proto)); | |
330 Handle<Object> result; | |
331 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | |
332 isolate, result, | |
333 Object::SetProperty(&it, value, strict_mode, | |
334 Object::CERTAINLY_NOT_STORE_FROM_KEYED, | |
335 Object::SUPER_PROPERTY)); | |
336 return *result; | |
337 } | |
338 | |
339 | |
340 RUNTIME_FUNCTION(Runtime_StoreToSuper_Strict) { | |
341 HandleScope scope(isolate); | |
342 DCHECK(args.length() == 4); | |
343 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | |
344 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | |
345 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | |
346 CONVERT_ARG_HANDLE_CHECKED(Name, name, 3); | |
347 | |
348 return StoreToSuper(isolate, home_object, receiver, name, value, STRICT); | |
349 } | |
350 | |
351 | |
352 RUNTIME_FUNCTION(Runtime_StoreToSuper_Sloppy) { | |
353 HandleScope scope(isolate); | |
354 DCHECK(args.length() == 4); | |
355 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 0); | |
356 CONVERT_ARG_HANDLE_CHECKED(JSObject, home_object, 1); | |
357 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | |
358 CONVERT_ARG_HANDLE_CHECKED(Name, name, 3); | |
359 | |
360 return StoreToSuper(isolate, home_object, receiver, name, value, SLOPPY); | |
361 } | |
362 | |
363 | |
364 RUNTIME_FUNCTION(Runtime_IsExtensible) { | 273 RUNTIME_FUNCTION(Runtime_IsExtensible) { |
365 SealHandleScope shs(isolate); | 274 SealHandleScope shs(isolate); |
366 DCHECK(args.length() == 1); | 275 DCHECK(args.length() == 1); |
367 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 276 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
368 if (obj->IsJSGlobalProxy()) { | 277 if (obj->IsJSGlobalProxy()) { |
369 PrototypeIterator iter(isolate, obj); | 278 PrototypeIterator iter(isolate, obj); |
370 if (iter.IsAtEnd()) return isolate->heap()->false_value(); | 279 if (iter.IsAtEnd()) return isolate->heap()->false_value(); |
371 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); | 280 DCHECK(iter.GetCurrent()->IsJSGlobalObject()); |
372 obj = JSObject::cast(iter.GetCurrent()); | 281 obj = JSObject::cast(iter.GetCurrent()); |
373 } | 282 } |
(...skipping 3060 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3434 } | 3343 } |
3435 return NULL; | 3344 return NULL; |
3436 } | 3345 } |
3437 | 3346 |
3438 | 3347 |
3439 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 3348 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
3440 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 3349 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
3441 } | 3350 } |
3442 } | 3351 } |
3443 } // namespace v8::internal | 3352 } // namespace v8::internal |
OLD | NEW |