@@ -1687,16 +1687,23 @@ static FORCE_INLINE int doPrintSlot(bool string, void *stream, int maxLen, const
1687
1687
}
1688
1688
1689
1689
1690
- static FORCE_INLINE void doBuiltinPrintf ( Fiber * fiber , HeapPages * pages , bool console , bool string , Error * error )
1690
+ enum
1691
1691
{
1692
- enum {STACK_OFFSET_COUNT = 4 , STACK_OFFSET_STREAM = 3 , STACK_OFFSET_FORMAT = 2 , STACK_OFFSET_VALUE = 1 , STACK_OFFSET_TYPE = 0 };
1692
+ STACK_OFFSET_COUNT = 3 ,
1693
+ STACK_OFFSET_STREAM = 2 ,
1694
+ STACK_OFFSET_FORMAT = 1 ,
1695
+ STACK_OFFSET_VALUE = 0
1696
+ };
1693
1697
1698
+
1699
+ static FORCE_INLINE void doBuiltinPrintf (Fiber * fiber , HeapPages * pages , bool console , bool string , Error * error )
1700
+ {
1694
1701
const int prevLen = fiber -> top [STACK_OFFSET_COUNT ].intVal ;
1695
1702
void * stream = console ? stdout : fiber -> top [STACK_OFFSET_STREAM ].ptrVal ;
1696
1703
const char * format = (const char * )fiber -> top [STACK_OFFSET_FORMAT ].ptrVal ;
1697
1704
Slot value = fiber -> top [STACK_OFFSET_VALUE ];
1698
- Type * type = (Type * )fiber -> top [STACK_OFFSET_TYPE ].ptrVal ;
1699
1705
1706
+ Type * type = fiber -> code [fiber -> ip ].type ;
1700
1707
TypeKind typeKind = type -> kind ;
1701
1708
1702
1709
if (!string && (!stream || (!fiber -> fileSystemEnabled && !console )))
@@ -1815,6 +1822,8 @@ static FORCE_INLINE void doBuiltinPrintf(Fiber *fiber, HeapPages *pages, bool co
1815
1822
fiber -> top [STACK_OFFSET_COUNT ].intVal += len ;
1816
1823
fiber -> top [STACK_OFFSET_STREAM ].ptrVal = stream ;
1817
1824
1825
+ fiber -> top ++ ; // Remove value
1826
+
1818
1827
if (isCurFormatBufInHeap )
1819
1828
free (curFormat );
1820
1829
@@ -1825,11 +1834,12 @@ static FORCE_INLINE void doBuiltinPrintf(Fiber *fiber, HeapPages *pages, bool co
1825
1834
1826
1835
static FORCE_INLINE void doBuiltinScanf (Fiber * fiber , HeapPages * pages , bool console , bool string , Error * error )
1827
1836
{
1828
- enum {STACK_OFFSET_COUNT = 3 , STACK_OFFSET_STREAM = 2 , STACK_OFFSET_FORMAT = 1 , STACK_OFFSET_VALUE = 0 };
1829
-
1830
1837
void * stream = console ? stdin : (void * )fiber -> top [STACK_OFFSET_STREAM ].ptrVal ;
1831
1838
const char * format = (const char * )fiber -> top [STACK_OFFSET_FORMAT ].ptrVal ;
1832
- TypeKind typeKind = fiber -> code [fiber -> ip ].typeKind ;
1839
+ Slot value = fiber -> top [STACK_OFFSET_VALUE ];
1840
+
1841
+ Type * type = fiber -> code [fiber -> ip ].type ;
1842
+ TypeKind typeKind = type -> kind ;
1833
1843
1834
1844
if (!stream || (!fiber -> fileSystemEnabled && !console && !string ))
1835
1845
error -> runtimeHandler (error -> context , VM_RUNTIME_ERROR , "scanf() source is null" );
@@ -1863,14 +1873,14 @@ static FORCE_INLINE void doBuiltinScanf(Fiber *fiber, HeapPages *pages, bool con
1863
1873
cnt = fsscanf (string , stream , curFormat , & len );
1864
1874
else
1865
1875
{
1866
- if (!fiber -> top -> ptrVal )
1876
+ if (!value . ptrVal )
1867
1877
error -> runtimeHandler (error -> context , VM_RUNTIME_ERROR , "scanf() destination is null" );
1868
1878
1869
1879
// Strings need special handling, as the required buffer size is unknown
1870
1880
if (typeKind == TYPE_STR )
1871
1881
{
1872
1882
char * src = fsscanfString (string , stream , & len );
1873
- char * * dest = (char * * )fiber -> top -> ptrVal ;
1883
+ char * * dest = (char * * )value . ptrVal ;
1874
1884
1875
1885
// Decrease old string ref count
1876
1886
Type destType = {.kind = TYPE_STR };
@@ -1884,14 +1894,16 @@ static FORCE_INLINE void doBuiltinScanf(Fiber *fiber, HeapPages *pages, bool con
1884
1894
cnt = (* dest )[0 ] ? 1 : 0 ;
1885
1895
}
1886
1896
else
1887
- cnt = fsscanf (string , stream , curFormat , (void * )fiber -> top -> ptrVal , & len );
1897
+ cnt = fsscanf (string , stream , curFormat , (void * )value . ptrVal , & len );
1888
1898
}
1889
1899
1890
1900
fiber -> top [STACK_OFFSET_FORMAT ].ptrVal = (char * )fiber -> top [STACK_OFFSET_FORMAT ].ptrVal + formatLen ;
1891
1901
fiber -> top [STACK_OFFSET_COUNT ].intVal += cnt ;
1892
1902
if (string )
1893
1903
fiber -> top [STACK_OFFSET_STREAM ].ptrVal = (char * )fiber -> top [STACK_OFFSET_STREAM ].ptrVal + len ;
1894
1904
1905
+ fiber -> top ++ ; // Remove value
1906
+
1895
1907
if (isCurFormatBufInHeap )
1896
1908
free (curFormat );
1897
1909
}
@@ -3761,7 +3773,12 @@ int vmAsm(int ip, Instruction *code, DebugInfo *debugPerInstr, char *buf, int si
3761
3773
if (instr -> tokKind != TOK_NONE )
3762
3774
chars += snprintf (buf + chars , nonneg (size - chars ), " %s" , lexSpelling (instr -> tokKind ));
3763
3775
3764
- if (instr -> typeKind != TYPE_NONE )
3776
+ if (instr -> type )
3777
+ {
3778
+ char typeBuf [DEFAULT_STR_LEN + 1 ];
3779
+ chars += snprintf (buf + chars , nonneg (size - chars ), " %s" , typeSpelling (instr -> type , typeBuf ));
3780
+ }
3781
+ else if (instr -> typeKind != TYPE_NONE )
3765
3782
chars += snprintf (buf + chars , nonneg (size - chars ), " %s" , typeKindSpelling (instr -> typeKind ));
3766
3783
3767
3784
switch (instr -> opcode )
@@ -3786,6 +3803,7 @@ int vmAsm(int ip, Instruction *code, DebugInfo *debugPerInstr, char *buf, int si
3786
3803
case OP_ZERO :
3787
3804
case OP_ASSIGN :
3788
3805
case OP_BINARY :
3806
+ case OP_CHANGE_REF_CNT_LOCAL :
3789
3807
case OP_GET_FIELD_PTR :
3790
3808
case OP_GOTO :
3791
3809
case OP_GOTO_IF :
@@ -3801,29 +3819,10 @@ int vmAsm(int ip, Instruction *code, DebugInfo *debugPerInstr, char *buf, int si
3801
3819
}
3802
3820
case OP_PUSH_LOCAL_PTR_ZERO :
3803
3821
case OP_GET_ARRAY_PTR : chars += snprintf (buf + chars , nonneg (size - chars ), " %d %d" , (int )instr -> operand .int32Val [0 ], (int )instr -> operand .int32Val [1 ]); break ;
3822
+ case OP_CHANGE_REF_CNT_GLOBAL :
3804
3823
case OP_CALL_EXTERN : chars += snprintf (buf + chars , nonneg (size - chars ), " %p" , instr -> operand .ptrVal ); break ;
3805
3824
case OP_CALL_BUILTIN : chars += snprintf (buf + chars , nonneg (size - chars ), " %s" , builtinSpelling [instr -> operand .builtinVal ]); break ;
3806
- case OP_CHANGE_REF_CNT :
3807
- case OP_CHANGE_REF_CNT_ASSIGN :
3808
- case OP_GET_MAP_PTR :
3809
- case OP_ASSERT_TYPE :
3810
- {
3811
- char typeBuf [DEFAULT_STR_LEN + 1 ];
3812
- chars += snprintf (buf + chars , nonneg (size - chars ), " %s" , typeSpelling (instr -> type , typeBuf ));
3813
- break ;
3814
- }
3815
- case OP_CHANGE_REF_CNT_GLOBAL :
3816
- {
3817
- char typeBuf [DEFAULT_STR_LEN + 1 ];
3818
- chars += snprintf (buf + chars , nonneg (size - chars ), " %p %s" , instr -> operand .ptrVal , typeSpelling (instr -> type , typeBuf ));
3819
- break ;
3820
- }
3821
- case OP_CHANGE_REF_CNT_LOCAL :
3822
- {
3823
- char typeBuf [DEFAULT_STR_LEN + 1 ];
3824
- chars += snprintf (buf + chars , nonneg (size - chars ), " %lld %s" , (long long int )instr -> operand .intVal , typeSpelling (instr -> type , typeBuf ));
3825
- break ;
3826
- }
3825
+
3827
3826
default : break ;
3828
3827
}
3829
3828
0 commit comments