summaryrefslogtreecommitdiff
path: root/libgpython/include/gpython/objects.h
blob: f5100a9aeecc7fa9cc93ddddb67d317169e8ad80 (plain)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef __GCC_OBJECTS_H__
#define __GCC_OBJECTS_H__

enum GPY_LIT_T { TYPE_INTEGER, TYPE_STRING, TYPE_NONE };

typedef struct gpy_rr_literal_t {
  enum GPY_LIT_T type;
  union {
    int integer;
    char * string;
    /* ... */
  } literal ;
} gpy_literal_t ;

#define Gpy_Lit_Init( x )			\
  x = gpy_malloc( sizeof(gpy_literal_t) );	\
  x->type = TYPE_NONE;				\
  x->literal.integer = 0;

typedef struct gpy_rr_object_state_t {
  char * obj_t_ident;
  signed long ref_count;
  void * self;
  struct gpy_type_obj_def_t * definition;
} gpy_object_state_t ;

typedef gpy_object_state_t * (*binary_op)( gpy_object_state_t *,
					   gpy_object_state_t * );

typedef struct gpy_number_prot_t
{
  bool init;

  binary_op n_add;
  binary_op n_sub;
  binary_op n_div;
  binary_op n_mul;
  binary_op n_pow;

  binary_op n_let;
  binary_op n_lee;
  binary_op n_get;
  binary_op n_gee;
  binary_op n_eee;
  binary_op n_nee;
  binary_op n_orr;
  binary_op n_and;

} gpy_num_prot_t ;

typedef struct gpy_type_obj_def_t {
  char * identifier;
  size_t builtin_type_size;
  void * (*init_hook)( gpy_literal_t * );
  void (*destroy_hook)( void * );
  void (*print_hook)( void * , FILE * , bool );
  const struct gpy_number_prot_t * binary_protocol;
} gpy_type_obj_def_t ;


#define Gpy_Object_State_Init( x )				\
  x = gpy_malloc( sizeof(struct gpy_rr_object_state_t) );	\
  debug("object created at <%p>!\n", (void*)x );		\
  x->obj_t_ident = NULL; x->ref_count = 0;			\
  x->self = NULL; x->definition = NULL;

#define Gpy_Object_State_Init_Ctx( x,y )			\
  Gpy_Object_State_Init( x );					\
  gpy_vec_push( ((gpy_context_t*)(y->vector[y->length-1]))->symbols, x );

#define NULL_OBJ_STATE  NULL

extern void gpy_rr_init_runtime( void );
extern gpy_object_state_t * gpy_rr_fold_integer( int );

extern void gpy_rr_init_primitives( void );

#endif //__GCC_OBJECTS_H__