/
float.cpp
62 lines (47 loc) · 1.54 KB
/
float.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "capi/capi.hpp"
#include "capi/ruby.h"
#include "builtin/float.hpp"
using namespace rubinius;
using namespace rubinius::capi;
namespace rubinius {
namespace capi {
Float* capi_get_float(NativeMethodEnvironment* env, VALUE float_handle) {
Handle* handle = Handle::from(float_handle);
handle->flush(env);
return c_as<Float>(handle->object());
}
void flush_cached_rfloat(NativeMethodEnvironment* env, Handle* handle) {
if(handle->is_rfloat()) {
Float* obj = c_as<Float>(handle->object());
RFloat* rfloat = handle->as_rfloat(env);
obj->val = rfloat->value;
}
}
RFloat* Handle::as_rfloat(NativeMethodEnvironment* env) {
if(type_ != cRFloat) {
Float* float_obj = c_as<Float>(object());
RFloat* f = new RFloat;
f->value = float_obj->val;
type_ = cRFloat;
as_.rfloat = f;
flush_ = flush_cached_rfloat;
env->state()->shared.global_handles()->move(this,
env->state()->shared.cached_handles());
}
return as_.rfloat;
}
}
}
extern "C" {
struct RFloat* capi_rfloat_struct(VALUE float_handle) {
NativeMethodEnvironment* env = NativeMethodEnvironment::get();
return Handle::from(float_handle)->as_rfloat(env);
}
VALUE rb_float_new(double val) {
NativeMethodEnvironment* env = NativeMethodEnvironment::get();
return env->get_handle(Float::create(env->state(), val));
}
VALUE rb_Float(VALUE object_handle) {
return rb_convert_type(object_handle, 0, "Float", "to_f");
}
}