Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F4398660
literals.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
literals.h
View Options
#ifndef SV_LITERALS_H
#define SV_LITERALS_H
#include
"ant.h"
#include
"silver/engine.h"
static
inline
void
sv_op_const
(
sv_vm_t
*
vm
,
sv_func_t
*
func
,
uint8_t
*
ip
)
{
uint32_t
idx
=
sv_get_u32
(
ip
+
1
);
vm
->
stack
[
vm
->
sp
++
]
=
func
->
constants
[
idx
];
}
static
inline
void
sv_op_const_i8
(
sv_vm_t
*
vm
,
uint8_t
*
ip
)
{
int8_t
val
=
sv_get_i8
(
ip
+
1
);
vm
->
stack
[
vm
->
sp
++
]
=
tov
((
double
)
val
);
}
static
inline
void
sv_op_const8
(
sv_vm_t
*
vm
,
sv_func_t
*
func
,
uint8_t
*
ip
)
{
uint8_t
idx
=
sv_get_u8
(
ip
+
1
);
vm
->
stack
[
vm
->
sp
++
]
=
func
->
constants
[
idx
];
}
static
inline
void
sv_op_undef
(
sv_vm_t
*
vm
)
{
vm
->
stack
[
vm
->
sp
++
]
=
mkval
(
T_UNDEF
,
0
);
}
static
inline
void
sv_op_null
(
sv_vm_t
*
vm
)
{
vm
->
stack
[
vm
->
sp
++
]
=
mkval
(
T_NULL
,
0
);
}
static
inline
void
sv_op_true
(
sv_vm_t
*
vm
)
{
vm
->
stack
[
vm
->
sp
++
]
=
js_true
;
}
static
inline
void
sv_op_false
(
sv_vm_t
*
vm
)
{
vm
->
stack
[
vm
->
sp
++
]
=
js_false
;
}
static
inline
void
sv_op_this
(
sv_vm_t
*
vm
,
sv_frame_t
*
frame
)
{
vm
->
stack
[
vm
->
sp
++
]
=
frame
->
this
;
}
static
inline
void
sv_op_global
(
sv_vm_t
*
vm
,
ant_t
*
js
)
{
vm
->
stack
[
vm
->
sp
++
]
=
js
->
global
;
}
static
inline
sv_obj_site_cache_t
*
sv_obj_site_for_ip
(
sv_func_t
*
func
,
uint8_t
*
ip
)
{
if
(
!
func
||
!
ip
||
!
func
->
obj_sites
||
func
->
obj_site_count
==
0
)
return
NULL
;
uint32_t
off
=
(
uint32_t
)(
ip
-
func
->
code
);
for
(
uint16_t
i
=
0
;
i
<
func
->
obj_site_count
;
i
++
)
{
if
(
func
->
obj_sites
[
i
].
bc_off
==
off
)
return
&
func
->
obj_sites
[
i
];
}
return
NULL
;
}
static
inline
void
sv_op_object
(
sv_vm_t
*
vm
,
ant_t
*
js
,
sv_func_t
*
func
,
uint8_t
*
ip
)
{
ant_value_t
obj
=
mkobj
(
js
,
0
);
ant_object_t
*
ptr
=
js_obj_ptr
(
js_as_obj
(
obj
));
sv_obj_site_cache_t
*
site
=
sv_obj_site_for_ip
(
func
,
ip
);
if
(
ptr
&&
ptr
->
shape
&&
site
)
{
if
(
site
->
shared_shape
)
{
if
(
site
->
shared_shape
!=
ptr
->
shape
)
{
ant_shape_retain
(
site
->
shared_shape
);
ant_shape_release
(
ptr
->
shape
);
ptr
->
shape
=
site
->
shared_shape
;
}
uint32_t
count
=
ant_shape_count
(
ptr
->
shape
);
if
(
count
>
ptr
->
prop_count
)
(
void
)
js_obj_ensure_prop_capacity
(
ptr
,
count
);
}
else
{
site
->
shared_shape
=
ptr
->
shape
;
ant_shape_retain
(
site
->
shared_shape
);
}}
ant_value_t
proto
=
js
->
sym
.
object_proto
;
if
(
vtype
(
proto
)
==
T_OBJ
)
js_set_proto_init
(
obj
,
proto
);
vm
->
stack
[
vm
->
sp
++
]
=
obj
;
}
static
inline
void
sv_op_array
(
sv_vm_t
*
vm
,
ant_t
*
js
,
uint8_t
*
ip
)
{
uint16_t
n
=
sv_get_u16
(
ip
+
1
);
ant_value_t
arr
=
js_mkarr
(
js
);
for
(
uint16_t
i
=
0
;
i
<
n
;
i
++
)
{
ant_value_t
val
=
vm
->
stack
[
vm
->
sp
-
n
+
i
];
js_arr_push
(
js
,
arr
,
val
);
}
vm
->
sp
-=
n
;
vm
->
stack
[
vm
->
sp
++
]
=
arr
;
}
// TODO: reduce duplication with regex.c
static
inline
void
sv_op_regexp
(
sv_vm_t
*
vm
,
ant_t
*
js
)
{
ant_value_t
pattern
=
vm
->
stack
[
vm
->
sp
-
2
];
ant_value_t
flags
=
vm
->
stack
[
vm
->
sp
-
1
];
vm
->
sp
-=
2
;
ant_value_t
regexp_obj
=
mkobj
(
js
,
0
);
ant_value_t
regexp_proto
=
js_get_ctor_proto
(
js
,
"RegExp"
,
6
);
if
(
vtype
(
regexp_proto
)
==
T_OBJ
)
js_set_proto_init
(
regexp_obj
,
regexp_proto
);
js_mkprop_fast
(
js
,
regexp_obj
,
"source"
,
6
,
pattern
);
ant_offset_t
flen
=
0
;
const
char
*
fstr
=
""
;
if
(
vtype
(
flags
)
==
T_STR
)
{
ant_offset_t
foff
;
foff
=
vstr
(
js
,
flags
,
&
flen
);
fstr
=
(
const
char
*
)(
uintptr_t
)(
foff
);
}
bool
d
=
false
,
g
=
false
,
i
=
false
,
m
=
false
;
bool
s
=
false
,
u
=
false
,
v
=
false
,
y
=
false
;
for
(
ant_offset_t
k
=
0
;
k
<
flen
;
k
++
)
{
if
(
fstr
[
k
]
==
'd'
)
d
=
true
;
if
(
fstr
[
k
]
==
'g'
)
g
=
true
;
if
(
fstr
[
k
]
==
'i'
)
i
=
true
;
if
(
fstr
[
k
]
==
'm'
)
m
=
true
;
if
(
fstr
[
k
]
==
's'
)
s
=
true
;
if
(
fstr
[
k
]
==
'u'
)
u
=
true
;
if
(
fstr
[
k
]
==
'v'
)
v
=
true
;
if
(
fstr
[
k
]
==
'y'
)
y
=
true
;
}
char
sorted
[
10
];
int
si
=
0
;
if
(
d
)
sorted
[
si
++
]
=
'd'
;
if
(
g
)
sorted
[
si
++
]
=
'g'
;
if
(
i
)
sorted
[
si
++
]
=
'i'
;
if
(
m
)
sorted
[
si
++
]
=
'm'
;
if
(
s
)
sorted
[
si
++
]
=
's'
;
if
(
u
)
sorted
[
si
++
]
=
'u'
;
if
(
v
)
sorted
[
si
++
]
=
'v'
;
if
(
y
)
sorted
[
si
++
]
=
'y'
;
js_mkprop_fast
(
js
,
regexp_obj
,
"flags"
,
5
,
js_mkstr
(
js
,
sorted
,
si
));
js_mkprop_fast
(
js
,
regexp_obj
,
"hasIndices"
,
10
,
mkval
(
T_BOOL
,
d
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"global"
,
6
,
mkval
(
T_BOOL
,
g
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"ignoreCase"
,
10
,
mkval
(
T_BOOL
,
i
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"multiline"
,
9
,
mkval
(
T_BOOL
,
m
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"dotAll"
,
6
,
mkval
(
T_BOOL
,
s
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"unicode"
,
7
,
mkval
(
T_BOOL
,
u
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"unicodeSets"
,
11
,
mkval
(
T_BOOL
,
v
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"sticky"
,
6
,
mkval
(
T_BOOL
,
y
?
1
:
0
));
js_mkprop_fast
(
js
,
regexp_obj
,
"lastIndex"
,
9
,
tov
(
0
));
vm
->
stack
[
vm
->
sp
++
]
=
regexp_obj
;
}
#endif
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Fri, May 1, 2:42 PM (2 d)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
541496
Default Alt Text
literals.h (4 KB)
Attached To
Mode
rANT Ant
Attached
Detach File
Event Timeline
Log In to Comment