Browse Source

added ArrayAccess.

Nicolas Cannasse 19 years ago
parent
commit
824dd142eb
4 changed files with 24 additions and 2 deletions
  1. 1 0
      doc/CHANGES.txt
  2. 2 0
      std/StdTypes.hx
  3. 1 1
      std/flash9/utils/ByteArray.hx
  4. 20 1
      typer.ml

+ 1 - 0
doc/CHANGES.txt

@@ -21,6 +21,7 @@
 	added haxe.xml.Check and haxe.xml.Fast
 	added Xml.parent
 	added haxelib
+	added ArrayAccess interface
 
 2006-08-16: 1.05
 	moved Md5 to haxe package.

+ 2 - 0
std/StdTypes.hx

@@ -49,3 +49,5 @@ typedef Iterator<T> = {
 	function hasNext() : Bool;
 	function next() : T;
 }
+
+extern interface ArrayAccess<T> { }

+ 1 - 1
std/flash9/utils/ByteArray.hx

@@ -1,6 +1,6 @@
 package flash.utils;
 
-extern class ByteArray implements IDataInput, implements IDataOutput {
+extern class ByteArray implements IDataInput, implements IDataOutput, implements ArrayAccess<Int> {
 	function new() : Void;
 	var bytesAvailable(default,null) : UInt;
 	function compress() : Void;

+ 20 - 1
typer.ml

@@ -627,6 +627,17 @@ let t_array ctx =
 	| _ ->
 		assert false
 
+let t_array_access ctx =
+	let show = hide_types ctx in
+	match load_type_def ctx null_pos ([],"ArrayAccess") with
+	| TClassDecl c ->
+		show();
+		if List.length c.cl_types <> 1 then assert false;
+		let pt = mk_mono() in
+		TInst (c,[pt]) , pt
+	| _ ->
+		assert false
+
 let t_iterator ctx =
 	let show = hide_types ctx in
 	match load_type_def ctx null_pos ([],"Iterator") with
@@ -1423,7 +1434,15 @@ and type_expr ctx ?(need_val=true) (e,p) =
 		let e2 = type_expr ctx e2 in
 		unify ctx e2.etype (t_int ctx) e2.epos;
 		let t , pt = t_array ctx in
-		unify ctx e1.etype t e1.epos;
+		let pt = (try
+			unify_raise ctx e1.etype t e1.epos;
+			pt
+		with
+			Error (Unify _,_) ->
+				let t, pt = t_array_access ctx in
+				unify ctx e1.etype t e1.epos;
+				pt
+		) in
 		mk (TArray (e1,e2)) pt p
     | EBinop (op,e1,e2) ->
 		type_binop ctx op e1 e2 p