From f1f1bc5347c53bef510e9d2392a4cbd6b5e9cc21 Mon Sep 17 00:00:00 2001 From: mzp Date: Sun, 13 Sep 2009 18:58:49 +0900 Subject: [PATCH] update signature --- swflib/OMakefile | 6 +++--- swflib/abc.ml | 5 +++++ swflib/abcType.ml | 2 +- swflib/asm.mli | 2 +- swflib/compile.ml | 48 ++++++++++++++++++++++++++++++++++++++---------- swflib/compile.mli | 3 ++- swflib/compileTest.ml | 28 ++++++++++++++++------------ swflib/methodType.ml | 8 -------- 8 files changed, 66 insertions(+), 36 deletions(-) diff --git a/swflib/OMakefile b/swflib/OMakefile index dc9139f..1e742d7 100644 --- a/swflib/OMakefile +++ b/swflib/OMakefile @@ -18,7 +18,6 @@ FILES[] = compile abc - UseCamlp4(pa_openin pa_oo pa_field) PROGRAM=../swflib @@ -43,8 +42,9 @@ OUnitTest(cpool , cpool revList) # phony .PHONY: clean -.DEFAULT: $(MyOCamlPackage $(PROGRAM), $(FILES)) -OCamlLibrary(swflib, $(FILES)) + +.DEFAULT: +MyOCamlPackage($(PROGRAM), $(FILES)) %.type.h: gen_typemap$(EXE) ./gen_typemap$(EXE) -$> > $@ diff --git a/swflib/abc.ml b/swflib/abc.ml index 43f64d9..4c361c9 100644 --- a/swflib/abc.ml +++ b/swflib/abc.ml @@ -1,2 +1,7 @@ module A = Asm.Make(LowInst) module C = Compile.Make(HighInst) +include AbcType +include MethodType + +let asm = A.to_bytes +let compile = C.to_abc diff --git a/swflib/abcType.ml b/swflib/abcType.ml index 1a0f2d9..fbde801 100644 --- a/swflib/abcType.ml +++ b/swflib/abcType.ml @@ -78,7 +78,7 @@ type 'a method_body = { method_traits: trait list } -type 'a t = { +type 'a abc = { cpool: cpool; method_info: method_info list; metadata: int list; diff --git a/swflib/asm.mli b/swflib/asm.mli index ace62aa..4a85861 100644 --- a/swflib/asm.mli +++ b/swflib/asm.mli @@ -7,7 +7,7 @@ module Make : functor (S : Inst) -> sig open AbcType val empty_cpool : cpool - val to_bytes : S.t AbcType.t -> Bytes.t list + val to_bytes : S.t abc -> Bytes.t list (**{6 Debug only}*) val of_cpool : cpool -> Bytes.t list diff --git a/swflib/compile.ml b/swflib/compile.ml index 9cda9c4..4451c3e 100644 --- a/swflib/compile.ml +++ b/swflib/compile.ml @@ -77,11 +77,7 @@ module Make(Inst : Inst) = struct let method_body ctx i {params=params; code=code} = let max_value f xs = - snd @@ List.fold_left - (fun (c,m) x -> - let c' = c + f x in - (c',max c' m)) - (0,0) xs in + snd @@ List.fold_left (fun (c,m) x -> (c + f x,max m @@ c + (f x))) (0,0) xs in { AbcType.method_sig = i; max_stack = max_value Inst.stack code; @@ -146,7 +142,20 @@ module Make(Inst : Inst) = struct ] } - let to_abc top_method = + let make_traits ~base ~name ~data xs = + List.mapi (fun id x -> { + AbcType.trait_name = name x; + data = data (id+base); + }) xs + + let __to_cpool top_method = + let ms = + methods top_method in + let cs = + classes ms in + consts ms cs + + let to_abc slots top_method = let ms = methods top_method in let cs = @@ -155,11 +164,30 @@ module Make(Inst : Inst) = struct consts ms cs in let ctx = {| cpool = cpool; methods = ms; classes = cs |} in + let classes = + List.map (class_info ctx) cs in + let instances = + List.map (instance_info ctx) cs in + let slot_traits = + make_traits ~base:1 + ~name:(Cpool.index cpool) + ~data:(fun id -> AbcType.SlotTrait (id,0,0,0)) + slots in + let n = + List.length slots in + let class_traits = + make_traits ~base:0 + ~name:(fun {AbcType.instance_name=name} -> name) + ~data:(fun id -> AbcType.ClassTrait (id+n+1,id)) + instances in { - cpool = cpool; + AbcType.cpool = Cpool.to_abc cpool; + metadata = []; method_info = List.map (method_info cpool) ms; - method_body = List.mapi (method_body ctx) ms; - class_info = List.map (class_info ctx) cs; - instance_info = List.map (instance_info ctx) cs; + method_bodies = List.mapi (method_body ctx) ms; + classes; + instances; + scripts=[{ AbcType.init = index top_method ms; + script_traits = slot_traits @ class_traits }] } end diff --git a/swflib/compile.mli b/swflib/compile.mli index 47bb8df..af54724 100644 --- a/swflib/compile.mli +++ b/swflib/compile.mli @@ -21,5 +21,6 @@ end module Make : functor (Inst : Inst) -> sig - val to_abc : Inst.s method_ -> Inst.t t + val to_abc : Cpool.multiname list -> Inst.s method_ -> Inst.t AbcType.abc + val __to_cpool : Inst.s method_ -> Cpool.t end diff --git a/swflib/compileTest.ml b/swflib/compileTest.ml index bcdd03d..bc45140 100644 --- a/swflib/compileTest.ml +++ b/swflib/compileTest.ml @@ -111,12 +111,15 @@ end module C = Compile.Make(Inst) let to_abc xs = - C.to_abc @@ (insts xs) + C.to_abc [] @@ insts xs + +let to_cpool xs = + C.__to_cpool @@ insts xs let _ = test "Instruction" begin fun () -> let {method_info=mi; - method_body=mb} = + method_bodies=mb} = to_abc [`OpOnly1; `OpOnly2] in ok 1 @@ List.length mi; ok 1 @@ List.length mb; @@ -126,8 +129,8 @@ end let _ = test "constant" begin fun () -> - let {cpool=cpool} = - to_abc [`String; `Int; `Meth; `Class] in + let cpool = + to_cpool [`String; `Int; `Meth; `Class] in List.iter (ignore $ Cpool.index cpool ) [ `String "foo"; @@ -146,7 +149,7 @@ end let _ = test "stack" begin fun () -> let {method_info=mi; - method_body=mb} = + method_bodies=mb} = to_abc [`StackAdd; `StackAdd; `StackDel] in ok 1 @@ List.length mi; ok 1 @@ List.length mb; @@ -156,7 +159,7 @@ end let _ = test "scope" begin fun () -> let {method_info=mi; - method_body=mb} = + method_bodies=mb} = to_abc [`ScopeAdd; `ScopeAdd; `ScopeDel] in ok 1 @@ List.length mi; ok 1 @@ List.length mb; @@ -167,7 +170,7 @@ end let _ = test "method" begin fun () -> let {method_info=mi; - method_body=mb} = + method_bodies=mb} = to_abc [`Meth] in ok 2 @@ List.length mi; ok 2 @@ List.length mb; @@ -181,7 +184,7 @@ let _ = test "method dup" begin (* same method should NOT be unified for AVM2 restriction *) fun () -> let {method_info=mi; - method_body=mb} = + method_bodies=mb} = to_abc [`Meth; `Meth] in ok 3 @@ List.length mi; ok 3 @@ List.length mb @@ -200,11 +203,12 @@ let method_trait { trait_name = name; data = data} = let _ = test "class" begin fun () -> let {method_info = mi; - method_body = mb; - instance_info = ii; - class_info = ci; - cpool = cp } = + method_bodies = mb; + instances = ii; + classes = ci} = to_abc [`Class] in + let cp = + to_cpool [`Class] in let nth_method i = (List.nth mb i).AbcType.code in ok 1 @@ List.length ci; diff --git a/swflib/methodType.ml b/swflib/methodType.ml index 539d304..62f674e 100644 --- a/swflib/methodType.ml +++ b/swflib/methodType.ml @@ -1,13 +1,5 @@ open AbcType -type 'a t = { - cpool: Cpool.t; - method_info: method_info list; - method_body: 'a method_body list; - class_info: class_info list; - instance_info: instance_info list -} - type function_scope = [ `Global | `Class of Cpool.multiname] -- 2.11.0