From 6e3ebc4c49ed690daa41ab5df580faeb6bab3181 Mon Sep 17 00:00:00 2001 From: Alan Schmitt <alan.schmitt@polytechnique.org> Date: Mon, 14 Mar 2016 09:55:13 +0100 Subject: [PATCH] getting rid of JsNumber --- generator/Makefile | 5 +- generator/tests/jsref/JsNumber.js | 31 +++++ generator/tests/jsref/JsNumber.ml | 206 ----------------------------- generator/tests/jsref/JsNumber.mli | 35 +++++ 4 files changed, 70 insertions(+), 207 deletions(-) create mode 100644 generator/tests/jsref/JsNumber.js delete mode 100644 generator/tests/jsref/JsNumber.ml create mode 100644 generator/tests/jsref/JsNumber.mli diff --git a/generator/Makefile b/generator/Makefile index 1f4d783..aa23952 100644 --- a/generator/Makefile +++ b/generator/Makefile @@ -36,7 +36,7 @@ ASSEMBLY_JS := \ Shared.log.js \ LibString.log.js \ LibOption.log.js \ - JsNumber.log.js \ + JsNumber.js \ JsSyntax.log.js \ JsSyntaxAux.log.js \ Translate_syntax.js \ @@ -119,6 +119,9 @@ tests/%.cmi: tests/%.ml main.byte stdlib ##### Custome cmi rules for compilation of mli files without ml source +$(JSREF_PATH)/JsNumber.cmi: $(JSREF_PATH)/JsNumber.mli + ocamlc -I $(JSREF_PATH) $< + $(JSREF_PATH)/Translate_syntax.cmi: $(JSREF_PATH)/Translate_syntax.mli $(JSREF_PATH)/JsSyntax.cmi stdlib ocamlc -I $(JSREF_PATH) -I stdlib_ml -open Stdlib $< diff --git a/generator/tests/jsref/JsNumber.js b/generator/tests/jsref/JsNumber.js new file mode 100644 index 0000000..3b618ce --- /dev/null +++ b/generator/tests/jsref/JsNumber.js @@ -0,0 +1,31 @@ +var JsNumber = { + /* Alternative approach to the int32 and uint32 conversions + source: http://www.2ality.com/2012/02/js-integers.html + function modulo(a, b) { + return a - Math.floor(a/b)*b; + } + function ToUint32(x) { + return modulo(ToInteger(x), Math.pow(2, 32)); + } + + function ToInt32(x) { + var uint32 = ToUint32(x); + if (uint32 >= Math.pow(2, 31)) { + return uint32 - Math.pow(2, 32) + } else { + return uint32; + } + } + */ + + // this works because the >>> operator first converts its first argument to uint32 + to_uint32 : function (x) { + return x >>> 0; + }, + + // this works because the >> operator first converts its first argument to int32 + to_int32 : function (x) { + return x >> 0; + } +}; + diff --git a/generator/tests/jsref/JsNumber.ml b/generator/tests/jsref/JsNumber.ml deleted file mode 100644 index 29383d1..0000000 --- a/generator/tests/jsref/JsNumber.ml +++ /dev/null @@ -1,206 +0,0 @@ -open Fappli_IEEE_bits -open LibReflect - -type number = binary64 - -(** val nan : number **) - -let nan = nan - -(** val zero : number **) - -let zero = 0. - -(** val neg_zero : number **) - -let neg_zero = (-0.) - -(** val one : float **) - -let one = 1. - -(** val infinity : number **) - -let infinity = infinity - -(** val neg_infinity : number **) - -let neg_infinity = neg_infinity - -(** val max_value : number **) - -let max_value = max_float - -(** val min_value : number **) - -let min_value = min_float (* (Int64.float_of_bits Int64.one) *) - - -(** val pi : number **) - -let pi = 3.141592654 (* (4. *. atan 1.) *) - -(** val e : number **) - -let e = 2.718281828 (* (exp 1.) *) - -(** val ln2 : number **) - -let ln2 = 0.693147181 (* (log 2.) *) - - -(** val from_string : string -> number **) - -let from_string = (fun s -> - (*try*) - (* let s = (String.concat "" (List.map (String.make 1) s)) in ARTHUR hack*) - if string_eq s "" then 0. else float_of_string s - (* FIXME: with Failure "float_of_string" -> nan *) ) - (* Note that we're using `float_of_string' there, which does not have the same - behavior than JavaScript. For instance it will read "022" as 22 instead of - 18, which should be the JavaScript result for it. *) - -(** val to_string : number -> string **) - -let to_string = (fun f -> - prerr_string ("Warning: JsNumber.to_string called. This might be responsible for errors. Argument value: " ^ string_of_float f ^ "."); - prerr_newline(); - let string_of_number n = - let sfn = string_of_float n in - (if (string_eq sfn "inf") then "Infinity" else - if (string_eq sfn "-inf") then "-Infinity" else - if (string_eq sfn "nan") then "NaN" else - let inum = int_of_float n in - if (float_of_int inum = n) then (string_of_int inum) else (string_of_float n)) in - string_of_number f - - (* ARTHUR hack - let ret = ref [] in (* Ugly, but the API for OCaml string is not very functional... *) - String.iter (fun c -> ret := c :: !ret) (string_of_number f); - List.rev !ret - *) - ) - (* Note that this is ugly, we should use the spec of JsNumber.to_string here (9.8.1). *) - - -(** val neg : number -> number **) - -let neg x = float_neg x - -(** val floor : number -> number **) - -let floor x = floor x - -(** val absolute : number -> number **) - -let absolute x = abs_float x - -(** val sign : number -> number **) - -let sign = (fun x -> float_of_int (float_compare x 0.)) - -(* - (** val lt_bool : number -> number -> bool **) - - let lt_bool = (<) - - (** val add : number -> number -> number **) - - let add = (+.) - - (** val sub : number -> number -> number **) - - let sub = (-.) - - (** val fmod : number -> number -> number **) - - let fmod = mod_float - - (** val mult : number -> number -> number **) - - let mult = ( *. ) - - (** val div : number -> number -> number **) - - let div = (/.) - -*) - - - - -(** val to_int32 : number -> float **) - - -(* ARTHUR hacked this in *) -let classify_float n = - let x = classify_float n in - match x with - | FP_normal -> FP_normal - | FP_subnormal -> FP_normal - | _ -> x - -let to_int32 = fun n -> - match classify_float n with - | FP_normal -> (* ARTHUR hacked this from | FP_normal | FP_subnormal *) - let i32 = float_exp 2. 32. in - let i31 = float_exp 2. 31. in - let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in - let int32bit = - let smod = mod_float posint i32 in - if smod < 0. then smod +. i32 else smod - in - (if int32bit >= i31 then int32bit -. i32 else int32bit) - | _ -> 0. - -(** val to_uint32 : number -> float **) - -let to_uint32 = fun n -> - match classify_float n with - | FP_normal -> (* ARTHUR hacked this from | FP_normal | FP_subnormal *) - let i32 = float_exp 2. 32. in - let posint = (if n < 0. then (-1.) else 1.) *. (floor (abs_float n)) in - let int32bit = - let smod = mod_float posint i32 in - if smod < 0. then smod +. i32 else smod - in - int32bit - | _ -> 0. - -(** val modulo_32 : float -> float **) - -let modulo_32 = (fun x -> let r = mod_float x 32. in if x < 0. then r +. 32. else r) - -(** val int32_bitwise_not : float -> float **) - -let int32_bitwise_not = fun x -> Int32.to_float (Int32.lognot (Int32.of_float x)) - -(** val int32_bitwise_and : float -> float -> float **) - -let int32_bitwise_and = fun x y -> Int32.to_float (Int32.logand (Int32.of_float x) (Int32.of_float y)) - -(** val int32_bitwise_or : float -> float -> float **) - -let int32_bitwise_or = fun x y -> Int32.to_float (Int32.logor (Int32.of_float x) (Int32.of_float y)) - -(** val int32_bitwise_xor : float -> float -> float **) - -let int32_bitwise_xor = fun x y -> Int32.to_float (Int32.logxor (Int32.of_float x) (Int32.of_float y)) - -(** val int32_left_shift : float -> float -> float **) - -let int32_left_shift = (fun x y -> Int32.to_float (Int32.shift_left (Int32.of_float x) (int_of_float y))) - -(** val int32_right_shift : float -> float -> float **) - -let int32_right_shift = (fun x y -> Int32.to_float (Int32.shift_right (Int32.of_float x) (int_of_float y))) - -(** val uint32_right_shift : float -> float -> float **) - -let uint32_right_shift = (fun x y -> - let i31 = float_exp 2. 31. in - let i32 = float_exp 2. 32. in - let newx = if x >= i31 then x -. i32 else x in - let r = Int32.to_float (Int32.shift_right_logical (Int32.of_float newx) (int_of_float y)) in - if r < 0. then r +. i32 else r) - diff --git a/generator/tests/jsref/JsNumber.mli b/generator/tests/jsref/JsNumber.mli new file mode 100644 index 0000000..7d0a7cd --- /dev/null +++ b/generator/tests/jsref/JsNumber.mli @@ -0,0 +1,35 @@ +type number = float + +val zero: number +val neg_zero : number +val one : number +val infinity : number +val neg_infinity : number +val max_value : number +val min_value : number +val nan : number +val pi : number +val e : number +val ln2 : number + +val from_string : string -> number +val to_string : number -> string + +val to_int32 : number -> number +val to_uint32 : number -> number + +val int32_left_shift : number -> number -> number +val int32_right_shift : number -> number -> number + +val int32_bitwise_and : number -> number -> number +val int32_bitwise_or : number -> number -> number +val int32_bitwise_xor : number -> number -> number +val int32_bitwise_not : number -> number + +val uint32_right_shift : number -> number -> number + +val neg : number -> number +val sign : number -> number +val absolute : number -> number + +val modulo_32 : number -> number -- GitLab