| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 double name = args.number_at(index); | 99 double name = args.number_at(index); |
| 100 | 100 |
| 101 // Call the specified converter on the object *comand store the result in | 101 // Call the specified converter on the object *comand store the result in |
| 102 // a variable of the specified type with the given name. If the | 102 // a variable of the specified type with the given name. If the |
| 103 // object is not a Number call IllegalOperation and return. | 103 // object is not a Number call IllegalOperation and return. |
| 104 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ | 104 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ |
| 105 RUNTIME_ASSERT(obj->IsNumber()); \ | 105 RUNTIME_ASSERT(obj->IsNumber()); \ |
| 106 type name = NumberTo##Type(obj); | 106 type name = NumberTo##Type(obj); |
| 107 | 107 |
| 108 | 108 |
| 109 // Assert that the given argument has a valid value for a StrictModeFlag |
| 110 // and store it in a StrictModeFlag variable with the given name. |
| 111 #define CONVERT_STRICT_MODE_ARG(name, index) \ |
| 112 ASSERT(args[index]->IsSmi()); \ |
| 113 ASSERT(args.smi_at(index) == kStrictMode || \ |
| 114 args.smi_at(index) == kNonStrictMode); \ |
| 115 StrictModeFlag name = \ |
| 116 static_cast<StrictModeFlag>(args.smi_at(index)); |
| 117 |
| 118 |
| 109 MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, | 119 MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, |
| 110 JSObject* boilerplate) { | 120 JSObject* boilerplate) { |
| 111 StackLimitCheck check(isolate); | 121 StackLimitCheck check(isolate); |
| 112 if (check.HasOverflowed()) return isolate->StackOverflow(); | 122 if (check.HasOverflowed()) return isolate->StackOverflow(); |
| 113 | 123 |
| 114 Heap* heap = isolate->heap(); | 124 Heap* heap = isolate->heap(); |
| 115 Object* result; | 125 Object* result; |
| 116 { MaybeObject* maybe_result = heap->CopyJSObject(boilerplate); | 126 { MaybeObject* maybe_result = heap->CopyJSObject(boilerplate); |
| 117 if (!maybe_result->ToObject(&result)) return maybe_result; | 127 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 118 } | 128 } |
| (...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1508 // args[2] == value (optional) | 1518 // args[2] == value (optional) |
| 1509 | 1519 |
| 1510 // Determine if we need to assign to the variable if it already | 1520 // Determine if we need to assign to the variable if it already |
| 1511 // exists (based on the number of arguments). | 1521 // exists (based on the number of arguments). |
| 1512 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); | 1522 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); |
| 1513 bool assign = args.length() == 3; | 1523 bool assign = args.length() == 3; |
| 1514 | 1524 |
| 1515 CONVERT_ARG_CHECKED(String, name, 0); | 1525 CONVERT_ARG_CHECKED(String, name, 0); |
| 1516 GlobalObject* global = isolate->context()->global(); | 1526 GlobalObject* global = isolate->context()->global(); |
| 1517 RUNTIME_ASSERT(args[1]->IsSmi()); | 1527 RUNTIME_ASSERT(args[1]->IsSmi()); |
| 1518 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(args.smi_at(1)); | 1528 CONVERT_STRICT_MODE_ARG(strict_mode, 1); |
| 1519 ASSERT(strict_mode == kStrictMode || strict_mode == kNonStrictMode); | |
| 1520 | 1529 |
| 1521 // According to ECMA-262, section 12.2, page 62, the property must | 1530 // According to ECMA-262, section 12.2, page 62, the property must |
| 1522 // not be deletable. | 1531 // not be deletable. |
| 1523 PropertyAttributes attributes = DONT_DELETE; | 1532 PropertyAttributes attributes = DONT_DELETE; |
| 1524 | 1533 |
| 1525 // Lookup the property locally in the global object. If it isn't | 1534 // Lookup the property locally in the global object. If it isn't |
| 1526 // there, there is a property with this name in the prototype chain. | 1535 // there, there is a property with this name in the prototype chain. |
| 1527 // We follow Safari and Firefox behavior and only set the property | 1536 // We follow Safari and Firefox behavior and only set the property |
| 1528 // locally if there is an explicit initialization value that we have | 1537 // locally if there is an explicit initialization value that we have |
| 1529 // to assign to the property. | 1538 // to assign to the property. |
| (...skipping 3057 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4587 Handle<Object> value = args.at<Object>(2); | 4596 Handle<Object> value = args.at<Object>(2); |
| 4588 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); | 4597 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); |
| 4589 RUNTIME_ASSERT( | 4598 RUNTIME_ASSERT( |
| 4590 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 4599 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
| 4591 // Compute attributes. | 4600 // Compute attributes. |
| 4592 PropertyAttributes attributes = | 4601 PropertyAttributes attributes = |
| 4593 static_cast<PropertyAttributes>(unchecked_attributes); | 4602 static_cast<PropertyAttributes>(unchecked_attributes); |
| 4594 | 4603 |
| 4595 StrictModeFlag strict_mode = kNonStrictMode; | 4604 StrictModeFlag strict_mode = kNonStrictMode; |
| 4596 if (args.length() == 5) { | 4605 if (args.length() == 5) { |
| 4597 CONVERT_SMI_ARG_CHECKED(strict_unchecked, 4); | 4606 CONVERT_STRICT_MODE_ARG(strict_mode_flag, 4); |
| 4598 RUNTIME_ASSERT(strict_unchecked == kStrictMode || | 4607 strict_mode = strict_mode_flag; |
| 4599 strict_unchecked == kNonStrictMode); | |
| 4600 strict_mode = static_cast<StrictModeFlag>(strict_unchecked); | |
| 4601 } | 4608 } |
| 4602 | 4609 |
| 4603 return Runtime::SetObjectProperty(isolate, | 4610 return Runtime::SetObjectProperty(isolate, |
| 4604 object, | 4611 object, |
| 4605 key, | 4612 key, |
| 4606 value, | 4613 value, |
| 4607 attributes, | 4614 attributes, |
| 4608 strict_mode); | 4615 strict_mode); |
| 4609 } | 4616 } |
| 4610 | 4617 |
| (...skipping 4394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9005 } | 9012 } |
| 9006 | 9013 |
| 9007 | 9014 |
| 9008 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) { | 9015 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) { |
| 9009 HandleScope scope(isolate); | 9016 HandleScope scope(isolate); |
| 9010 ASSERT(args.length() == 4); | 9017 ASSERT(args.length() == 4); |
| 9011 | 9018 |
| 9012 Handle<Object> value(args[0], isolate); | 9019 Handle<Object> value(args[0], isolate); |
| 9013 CONVERT_ARG_CHECKED(Context, context, 1); | 9020 CONVERT_ARG_CHECKED(Context, context, 1); |
| 9014 CONVERT_ARG_CHECKED(String, name, 2); | 9021 CONVERT_ARG_CHECKED(String, name, 2); |
| 9015 CONVERT_SMI_ARG_CHECKED(strict_unchecked, 3); | 9022 CONVERT_STRICT_MODE_ARG(strict_mode, 3); |
| 9016 RUNTIME_ASSERT(strict_unchecked == kStrictMode || | |
| 9017 strict_unchecked == kNonStrictMode); | |
| 9018 StrictModeFlag strict_mode = static_cast<StrictModeFlag>(strict_unchecked); | |
| 9019 | 9023 |
| 9020 int index; | 9024 int index; |
| 9021 PropertyAttributes attributes; | 9025 PropertyAttributes attributes; |
| 9022 ContextLookupFlags flags = FOLLOW_CHAINS; | 9026 ContextLookupFlags flags = FOLLOW_CHAINS; |
| 9023 BindingFlags binding_flags; | 9027 BindingFlags binding_flags; |
| 9024 Handle<Object> holder = context->Lookup(name, | 9028 Handle<Object> holder = context->Lookup(name, |
| 9025 flags, | 9029 flags, |
| 9026 &index, | 9030 &index, |
| 9027 &attributes, | 9031 &attributes, |
| 9028 &binding_flags); | 9032 &binding_flags); |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9481 return MakePair(*callee, *receiver); | 9485 return MakePair(*callee, *receiver); |
| 9482 } | 9486 } |
| 9483 | 9487 |
| 9484 // 'eval' is bound in the global context, but it may have been overwritten. | 9488 // 'eval' is bound in the global context, but it may have been overwritten. |
| 9485 // Compare it to the builtin 'GlobalEval' function to make sure. | 9489 // Compare it to the builtin 'GlobalEval' function to make sure. |
| 9486 if (*callee != isolate->global_context()->global_eval_fun() || | 9490 if (*callee != isolate->global_context()->global_eval_fun() || |
| 9487 !args[1]->IsString()) { | 9491 !args[1]->IsString()) { |
| 9488 return MakePair(*callee, isolate->heap()->the_hole_value()); | 9492 return MakePair(*callee, isolate->heap()->the_hole_value()); |
| 9489 } | 9493 } |
| 9490 | 9494 |
| 9491 ASSERT(args[3]->IsSmi()); | 9495 CONVERT_STRICT_MODE_ARG(strict_mode, 3); |
| 9492 return CompileGlobalEval(isolate, | 9496 return CompileGlobalEval(isolate, |
| 9493 args.at<String>(1), | 9497 args.at<String>(1), |
| 9494 args.at<Object>(2), | 9498 args.at<Object>(2), |
| 9495 static_cast<StrictModeFlag>(args.smi_at(3))); | 9499 strict_mode); |
| 9496 } | 9500 } |
| 9497 | 9501 |
| 9498 | 9502 |
| 9499 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEvalNoLookup) { | 9503 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEvalNoLookup) { |
| 9500 ASSERT(args.length() == 4); | 9504 ASSERT(args.length() == 4); |
| 9501 | 9505 |
| 9502 HandleScope scope(isolate); | 9506 HandleScope scope(isolate); |
| 9503 Handle<Object> callee = args.at<Object>(0); | 9507 Handle<Object> callee = args.at<Object>(0); |
| 9504 | 9508 |
| 9505 // 'eval' is bound in the global context, but it may have been overwritten. | 9509 // 'eval' is bound in the global context, but it may have been overwritten. |
| 9506 // Compare it to the builtin 'GlobalEval' function to make sure. | 9510 // Compare it to the builtin 'GlobalEval' function to make sure. |
| 9507 if (*callee != isolate->global_context()->global_eval_fun() || | 9511 if (*callee != isolate->global_context()->global_eval_fun() || |
| 9508 !args[1]->IsString()) { | 9512 !args[1]->IsString()) { |
| 9509 return MakePair(*callee, isolate->heap()->the_hole_value()); | 9513 return MakePair(*callee, isolate->heap()->the_hole_value()); |
| 9510 } | 9514 } |
| 9511 | 9515 |
| 9512 ASSERT(args[3]->IsSmi()); | 9516 CONVERT_STRICT_MODE_ARG(strict_mode, 3); |
| 9513 return CompileGlobalEval(isolate, | 9517 return CompileGlobalEval(isolate, |
| 9514 args.at<String>(1), | 9518 args.at<String>(1), |
| 9515 args.at<Object>(2), | 9519 args.at<Object>(2), |
| 9516 static_cast<StrictModeFlag>(args.smi_at(3))); | 9520 strict_mode); |
| 9517 } | 9521 } |
| 9518 | 9522 |
| 9519 | 9523 |
| 9520 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) { | 9524 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) { |
| 9521 // This utility adjusts the property attributes for newly created Function | 9525 // This utility adjusts the property attributes for newly created Function |
| 9522 // object ("new Function(...)") by changing the map. | 9526 // object ("new Function(...)") by changing the map. |
| 9523 // All it does is changing the prototype property to enumerable | 9527 // All it does is changing the prototype property to enumerable |
| 9524 // as specified in ECMA262, 15.3.5.2. | 9528 // as specified in ECMA262, 15.3.5.2. |
| 9525 HandleScope scope(isolate); | 9529 HandleScope scope(isolate); |
| 9526 ASSERT(args.length() == 1); | 9530 ASSERT(args.length() == 1); |
| (...skipping 3999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13526 } else { | 13530 } else { |
| 13527 // Handle last resort GC and make sure to allow future allocations | 13531 // Handle last resort GC and make sure to allow future allocations |
| 13528 // to grow the heap without causing GCs (if possible). | 13532 // to grow the heap without causing GCs (if possible). |
| 13529 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13533 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13530 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13534 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 13531 } | 13535 } |
| 13532 } | 13536 } |
| 13533 | 13537 |
| 13534 | 13538 |
| 13535 } } // namespace v8::internal | 13539 } } // namespace v8::internal |
| OLD | NEW |