فهرست منبع

flash9 : fixed some "never" property access issues
all : added "never" property access support for all platforms

Nicolas Cannasse 16 سال پیش
والد
کامیت
846899b5f5
3فایلهای تغییر یافته به همراه15 افزوده شده و 5 حذف شده
  1. 2 0
      doc/CHANGES.txt
  2. 9 4
      type.ml
  3. 4 1
      typeload.ml

+ 2 - 0
doc/CHANGES.txt

@@ -10,6 +10,8 @@ TODO :
 	improved speed of Bytes unserializing (no need for BytesBuffer)
 	flash9 : bugfix, Null<Typedef> was generating dynamic code
 	flash9 : added error message in flash.Vector if used without flash 10
+	flash9 : fixed some "never" property access issues
+	all : added "never" property access support for all platforms
 
 2009-03-22: 2.03
 	optimized Type.enumEq : use index instead of tag comparison for neko/flash9/php

+ 9 - 4
type.ml

@@ -491,8 +491,13 @@ let has_extra_field t n = Has_extra_field (t,n)
 let error l = raise (Unify_error l)
 
 let unify_access a1 a2 =
-	a1 = a2 || (a1 = NormalAccess && (a2 = NoAccess || a2 = MethodCantAccess))
-	|| (a1 = MethodCantAccess && a2 = NoAccess)
+	a1 = a2 || match a1, a2 with
+	| NoAccess, NoAccess 
+	| NoAccess, MethodCantAccess
+	| NoAccess, NeverAccess
+	| MethodCantAccess, NoAccess
+	| NeverAccess, NoAccess -> true
+	| _ -> false
 
 let eq_stack = ref []
 
@@ -763,8 +768,8 @@ and unify_types a b tl1 tl2 =
 
 and unify_with_access t f =
 	match f.cf_get, f.cf_set with
-	| NoAccess , _ -> unify f.cf_type t
-	| _ , NoAccess -> unify t f.cf_type
+	| NoAccess , _ | NeverAccess, _ -> unify f.cf_type t
+	| _ , NoAccess | _, NeverAccess -> unify t f.cf_type
 	| _ , _ -> type_eq EqBothDynamic t f.cf_type
 
 let iter f e =

+ 4 - 1
typeload.ml

@@ -197,6 +197,7 @@ and load_type ctx p t =
 					let access m get =
 						match m with
 						| "null" -> NoAccess
+						| "never" -> NeverAccess
 						| "default" -> NormalAccess
 						| "dynamic" -> MethodAccess ((if get then "get_"  else "set_") ^ n)
 						| _ -> MethodAccess m
@@ -333,7 +334,7 @@ let rec check_interface ctx c p intf params =
 			let p = (match f2.cf_expr with None -> p | Some e -> e.epos) in
 			if f.cf_public && not f2.cf_public then
 				display_error ctx ("Field " ^ i ^ " should be public as requested by " ^ s_type_path intf.cl_path) p
-			else if f2.cf_get <> f.cf_get || f2.cf_set <> f.cf_set then
+			else if f2.cf_get <> f.cf_get || (f2.cf_set <> f.cf_set && (f2.cf_set,f.cf_set) <> (NeverAccess,NoAccess)) then
 				display_error ctx ("Field " ^ i ^ " has different property access than in " ^ s_type_path intf.cl_path) p
 			else try
 				valid_redefinition ctx f2 t2 f (apply_params intf.cl_types params f.cf_type)
@@ -679,6 +680,7 @@ let init_class ctx c p herits fields =
 			let get = (match get with
 				| "null" -> NoAccess
 				| "dynamic" -> MethodAccess ("get_" ^ name)
+				| "never" -> NeverAccess
 				| "default" -> NormalAccess
 				| _ ->
 					check_get := check_method get (TFun ([],ret));
@@ -691,6 +693,7 @@ let init_class ctx c p herits fields =
 						NeverAccess
 					else
 						NoAccess
+				| "never" -> NeverAccess
 				| "dynamic" -> MethodAccess ("set_" ^ name)
 				| "default" -> NormalAccess
 				| _ ->