OLD | NEW |
1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 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 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 for (int i = 0, len = stmts->length(); i < len; i++) { | 642 for (int i = 0, len = stmts->length(); i < len; i++) { |
643 Visit(stmts->at(i)); | 643 Visit(stmts->at(i)); |
644 CHECK_BAILOUT; | 644 CHECK_BAILOUT; |
645 } | 645 } |
646 } | 646 } |
647 | 647 |
648 | 648 |
649 void CodeGenSelector::VisitDeclaration(Declaration* decl) { | 649 void CodeGenSelector::VisitDeclaration(Declaration* decl) { |
650 Property* prop = decl->proxy()->AsProperty(); | 650 Property* prop = decl->proxy()->AsProperty(); |
651 if (prop != NULL) { | 651 if (prop != NULL) { |
652 // Property rewrites are shared, ensure we are not changing its | |
653 // expression context state. | |
654 ASSERT(prop->obj()->context() == Expression::kUninitialized || | |
655 prop->obj()->context() == Expression::kValue); | |
656 ASSERT(prop->key()->context() == Expression::kUninitialized || | |
657 prop->key()->context() == Expression::kValue); | |
658 ProcessExpression(prop->obj(), Expression::kValue); | 652 ProcessExpression(prop->obj(), Expression::kValue); |
659 ProcessExpression(prop->key(), Expression::kValue); | 653 ProcessExpression(prop->key(), Expression::kValue); |
660 } | 654 } |
661 | 655 |
662 if (decl->fun() != NULL) { | 656 if (decl->fun() != NULL) { |
663 ProcessExpression(decl->fun(), Expression::kValue); | 657 ProcessExpression(decl->fun(), Expression::kValue); |
664 } | 658 } |
665 } | 659 } |
666 | 660 |
667 | 661 |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 if (var != NULL) { | 890 if (var != NULL) { |
897 // All global variables are supported. | 891 // All global variables are supported. |
898 if (!var->is_global()) { | 892 if (!var->is_global()) { |
899 ASSERT(var->slot() != NULL); | 893 ASSERT(var->slot() != NULL); |
900 Slot::Type type = var->slot()->type(); | 894 Slot::Type type = var->slot()->type(); |
901 if (type == Slot::LOOKUP) { | 895 if (type == Slot::LOOKUP) { |
902 BAILOUT("Lookup slot"); | 896 BAILOUT("Lookup slot"); |
903 } | 897 } |
904 } | 898 } |
905 } else if (prop != NULL) { | 899 } else if (prop != NULL) { |
906 ASSERT(prop->obj()->context() == Expression::kUninitialized || | |
907 prop->obj()->context() == Expression::kValue); | |
908 ProcessExpression(prop->obj(), Expression::kValue); | 900 ProcessExpression(prop->obj(), Expression::kValue); |
909 CHECK_BAILOUT; | 901 CHECK_BAILOUT; |
910 // We will only visit the key during code generation for keyed property | 902 // We will only visit the key during code generation for keyed property |
911 // stores. Leave its expression context uninitialized for named | 903 // stores. Leave its expression context uninitialized for named |
912 // property stores. | 904 // property stores. |
913 Literal* lit = prop->key()->AsLiteral(); | 905 Literal* lit = prop->key()->AsLiteral(); |
914 uint32_t ignored; | 906 uint32_t ignored; |
915 if (lit == NULL || | 907 if (lit == NULL || |
916 !lit->handle()->IsSymbol() || | 908 !lit->handle()->IsSymbol() || |
917 String::cast(*(lit->handle()))->AsArrayIndex(&ignored)) { | 909 String::cast(*(lit->handle()))->AsArrayIndex(&ignored)) { |
918 ASSERT(prop->key()->context() == Expression::kUninitialized || | |
919 prop->key()->context() == Expression::kValue); | |
920 ProcessExpression(prop->key(), Expression::kValue); | 910 ProcessExpression(prop->key(), Expression::kValue); |
921 CHECK_BAILOUT; | 911 CHECK_BAILOUT; |
922 } | 912 } |
923 } else { | 913 } else { |
924 // This is a throw reference error. | 914 // This is a throw reference error. |
925 BAILOUT("non-variable/non-property assignment"); | 915 BAILOUT("non-variable/non-property assignment"); |
926 } | 916 } |
927 | 917 |
928 ProcessExpression(expr->value(), Expression::kValue); | 918 ProcessExpression(expr->value(), Expression::kValue); |
929 } | 919 } |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1015 case Token::TYPEOF: | 1005 case Token::TYPEOF: |
1016 ProcessExpression(expr->expression(), Expression::kValue); | 1006 ProcessExpression(expr->expression(), Expression::kValue); |
1017 break; | 1007 break; |
1018 default: | 1008 default: |
1019 BAILOUT("UnaryOperation"); | 1009 BAILOUT("UnaryOperation"); |
1020 } | 1010 } |
1021 } | 1011 } |
1022 | 1012 |
1023 | 1013 |
1024 void CodeGenSelector::VisitCountOperation(CountOperation* expr) { | 1014 void CodeGenSelector::VisitCountOperation(CountOperation* expr) { |
1025 // We support postfix count operations on global variables. | |
1026 if (expr->is_prefix()) BAILOUT("Prefix CountOperation"); | |
1027 Variable* var = expr->expression()->AsVariableProxy()->AsVariable(); | 1015 Variable* var = expr->expression()->AsVariableProxy()->AsVariable(); |
1028 if (var == NULL || !var->is_global()) BAILOUT("non-global postincrement"); | 1016 Property* prop = expr->expression()->AsProperty(); |
1029 ProcessExpression(expr->expression(), Expression::kValue); | 1017 ASSERT(var == NULL || prop == NULL); |
| 1018 if (var != NULL) { |
| 1019 // All global variables are supported. |
| 1020 if (!var->is_global()) { |
| 1021 ASSERT(var->slot() != NULL); |
| 1022 Slot::Type type = var->slot()->type(); |
| 1023 if (type == Slot::LOOKUP) { |
| 1024 BAILOUT("CountOperation with lookup slot"); |
| 1025 } |
| 1026 } |
| 1027 } else if (prop != NULL) { |
| 1028 ProcessExpression(prop->obj(), Expression::kValue); |
| 1029 CHECK_BAILOUT; |
| 1030 // We will only visit the key during code generation for keyed property |
| 1031 // stores. Leave its expression context uninitialized for named |
| 1032 // property stores. |
| 1033 Literal* lit = prop->key()->AsLiteral(); |
| 1034 uint32_t ignored; |
| 1035 if (lit == NULL || |
| 1036 !lit->handle()->IsSymbol() || |
| 1037 String::cast(*(lit->handle()))->AsArrayIndex(&ignored)) { |
| 1038 ProcessExpression(prop->key(), Expression::kValue); |
| 1039 CHECK_BAILOUT; |
| 1040 } |
| 1041 } else { |
| 1042 // This is a throw reference error. |
| 1043 BAILOUT("CountOperation non-variable/non-property expression"); |
| 1044 } |
1030 } | 1045 } |
1031 | 1046 |
1032 | 1047 |
1033 void CodeGenSelector::VisitBinaryOperation(BinaryOperation* expr) { | 1048 void CodeGenSelector::VisitBinaryOperation(BinaryOperation* expr) { |
1034 switch (expr->op()) { | 1049 switch (expr->op()) { |
1035 case Token::COMMA: | 1050 case Token::COMMA: |
1036 ProcessExpression(expr->left(), Expression::kEffect); | 1051 ProcessExpression(expr->left(), Expression::kEffect); |
1037 CHECK_BAILOUT; | 1052 CHECK_BAILOUT; |
1038 ProcessExpression(expr->right(), context_); | 1053 ProcessExpression(expr->right(), context_); |
1039 break; | 1054 break; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1113 | 1128 |
1114 void CodeGenSelector::VisitThisFunction(ThisFunction* expr) { | 1129 void CodeGenSelector::VisitThisFunction(ThisFunction* expr) { |
1115 // ThisFunction is supported. | 1130 // ThisFunction is supported. |
1116 } | 1131 } |
1117 | 1132 |
1118 #undef BAILOUT | 1133 #undef BAILOUT |
1119 #undef CHECK_BAILOUT | 1134 #undef CHECK_BAILOUT |
1120 | 1135 |
1121 | 1136 |
1122 } } // namespace v8::internal | 1137 } } // namespace v8::internal |
OLD | NEW |