| 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 // Assert that the given argument has a valid value for a StrictModeFlag | 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. | 110 // and store it in a StrictModeFlag variable with the given name. |
| 111 #define CONVERT_STRICT_MODE_ARG(name, index) \ | 111 #define CONVERT_STRICT_MODE_ARG(name, index) \ |
| 112 ASSERT(args[index]->IsSmi()); \ | 112 ASSERT(args[index]->IsSmi()); \ |
| 113 ASSERT(args.smi_at(index) == kStrictMode || \ | 113 ASSERT(args.smi_at(index) == kStrictMode || \ |
| 114 args.smi_at(index) == kNonStrictMode); \ | 114 args.smi_at(index) == kNonStrictMode); \ |
| 115 StrictModeFlag name = \ | 115 StrictModeFlag name = \ |
| 116 static_cast<StrictModeFlag>(args.smi_at(index)); | 116 static_cast<StrictModeFlag>(args.smi_at(index)); |
| 117 | 117 |
| 118 | 118 |
| 119 // Assert that the given argument has a valid value for a LanguageMode |
| 120 // and store it in a LanguageMode variable with the given name. |
| 121 #define CONVERT_LANGUAGE_MODE_ARG(name, index) \ |
| 122 ASSERT(args[index]->IsSmi()); \ |
| 123 ASSERT(args.smi_at(index) == CLASSIC_MODE || \ |
| 124 args.smi_at(index) == STRICT_MODE || \ |
| 125 args.smi_at(index) == EXTENDED_MODE); \ |
| 126 LanguageMode name = \ |
| 127 static_cast<LanguageMode>(args.smi_at(index)); |
| 128 |
| 129 |
| 119 MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, | 130 MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, |
| 120 JSObject* boilerplate) { | 131 JSObject* boilerplate) { |
| 121 StackLimitCheck check(isolate); | 132 StackLimitCheck check(isolate); |
| 122 if (check.HasOverflowed()) return isolate->StackOverflow(); | 133 if (check.HasOverflowed()) return isolate->StackOverflow(); |
| 123 | 134 |
| 124 Heap* heap = isolate->heap(); | 135 Heap* heap = isolate->heap(); |
| 125 Object* result; | 136 Object* result; |
| 126 { MaybeObject* maybe_result = heap->CopyJSObject(boilerplate); | 137 { MaybeObject* maybe_result = heap->CopyJSObject(boilerplate); |
| 127 if (!maybe_result->ToObject(&result)) return maybe_result; | 138 if (!maybe_result->ToObject(&result)) return maybe_result; |
| 128 } | 139 } |
| (...skipping 1266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1395 attr |= lookup.GetAttributes() & DONT_DELETE; | 1406 attr |= lookup.GetAttributes() & DONT_DELETE; |
| 1396 } | 1407 } |
| 1397 PropertyAttributes attributes = static_cast<PropertyAttributes>(attr); | 1408 PropertyAttributes attributes = static_cast<PropertyAttributes>(attr); |
| 1398 | 1409 |
| 1399 RETURN_IF_EMPTY_HANDLE(isolate, | 1410 RETURN_IF_EMPTY_HANDLE(isolate, |
| 1400 SetLocalPropertyIgnoreAttributes(global, | 1411 SetLocalPropertyIgnoreAttributes(global, |
| 1401 name, | 1412 name, |
| 1402 value, | 1413 value, |
| 1403 attributes)); | 1414 attributes)); |
| 1404 } else { | 1415 } else { |
| 1405 StrictModeFlag strict_mode = DeclareGlobalsStrictModeFlag::decode(flags); | 1416 LanguageMode language_mode = DeclareGlobalsLanguageMode::decode(flags); |
| 1417 StrictModeFlag strict_mode_flag = (language_mode == CLASSIC_MODE) |
| 1418 ? kNonStrictMode : kStrictMode; |
| 1406 RETURN_IF_EMPTY_HANDLE(isolate, | 1419 RETURN_IF_EMPTY_HANDLE(isolate, |
| 1407 SetProperty(global, | 1420 SetProperty(global, |
| 1408 name, | 1421 name, |
| 1409 value, | 1422 value, |
| 1410 static_cast<PropertyAttributes>(attr), | 1423 static_cast<PropertyAttributes>(attr), |
| 1411 strict_mode)); | 1424 strict_mode_flag)); |
| 1412 } | 1425 } |
| 1413 } | 1426 } |
| 1414 | 1427 |
| 1415 ASSERT(!isolate->has_pending_exception()); | 1428 ASSERT(!isolate->has_pending_exception()); |
| 1416 return isolate->heap()->undefined_value(); | 1429 return isolate->heap()->undefined_value(); |
| 1417 } | 1430 } |
| 1418 | 1431 |
| 1419 | 1432 |
| 1420 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareContextSlot) { | 1433 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareContextSlot) { |
| 1421 HandleScope scope(isolate); | 1434 HandleScope scope(isolate); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1507 kNonStrictMode)); | 1520 kNonStrictMode)); |
| 1508 } | 1521 } |
| 1509 | 1522 |
| 1510 return isolate->heap()->undefined_value(); | 1523 return isolate->heap()->undefined_value(); |
| 1511 } | 1524 } |
| 1512 | 1525 |
| 1513 | 1526 |
| 1514 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) { | 1527 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeVarGlobal) { |
| 1515 NoHandleAllocation nha; | 1528 NoHandleAllocation nha; |
| 1516 // args[0] == name | 1529 // args[0] == name |
| 1517 // args[1] == strict_mode | 1530 // args[1] == language_mode |
| 1518 // args[2] == value (optional) | 1531 // args[2] == value (optional) |
| 1519 | 1532 |
| 1520 // Determine if we need to assign to the variable if it already | 1533 // Determine if we need to assign to the variable if it already |
| 1521 // exists (based on the number of arguments). | 1534 // exists (based on the number of arguments). |
| 1522 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); | 1535 RUNTIME_ASSERT(args.length() == 2 || args.length() == 3); |
| 1523 bool assign = args.length() == 3; | 1536 bool assign = args.length() == 3; |
| 1524 | 1537 |
| 1525 CONVERT_ARG_CHECKED(String, name, 0); | 1538 CONVERT_ARG_CHECKED(String, name, 0); |
| 1526 GlobalObject* global = isolate->context()->global(); | 1539 GlobalObject* global = isolate->context()->global(); |
| 1527 RUNTIME_ASSERT(args[1]->IsSmi()); | 1540 RUNTIME_ASSERT(args[1]->IsSmi()); |
| 1528 CONVERT_STRICT_MODE_ARG(strict_mode, 1); | 1541 CONVERT_LANGUAGE_MODE_ARG(language_mode, 1); |
| 1542 StrictModeFlag strict_mode_flag = (language_mode == CLASSIC_MODE) |
| 1543 ? kNonStrictMode : kStrictMode; |
| 1529 | 1544 |
| 1530 // According to ECMA-262, section 12.2, page 62, the property must | 1545 // According to ECMA-262, section 12.2, page 62, the property must |
| 1531 // not be deletable. | 1546 // not be deletable. |
| 1532 PropertyAttributes attributes = DONT_DELETE; | 1547 PropertyAttributes attributes = DONT_DELETE; |
| 1533 | 1548 |
| 1534 // Lookup the property locally in the global object. If it isn't | 1549 // Lookup the property locally in the global object. If it isn't |
| 1535 // there, there is a property with this name in the prototype chain. | 1550 // there, there is a property with this name in the prototype chain. |
| 1536 // We follow Safari and Firefox behavior and only set the property | 1551 // We follow Safari and Firefox behavior and only set the property |
| 1537 // locally if there is an explicit initialization value that we have | 1552 // locally if there is an explicit initialization value that we have |
| 1538 // to assign to the property. | 1553 // to assign to the property. |
| 1539 // Note that objects can have hidden prototypes, so we need to traverse | 1554 // Note that objects can have hidden prototypes, so we need to traverse |
| 1540 // the whole chain of hidden prototypes to do a 'local' lookup. | 1555 // the whole chain of hidden prototypes to do a 'local' lookup. |
| 1541 Object* object = global; | 1556 Object* object = global; |
| 1542 LookupResult lookup(isolate); | 1557 LookupResult lookup(isolate); |
| 1543 while (object->IsJSObject() && | 1558 while (object->IsJSObject() && |
| 1544 JSObject::cast(object)->map()->is_hidden_prototype()) { | 1559 JSObject::cast(object)->map()->is_hidden_prototype()) { |
| 1545 JSObject* raw_holder = JSObject::cast(object); | 1560 JSObject* raw_holder = JSObject::cast(object); |
| 1546 raw_holder->LocalLookup(*name, &lookup); | 1561 raw_holder->LocalLookup(*name, &lookup); |
| 1547 if (lookup.IsProperty() && lookup.type() == INTERCEPTOR) { | 1562 if (lookup.IsProperty() && lookup.type() == INTERCEPTOR) { |
| 1548 HandleScope handle_scope(isolate); | 1563 HandleScope handle_scope(isolate); |
| 1549 Handle<JSObject> holder(raw_holder); | 1564 Handle<JSObject> holder(raw_holder); |
| 1550 PropertyAttributes intercepted = holder->GetPropertyAttribute(*name); | 1565 PropertyAttributes intercepted = holder->GetPropertyAttribute(*name); |
| 1551 // Update the raw pointer in case it's changed due to GC. | 1566 // Update the raw pointer in case it's changed due to GC. |
| 1552 raw_holder = *holder; | 1567 raw_holder = *holder; |
| 1553 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { | 1568 if (intercepted != ABSENT && (intercepted & READ_ONLY) == 0) { |
| 1554 // Found an interceptor that's not read only. | 1569 // Found an interceptor that's not read only. |
| 1555 if (assign) { | 1570 if (assign) { |
| 1556 return raw_holder->SetProperty( | 1571 return raw_holder->SetProperty( |
| 1557 &lookup, *name, args[2], attributes, strict_mode); | 1572 &lookup, *name, args[2], attributes, strict_mode_flag); |
| 1558 } else { | 1573 } else { |
| 1559 return isolate->heap()->undefined_value(); | 1574 return isolate->heap()->undefined_value(); |
| 1560 } | 1575 } |
| 1561 } | 1576 } |
| 1562 } | 1577 } |
| 1563 object = raw_holder->GetPrototype(); | 1578 object = raw_holder->GetPrototype(); |
| 1564 } | 1579 } |
| 1565 | 1580 |
| 1566 // Reload global in case the loop above performed a GC. | 1581 // Reload global in case the loop above performed a GC. |
| 1567 global = isolate->context()->global(); | 1582 global = isolate->context()->global(); |
| 1568 if (assign) { | 1583 if (assign) { |
| 1569 return global->SetProperty(*name, args[2], attributes, strict_mode); | 1584 return global->SetProperty(*name, args[2], attributes, strict_mode_flag); |
| 1570 } | 1585 } |
| 1571 return isolate->heap()->undefined_value(); | 1586 return isolate->heap()->undefined_value(); |
| 1572 } | 1587 } |
| 1573 | 1588 |
| 1574 | 1589 |
| 1575 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) { | 1590 RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) { |
| 1576 // All constants are declared with an initial value. The name | 1591 // All constants are declared with an initial value. The name |
| 1577 // of the constant is the first argument and the initial value | 1592 // of the constant is the first argument and the initial value |
| 1578 // is the second. | 1593 // is the second. |
| 1579 RUNTIME_ASSERT(args.length() == 2); | 1594 RUNTIME_ASSERT(args.length() == 2); |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1926 | 1941 |
| 1927 return *holder; | 1942 return *holder; |
| 1928 } | 1943 } |
| 1929 | 1944 |
| 1930 | 1945 |
| 1931 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { | 1946 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { |
| 1932 NoHandleAllocation handle_free; | 1947 NoHandleAllocation handle_free; |
| 1933 ASSERT(args.length() == 1); | 1948 ASSERT(args.length() == 1); |
| 1934 CONVERT_CHECKED(JSFunction, function, args[0]); | 1949 CONVERT_CHECKED(JSFunction, function, args[0]); |
| 1935 SharedFunctionInfo* shared = function->shared(); | 1950 SharedFunctionInfo* shared = function->shared(); |
| 1936 if (shared->native() || shared->strict_mode()) { | 1951 if (shared->native() || shared->is_strict_or_extended_mode()) { |
| 1937 return isolate->heap()->undefined_value(); | 1952 return isolate->heap()->undefined_value(); |
| 1938 } | 1953 } |
| 1939 // Returns undefined for strict or native functions, or | 1954 // Returns undefined for strict or native functions, or |
| 1940 // the associated global receiver for "normal" functions. | 1955 // the associated global receiver for "normal" functions. |
| 1941 | 1956 |
| 1942 Context* global_context = | 1957 Context* global_context = |
| 1943 function->context()->global()->global_context(); | 1958 function->context()->global()->global_context(); |
| 1944 return global_context->global()->global_receiver(); | 1959 return global_context->global()->global_receiver(); |
| 1945 } | 1960 } |
| 1946 | 1961 |
| (...skipping 2802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4749 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); | 4764 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); |
| 4750 } | 4765 } |
| 4751 | 4766 |
| 4752 | 4767 |
| 4753 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { | 4768 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { |
| 4754 NoHandleAllocation ha; | 4769 NoHandleAllocation ha; |
| 4755 ASSERT(args.length() == 3); | 4770 ASSERT(args.length() == 3); |
| 4756 | 4771 |
| 4757 CONVERT_CHECKED(JSReceiver, object, args[0]); | 4772 CONVERT_CHECKED(JSReceiver, object, args[0]); |
| 4758 CONVERT_CHECKED(String, key, args[1]); | 4773 CONVERT_CHECKED(String, key, args[1]); |
| 4759 CONVERT_SMI_ARG_CHECKED(strict, 2); | 4774 CONVERT_STRICT_MODE_ARG(strict_mode, 2); |
| 4760 return object->DeleteProperty(key, (strict == kStrictMode) | 4775 return object->DeleteProperty(key, (strict_mode == kStrictMode) |
| 4761 ? JSReceiver::STRICT_DELETION | 4776 ? JSReceiver::STRICT_DELETION |
| 4762 : JSReceiver::NORMAL_DELETION); | 4777 : JSReceiver::NORMAL_DELETION); |
| 4763 } | 4778 } |
| 4764 | 4779 |
| 4765 | 4780 |
| 4766 static Object* HasLocalPropertyImplementation(Isolate* isolate, | 4781 static Object* HasLocalPropertyImplementation(Isolate* isolate, |
| 4767 Handle<JSObject> object, | 4782 Handle<JSObject> object, |
| 4768 Handle<String> key) { | 4783 Handle<String> key) { |
| 4769 if (object->HasLocalProperty(*key)) return isolate->heap()->true_value(); | 4784 if (object->HasLocalProperty(*key)) return isolate->heap()->true_value(); |
| 4770 // Handle hidden prototypes. If there's a hidden prototype above this thing | 4785 // Handle hidden prototypes. If there's a hidden prototype above this thing |
| (...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5176 } else { | 5191 } else { |
| 5177 return isolate->initial_object_prototype()->GetElement(index); | 5192 return isolate->initial_object_prototype()->GetElement(index); |
| 5178 } | 5193 } |
| 5179 } | 5194 } |
| 5180 | 5195 |
| 5181 // Handle special arguments properties. | 5196 // Handle special arguments properties. |
| 5182 if (key->Equals(isolate->heap()->length_symbol())) return Smi::FromInt(n); | 5197 if (key->Equals(isolate->heap()->length_symbol())) return Smi::FromInt(n); |
| 5183 if (key->Equals(isolate->heap()->callee_symbol())) { | 5198 if (key->Equals(isolate->heap()->callee_symbol())) { |
| 5184 Object* function = frame->function(); | 5199 Object* function = frame->function(); |
| 5185 if (function->IsJSFunction() && | 5200 if (function->IsJSFunction() && |
| 5186 JSFunction::cast(function)->shared()->strict_mode()) { | 5201 JSFunction::cast(function)->shared()->is_strict_or_extended_mode()) { |
| 5187 return isolate->Throw(*isolate->factory()->NewTypeError( | 5202 return isolate->Throw(*isolate->factory()->NewTypeError( |
| 5188 "strict_arguments_callee", HandleVector<Object>(NULL, 0))); | 5203 "strict_arguments_callee", HandleVector<Object>(NULL, 0))); |
| 5189 } | 5204 } |
| 5190 return function; | 5205 return function; |
| 5191 } | 5206 } |
| 5192 | 5207 |
| 5193 // Lookup in the initial Object.prototype object. | 5208 // Lookup in the initial Object.prototype object. |
| 5194 return isolate->initial_object_prototype()->GetProperty(*key); | 5209 return isolate->initial_object_prototype()->GetProperty(*key); |
| 5195 } | 5210 } |
| 5196 | 5211 |
| (...skipping 3865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9062 } | 9077 } |
| 9063 | 9078 |
| 9064 | 9079 |
| 9065 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) { | 9080 RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) { |
| 9066 HandleScope scope(isolate); | 9081 HandleScope scope(isolate); |
| 9067 ASSERT(args.length() == 4); | 9082 ASSERT(args.length() == 4); |
| 9068 | 9083 |
| 9069 Handle<Object> value(args[0], isolate); | 9084 Handle<Object> value(args[0], isolate); |
| 9070 CONVERT_ARG_CHECKED(Context, context, 1); | 9085 CONVERT_ARG_CHECKED(Context, context, 1); |
| 9071 CONVERT_ARG_CHECKED(String, name, 2); | 9086 CONVERT_ARG_CHECKED(String, name, 2); |
| 9072 CONVERT_STRICT_MODE_ARG(strict_mode, 3); | 9087 CONVERT_LANGUAGE_MODE_ARG(language_mode, 3); |
| 9088 StrictModeFlag strict_mode = (language_mode == CLASSIC_MODE) |
| 9089 ? kNonStrictMode : kStrictMode; |
| 9073 | 9090 |
| 9074 int index; | 9091 int index; |
| 9075 PropertyAttributes attributes; | 9092 PropertyAttributes attributes; |
| 9076 ContextLookupFlags flags = FOLLOW_CHAINS; | 9093 ContextLookupFlags flags = FOLLOW_CHAINS; |
| 9077 BindingFlags binding_flags; | 9094 BindingFlags binding_flags; |
| 9078 Handle<Object> holder = context->Lookup(name, | 9095 Handle<Object> holder = context->Lookup(name, |
| 9079 flags, | 9096 flags, |
| 9080 &index, | 9097 &index, |
| 9081 &attributes, | 9098 &attributes, |
| 9082 &binding_flags); | 9099 &binding_flags); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9432 // strings. Throw an exception if it doesn't. | 9449 // strings. Throw an exception if it doesn't. |
| 9433 if (!CodeGenerationFromStringsAllowed(isolate, context)) { | 9450 if (!CodeGenerationFromStringsAllowed(isolate, context)) { |
| 9434 return isolate->Throw(*isolate->factory()->NewError( | 9451 return isolate->Throw(*isolate->factory()->NewError( |
| 9435 "code_gen_from_strings", HandleVector<Object>(NULL, 0))); | 9452 "code_gen_from_strings", HandleVector<Object>(NULL, 0))); |
| 9436 } | 9453 } |
| 9437 | 9454 |
| 9438 // Compile source string in the global context. | 9455 // Compile source string in the global context. |
| 9439 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source, | 9456 Handle<SharedFunctionInfo> shared = Compiler::CompileEval(source, |
| 9440 context, | 9457 context, |
| 9441 true, | 9458 true, |
| 9442 kNonStrictMode); | 9459 CLASSIC_MODE); |
| 9443 if (shared.is_null()) return Failure::Exception(); | 9460 if (shared.is_null()) return Failure::Exception(); |
| 9444 Handle<JSFunction> fun = | 9461 Handle<JSFunction> fun = |
| 9445 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | 9462 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, |
| 9446 context, | 9463 context, |
| 9447 NOT_TENURED); | 9464 NOT_TENURED); |
| 9448 return *fun; | 9465 return *fun; |
| 9449 } | 9466 } |
| 9450 | 9467 |
| 9451 | 9468 |
| 9452 static ObjectPair CompileGlobalEval(Isolate* isolate, | 9469 static ObjectPair CompileGlobalEval(Isolate* isolate, |
| 9453 Handle<String> source, | 9470 Handle<String> source, |
| 9454 Handle<Object> receiver, | 9471 Handle<Object> receiver, |
| 9455 StrictModeFlag strict_mode) { | 9472 LanguageMode language_mode) { |
| 9456 Handle<Context> context = Handle<Context>(isolate->context()); | 9473 Handle<Context> context = Handle<Context>(isolate->context()); |
| 9457 Handle<Context> global_context = Handle<Context>(context->global_context()); | 9474 Handle<Context> global_context = Handle<Context>(context->global_context()); |
| 9458 | 9475 |
| 9459 // Check if global context allows code generation from | 9476 // Check if global context allows code generation from |
| 9460 // strings. Throw an exception if it doesn't. | 9477 // strings. Throw an exception if it doesn't. |
| 9461 if (!CodeGenerationFromStringsAllowed(isolate, global_context)) { | 9478 if (!CodeGenerationFromStringsAllowed(isolate, global_context)) { |
| 9462 isolate->Throw(*isolate->factory()->NewError( | 9479 isolate->Throw(*isolate->factory()->NewError( |
| 9463 "code_gen_from_strings", HandleVector<Object>(NULL, 0))); | 9480 "code_gen_from_strings", HandleVector<Object>(NULL, 0))); |
| 9464 return MakePair(Failure::Exception(), NULL); | 9481 return MakePair(Failure::Exception(), NULL); |
| 9465 } | 9482 } |
| 9466 | 9483 |
| 9467 // Deal with a normal eval call with a string argument. Compile it | 9484 // Deal with a normal eval call with a string argument. Compile it |
| 9468 // and return the compiled function bound in the local context. | 9485 // and return the compiled function bound in the local context. |
| 9469 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( | 9486 Handle<SharedFunctionInfo> shared = Compiler::CompileEval( |
| 9470 source, | 9487 source, |
| 9471 Handle<Context>(isolate->context()), | 9488 Handle<Context>(isolate->context()), |
| 9472 context->IsGlobalContext(), | 9489 context->IsGlobalContext(), |
| 9473 strict_mode); | 9490 language_mode); |
| 9474 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); | 9491 if (shared.is_null()) return MakePair(Failure::Exception(), NULL); |
| 9475 Handle<JSFunction> compiled = | 9492 Handle<JSFunction> compiled = |
| 9476 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 9493 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| 9477 shared, context, NOT_TENURED); | 9494 shared, context, NOT_TENURED); |
| 9478 return MakePair(*compiled, *receiver); | 9495 return MakePair(*compiled, *receiver); |
| 9479 } | 9496 } |
| 9480 | 9497 |
| 9481 | 9498 |
| 9482 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { | 9499 RUNTIME_FUNCTION(ObjectPair, Runtime_ResolvePossiblyDirectEval) { |
| 9483 ASSERT(args.length() == 4); | 9500 ASSERT(args.length() == 4); |
| 9484 | 9501 |
| 9485 HandleScope scope(isolate); | 9502 HandleScope scope(isolate); |
| 9486 Handle<Object> callee = args.at<Object>(0); | 9503 Handle<Object> callee = args.at<Object>(0); |
| 9487 | 9504 |
| 9488 // If "eval" didn't refer to the original GlobalEval, it's not a | 9505 // If "eval" didn't refer to the original GlobalEval, it's not a |
| 9489 // direct call to eval. | 9506 // direct call to eval. |
| 9490 // (And even if it is, but the first argument isn't a string, just let | 9507 // (And even if it is, but the first argument isn't a string, just let |
| 9491 // execution default to an indirect call to eval, which will also return | 9508 // execution default to an indirect call to eval, which will also return |
| 9492 // the first argument without doing anything). | 9509 // the first argument without doing anything). |
| 9493 if (*callee != isolate->global_context()->global_eval_fun() || | 9510 if (*callee != isolate->global_context()->global_eval_fun() || |
| 9494 !args[1]->IsString()) { | 9511 !args[1]->IsString()) { |
| 9495 return MakePair(*callee, isolate->heap()->the_hole_value()); | 9512 return MakePair(*callee, isolate->heap()->the_hole_value()); |
| 9496 } | 9513 } |
| 9497 | 9514 |
| 9498 CONVERT_STRICT_MODE_ARG(strict_mode, 3); | 9515 CONVERT_LANGUAGE_MODE_ARG(language_mode, 3); |
| 9499 return CompileGlobalEval(isolate, | 9516 return CompileGlobalEval(isolate, |
| 9500 args.at<String>(1), | 9517 args.at<String>(1), |
| 9501 args.at<Object>(2), | 9518 args.at<Object>(2), |
| 9502 strict_mode); | 9519 language_mode); |
| 9503 } | 9520 } |
| 9504 | 9521 |
| 9505 | 9522 |
| 9506 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) { | 9523 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetNewFunctionAttributes) { |
| 9507 // This utility adjusts the property attributes for newly created Function | 9524 // This utility adjusts the property attributes for newly created Function |
| 9508 // object ("new Function(...)") by changing the map. | 9525 // object ("new Function(...)") by changing the map. |
| 9509 // All it does is changing the prototype property to enumerable | 9526 // All it does is changing the prototype property to enumerable |
| 9510 // as specified in ECMA262, 15.3.5.2. | 9527 // as specified in ECMA262, 15.3.5.2. |
| 9511 HandleScope scope(isolate); | 9528 HandleScope scope(isolate); |
| 9512 ASSERT(args.length() == 1); | 9529 ASSERT(args.length() == 1); |
| 9513 CONVERT_ARG_CHECKED(JSFunction, func, 0); | 9530 CONVERT_ARG_CHECKED(JSFunction, func, 0); |
| 9514 | 9531 |
| 9515 Handle<Map> map = func->shared()->strict_mode() | 9532 Handle<Map> map = func->shared()->is_classic_mode() |
| 9516 ? isolate->strict_mode_function_instance_map() | 9533 ? isolate->function_instance_map() |
| 9517 : isolate->function_instance_map(); | 9534 : isolate->strict_mode_function_instance_map(); |
| 9518 | 9535 |
| 9519 ASSERT(func->map()->instance_type() == map->instance_type()); | 9536 ASSERT(func->map()->instance_type() == map->instance_type()); |
| 9520 ASSERT(func->map()->instance_size() == map->instance_size()); | 9537 ASSERT(func->map()->instance_size() == map->instance_size()); |
| 9521 func->set_map(*map); | 9538 func->set_map(*map); |
| 9522 return *func; | 9539 return *func; |
| 9523 } | 9540 } |
| 9524 | 9541 |
| 9525 | 9542 |
| 9526 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) { | 9543 RUNTIME_FUNCTION(MaybeObject*, Runtime_AllocateInNewSpace) { |
| 9527 // Allocate a block of memory in NewSpace (filled with a filler). | 9544 // Allocate a block of memory in NewSpace (filled with a filler). |
| (...skipping 1407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10935 | 10952 |
| 10936 // Add the value being returned. | 10953 // Add the value being returned. |
| 10937 if (at_return) { | 10954 if (at_return) { |
| 10938 details->set(details_index++, *return_value); | 10955 details->set(details_index++, *return_value); |
| 10939 } | 10956 } |
| 10940 | 10957 |
| 10941 // Add the receiver (same as in function frame). | 10958 // Add the receiver (same as in function frame). |
| 10942 // THIS MUST BE DONE LAST SINCE WE MIGHT ADVANCE | 10959 // THIS MUST BE DONE LAST SINCE WE MIGHT ADVANCE |
| 10943 // THE FRAME ITERATOR TO WRAP THE RECEIVER. | 10960 // THE FRAME ITERATOR TO WRAP THE RECEIVER. |
| 10944 Handle<Object> receiver(it.frame()->receiver(), isolate); | 10961 Handle<Object> receiver(it.frame()->receiver(), isolate); |
| 10945 if (!receiver->IsJSObject() && !shared->strict_mode() && !shared->native()) { | 10962 if (!receiver->IsJSObject() && |
| 10963 shared->is_classic_mode() && |
| 10964 !shared->native()) { |
| 10946 // If the receiver is not a JSObject and the function is not a | 10965 // If the receiver is not a JSObject and the function is not a |
| 10947 // builtin or strict-mode we have hit an optimization where a | 10966 // builtin or strict-mode we have hit an optimization where a |
| 10948 // value object is not converted into a wrapped JS objects. To | 10967 // value object is not converted into a wrapped JS objects. To |
| 10949 // hide this optimization from the debugger, we wrap the receiver | 10968 // hide this optimization from the debugger, we wrap the receiver |
| 10950 // by creating correct wrapper object based on the calling frame's | 10969 // by creating correct wrapper object based on the calling frame's |
| 10951 // global context. | 10970 // global context. |
| 10952 it.Advance(); | 10971 it.Advance(); |
| 10953 Handle<Context> calling_frames_global_context( | 10972 Handle<Context> calling_frames_global_context( |
| 10954 Context::cast(Context::cast(it.frame()->context())->global_context())); | 10973 Context::cast(Context::cast(it.frame()->context())->global_context())); |
| 10955 receiver = | 10974 receiver = |
| (...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12074 Handle<String> function_source = | 12093 Handle<String> function_source = |
| 12075 isolate->factory()->NewStringFromAscii( | 12094 isolate->factory()->NewStringFromAscii( |
| 12076 Vector<const char>(kSourceStr, sizeof(kSourceStr) - 1)); | 12095 Vector<const char>(kSourceStr, sizeof(kSourceStr) - 1)); |
| 12077 | 12096 |
| 12078 // Currently, the eval code will be executed in non-strict mode, | 12097 // Currently, the eval code will be executed in non-strict mode, |
| 12079 // even in the strict code context. | 12098 // even in the strict code context. |
| 12080 Handle<SharedFunctionInfo> shared = | 12099 Handle<SharedFunctionInfo> shared = |
| 12081 Compiler::CompileEval(function_source, | 12100 Compiler::CompileEval(function_source, |
| 12082 context, | 12101 context, |
| 12083 context->IsGlobalContext(), | 12102 context->IsGlobalContext(), |
| 12084 kNonStrictMode); | 12103 CLASSIC_MODE); |
| 12085 if (shared.is_null()) return Failure::Exception(); | 12104 if (shared.is_null()) return Failure::Exception(); |
| 12086 Handle<JSFunction> compiled_function = | 12105 Handle<JSFunction> compiled_function = |
| 12087 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context); | 12106 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context); |
| 12088 | 12107 |
| 12089 // Invoke the result of the compilation to get the evaluation function. | 12108 // Invoke the result of the compilation to get the evaluation function. |
| 12090 bool has_pending_exception; | 12109 bool has_pending_exception; |
| 12091 Handle<Object> receiver(frame->receiver(), isolate); | 12110 Handle<Object> receiver(frame->receiver(), isolate); |
| 12092 Handle<Object> evaluation_function = | 12111 Handle<Object> evaluation_function = |
| 12093 Execution::Call(compiled_function, receiver, 0, NULL, | 12112 Execution::Call(compiled_function, receiver, 0, NULL, |
| 12094 &has_pending_exception); | 12113 &has_pending_exception); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12167 isolate->factory()->NewFunctionContext( | 12186 isolate->factory()->NewFunctionContext( |
| 12168 Context::MIN_CONTEXT_SLOTS, go_between); | 12187 Context::MIN_CONTEXT_SLOTS, go_between); |
| 12169 context->set_extension(JSObject::cast(*additional_context)); | 12188 context->set_extension(JSObject::cast(*additional_context)); |
| 12170 is_global = false; | 12189 is_global = false; |
| 12171 } | 12190 } |
| 12172 | 12191 |
| 12173 // Compile the source to be evaluated. | 12192 // Compile the source to be evaluated. |
| 12174 // Currently, the eval code will be executed in non-strict mode, | 12193 // Currently, the eval code will be executed in non-strict mode, |
| 12175 // even in the strict code context. | 12194 // even in the strict code context. |
| 12176 Handle<SharedFunctionInfo> shared = | 12195 Handle<SharedFunctionInfo> shared = |
| 12177 Compiler::CompileEval(source, context, is_global, kNonStrictMode); | 12196 Compiler::CompileEval(source, context, is_global, CLASSIC_MODE); |
| 12178 if (shared.is_null()) return Failure::Exception(); | 12197 if (shared.is_null()) return Failure::Exception(); |
| 12179 Handle<JSFunction> compiled_function = | 12198 Handle<JSFunction> compiled_function = |
| 12180 Handle<JSFunction>( | 12199 Handle<JSFunction>( |
| 12181 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, | 12200 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, |
| 12182 context)); | 12201 context)); |
| 12183 | 12202 |
| 12184 // Invoke the result of the compilation to get the evaluation function. | 12203 // Invoke the result of the compilation to get the evaluation function. |
| 12185 bool has_pending_exception; | 12204 bool has_pending_exception; |
| 12186 Handle<Object> receiver = isolate->global(); | 12205 Handle<Object> receiver = isolate->global(); |
| 12187 Handle<Object> result = | 12206 Handle<Object> result = |
| (...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13503 } else { | 13522 } else { |
| 13504 // Handle last resort GC and make sure to allow future allocations | 13523 // Handle last resort GC and make sure to allow future allocations |
| 13505 // to grow the heap without causing GCs (if possible). | 13524 // to grow the heap without causing GCs (if possible). |
| 13506 isolate->counters()->gc_last_resort_from_js()->Increment(); | 13525 isolate->counters()->gc_last_resort_from_js()->Increment(); |
| 13507 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); | 13526 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags); |
| 13508 } | 13527 } |
| 13509 } | 13528 } |
| 13510 | 13529 |
| 13511 | 13530 |
| 13512 } } // namespace v8::internal | 13531 } } // namespace v8::internal |
| OLD | NEW |