2017-04-22 3 views
1

Je suis en train de générer OCaml bytecode contenant C_CALL s à ces primitives:définitions récursives des valeurs et bytecode appels aux primitives

caml_alloc_dummy 
caml_alloc_dummy_function 
caml_update_dummy 
caml_alloc_dummy_float 

qui sont tous liés à la définition récursive des valeurs (voir <ocamlsource>/bytecomp/bytegen.ml)

pour générer des appels vers les trois premiers, ce code est assez:

let rec myval = (f, 1, myval) 
and f _ = match myval with (_, x, _) -> x;; 

mais je ne peux pas imaginer un morceau de code pour la le dernier, qui devrait être spécifiquement lié aux définitions récursives de float array s.

Répondre

2

Cela semble le faire (test avec 4.03.0):

type t = { x : float } 

let rec r = { x = 0.1 +. 0.2 } 

Oui, le rec est inutile, mais le compilateur bytecode est pas assez intelligent pour voir que. Notez que les enregistrements dans lesquels chaque champ est un float sont représentés spécialement, avec les flotteurs non boxés.

Le bytecode généré:

const 1 
ccall caml_alloc_dummy_float, 1 
push 
const 0.2 
push 
const 0.1 
ccall caml_add_float, 2 
makefloatblock 1 
push 
acc 1 
ccall caml_update_dummy, 2 
event "_none_" -1--1 
acc 0 
makeblock 1, 0 
pop 1 
setglobal Test!