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 3996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4007 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(elements, | 4007 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(elements, |
4008 TENURED); | 4008 TENURED); |
4009 | 4009 |
4010 ZoneList<Expression*>* args = new ZoneList<Expression*>(2); | 4010 ZoneList<Expression*>* args = new ZoneList<Expression*>(2); |
4011 args->Add(new(zone()) Literal(type)); | 4011 args->Add(new(zone()) Literal(type)); |
4012 args->Add(new(zone()) Literal(array)); | 4012 args->Add(new(zone()) Literal(array)); |
4013 return new(zone()) Throw(new(zone()) CallRuntime(constructor, NULL, args), | 4013 return new(zone()) Throw(new(zone()) CallRuntime(constructor, NULL, args), |
4014 scanner().location().beg_pos); | 4014 scanner().location().beg_pos); |
4015 } | 4015 } |
4016 | 4016 |
4017 // ---------------------------------------------------------------------------- | |
4018 // JSON | |
4019 | |
4020 Handle<Object> JsonParser::ParseJson(Handle<String> script, | |
4021 UC16CharacterStream* source) { | |
4022 scanner_.Initialize(source); | |
4023 stack_overflow_ = false; | |
4024 Handle<Object> result = ParseJsonValue(); | |
4025 if (result.is_null() || scanner_.Next() != Token::EOS) { | |
4026 if (stack_overflow_) { | |
4027 // Scanner failed. | |
4028 isolate()->StackOverflow(); | |
4029 } else { | |
4030 // Parse failed. Scanner's current token is the unexpected token. | |
4031 Token::Value token = scanner_.current_token(); | |
4032 | |
4033 const char* message; | |
4034 const char* name_opt = NULL; | |
4035 | |
4036 switch (token) { | |
4037 case Token::EOS: | |
4038 message = "unexpected_eos"; | |
4039 break; | |
4040 case Token::NUMBER: | |
4041 message = "unexpected_token_number"; | |
4042 break; | |
4043 case Token::STRING: | |
4044 message = "unexpected_token_string"; | |
4045 break; | |
4046 case Token::IDENTIFIER: | |
4047 case Token::FUTURE_RESERVED_WORD: | |
4048 message = "unexpected_token_identifier"; | |
4049 break; | |
4050 default: | |
4051 message = "unexpected_token"; | |
4052 name_opt = Token::String(token); | |
4053 ASSERT(name_opt != NULL); | |
4054 break; | |
4055 } | |
4056 | |
4057 Scanner::Location source_location = scanner_.location(); | |
4058 Factory* factory = isolate()->factory(); | |
4059 MessageLocation location(factory->NewScript(script), | |
4060 source_location.beg_pos, | |
4061 source_location.end_pos); | |
4062 Handle<JSArray> array; | |
4063 if (name_opt == NULL) { | |
4064 array = factory->NewJSArray(0); | |
4065 } else { | |
4066 Handle<String> name = factory->NewStringFromUtf8(CStrVector(name_opt)); | |
4067 Handle<FixedArray> element = factory->NewFixedArray(1); | |
4068 element->set(0, *name); | |
4069 array = factory->NewJSArrayWithElements(element); | |
4070 } | |
4071 Handle<Object> result = factory->NewSyntaxError(message, array); | |
4072 isolate()->Throw(*result, &location); | |
4073 return Handle<Object>::null(); | |
4074 } | |
4075 } | |
4076 return result; | |
4077 } | |
4078 | |
4079 | |
4080 Handle<String> JsonParser::GetString() { | |
4081 int literal_length = scanner_.literal_length(); | |
4082 if (literal_length == 0) { | |
4083 return isolate()->factory()->empty_string(); | |
4084 } | |
4085 if (scanner_.is_literal_ascii()) { | |
4086 return isolate()->factory()->NewStringFromAscii( | |
4087 scanner_.literal_ascii_string()); | |
4088 } else { | |
4089 return isolate()->factory()->NewStringFromTwoByte( | |
4090 scanner_.literal_uc16_string()); | |
4091 } | |
4092 } | |
4093 | |
4094 | |
4095 Handle<String> JsonParser::GetSymbol() { | |
4096 int literal_length = scanner_.literal_length(); | |
4097 if (literal_length == 0) { | |
4098 return isolate()->factory()->empty_string(); | |
4099 } | |
4100 if (scanner_.is_literal_ascii()) { | |
4101 return isolate()->factory()->LookupAsciiSymbol( | |
4102 scanner_.literal_ascii_string()); | |
4103 } else { | |
4104 return isolate()->factory()->LookupTwoByteSymbol( | |
4105 scanner_.literal_uc16_string()); | |
4106 } | |
4107 } | |
4108 | |
4109 | |
4110 // Parse any JSON value. | |
4111 Handle<Object> JsonParser::ParseJsonValue() { | |
4112 Token::Value token = scanner_.Next(); | |
4113 switch (token) { | |
4114 case Token::STRING: | |
4115 return GetString(); | |
4116 case Token::NUMBER: | |
4117 return isolate()->factory()->NewNumber(scanner_.number()); | |
4118 case Token::FALSE_LITERAL: | |
4119 return isolate()->factory()->false_value(); | |
4120 case Token::TRUE_LITERAL: | |
4121 return isolate()->factory()->true_value(); | |
4122 case Token::NULL_LITERAL: | |
4123 return isolate()->factory()->null_value(); | |
4124 case Token::LBRACE: | |
4125 return ParseJsonObject(); | |
4126 case Token::LBRACK: | |
4127 return ParseJsonArray(); | |
4128 default: | |
4129 return ReportUnexpectedToken(); | |
4130 } | |
4131 } | |
4132 | |
4133 | |
4134 // Parse a JSON object. Scanner must be right after '{' token. | |
4135 Handle<Object> JsonParser::ParseJsonObject() { | |
4136 Handle<JSFunction> object_constructor( | |
4137 isolate()->global_context()->object_function()); | |
4138 Handle<JSObject> json_object = | |
4139 isolate()->factory()->NewJSObject(object_constructor); | |
4140 if (scanner_.peek() == Token::RBRACE) { | |
4141 scanner_.Next(); | |
4142 } else { | |
4143 if (StackLimitCheck(isolate()).HasOverflowed()) { | |
4144 stack_overflow_ = true; | |
4145 return Handle<Object>::null(); | |
4146 } | |
4147 do { | |
4148 if (scanner_.Next() != Token::STRING) { | |
4149 return ReportUnexpectedToken(); | |
4150 } | |
4151 Handle<String> key = GetSymbol(); | |
4152 if (scanner_.Next() != Token::COLON) { | |
4153 return ReportUnexpectedToken(); | |
4154 } | |
4155 Handle<Object> value = ParseJsonValue(); | |
4156 if (value.is_null()) return Handle<Object>::null(); | |
4157 uint32_t index; | |
4158 if (key->AsArrayIndex(&index)) { | |
4159 SetOwnElement(json_object, index, value, kNonStrictMode); | |
4160 } else if (key->Equals(isolate()->heap()->Proto_symbol())) { | |
4161 // We can't remove the __proto__ accessor since it's hardcoded | |
4162 // in several places. Instead go along and add the value as | |
4163 // the prototype of the created object if possible. | |
4164 SetPrototype(json_object, value); | |
4165 } else { | |
4166 SetLocalPropertyIgnoreAttributes(json_object, key, value, NONE); | |
4167 } | |
4168 } while (scanner_.Next() == Token::COMMA); | |
4169 if (scanner_.current_token() != Token::RBRACE) { | |
4170 return ReportUnexpectedToken(); | |
4171 } | |
4172 } | |
4173 return json_object; | |
4174 } | |
4175 | |
4176 | |
4177 // Parse a JSON array. Scanner must be right after '[' token. | |
4178 Handle<Object> JsonParser::ParseJsonArray() { | |
4179 ZoneScope zone_scope(DELETE_ON_EXIT); | |
4180 ZoneList<Handle<Object> > elements(4); | |
4181 | |
4182 Token::Value token = scanner_.peek(); | |
4183 if (token == Token::RBRACK) { | |
4184 scanner_.Next(); | |
4185 } else { | |
4186 if (StackLimitCheck(isolate()).HasOverflowed()) { | |
4187 stack_overflow_ = true; | |
4188 return Handle<Object>::null(); | |
4189 } | |
4190 do { | |
4191 Handle<Object> element = ParseJsonValue(); | |
4192 if (element.is_null()) return Handle<Object>::null(); | |
4193 elements.Add(element); | |
4194 token = scanner_.Next(); | |
4195 } while (token == Token::COMMA); | |
4196 if (token != Token::RBRACK) { | |
4197 return ReportUnexpectedToken(); | |
4198 } | |
4199 } | |
4200 | |
4201 // Allocate a fixed array with all the elements. | |
4202 Handle<FixedArray> fast_elements = | |
4203 isolate()->factory()->NewFixedArray(elements.length()); | |
4204 | |
4205 for (int i = 0, n = elements.length(); i < n; i++) { | |
4206 fast_elements->set(i, *elements[i]); | |
4207 } | |
4208 | |
4209 return isolate()->factory()->NewJSArrayWithElements(fast_elements); | |
4210 } | |
4211 | 4017 |
4212 // ---------------------------------------------------------------------------- | 4018 // ---------------------------------------------------------------------------- |
4213 // Regular expressions | 4019 // Regular expressions |
4214 | 4020 |
4215 | 4021 |
4216 RegExpParser::RegExpParser(FlatStringReader* in, | 4022 RegExpParser::RegExpParser(FlatStringReader* in, |
4217 Handle<String>* error, | 4023 Handle<String>* error, |
4218 bool multiline) | 4024 bool multiline) |
4219 : isolate_(Isolate::Current()), | 4025 : isolate_(Isolate::Current()), |
4220 error_(error), | 4026 error_(error), |
(...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5178 info->is_global(), | 4984 info->is_global(), |
5179 info->StrictMode()); | 4985 info->StrictMode()); |
5180 } | 4986 } |
5181 } | 4987 } |
5182 | 4988 |
5183 info->SetFunction(result); | 4989 info->SetFunction(result); |
5184 return (result != NULL); | 4990 return (result != NULL); |
5185 } | 4991 } |
5186 | 4992 |
5187 } } // namespace v8::internal | 4993 } } // namespace v8::internal |
OLD | NEW |