From 74c4a3ce184d9bc378a03b48affc8c3fa074105a Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Wed, 16 Sep 2020 00:48:37 -0400 Subject: [PATCH] Add ArrayLength expression --- src/back/glsl.rs | 4 ++++ src/lib.rs | 2 ++ src/proc/interface.rs | 3 +++ src/proc/typifier.rs | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/src/back/glsl.rs b/src/back/glsl.rs index c3003dccaf..cbb8fd26ac 100644 --- a/src/back/glsl.rs +++ b/src/back/glsl.rs @@ -1042,6 +1042,10 @@ fn write_expression<'a, 'b>( .join(","), )) } + Expression::ArrayLength(expr) => { + let base = write_expression(&builder.expressions[expr], module, builder)?; + Cow::Owned(format!("uint({}.length())", base)) + } }) } diff --git a/src/lib.rs b/src/lib.rs index 2b65d8ac81..4cded46cac 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -635,6 +635,8 @@ pub enum Expression { origin: FunctionOrigin, arguments: Vec>, }, + /// Get dynamic array length. + ArrayLength(Handle), } /// A code block is just a vector of statements. diff --git a/src/proc/interface.rs b/src/proc/interface.rs index ff4290c192..8e1f5666ce 100644 --- a/src/proc/interface.rs +++ b/src/proc/interface.rs @@ -100,6 +100,9 @@ where self.traverse_expr(argument); } } + E::ArrayLength(expr) => { + self.traverse_expr(expr); + } } } diff --git a/src/proc/typifier.rs b/src/proc/typifier.rs index 787c8adacf..461bfa1bbd 100644 --- a/src/proc/typifier.rs +++ b/src/proc/typifier.rs @@ -262,6 +262,10 @@ impl Typifier { .ok_or(ResolveError::FunctionReturnsVoid)?; Resolution::Handle(ty) } + crate::Expression::ArrayLength(_) => Resolution::Value(crate::TypeInner::Scalar { + kind: crate::ScalarKind::Uint, + width: 4, + }), }) }