Parcourir la source

more Buffer support

Nicolas Cannasse il y a 7 ans
Parent
commit
405f5deeba
2 fichiers modifiés avec 9 ajouts et 8 suppressions
  1. 6 5
      hxsl/Checker.hx
  2. 3 3
      hxsl/Eval.hx

+ 6 - 5
hxsl/Checker.hx

@@ -725,8 +725,8 @@ class Checker {
 		return tv;
 		return tv;
 	}
 	}
 
 
-	function makeVarType( t : Type, parent : TVar, pos : Position ) {
-		switch( t ) {
+	function makeVarType( vt : Type, parent : TVar, pos : Position ) {
+		switch( vt ) {
 		case TStruct(vl):
 		case TStruct(vl):
 			// mutate to allow TArray to access previously declared vars
 			// mutate to allow TArray to access previously declared vars
 			var vl = vl.copy();
 			var vl = vl.copy();
@@ -736,7 +736,7 @@ class Checker {
 				vl[i] = makeVar( { type : v.type, qualifiers : v.qualifiers, name : v.name, kind : v.kind, expr : null }, pos, parent);
 				vl[i] = makeVar( { type : v.type, qualifiers : v.qualifiers, name : v.name, kind : v.kind, expr : null }, pos, parent);
 			}
 			}
 			return parent.type;
 			return parent.type;
-		case TArray(t, size):
+		case TArray(t, size), TBuffer(t,size):
 			switch( t ) {
 			switch( t ) {
 			case TArray(_):
 			case TArray(_):
 				error("Multidimentional arrays are not allowed", pos);
 				error("Multidimentional arrays are not allowed", pos);
@@ -780,9 +780,10 @@ class Checker {
 				if( !v2.isConst() ) error("Array size variable '" + v.name + "'should be a constant", pos);
 				if( !v2.isConst() ) error("Array size variable '" + v.name + "'should be a constant", pos);
 				SVar(v2);
 				SVar(v2);
 			}
 			}
-			return TArray(makeVarType(t,parent,pos), s);
+			t = makeVarType(t,parent,pos);
+			return vt.match(TArray(_)) ? TArray(t, s) : TBuffer(t,s);
 		default:
 		default:
-			return t;
+			return vt;
 		}
 		}
 	}
 	}
 
 

+ 3 - 3
hxsl/Eval.hx

@@ -52,18 +52,18 @@ class Eval {
 		switch( v2.type ) {
 		switch( v2.type ) {
 		case TStruct(vl):
 		case TStruct(vl):
 			v2.type = TStruct([for( v in vl ) mapVar(v)]);
 			v2.type = TStruct([for( v in vl ) mapVar(v)]);
-		case TArray(t, SVar(vs)):
+		case TArray(t, SVar(vs)), TBuffer(t, SVar(vs)):
 			var c = constants.get(vs.id);
 			var c = constants.get(vs.id);
 			if( c != null )
 			if( c != null )
 				switch( c ) {
 				switch( c ) {
 				case TConst(CInt(v)):
 				case TConst(CInt(v)):
-					v2.type = TArray(t, SConst(v));
+					v2.type = v2.type.match(TArray(_)) ? TArray(t, SConst(v)) : TBuffer(t, SConst(v));
 				default:
 				default:
 					Error.t("Integer value expected for array size constant " + vs.name, null);
 					Error.t("Integer value expected for array size constant " + vs.name, null);
 				}
 				}
 			else {
 			else {
 				var vs2 = mapVar(vs);
 				var vs2 = mapVar(vs);
-				v2.type = TArray(t, SVar(vs2));
+				v2.type = v2.type.match(TArray(_)) ? TArray(t, SVar(vs2)) : TBuffer(t, SVar(vs2));
 			}
 			}
 		default:
 		default:
 		}
 		}