Forráskód Böngészése

support for neko 2.0 bridge

Nicolas Cannasse 13 éve
szülő
commit
ac73f6b2e8
1 módosított fájl, 6 hozzáadás és 3 törlés
  1. 6 3
      interp.ml

+ 6 - 3
interp.ml

@@ -519,6 +519,9 @@ let neko =
 	let val_null = call_raw_prim unser [|alloc_string "N";loader|] in
 
 	let is_64 = call_raw_prim (loadprim "std@sys_is64" 0) [||] == val_true in
+	let is_v2 = (try ignore(load "neko_alloc_int32"); true with _ -> false) in
+	let tag_bits = if is_v2 then 4 else 3 in
+	let tag_mask = (1 lsl tag_bits) - 1 in
 	let ptr_size = if is_64 then 8 else 4 in
 	let val_field v i = Extc.dladdr v ((i + 1) * ptr_size) in
 	let val_str v = Extc.dladdr v 4 in
@@ -552,7 +555,7 @@ let neko =
 
 	let copy_string v =
 		let head = Extc.dltoint (Extc.dlptr v) in
-		let size = head lsr 3 in
+		let size = head asr tag_bits in
 		let s = String.create size in
 		Extc.dlmemcpy (Extc.dlstring s) (val_str v) size;
 		s
@@ -609,7 +612,7 @@ let neko =
 			VInt (Obj.magic v)
 		else
 			let head = Extc.dltoint (Extc.dlptr v) in
-			match head land 7 with
+			match head land tag_mask with
 			| 0 -> VNull
 			| 2 -> VBool (v == val_true)
 			| 3 -> VString (copy_string v)
@@ -628,7 +631,7 @@ let neko =
 				) r in
 				VObject { ofields = Array.of_list fields; oproto = None }
 			| 5 ->
-				VArray (Array.init (head lsr 3) (fun i -> neko_value (Extc.dlptr (val_field v i))))
+				VArray (Array.init (head asr tag_bits) (fun i -> neko_value (Extc.dlptr (val_field v i))))
 			| 7 ->
 				let r = alloc_root v in
 				let a = ANekoAbstract v in