]> gitweb.factorcode.org Git - factor.git/commitdiff
Using a higher-order C macro to clean up duplication in declaring/defining VM primitives
authorDaniel Ehrenberg <littledan@Macintosh-122.local>
Fri, 19 Mar 2010 18:05:14 +0000 (14:05 -0400)
committerDaniel Ehrenberg <littledan@Macintosh-122.local>
Fri, 19 Mar 2010 18:05:14 +0000 (14:05 -0400)
vm/alien.cpp
vm/primitives.cpp
vm/primitives.hpp

index 38078b66790ebf0c7d704d72989d8cc557ea4185..44365859e26217f36ad7dcd37cd1a67e1ffa7563 100755 (executable)
@@ -113,19 +113,7 @@ void *factor_vm::alien_pointer()
                *ptr = value; \
        }
 
-DEFINE_ALIEN_ACCESSOR(signed_cell,fixnum,from_signed_cell,to_fixnum)
-DEFINE_ALIEN_ACCESSOR(unsigned_cell,cell,from_unsigned_cell,to_cell)
-DEFINE_ALIEN_ACCESSOR(signed_8,s64,from_signed_8,to_signed_8)
-DEFINE_ALIEN_ACCESSOR(unsigned_8,u64,from_unsigned_8,to_unsigned_8)
-DEFINE_ALIEN_ACCESSOR(signed_4,s32,from_signed_4,to_fixnum)
-DEFINE_ALIEN_ACCESSOR(unsigned_4,u32,from_unsigned_4,to_cell)
-DEFINE_ALIEN_ACCESSOR(signed_2,s16,from_signed_2,to_fixnum)
-DEFINE_ALIEN_ACCESSOR(unsigned_2,u16,from_unsigned_2,to_cell)
-DEFINE_ALIEN_ACCESSOR(signed_1,s8,from_signed_1,to_fixnum)
-DEFINE_ALIEN_ACCESSOR(unsigned_1,u8,from_unsigned_1,to_cell)
-DEFINE_ALIEN_ACCESSOR(float,float,from_float,to_float)
-DEFINE_ALIEN_ACCESSOR(double,double,from_double,to_double)
-DEFINE_ALIEN_ACCESSOR(cell,void *,allot_alien,pinned_alien_offset)
+EACH_ALIEN_PRIMITIVE(DEFINE_ALIEN_ACCESSOR)
 
 /* open a native library and push a handle */
 void factor_vm::primitive_dlopen()
index aa1e10f5a5f647df2401468da48627e57778d346..104b180341a60741f88309663c1c75709aabac4c 100644 (file)
@@ -8,131 +8,6 @@ namespace factor
        parent->primitive_##name(); \
 }
 
-PRIMITIVE(alien_address)
-PRIMITIVE(all_instances)
-PRIMITIVE(array)
-PRIMITIVE(array_to_quotation)
-PRIMITIVE(become)
-PRIMITIVE(bignum_add)
-PRIMITIVE(bignum_and)
-PRIMITIVE(bignum_bitp)
-PRIMITIVE(bignum_divint)
-PRIMITIVE(bignum_divmod)
-PRIMITIVE(bignum_eq)
-PRIMITIVE(bignum_greater)
-PRIMITIVE(bignum_greatereq)
-PRIMITIVE(bignum_less)
-PRIMITIVE(bignum_lesseq)
-PRIMITIVE(bignum_log2)
-PRIMITIVE(bignum_mod)
-PRIMITIVE(bignum_multiply)
-PRIMITIVE(bignum_not)
-PRIMITIVE(bignum_or)
-PRIMITIVE(bignum_shift)
-PRIMITIVE(bignum_subtract)
-PRIMITIVE(bignum_to_fixnum)
-PRIMITIVE(bignum_to_float)
-PRIMITIVE(bignum_xor)
-PRIMITIVE(bits_double)
-PRIMITIVE(bits_float)
-PRIMITIVE(byte_array)
-PRIMITIVE(byte_array_to_bignum)
-PRIMITIVE(call_clear)
-PRIMITIVE(callback)
-PRIMITIVE(callstack)
-PRIMITIVE(callstack_to_array)
-PRIMITIVE(check_datastack)
-PRIMITIVE(clone)
-PRIMITIVE(code_blocks)
-PRIMITIVE(code_room)
-PRIMITIVE(compact_gc)
-PRIMITIVE(compute_identity_hashcode)
-PRIMITIVE(context_object)
-PRIMITIVE(data_room)
-PRIMITIVE(datastack)
-PRIMITIVE(die)
-PRIMITIVE(disable_gc_events)
-PRIMITIVE(dispatch_stats)
-PRIMITIVE(displaced_alien)
-PRIMITIVE(dlclose)
-PRIMITIVE(dll_validp)
-PRIMITIVE(dlopen)
-PRIMITIVE(dlsym)
-PRIMITIVE(double_bits)
-PRIMITIVE(enable_gc_events)
-PRIMITIVE(existsp)
-PRIMITIVE(exit)
-PRIMITIVE(fclose)
-PRIMITIVE(fflush)
-PRIMITIVE(fgetc)
-PRIMITIVE(fixnum_divint)
-PRIMITIVE(fixnum_divmod)
-PRIMITIVE(fixnum_shift)
-PRIMITIVE(fixnum_to_bignum)
-PRIMITIVE(fixnum_to_float)
-PRIMITIVE(float_add)
-PRIMITIVE(float_bits)
-PRIMITIVE(float_divfloat)
-PRIMITIVE(float_eq)
-PRIMITIVE(float_greater)
-PRIMITIVE(float_greatereq)
-PRIMITIVE(float_less)
-PRIMITIVE(float_lesseq)
-PRIMITIVE(float_mod)
-PRIMITIVE(float_multiply)
-PRIMITIVE(float_subtract)
-PRIMITIVE(float_to_bignum)
-PRIMITIVE(float_to_fixnum)
-PRIMITIVE(float_to_str)
-PRIMITIVE(fopen)
-PRIMITIVE(fputc)
-PRIMITIVE(fread)
-PRIMITIVE(fseek)
-PRIMITIVE(ftell)
-PRIMITIVE(full_gc)
-PRIMITIVE(fwrite)
-PRIMITIVE(identity_hashcode)
-PRIMITIVE(innermost_stack_frame_executing)
-PRIMITIVE(innermost_stack_frame_scan)
-PRIMITIVE(jit_compile)
-PRIMITIVE(load_locals)
-PRIMITIVE(lookup_method)
-PRIMITIVE(mega_cache_miss)
-PRIMITIVE(minor_gc)
-PRIMITIVE(modify_code_heap)
-PRIMITIVE(nano_count)
-PRIMITIVE(optimized_p)
-PRIMITIVE(profiling)
-PRIMITIVE(quot_compiled_p)
-PRIMITIVE(quotation_code)
-PRIMITIVE(reset_dispatch_stats)
-PRIMITIVE(resize_array)
-PRIMITIVE(resize_byte_array)
-PRIMITIVE(resize_string)
-PRIMITIVE(retainstack)
-PRIMITIVE(save_image)
-PRIMITIVE(save_image_and_exit)
-PRIMITIVE(set_context_object)
-PRIMITIVE(set_datastack)
-PRIMITIVE(set_innermost_stack_frame_quot)
-PRIMITIVE(set_retainstack)
-PRIMITIVE(set_slot)
-PRIMITIVE(set_special_object)
-PRIMITIVE(set_string_nth_fast)
-PRIMITIVE(set_string_nth_slow)
-PRIMITIVE(size)
-PRIMITIVE(sleep)
-PRIMITIVE(special_object)
-PRIMITIVE(string)
-PRIMITIVE(string_nth)
-PRIMITIVE(strip_stack_traces)
-PRIMITIVE(system_micros)
-PRIMITIVE(tuple)
-PRIMITIVE(tuple_boa)
-PRIMITIVE(unimplemented)
-PRIMITIVE(uninitialized_byte_array)
-PRIMITIVE(word)
-PRIMITIVE(word_code)
-PRIMITIVE(wrapper)
+EACH_PRIMITIVE(PRIMITIVE)
 
 }
index a36050323f5ac1a08565b72e92ac1ac44ece09f3..df36ed84b213289ab807facd231652374cb0dbe0 100644 (file)
 namespace factor
 {
 
-#define DECLARE_PRIMITIVE(name) VM_C_API void primitive_##name(factor_vm *parent);
-
 /* Generated with PRIMITIVE in primitives.cpp */
-DECLARE_PRIMITIVE(alien_address)
-DECLARE_PRIMITIVE(all_instances)
-DECLARE_PRIMITIVE(array)
-DECLARE_PRIMITIVE(array_to_quotation)
-DECLARE_PRIMITIVE(become)
-DECLARE_PRIMITIVE(bignum_add)
-DECLARE_PRIMITIVE(bignum_and)
-DECLARE_PRIMITIVE(bignum_bitp)
-DECLARE_PRIMITIVE(bignum_divint)
-DECLARE_PRIMITIVE(bignum_divmod)
-DECLARE_PRIMITIVE(bignum_eq)
-DECLARE_PRIMITIVE(bignum_greater)
-DECLARE_PRIMITIVE(bignum_greatereq)
-DECLARE_PRIMITIVE(bignum_less)
-DECLARE_PRIMITIVE(bignum_lesseq)
-DECLARE_PRIMITIVE(bignum_log2)
-DECLARE_PRIMITIVE(bignum_mod)
-DECLARE_PRIMITIVE(bignum_multiply)
-DECLARE_PRIMITIVE(bignum_not)
-DECLARE_PRIMITIVE(bignum_or)
-DECLARE_PRIMITIVE(bignum_shift)
-DECLARE_PRIMITIVE(bignum_subtract)
-DECLARE_PRIMITIVE(bignum_to_fixnum)
-DECLARE_PRIMITIVE(bignum_to_float)
-DECLARE_PRIMITIVE(bignum_xor)
-DECLARE_PRIMITIVE(bits_double)
-DECLARE_PRIMITIVE(bits_float)
-DECLARE_PRIMITIVE(byte_array)
-DECLARE_PRIMITIVE(byte_array_to_bignum)
-DECLARE_PRIMITIVE(call_clear)
-DECLARE_PRIMITIVE(callback)
-DECLARE_PRIMITIVE(callstack)
-DECLARE_PRIMITIVE(callstack_to_array)
-DECLARE_PRIMITIVE(check_datastack)
-DECLARE_PRIMITIVE(clone)
-DECLARE_PRIMITIVE(code_blocks)
-DECLARE_PRIMITIVE(code_room)
-DECLARE_PRIMITIVE(compact_gc)
-DECLARE_PRIMITIVE(compute_identity_hashcode)
-DECLARE_PRIMITIVE(context_object)
-DECLARE_PRIMITIVE(data_room)
-DECLARE_PRIMITIVE(datastack)
-DECLARE_PRIMITIVE(die)
-DECLARE_PRIMITIVE(disable_gc_events)
-DECLARE_PRIMITIVE(dispatch_stats)
-DECLARE_PRIMITIVE(displaced_alien)
-DECLARE_PRIMITIVE(dlclose)
-DECLARE_PRIMITIVE(dll_validp)
-DECLARE_PRIMITIVE(dlopen)
-DECLARE_PRIMITIVE(dlsym)
-DECLARE_PRIMITIVE(double_bits)
-DECLARE_PRIMITIVE(enable_gc_events)
-DECLARE_PRIMITIVE(existsp)
-DECLARE_PRIMITIVE(exit)
-DECLARE_PRIMITIVE(fclose)
-DECLARE_PRIMITIVE(fflush)
-DECLARE_PRIMITIVE(fgetc)
-DECLARE_PRIMITIVE(fixnum_divint)
-DECLARE_PRIMITIVE(fixnum_divmod)
-DECLARE_PRIMITIVE(fixnum_shift)
-DECLARE_PRIMITIVE(fixnum_to_bignum)
-DECLARE_PRIMITIVE(fixnum_to_float)
-DECLARE_PRIMITIVE(float_add)
-DECLARE_PRIMITIVE(float_bits)
-DECLARE_PRIMITIVE(float_divfloat)
-DECLARE_PRIMITIVE(float_eq)
-DECLARE_PRIMITIVE(float_greater)
-DECLARE_PRIMITIVE(float_greatereq)
-DECLARE_PRIMITIVE(float_less)
-DECLARE_PRIMITIVE(float_lesseq)
-DECLARE_PRIMITIVE(float_mod)
-DECLARE_PRIMITIVE(float_multiply)
-DECLARE_PRIMITIVE(float_subtract)
-DECLARE_PRIMITIVE(float_to_bignum)
-DECLARE_PRIMITIVE(float_to_fixnum)
-DECLARE_PRIMITIVE(float_to_str)
-DECLARE_PRIMITIVE(fopen)
-DECLARE_PRIMITIVE(fputc)
-DECLARE_PRIMITIVE(fread)
-DECLARE_PRIMITIVE(fseek)
-DECLARE_PRIMITIVE(ftell)
-DECLARE_PRIMITIVE(full_gc)
-DECLARE_PRIMITIVE(fwrite)
-DECLARE_PRIMITIVE(identity_hashcode)
-DECLARE_PRIMITIVE(innermost_stack_frame_executing)
-DECLARE_PRIMITIVE(innermost_stack_frame_scan)
-DECLARE_PRIMITIVE(jit_compile)
-DECLARE_PRIMITIVE(load_locals)
-DECLARE_PRIMITIVE(lookup_method)
-DECLARE_PRIMITIVE(mega_cache_miss)
-DECLARE_PRIMITIVE(minor_gc)
-DECLARE_PRIMITIVE(modify_code_heap)
-DECLARE_PRIMITIVE(nano_count)
-DECLARE_PRIMITIVE(optimized_p)
-DECLARE_PRIMITIVE(profiling)
-DECLARE_PRIMITIVE(quot_compiled_p)
-DECLARE_PRIMITIVE(quotation_code)
-DECLARE_PRIMITIVE(reset_dispatch_stats)
-DECLARE_PRIMITIVE(resize_array)
-DECLARE_PRIMITIVE(resize_byte_array)
-DECLARE_PRIMITIVE(resize_string)
-DECLARE_PRIMITIVE(retainstack)
-DECLARE_PRIMITIVE(save_image)
-DECLARE_PRIMITIVE(save_image_and_exit)
-DECLARE_PRIMITIVE(set_context_object)
-DECLARE_PRIMITIVE(set_datastack)
-DECLARE_PRIMITIVE(set_innermost_stack_frame_quot)
-DECLARE_PRIMITIVE(set_retainstack)
-DECLARE_PRIMITIVE(set_slot)
-DECLARE_PRIMITIVE(set_special_object)
-DECLARE_PRIMITIVE(set_string_nth_fast)
-DECLARE_PRIMITIVE(set_string_nth_slow)
-DECLARE_PRIMITIVE(size)
-DECLARE_PRIMITIVE(sleep)
-DECLARE_PRIMITIVE(special_object)
-DECLARE_PRIMITIVE(string)
-DECLARE_PRIMITIVE(string_nth)
-DECLARE_PRIMITIVE(strip_stack_traces)
-DECLARE_PRIMITIVE(system_micros)
-DECLARE_PRIMITIVE(tuple)
-DECLARE_PRIMITIVE(tuple_boa)
-DECLARE_PRIMITIVE(unimplemented)
-DECLARE_PRIMITIVE(uninitialized_byte_array)
-DECLARE_PRIMITIVE(word)
-DECLARE_PRIMITIVE(word_code)
-DECLARE_PRIMITIVE(wrapper)
+#define EACH_PRIMITIVE(_) \
+    _(alien_address) \
+    _(all_instances) \
+    _(array) \
+    _(array_to_quotation) \
+    _(become) \
+    _(bignum_add) \
+    _(bignum_and) \
+    _(bignum_bitp) \
+    _(bignum_divint) \
+    _(bignum_divmod) \
+    _(bignum_eq) \
+    _(bignum_greater) \
+    _(bignum_greatereq) \
+    _(bignum_less) \
+    _(bignum_lesseq) \
+    _(bignum_log2) \
+    _(bignum_mod) \
+    _(bignum_multiply) \
+    _(bignum_not) \
+    _(bignum_or) \
+    _(bignum_shift) \
+    _(bignum_subtract) \
+    _(bignum_to_fixnum) \
+    _(bignum_to_float) \
+    _(bignum_xor) \
+    _(bits_double) \
+    _(bits_float) \
+    _(byte_array) \
+    _(byte_array_to_bignum) \
+    _(call_clear) \
+    _(callback) \
+    _(callstack) \
+    _(callstack_to_array) \
+    _(check_datastack) \
+    _(clone) \
+    _(code_blocks) \
+    _(code_room) \
+    _(compact_gc) \
+    _(compute_identity_hashcode) \
+    _(context_object) \
+    _(data_room) \
+    _(datastack) \
+    _(die) \
+    _(disable_gc_events) \
+    _(dispatch_stats) \
+    _(displaced_alien) \
+    _(dlclose) \
+    _(dll_validp) \
+    _(dlopen) \
+    _(dlsym) \
+    _(double_bits) \
+    _(enable_gc_events) \
+    _(existsp) \
+    _(exit) \
+    _(fclose) \
+    _(fflush) \
+    _(fgetc) \
+    _(fixnum_divint) \
+    _(fixnum_divmod) \
+    _(fixnum_shift) \
+    _(fixnum_to_bignum) \
+    _(fixnum_to_float) \
+    _(float_add) \
+    _(float_bits) \
+    _(float_divfloat) \
+    _(float_eq) \
+    _(float_greater) \
+    _(float_greatereq) \
+    _(float_less) \
+    _(float_lesseq) \
+    _(float_mod) \
+    _(float_multiply) \
+    _(float_subtract) \
+    _(float_to_bignum) \
+    _(float_to_fixnum) \
+    _(float_to_str) \
+    _(fopen) \
+    _(fputc) \
+    _(fread) \
+    _(fseek) \
+    _(ftell) \
+    _(full_gc) \
+    _(fwrite) \
+    _(identity_hashcode) \
+    _(innermost_stack_frame_executing) \
+    _(innermost_stack_frame_scan) \
+    _(jit_compile) \
+    _(load_locals) \
+    _(lookup_method) \
+    _(mega_cache_miss) \
+    _(minor_gc) \
+    _(modify_code_heap) \
+    _(nano_count) \
+    _(optimized_p) \
+    _(profiling) \
+    _(quot_compiled_p) \
+    _(quotation_code) \
+    _(reset_dispatch_stats) \
+    _(resize_array) \
+    _(resize_byte_array) \
+    _(resize_string) \
+    _(retainstack) \
+    _(save_image) \
+    _(save_image_and_exit) \
+    _(set_context_object) \
+    _(set_datastack) \
+    _(set_innermost_stack_frame_quot) \
+    _(set_retainstack) \
+    _(set_slot) \
+    _(set_special_object) \
+    _(set_string_nth_fast) \
+    _(set_string_nth_slow) \
+    _(size) \
+    _(sleep) \
+    _(special_object) \
+    _(string) \
+    _(string_nth) \
+    _(strip_stack_traces) \
+    _(system_micros) \
+    _(tuple) \
+    _(tuple_boa) \
+    _(unimplemented) \
+    _(uninitialized_byte_array) \
+    _(word) \
+    _(word_code) \
+    _(wrapper)
 
 /* These are generated with macros in alien.cpp, and not with PRIMIIVE in
 primitives.cpp */
-DECLARE_PRIMITIVE(alien_signed_cell)
-DECLARE_PRIMITIVE(set_alien_signed_cell)
-DECLARE_PRIMITIVE(alien_unsigned_cell)
-DECLARE_PRIMITIVE(set_alien_unsigned_cell)
-DECLARE_PRIMITIVE(alien_signed_8)
-DECLARE_PRIMITIVE(set_alien_signed_8)
-DECLARE_PRIMITIVE(alien_unsigned_8)
-DECLARE_PRIMITIVE(set_alien_unsigned_8)
-DECLARE_PRIMITIVE(alien_signed_4)
-DECLARE_PRIMITIVE(set_alien_signed_4)
-DECLARE_PRIMITIVE(alien_unsigned_4)
-DECLARE_PRIMITIVE(set_alien_unsigned_4)
-DECLARE_PRIMITIVE(alien_signed_2)
-DECLARE_PRIMITIVE(set_alien_signed_2)
-DECLARE_PRIMITIVE(alien_unsigned_2)
-DECLARE_PRIMITIVE(set_alien_unsigned_2)
-DECLARE_PRIMITIVE(alien_signed_1)
-DECLARE_PRIMITIVE(set_alien_signed_1)
-DECLARE_PRIMITIVE(alien_unsigned_1)
-DECLARE_PRIMITIVE(set_alien_unsigned_1)
-DECLARE_PRIMITIVE(alien_float)
-DECLARE_PRIMITIVE(set_alien_float)
-DECLARE_PRIMITIVE(alien_double)
-DECLARE_PRIMITIVE(set_alien_double)
-DECLARE_PRIMITIVE(alien_cell)
-DECLARE_PRIMITIVE(set_alien_cell)
 
+#define EACH_ALIEN_PRIMITIVE(_) \
+    _(signed_cell,fixnum,from_signed_cell,to_fixnum) \
+    _(unsigned_cell,cell,from_unsigned_cell,to_cell) \
+    _(signed_8,s64,from_signed_8,to_signed_8) \
+    _(unsigned_8,u64,from_unsigned_8,to_unsigned_8) \
+    _(signed_4,s32,from_signed_4,to_fixnum) \
+    _(unsigned_4,u32,from_unsigned_4,to_cell) \
+    _(signed_2,s16,from_signed_2,to_fixnum) \
+    _(unsigned_2,u16,from_unsigned_2,to_cell) \
+    _(signed_1,s8,from_signed_1,to_fixnum) \
+    _(unsigned_1,u8,from_unsigned_1,to_cell) \
+    _(float,float,from_float,to_float) \
+    _(double,double,from_double,to_double) \
+    _(cell,void *,allot_alien,pinned_alien_offset)
+
+#define DECLARE_PRIMITIVE(name) VM_C_API void primitive_##name(factor_vm *parent);
+
+#define DECLARE_ALIEN_PRIMITIVE(name, type, from, to) \
+    DECLARE_PRIMITIVE(alien_##name) \
+    DECLARE_PRIMITIVE(set_alien_##name)
+
+EACH_PRIMITIVE(DECLARE_PRIMITIVE)
+EACH_ALIEN_PRIMITIVE(DECLARE_ALIEN_PRIMITIVE)
 }