git.delta.rocks / jrsonnet / refs/commits / 9d883c6db8a3

difftreelog

perf faster range

Лач2020-07-20parent: #aa3619c.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/build.rsdiffbeforeafterboth
before · crates/jrsonnet-evaluator/build.rs
1use bincode::serialize;2use jrsonnet_parser::{3	parse, Expr, FieldMember, FieldName, LocExpr, Member, ObjBody, ParserSettings,4};5use jrsonnet_stdlib::STDLIB_STR;6use std::{7	env,8	fs::File,9	io::Write,10	path::{Path, PathBuf},11	rc::Rc,12};13use structdump::CodegenResult;1415fn main() {16	let parsed = parse(17		STDLIB_STR,18		&ParserSettings {19			file_name: Rc::new(PathBuf::from("std.jsonnet")),20			loc_data: true,21		},22	)23	.expect("parse");2425	let parsed = if cfg!(feature = "faster") {26		let LocExpr(expr, location) = parsed;27		LocExpr(28			Rc::new(match Rc::try_unwrap(expr).unwrap() {29				Expr::Obj(ObjBody::MemberList(members)) => Expr::Obj(ObjBody::MemberList(30					members31						.into_iter()32						.filter(|p| {33							!matches!(34								p,35								Member::Field(FieldMember {36									name: FieldName::Fixed(name),37									..38								})39								if **name == *"join" || **name == *"manifestJsonEx" ||40								**name == *"escapeStringJson" || **name == *"equals" ||41								**name == *"base64" || **name == *"foldl" || **name == *"foldr" ||42								**name == *"sortImpl"43							)44						})45						.collect(),46				)),47				_ => panic!("std value should be object"),48			}),49			location,50		)51	} else {52		parsed53	};54	{55		let mut codegen = CodegenResult::default();56		let code = codegen.codegen(&parsed);5758		let out_dir = env::var("OUT_DIR").unwrap();59		let dest_path = Path::new(&out_dir).join("stdlib.rs");60		let mut f = File::create(&dest_path).unwrap();61		f.write_all(&code.as_bytes()).unwrap();62	}63	{64		let out_dir = env::var("OUT_DIR").unwrap();65		let dest_path = Path::new(&out_dir).join("stdlib.bincode");66		let mut f = File::create(&dest_path).unwrap();67		f.write_all(&serialize(&parsed).unwrap()).unwrap();68	}69}
after · crates/jrsonnet-evaluator/build.rs
1use bincode::serialize;2use jrsonnet_parser::{3	parse, Expr, FieldMember, FieldName, LocExpr, Member, ObjBody, ParserSettings,4};5use jrsonnet_stdlib::STDLIB_STR;6use std::{7	env,8	fs::File,9	io::Write,10	path::{Path, PathBuf},11	rc::Rc,12};13use structdump::CodegenResult;1415fn main() {16	let parsed = parse(17		STDLIB_STR,18		&ParserSettings {19			file_name: Rc::new(PathBuf::from("std.jsonnet")),20			loc_data: true,21		},22	)23	.expect("parse");2425	let parsed = if cfg!(feature = "faster") {26		let LocExpr(expr, location) = parsed;27		LocExpr(28			Rc::new(match Rc::try_unwrap(expr).unwrap() {29				Expr::Obj(ObjBody::MemberList(members)) => Expr::Obj(ObjBody::MemberList(30					members31						.into_iter()32						.filter(|p| {33							!matches!(34								p,35								Member::Field(FieldMember {36									name: FieldName::Fixed(name),37									..38								})39								if **name == *"join" || **name == *"manifestJsonEx" ||40								**name == *"escapeStringJson" || **name == *"equals" ||41								**name == *"base64" || **name == *"foldl" || **name == *"foldr" ||42								**name == *"sortImpl" || **name == *"range"43							)44						})45						.collect(),46				)),47				_ => panic!("std value should be object"),48			}),49			location,50		)51	} else {52		parsed53	};54	{55		let mut codegen = CodegenResult::default();56		let code = codegen.codegen(&parsed);5758		let out_dir = env::var("OUT_DIR").unwrap();59		let dest_path = Path::new(&out_dir).join("stdlib.rs");60		let mut f = File::create(&dest_path).unwrap();61		f.write_all(&code.as_bytes()).unwrap();62	}63	{64		let out_dir = env::var("OUT_DIR").unwrap();65		let dest_path = Path::new(&out_dir).join("stdlib.bincode");66		let mut f = File::create(&dest_path).unwrap();67		f.write_all(&serialize(&parsed).unwrap()).unwrap();68	}69}
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -633,6 +633,17 @@
 				}
 				Ok(Val::Arr(Rc::new(new_arr)))
 			}))?,
+			// faster
+			("std", "range") => parse_args!(context, "std.range", args, 2, [
+				0, from: [Val::Num]!!Val::Num, vec![ValType::Num];
+				0, to: [Val::Num]!!Val::Num, vec![ValType::Num];
+			], {
+				let mut out = Vec::with_capacity((1+to as usize-from as usize).max(0));
+				for i in from as usize..=to as usize {
+					out.push(Val::Num(i as f64));
+				}
+				Val::Arr(Rc::new(out))
+			}),
 			("std", "char") => parse_args!(context, "std.char", args, 1, [
 				0, n: [Val::Num]!!Val::Num, vec![ValType::Num];
 			], {