Skip to content

Commit aef9632

Browse files
committed
Merge branch 'master' of https://github.com/ratel-rust/ratel-core into parenfix
2 parents 3cef757 + 54498dd commit aef9632

File tree

8 files changed

+242
-146
lines changed

8 files changed

+242
-146
lines changed

core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ratel"
3-
version = "0.5.0"
3+
version = "0.5.2"
44
authors = ["Maciej Hirsz <[email protected]>"]
55
license = "MIT/Apache-2.0"
66
description = "JavaScript transpiler in Rust"

core/src/codegen.rs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ impl Code for Value {
255255
Value::Null => gen.write_bytes(b"null"),
256256
Value::True => gen.write_min(b"true", b"!0",),
257257
Value::False => gen.write_min(b"false", b"!1"),
258-
Value::Integer(ref num) => gen.write(num),
258+
Value::Binary(ref num) => gen.write(num),
259259
Value::Number(ref num) => gen.write(num),
260260
Value::String(ref string) => gen.write(string),
261261
Value::RawQuasi(ref quasi) => write_quasi(gen, *quasi),
@@ -271,7 +271,7 @@ impl Code for ObjectMember {
271271
ref key
272272
} => gen.write(key),
273273

274-
ObjectMember::Literal {
274+
ObjectMember::Value {
275275
ref key,
276276
ref value,
277277
} => {
@@ -280,42 +280,39 @@ impl Code for ObjectMember {
280280
gen.write(value);
281281
},
282282

283-
ObjectMember::Computed {
284-
ref key,
285-
ref value,
286-
} => {
287-
gen.write_byte(b'[');
288-
gen.write(key);
289-
gen.write_min(b"]: ", b"]:");
290-
gen.write(value);
291-
},
292-
293283
ObjectMember::Method {
294-
ref name,
284+
ref key,
295285
ref params,
296286
ref body,
297287
} => {
298-
gen.write(name);
288+
gen.write(key);
299289
gen.write_byte(b'(');
300290
gen.write_list(params);
301291
gen.write_min(b") {", b"){");
302292
gen.write_block(body);
303293
gen.write_byte(b'}');
304294
},
295+
}
296+
}
297+
}
305298

306-
ObjectMember::ComputedMethod {
307-
ref name,
308-
ref params,
309-
ref body,
310-
} => {
299+
impl Code for ObjectKey {
300+
#[inline]
301+
fn to_code(&self, gen: &mut Generator) {
302+
match *self {
303+
ObjectKey::Computed (ref expression) => {
311304
gen.write_byte(b'[');
312-
gen.write(name);
313-
gen.write_bytes(b"](");
314-
gen.write_list(params);
315-
gen.write_min(b") {", b"){");
316-
gen.write_block(body);
317-
gen.write_byte(b'}');
305+
gen.write(expression);
306+
gen.write_byte(b']');
318307
},
308+
309+
ObjectKey::Literal (ref slice) => {
310+
gen.write(slice);
311+
},
312+
313+
ObjectKey::Binary (ref num) => {
314+
gen.write(num)
315+
}
319316
}
320317
}
321318
}

core/src/grammar.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@ pub enum Value {
66
Null,
77
True,
88
False,
9-
Integer(u64),
109
Number(OwnedSlice),
10+
Binary(u64),
1111
String(OwnedSlice),
1212
RawQuasi(OwnedSlice),
1313
}
1414

15+
1516
#[derive(Debug, PartialEq, Clone, Copy)]
1617
pub struct Parameter {
1718
pub name: OwnedSlice,
@@ -370,24 +371,22 @@ pub enum ObjectMember {
370371
Shorthand {
371372
key: OwnedSlice,
372373
},
373-
Literal {
374-
key: OwnedSlice,
375-
value: Expression,
376-
},
377-
Computed {
378-
key: Expression,
374+
Value {
375+
key: ObjectKey,
379376
value: Expression,
380377
},
381378
Method {
382-
name: OwnedSlice,
379+
key: ObjectKey,
383380
params: Vec<Parameter>,
384381
body: Vec<Statement>,
385382
},
386-
ComputedMethod {
387-
name: Expression,
388-
params: Vec<Parameter>,
389-
body: Vec<Statement>,
390-
}
383+
}
384+
385+
#[derive(Debug, PartialEq, Clone)]
386+
pub enum ObjectKey {
387+
Computed(Expression),
388+
Literal(OwnedSlice),
389+
Binary(u64),
391390
}
392391

393392
#[derive(Debug, PartialEq, Clone)]

core/src/parser.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,22 +172,28 @@ impl<'a> Parser<'a> {
172172
#[inline]
173173
fn object_member(&mut self, token: Token) -> Result<ObjectMember> {
174174
Ok(match token {
175-
Identifier(key) | Literal(Value::String(key)) => {
175+
176+
Identifier(key) |
177+
Literal(Value::String(key)) |
178+
Literal(Value::Number(key)) => {
179+
176180
match peek!(self) {
177181
Colon => {
178182
self.consume();
183+
let key = ObjectKey::Literal(key);
179184

180-
ObjectMember::Literal {
185+
ObjectMember::Value {
181186
key: key,
182187
value: try!(self.expression(0)),
183188
}
184189
},
185190

186191
ParenOpen => {
187192
self.consume();
193+
let key = ObjectKey::Literal(key);
188194

189195
ObjectMember::Method {
190-
name: key,
196+
key: key,
191197
params: try!(self.parameter_list()),
192198
body: try!(self.block_body())
193199
}
@@ -198,18 +204,43 @@ impl<'a> Parser<'a> {
198204
}
199205
}
200206
},
207+
Literal(Value::Binary(num)) => {
208+
let key = ObjectKey::Binary(num);
209+
match peek!(self) {
210+
Colon => {
211+
self.consume();
212+
213+
ObjectMember::Value {
214+
key: key,
215+
value: try!(self.expression(0)),
216+
}
217+
},
218+
219+
ParenOpen => {
220+
self.consume();
221+
222+
ObjectMember::Method {
223+
key: key,
224+
params: try!(self.parameter_list()),
225+
body: try!(self.block_body())
226+
}
227+
},
228+
229+
_ => unexpected_token!(self)
230+
}
231+
},
201232
BracketOpen => {
202-
let key = try!(self.expression(0));
233+
let key = ObjectKey::Computed(try!(self.expression(0)));
203234

204235
expect!(self, BracketClose);
205236

206237
match next!(self) {
207-
Colon => ObjectMember::Computed {
238+
Colon => ObjectMember::Value {
208239
key: key,
209240
value: try!(self.expression(0)),
210241
},
211-
ParenOpen => ObjectMember::ComputedMethod {
212-
name: key,
242+
ParenOpen => ObjectMember::Method {
243+
key: key,
213244
params: try!(self.parameter_list()),
214245
body: try!(self.block_body()),
215246
},

core/src/tokenizer.rs

Lines changed: 23 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -668,13 +668,13 @@ define_handlers! {
668668
b'o' | b'O' => {
669669
tok.bump();
670670

671-
return Ok(Literal(tok.read_octal()));
671+
return Ok(Literal(tok.read_octal(start)));
672672
},
673673

674674
b'x' | b'X' => {
675675
tok.bump();
676676

677-
return Ok(Literal(tok.read_hexadec()));
677+
return Ok(Literal(tok.read_hexadec(start)));
678678
},
679679

680680
_ => {}
@@ -1034,60 +1034,49 @@ impl<'a> Tokenizer<'a> {
10341034
}
10351035
}
10361036

1037-
Value::Integer(value)
1037+
Value::Binary(value)
10381038
}
10391039

10401040
#[inline]
1041-
fn read_octal(&mut self) -> Value {
1042-
let mut value = 0;
1041+
fn consume_label_characters(&mut self) -> &str {
1042+
let start = self.index;
10431043

1044-
while !self.is_eof() {
1045-
let peek = self.read_byte();
1046-
let digit = match peek {
1047-
b'0'...b'7' => peek - b'0',
1048-
_ => break
1049-
};
1044+
self.bump();
10501045

1051-
value = (value << 3) + digit as u64;
1046+
while !self.is_eof() && ident_lookup::TABLE[self.read_byte() as usize] {
10521047
self.bump();
10531048
}
10541049

1055-
Value::Integer(value)
1050+
unsafe {
1051+
self.source.slice_unchecked(start, self.index)
1052+
}
10561053
}
10571054

10581055
#[inline]
1059-
fn read_hexadec(&mut self) -> Value {
1060-
let mut value = 0;
1056+
fn read_octal(&mut self, start: usize) -> Value {
10611057

10621058
while !self.is_eof() {
1063-
let peek = self.read_byte();
1064-
let digit = match peek {
1065-
b'0'...b'9' => peek - b'0',
1066-
b'a'...b'f' => peek - b'a' + 10,
1067-
b'A'...b'F' => peek - b'A' + 10,
1059+
match self.read_byte() {
1060+
b'0'...b'7' => self.bump(),
10681061
_ => break
10691062
};
1070-
1071-
value = (value << 4) + digit as u64;
1072-
self.bump();
10731063
}
10741064

1075-
Value::Integer(value)
1065+
Value::Number(self.slice_source(start, self.index))
10761066
}
10771067

10781068
#[inline]
1079-
fn consume_label_characters(&mut self) -> &str {
1080-
let start = self.index;
1081-
1082-
self.bump();
1083-
1084-
while !self.is_eof() && ident_lookup::TABLE[self.read_byte() as usize] {
1085-
self.bump();
1069+
fn read_hexadec(&mut self, start: usize) -> Value {
1070+
while !self.is_eof() {
1071+
match self.read_byte() {
1072+
b'0'...b'9' => self.bump(),
1073+
b'a'...b'f' => self.bump(),
1074+
b'A'...b'F' => self.bump(),
1075+
_ => break
1076+
};
10861077
}
10871078

1088-
unsafe {
1089-
self.source.slice_unchecked(start, self.index)
1090-
}
1079+
Value::Number(self.slice_source(start, self.index))
10911080
}
10921081

10931082
#[inline]
@@ -1104,5 +1093,4 @@ impl<'a> Tokenizer<'a> {
11041093

11051094
Value::Number(value)
11061095
}
1107-
11081096
}

0 commit comments

Comments
 (0)