make swfdec_as_object_mark() only mark if not marked yet
[swfdec.git] / swfdec / swfdec_as_types.h
blob50472b87f6cc630087d58f08a73d8bdb783eca8c
1 /* Swfdec
2 * Copyright (C) 2007-2008 Benjamin Otte <otte@gnome.org>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301 USA
20 #ifndef _SWFDEC_AS_TYPES_H_
21 #define _SWFDEC_AS_TYPES_H_
23 #include <glib-object.h>
24 #include <swfdec/swfdec_as_string_value.h>
26 G_BEGIN_DECLS
28 /* fundamental types */
29 typedef enum {
30 SWFDEC_AS_TYPE_UNDEFINED = 0,
31 SWFDEC_AS_TYPE_NULL = 1,
32 SWFDEC_AS_TYPE_BOOLEAN = 2,
33 SWFDEC_AS_TYPE_INT = 3, /* unimplemented, but reserved if someone wants it */
34 SWFDEC_AS_TYPE_NUMBER = 4,
35 SWFDEC_AS_TYPE_STRING = 5,
36 SWFDEC_AS_TYPE_OBJECT = 6,
37 SWFDEC_AS_TYPE_MOVIE = 7
38 } SwfdecAsValueType;
40 typedef struct _SwfdecAsContext SwfdecAsContext;
41 typedef struct _SwfdecAsDebugger SwfdecAsDebugger;
42 typedef struct _SwfdecAsDoubleValue SwfdecAsDoubleValue;
43 typedef struct _SwfdecAsFrame SwfdecAsFrame;
44 typedef struct _SwfdecAsFunction SwfdecAsFunction;
45 typedef struct _SwfdecAsGcable SwfdecAsGcable;
46 typedef struct _SwfdecAsObject SwfdecAsObject;
47 typedef struct _SwfdecAsRelay SwfdecAsRelay;
48 typedef struct _SwfdecAsScope SwfdecAsScope;
49 typedef struct _SwfdecAsStack SwfdecAsStack;
50 typedef gsize SwfdecAsValue;
51 typedef void (* SwfdecAsNative) (SwfdecAsContext * context,
52 SwfdecAsObject * thisp,
53 guint argc,
54 SwfdecAsValue * argv,
55 SwfdecAsValue * retval);
56 typedef struct _SwfdecGcObject SwfdecGcObject;
57 typedef struct _SwfdecScript SwfdecScript;
60 /* IMPORTANT: a SwfdecAsValue memset to 0 is a valid undefined value */
61 #define SWFDEC_AS_VALUE_TYPE_BITS (3)
62 #define SWFDEC_AS_VALUE_TYPE_MASK ((1 << SWFDEC_AS_VALUE_TYPE_BITS) - 1)
63 #define SWFDEC_AS_VALUE_VALUE_MASK (~SWFDEC_AS_VALUE_TYPE_MASK)
65 #define SWFDEC_AS_VALUE_GET_TYPE(val) (*(val) & SWFDEC_AS_VALUE_TYPE_MASK)
66 #define SWFDEC_AS_VALUE_GET_VALUE(val) GSIZE_TO_POINTER (*(val) & SWFDEC_AS_VALUE_VALUE_MASK)
67 #define SWFDEC_AS_VALUE_COMBINE(val, type) (GPOINTER_TO_SIZE (val) | type)
69 #define SWFDEC_AS_VALUE_UNDEFINED SWFDEC_AS_VALUE_COMBINE (NULL, SWFDEC_AS_TYPE_UNDEFINED)
70 #define SWFDEC_AS_VALUE_IS_UNDEFINED(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_UNDEFINED)
71 #define SWFDEC_AS_VALUE_SET_UNDEFINED(val) *(val) = SWFDEC_AS_VALUE_UNDEFINED
73 #define SWFDEC_AS_VALUE_FALSE SWFDEC_AS_VALUE_COMBINE(NULL, SWFDEC_AS_TYPE_BOOLEAN)
74 #define SWFDEC_AS_VALUE_TRUE SWFDEC_AS_VALUE_COMBINE(GSIZE_TO_POINTER (1 << SWFDEC_AS_VALUE_TYPE_BITS), SWFDEC_AS_TYPE_BOOLEAN)
75 #define SWFDEC_AS_VALUE_IS_BOOLEAN(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_BOOLEAN)
76 #define SWFDEC_AS_VALUE_GET_BOOLEAN(val) (SWFDEC_AS_VALUE_GET_VALUE (val) != NULL)
77 #define SWFDEC_AS_VALUE_FROM_BOOLEAN(b) (b ? SWFDEC_AS_VALUE_TRUE : SWFDEC_AS_VALUE_FALSE)
78 #define SWFDEC_AS_VALUE_SET_BOOLEAN(val,b) G_STMT_START { \
79 gboolean __tmp = (b); \
80 g_assert (__tmp == TRUE || __tmp == FALSE); \
81 *(val) = SWFDEC_AS_VALUE_FROM_BOOLEAN(__tmp); \
82 } G_STMT_END
84 struct _SwfdecAsDoubleValue {
85 SwfdecAsGcable * next;
86 double number;
89 #define SWFDEC_AS_VALUE_IS_NUMBER(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_NUMBER)
90 #define SWFDEC_AS_VALUE_GET_NUMBER(val) (((SwfdecAsDoubleValue *) SWFDEC_AS_VALUE_GET_VALUE(val))->number)
92 #define SWFDEC_AS_VALUE_IS_STRING(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_STRING)
93 #define SWFDEC_AS_VALUE_GET_STRING(val) (((SwfdecAsStringValue *) SWFDEC_AS_VALUE_GET_VALUE(val))->string)
94 #define SWFDEC_AS_VALUE_FROM_STRING(s) SWFDEC_AS_VALUE_COMBINE (((guint8 *) (s) - G_STRUCT_OFFSET (SwfdecAsStringValue, string)), SWFDEC_AS_TYPE_STRING)
95 #define SWFDEC_AS_VALUE_SET_STRING(val,s) G_STMT_START { \
96 *(val) = SWFDEC_AS_VALUE_FROM_STRING (s); \
97 } G_STMT_END
99 #define SWFDEC_AS_VALUE_NULL SWFDEC_AS_VALUE_COMBINE (NULL, SWFDEC_AS_TYPE_NULL)
100 #define SWFDEC_AS_VALUE_IS_NULL(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_NULL)
101 #define SWFDEC_AS_VALUE_SET_NULL(val) *(val) = SWFDEC_AS_VALUE_NULL
103 #define SWFDEC_AS_VALUE_IS_OBJECT(val) (SWFDEC_AS_VALUE_GET_TYPE (val) == SWFDEC_AS_TYPE_OBJECT)
104 #define SWFDEC_AS_VALUE_GET_OBJECT(val) ((SwfdecAsObject *) SWFDEC_AS_VALUE_GET_VALUE (val))
105 #define SWFDEC_AS_VALUE_FROM_OBJECT(o) SWFDEC_AS_VALUE_COMBINE (o, SWFDEC_AS_TYPE_OBJECT)
106 #define SWFDEC_AS_VALUE_SET_OBJECT(val,o) G_STMT_START { \
107 SwfdecAsObject *__o = (o); \
108 g_assert (__o != NULL); \
109 g_assert (!__o->movie); \
110 *(val) = SWFDEC_AS_VALUE_FROM_OBJECT (__o); \
111 } G_STMT_END
113 /* value setters */
114 #define swfdec_as_value_set_integer(cx, val, i) swfdec_as_value_set_number((cx), (val), (int) (i))
115 void swfdec_as_value_set_number (SwfdecAsContext * context,
116 SwfdecAsValue * value,
117 double number);
119 /* value conversion functions */
120 gboolean swfdec_as_value_to_boolean (SwfdecAsContext * context,
121 const SwfdecAsValue * value);
122 int swfdec_as_value_to_integer (SwfdecAsContext * context,
123 const SwfdecAsValue * value);
124 double swfdec_as_value_to_number (SwfdecAsContext * context,
125 const SwfdecAsValue * value);
126 SwfdecAsObject *swfdec_as_value_to_object (SwfdecAsContext * context,
127 const SwfdecAsValue * value);
128 void swfdec_as_value_to_primitive (SwfdecAsValue * value);
129 const char * swfdec_as_value_to_string (SwfdecAsContext * context,
130 SwfdecAsValue value);
132 /* special conversion functions */
133 const char * swfdec_as_integer_to_string (SwfdecAsContext * context,
134 int i);
135 int swfdec_as_double_to_integer (double d);
136 const char * swfdec_as_double_to_string (SwfdecAsContext * context,
137 double d);
138 const char * swfdec_as_str_concat (SwfdecAsContext * cx,
139 const char * s1,
140 const char * s2);
142 /* variable get/set */
143 void swfdec_as_value_get_variable (SwfdecAsContext * cx,
144 const SwfdecAsValue * val,
145 const char * name,
146 SwfdecAsValue * ret);
149 G_END_DECLS
150 #endif