2
0
Эх сурвалжийг харах

Rework of method/field usage. Fixes #207.
Toker efficiency tweaks/caching.

woollybah 8 жил өмнө
parent
commit
ac2ac4e2e8
5 өөрчлөгдсөн 169 нэмэгдсэн , 102 устгасан
  1. 94 56
      ctranslator.bmx
  2. 7 4
      decl.bmx
  3. 1 1
      options.bmx
  4. 63 29
      toker.bmx
  5. 4 12
      translator.bmx

+ 94 - 56
ctranslator.bmx

@@ -657,20 +657,25 @@ t:+"NULLNULLNULL"
 
 	'***** Utility *****
 
-	Method TransLocalDecl$( decl:TLocalDecl,init:TExpr, declare:Int = False )
+	Method TransLocalDecl$( decl:TLocalDecl,init:TExpr, declare:Int = False, outputInit:Int = True )
+		Local initTrans:String
+		If outputInit Then
+			initTrans = "=" + init.Trans()
+		End If
+	
 		If Not declare And opt_debug Then
 			Local ty:TType = decl.ty
 			If Not TObjectType( ty ) Or (TObjectType( ty ) And Not TObjectType( ty ).classDecl.IsStruct()) Then
 				If TIntrinsicType(ty) Then
 					If Not TConstExpr(init) Then
-						Return decl.munged+"="+init.Trans()
+						Return decl.munged + initTrans
 					End If
 				Else
-					Return decl.munged+"="+init.Trans()
+					Return decl.munged + initTrans
 				End If
 			Else If TObjectType( ty ) And TObjectType( ty ).classDecl.IsStruct() Then
 				If Not TConstExpr(init) Then
-					Return decl.munged+"="+init.Trans()
+					Return decl.munged + initTrans
 				End If
 			End If
 		Else
@@ -678,7 +683,7 @@ t:+"NULLNULLNULL"
 				If TInvokeExpr(init) And Not TInvokeExpr(init).invokedWithBraces Then
 					Return TransType( decl.ty, decl.munged ) + " = " + TInvokeExpr(init).decl.munged
 				Else
-					Return TransType( decl.ty, decl.munged ) + "=" + init.Trans()
+					Return TransType( decl.ty, decl.munged ) + initTrans
 				End If
 			Else
 				Local ty:TType = decl.ty
@@ -688,19 +693,23 @@ t:+"NULLNULLNULL"
 				If TObjectType(ty) Then
 					If TObjectType(ty).classdecl.IsExtern() Then
 						If TObjectType(ty).classdecl.IsInterface() Then
-							Return TransType( ty, decl.munged )+" "+decl.munged+"="+init.Trans()
+							Return TransType( ty, decl.munged )+" "+decl.munged + initTrans
 						Else
-							Return TransType( ty, decl.munged )+" "+decl.munged+"="+init.Trans()
+							Return TransType( ty, decl.munged )+" "+decl.munged + initTrans
 						End If
 					Else
 						If TObjectType(ty).classdecl.IsStruct() Then
-							Return TransType( ty, decl.munged )+" "+decl.munged + "= " + init.Trans()
+							Return TransType( ty, decl.munged )+" "+decl.munged + initTrans
 						Else
-							Return TransType( ty, decl.munged )+" volatile "+decl.munged+"="+init.Trans()
+							If decl.volatile Then
+								Return TransType( ty, decl.munged )+" volatile "+decl.munged + initTrans
+							Else
+								Return TransType( ty, decl.munged )+" "+decl.munged + initTrans
+							End If
 						End If
 					End If
 				Else
-					Return TransType( ty, decl.munged )+" "+decl.munged+"="+init.Trans()
+					Return TransType( ty, decl.munged )+" "+decl.munged + initTrans
 				End If
 			End If
 		End If
@@ -719,7 +728,11 @@ t:+"NULLNULLNULL"
 					End If
 				Else
 					If Not TObjectType(decl.ty).classdecl.IsStruct() Then
-						Return TransType( decl.ty, decl.munged )+" volatile "+decl.munged + "=" + TransValue(decl.ty, "")
+						If TLocalDecl(decl) And TLocalDecl(decl).volatile Then
+							Return TransType( decl.ty, decl.munged )+" volatile "+decl.munged + "=" + TransValue(decl.ty, "")
+						Else
+							Return TransType( decl.ty, decl.munged )+" "+decl.munged + "=" + TransValue(decl.ty, "")
+						End If
 					Else
 						Return TransType( decl.ty, decl.munged )+" "+decl.munged + "=" + TransValue(decl.ty, "")
 					End If
@@ -931,17 +944,22 @@ t:+"NULLNULLNULL"
 						'Return "(" + obj + TransSubExpr( lhs ) + ")->" + decl.munged+TransArgs( args,decl, Null)
 						Return TransSubExpr( lhs ) + "->" + decl.munged+TransArgs( args,decl, Null)
 					Else
+						'Local lvar:String = CreateLocal(lhs, False)
+						'Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
+						
 						If decl.scope.IsExtern()
 							If Not cdecl.IsStruct()  Then
 								'Return decl.munged + Bra(TransArgs( args,decl, TransSubExpr( lhs ) ))
 								Return Bra(TransSubExpr( lhs )) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, TransSubExpr( lhs ) ))
+								'Return Bra(lvarInit) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, lvar ))
 							End If
 							Err "TODO extern types not allowed methods"
 						Else
-
 							If cdecl.IsInterface() And Not equalsBuiltInFunc(cdecl, decl) Then
 								Local ifc:String = Bra("(struct " + cdecl.munged + "_methods*)" + Bra("bbObjectInterface(" + TransSubExpr( lhs ) + ", " + "&" + cdecl.munged + "_ifc)"))
 								Return ifc + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, TransSubExpr( lhs ) )
+'								Local ifc:String = Bra("(struct " + cdecl.munged + "_methods*)" + Bra("bbObjectInterface(" + lvarInit + ", " + "&" + cdecl.munged + "_ifc)"))
+'								Return ifc + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 							Else
 								If cdecl.IsStruct() Then
 									If Not isPointerType(lhs.exprType) Then
@@ -952,6 +970,8 @@ t:+"NULLNULLNULL"
 								Else
 									Local class:String = Bra(TransSubExpr( lhs )) + "->clas" + tSuper
 									Return class + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, TransSubExpr( lhs ) )
+'									Local class:String = Bra(lvarInit) + "->clas" + tSuper
+'									Return class + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 								End If
 							End If
 						End If
@@ -967,6 +987,10 @@ t:+"NULLNULLNULL"
 						Return class + "." + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, TransSubExpr( lhs ) )
 					End If
 				Else If TCastExpr(lhs) Then
+					' create a local variable of the inner invocation
+					Local lvar:String = CreateLocal(lhs, False, False)
+					Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
+
 					Local cdecl:TClassDecl = TObjectType(TCastExpr(lhs).ty).classDecl
 					Local obj:String = Bra(TransObject(cdecl))
 					If decl.attrs & FUNC_PTR Then
@@ -974,26 +998,29 @@ t:+"NULLNULLNULL"
 					Else
 						' Null test
 						If opt_debug Then
-							EmitDebugNullObjectError(TransSubExpr( lhs ))
+							lvarInit = TransDebugNullObjectError(lvarInit, cdecl)
 						End If
 
 						If cdecl.IsInterface() And Not equalsBuiltInFunc(cdecl, decl) Then
-							Local ifc:String = Bra("(struct " + cdecl.munged + "_methods*)" + Bra("bbObjectInterface(" + obj + TransSubExpr( lhs ) + ", " + "&" + cdecl.munged + "_ifc)"))
-							Return ifc + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, TransSubExpr( lhs ) )
+							Local ifc:String = Bra("(struct " + cdecl.munged + "_methods*)" + Bra("bbObjectInterface(" + obj + lvarInit + ", " + "&" + cdecl.munged + "_ifc)"))
+							Return ifc + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 						Else
-							Local class:String = Bra("(" + obj + TransSubExpr( lhs ) + ")->clas" + tSuper)
-							Return class + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, TransSubExpr( lhs ) )
+							Local class:String = Bra("(" + obj + lvarInit + ")->clas" + tSuper)
+							Return class + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 						End If
 					End If
+
 				Else If TMemberVarExpr(lhs) Then
 					If TObjectType(TMemberVarExpr(lhs).decl.ty) Then
 						Local cdecl:TClassDecl = TObjectType(TMemberVarExpr(lhs).decl.ty).classDecl
 						Local obj:String = Bra(TransObject(cdecl))
 					
-					
 						If decl.scope.IsExtern()
 							If TClassDecl(decl.scope) And Not TClassDecl(decl.scope).IsStruct() Then
-								Return Bra(TransSubExpr( lhs )) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, TransSubExpr( lhs ) ))
+								Local lvar:String = CreateLocal(lhs, False, False)
+								Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
+									
+								Return Bra(lvarInit) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, lvar ))
 							Else
 								Return decl.munged + Bra(TransArgs( args,decl, TransSubExpr( lhs ) ))
 							End If
@@ -1011,14 +1038,17 @@ t:+"NULLNULLNULL"
 								If decl.attrs & FUNC_PTR Then
 									Return "(" + obj + TransSubExpr( lhs ) + ")->" + decl.munged+TransArgs( args,decl, Null)
 								Else
+									Local lvar:String = CreateLocal(lhs, False, False)
+									Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
+									
 									' Null test
 									If opt_debug Then
-										EmitDebugNullObjectError(TransSubExpr( lhs ))
+										lvarInit = TransDebugNullObjectError(lvarInit, cdecl)
 									End If
 		
-									Local class:String = Bra("(" + obj + TransSubExpr( lhs ) + ")->clas" + tSuper)
+									Local class:String = Bra("(" + obj + lvarInit + ")->clas" + tSuper)
 									'Local class:String = TransFuncClass(cdecl)
-									Return class + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, TransSubExpr( lhs ) )
+									Return class + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 								End If
 							End If
 						End If
@@ -1029,23 +1059,25 @@ t:+"NULLNULLNULL"
 
 				Else If TInvokeExpr(lhs) Then
 					' create a local variable of the inner invocation
-					Local lvar:String = CreateLocal(lhs)
+					Local lvar:String = CreateLocal(lhs, False, False)
+					Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
 
 					If TClassDecl(decl.scope) And TClassDecl(decl.scope).IsStruct() Then
 						If Not isPointerType(lhs.exprType) Then
-							Return "_" + decl.munged+TransArgs( args,decl, "&" + lvar )
+							Return "_" + decl.munged+TransArgs( args,decl, "&" + Bra(lhs.Trans()) )
 						Else
-							Return "_" + decl.munged+TransArgs( args,decl, lvar )
+							Return "_" + decl.munged+TransArgs( args,decl, lhs.Trans() )
 						End If
 					Else
 
 						' Null test
 						If opt_debug Then
-							EmitDebugNullObjectError(lvar)
+							Local cdecl:TClassDecl = TClassDecl(decl.scope)
+							lvarInit = TransDebugNullObjectError(lvarInit, cdecl)
 						End If
 	
 						Local obj:String = Bra(TransObject(decl.scope))
-						Local class:String = Bra("(" + obj + lvar +")->clas" + tSuper)
+						Local class:String = Bra("(" + obj + lvarInit +")->clas" + tSuper)
 						Return class + "->" + TransFuncPrefix(decl.scope, decl)+ FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 
 					End If
@@ -1055,11 +1087,12 @@ t:+"NULLNULLNULL"
 					'Return class + "->" + TransFuncPrefix(decl.scope, decl.ident) + decl.ident+TransArgs( args,decl, TransSubExpr( lhs ) )
 				Else If TInvokeMemberExpr(lhs)
 					' create a local variable of the inner invocation
-					Local lvar:String = CreateLocal(lhs)
+					Local lvar:String = CreateLocal(lhs, False, False)
+					Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
 
 					If decl.scope.IsExtern()
 						If TClassDecl(decl.scope) And Not TClassDecl(decl.scope).IsStruct() Then
-							Return Bra(lvar) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, lvar ))
+							Return Bra(lvarInit) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, lvar ))
 						End If
 						
 						Return "// TODO"
@@ -1073,42 +1106,48 @@ t:+"NULLNULLNULL"
 						Else
 							' Null test
 							If opt_debug Then
-								EmitDebugNullObjectError(lvar)
+								Local cdecl:TClassDecl = TClassDecl(decl.scope)
+								lvarInit = TransDebugNullObjectError(lvarInit, cdecl)
 							End If
 		
-							Local obj:String = lvar + "->clas" + tSuper
+							Local obj:String = lvarInit + "->clas" + tSuper
 							Return obj + "->" + TransFuncPrefix(decl.scope, decl)+ FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 						End If
 					End If
 
 				Else If TIndexExpr(lhs) Then
-					Local loc:String = CreateLocal(lhs)
+					Local lvar:String = CreateLocal(lhs, False, False)
+					Local lvarInit:String = Bra(lvar + " = " + lhs.Trans())
+				
+'					Local loc:String = CreateLocal(lhs)
 					Local obj:String = Bra(TransObject(decl.scope))
 
+					Local cdecl:TClassDecl = TClassDecl(decl.scope)
+
 					' Null test
 					If opt_debug Then
-						EmitDebugNullObjectError(loc)
+						lvarInit = TransDebugNullObjectError(lvarInit, cdecl)
 					End If
 
 					If decl.attrs & FUNC_PTR Then
-						Return loc + "->" + decl.munged+TransArgs( args,decl, Null)
+						Return lhs.Trans() + "->" + decl.munged+TransArgs( args,decl, Null)
 					Else
 						If decl.scope.IsExtern()
-							Local cdecl:TClassDecl = TClassDecl(decl.scope)
+							'Local cdecl:TClassDecl = TClassDecl(decl.scope)
 							
 							If Not cdecl.IsStruct()  Then
-								Return Bra(loc) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, loc ))
+								Return Bra(lvarInit) + "->vtbl->" + decl.munged + Bra(TransArgs( args,decl, lvar ))
 							End If
 							Err "TODO extern types not allowed methods"
 						Else
-							Local cdecl:TClassDecl = TClassDecl(decl.scope)
+							'Local cdecl:TClassDecl = TClassDecl(decl.scope)
 	
 							If cdecl And (cdecl.IsInterface() And Not equalsBuiltInFunc(cdecl, decl)) Then
-								Local ifc:String = Bra("(struct " + cdecl.munged + "_methods*)" + Bra("bbObjectInterface(" + obj + loc + ", " + "&" + cdecl.munged + "_ifc)"))
-								Return ifc + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, loc )
+								Local ifc:String = Bra("(struct " + cdecl.munged + "_methods*)" + Bra("bbObjectInterface(" + obj + lvarInit + ", " + "&" + cdecl.munged + "_ifc)"))
+								Return ifc + "->" + TransFuncPrefix(cdecl, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 							Else					
-								Local class:String = Bra(loc + "->clas" + tSuper)
-								Return class + "->" + TransFuncPrefix(decl.scope, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, loc )
+								Local class:String = Bra(lvarInit + "->clas" + tSuper)
+								Return class + "->" + TransFuncPrefix(decl.scope, decl) + FuncDeclMangleIdent(decl)+TransArgs( args,decl, lvar )
 							End If
 						End If
 					End If
@@ -1134,7 +1173,7 @@ t:+"NULLNULLNULL"
 
 						' Null test
 						If opt_debug Then
-							EmitDebugNullObjectError("o")
+							Emit TransDebugNullObjectError("o", TClassDecl(scope)) + ";"
 						End If
 					End If
 				Else
@@ -1154,7 +1193,7 @@ t:+"NULLNULLNULL"
 			Else
 				' Null test
 				If opt_debug Then
-					EmitDebugNullObjectError("o")
+					Emit TransDebugNullObjectError("o", TClassDecl(decl.scope)) + ";"
 				End If
 				
 				Local obj:String
@@ -1979,8 +2018,6 @@ t:+"NULLNULLNULL"
 	Method TransBinaryExpr$( expr:TBinaryExpr )
 		Local pri:Int=ExprPri( expr )
 		
-		_inBinary :+ 1
-
 		Local t_lhs$=TransSubExpr( expr.lhs,pri )
 '		If TVarPtrType(expr.lhs.exprType) Then
 '			t_lhs = "*" + t_lhs
@@ -1991,8 +2028,6 @@ t:+"NULLNULLNULL"
 '			t_rhs = "*" + t_rhs
 '		End If
 
-		_inBinary :- 1
-		
 		If expr.op = "+" Then
 			If TStringType(expr.exprType) Then
 				Return "bbStringConcat(" + t_lhs + "," + t_rhs + ")"
@@ -2427,13 +2462,15 @@ t:+"NULLNULLNULL"
 		Emit "bbOnDebugEnterScope(&__scope);"
 	End Method
 	
-	Method EmitDebugNullObjectError(variable:String)
-		' FIXME : for now we don't generate this in a binary expression, because the test may not be required depending on context
-		If Not _inBinary Then
-			Emit "if (" + variable + " == &bbNullObject) brl_blitz_NullObjectError();"
+	Method TransDebugNullObjectError:String(variable:String, cdecl:TClassDecl)
+	
+		If cdecl.ident = "String" Or cdecl.ident = "___Array" Then
+			'Return cdecl.munged + "NullObjectTest(" + variable + ")"
+			Return variable
+		Else
+			Return Bra(Bra(TransObject(cdecl)) + "bbNullObjectTest(" + variable + ")")
 		End If
 	End Method
-
 	
 	Method TransAssignStmt$( stmt:TAssignStmt )
 		If Not stmt.rhs Return stmt.lhs.Trans()
@@ -2981,7 +3018,7 @@ End Rem
 				decl.Semant()
 				
 				If opt_debug And decl.IsMethod() Then
-					EmitDebugNullObjectError("o")
+					Emit TransDebugNullObjectError("o", TClassDecl(decl.scope)) + ";"
 				End If
 
 				EmitLocalDeclarations(decl)
@@ -3229,7 +3266,7 @@ End Rem
 		For Local decl:TFieldDecl = EachIn classDecl.Decls()
 			MungDecl decl
 		Next
-
+		
 	End Method
 
 
@@ -4021,7 +4058,7 @@ End Rem
 			Else
 				
 			End If
-
+			
 		End If
 
 	End Method
@@ -4469,7 +4506,7 @@ End Rem
 			If TClassDecl(decl.scope) And TClassDecl(decl.scope).IsStruct() Then
 				'
 			Else
-				EmitDebugNullObjectError(variable)
+				variable = TransDebugNullObjectError(variable, TClassDecl(decl.scope))
 			End If
 		End If
 
@@ -4768,6 +4805,7 @@ End Rem
 
 		' functions
 		If Not classDecl.IsExtern() Then
+
 			Emit "-New()=" + Enquote("_" + classDecl.munged + "_New")
 			If classHierarchyHasFunction(classDecl, "Delete") Then
 				Emit "-Delete()=" + Enquote("_" + classDecl.munged + "_Delete")

+ 7 - 4
decl.bmx

@@ -478,18 +478,20 @@ End Type
 Type TLocalDecl Extends TVarDecl
 
 	Field done:Int
+	Field volatile:Int = True
 
-	Method Create:TLocalDecl( ident$,ty:TType,init:TExpr,attrs:Int=0, generated:Int = False )
+	Method Create:TLocalDecl( ident$,ty:TType,init:TExpr,attrs:Int=0, generated:Int = False, volatile:Int = True )
 		Self.ident=ident
 		Self.declTy=ty
 		Self.declInit=init
 		Self.attrs=attrs
 		Self.generated=generated
+		Self.volatile=volatile
 		Return Self
 	End Method
 	
 	Method OnCopy:TDecl(deep:Int = True)
-		Return New TLocalDecl.Create( ident,ty,CopyInit(),attrs, generated )
+		Return New TLocalDecl.Create( ident,ty,CopyInit(),attrs, generated, volatile )
 	End Method
 
 	Method GetDeclPrefix:String()
@@ -506,12 +508,13 @@ Type TArgDecl Extends TLocalDecl
 
 	Field castTo:String
 	
-	Method Create:TArgDecl( ident$,ty:TType,init:TExpr,attrs:Int=0, generated:Int = False )
+	Method Create:TArgDecl( ident$,ty:TType,init:TExpr,attrs:Int=0, generated:Int = False, volatile:Int = True )
 		Self.ident=ident
 		Self.declTy=ty
 		Self.declInit=init
 		Self.attrs=attrs
 		Self.generated=generated
+		Self.volatile=volatile
 		Return Self
 	End Method
 	
@@ -524,7 +527,7 @@ Type TArgDecl Extends TLocalDecl
 	End Method
 	
 	Method OnCopy:TDecl(deep:Int = True)
-		Local d:TArgDecl = New TArgDecl.Create( ident,ty,CopyInit(),attrs,generated )
+		Local d:TArgDecl = New TArgDecl.Create( ident,ty,CopyInit(),attrs,generated,volatile )
 		d.ty = d.declTy
 		d.init = d.declInit
 		Return d

+ 1 - 1
options.bmx

@@ -25,7 +25,7 @@ SuperStrict
 
 Import "base.configmap.bmx"
 
-Const version:String = "0.84"
+Const version:String = "0.85"
 
 Const BUILDTYPE_APP:Int = 0
 Const BUILDTYPE_MODULE:Int = 1

+ 63 - 29
toker.bmx

@@ -43,24 +43,14 @@ Const TOKE_NATIVE:Int=11
 '***** Tokenizer *****
 Type TToker
 
-	Const _keywords$=";"+ ..
-	"strict;superstrict;"+ ..
-	"public;private;"+ ..
-	"short;int;float;double;long;string;object;ptr;var;varptr;mod;continue;exit;"+ ..
-	"include;import;module;extern;framework;"+ ..
-	"new;self;super;eachin;true;false;null;not;"+ ..
-	"extends;abstract;select;case;default;"+ ..
-	"const;local;global;field;method;function;type;"+ ..
-	"and;or;shl;shr;sar;end;if;then;else;elseif;endif;while;wend;repeat;until;forever;"+ ..
-	"for;to;step;next;return;"+ ..
-	"alias;rem;endrem;throw;assert;try;catch;nodebug;incbin;"+ ..
-	"endselect;endmethod;endfunction;endtype;endextern;endtry;endwhile;pi;release;defdata;readdata;restoredata;" + ..
-	"interface;endinterface;implements;"+ ..
-	"size_t;uint;ulong;struct;endstruct;" + ..
-	"operator;"
-
-	'Global _symbols$[]=[ "..","[]",":=",":*",":/",":+",":-",":|",":&",":~~" ]
-	'Global _symbols_map$[]=[ "..","[]",":=","*=","/=","+=","-=","|=","&=","~~=" ]
+	Const __keywords$="strict,superstrict,public,private,short,int,float,double,long,string,object,ptr,var,varptr," + ..
+		"mod,continue,exit,include,import,module,extern,framework,new,self,super,eachin,true,false," + ..
+		"null,not,extends,abstract,select,case,default,const,local,global,field,method,function,type," + ..
+		"and,or,shl,shr,sar,end,if,then,else,elseif,endif,while,wend,repeat,until,forever,for,to,step," + ..
+		"next,return,alias,rem,endrem,throw,assert,try,catch,nodebug,incbin,endselect,endmethod," + ..
+		"endfunction,endtype,endextern,endtry,endwhile,pi,release,defdata,readdata,restoredata,interface," + ..
+		"endinterface,implements,size_t,uint,ulong,struct,endstruct,operator"
+	Global _keywords:TMap
 
 	Field _path$
 	Field _line:Int
@@ -83,9 +73,19 @@ Type TToker
 		_tokePos=0
 		_lines = source.split("~n")
 		_preprocess = preprocess
+		If Not _keywords Then
+			initKeywords()
+		End If
 		Return Self
 	End Method
 	
+	Method initKeywords()
+		_keywords = New TMap
+		For Local k:String = EachIn __keywords.Split(",")
+			_keywords.Insert(k, "")
+		Next
+	End Method
+	
 	Method rollback(pos:Int, toketype:Int = -1)
 		_tokePos = pos
 		If toketype >= 0
@@ -147,7 +147,7 @@ Type TToker
 			Wend
 			_toke=_source[start.._tokePos]
 			_tokeLower = _toke.ToLower()
-			If _keywords.Contains( ";"+_tokeLower+";" )
+			If _keywords.Contains( _tokeLower )
 				_tokeType=TOKE_KEYWORD
 
 				If Not _lookingForEndRem And _tokeLower = "rem" Then
@@ -169,10 +169,12 @@ Type TToker
 					_tokePos:+1
 				Wend
 			EndIf
-			If TSTR().ToLower()="e"
+			Local _tstr:String = TSTR()
+			If _tstr="e" Or _tstr="E" Then
 				_tokeType=TOKE_FLOATLIT
 				_tokePos:+1
-				If TSTR()="+" Or TSTR()="-" _tokePos:+1
+				_tstr = TSTR()
+				If _tstr="+" Or _tstr="-" _tokePos:+1
 				While IsDigit( TCHR() )
 					_tokePos:+1
 				Wend
@@ -194,26 +196,30 @@ Type TToker
 			Wend
 		Else If str="~q"
 			_tokeType=TOKE_STRINGLIT
-			While TSTR() And TSTR()<>"~q"
+			Local _tstr:String = TSTR()
+			While _tstr And _tstr<>"~q"
 				' Strings can't cross line boundries
-				If TSTR()="~n" Then
+				If _tstr="~n" Then
 					_tokePos:-1
 					Exit
 				End If
 				_tokePos:+1
+				_tstr = TSTR()
 			Wend
 			If _tokePos<_source.Length _tokePos:+1 Else _tokeType=TOKE_STRINGLITEX
 		Else If str="'"
-			If TSTR()="!" Then
+			Local _tstr:String = TSTR()
+			If _tstr="!" Then
 		
 				_tokeType=TOKE_NATIVE
 				
-				While TSTR() 
-					If TSTR()="~n" Then
+				While _tstr 
+					If _tstr="~n" Then
 						_tokePos:-1
 						Exit
 					End If
 					_tokePos:+1
+					_tstr = TSTR()
 				Wend
 		
 			Else
@@ -235,11 +241,14 @@ Type TToker
 			Local pos:Int = _tokePos
 			Local isValidTilEOL:Int = True
 			_tokePos:+1
-			While TSTR() And TSTR()<>"~n"
+			
+			Local _tstr:String = TSTR()
+			While _tstr And _tstr<>"~n"
 				If Not IsSpace(TCHR()) Then
 					isValidTilEOL = False
 				End If
 				_tokePos:+1
+				_tstr = TSTR()
 			Wend
 			
 			If Not isValidTilEOL Or _preprocess Then
@@ -360,11 +369,36 @@ Type TToker
 'Private
 
 	Method TCHR:Int( i:Int=0 )
-		If _tokePos+i<_source.Length Return _source[_tokePos+i]
+		If _lastIndex <> _tokePos+i Then
+			_lastIndex = _tokePos+i
+			If _lastIndex < _source.Length Then
+				_lastTCHR = _source[_lastIndex]
+				_lastTSTR = Chr( _lastTCHR )
+			Else
+				_lastTCHR = 0
+				_lastTSTR = ""
+			End If
+		End If
+		Return _lastTCHR
 	End Method
 	
+	Field _lastIndex:Int = -1
+	Field _lastTCHR:Int
+	
 	Method TSTR$( i:Int=0 )
-		If _tokePos+i<_source.Length Return Chr( _source[_tokePos+i] )
+		If _lastIndex <> _tokePos+i Then
+			_lastIndex = _tokePos+i
+			If _lastIndex < _source.Length Then
+				_lastTCHR = _source[_lastIndex]
+				_lastTSTR = Chr( _lastTCHR )
+			Else
+				_lastTCHR = 0
+				_lastTSTR = ""
+			End If
+		End If
+		Return _lastTSTR
 	End Method
 	
+	Field _lastTSTR:String
+	
 End Type

+ 4 - 12
translator.bmx

@@ -58,8 +58,6 @@ Type TTranslator
 	
 	Field processingReturnStatement:Int
 
-	Field _inBinary:Int
-
 	Method PushVarScope()
 		varStack.Push customVarStack
 		customVarStack = New TStack
@@ -711,10 +709,10 @@ op = mapSymbol(op)
 		Return CreateLocal( expr )
 	End Method
 	
-	Method CreateLocal$( expr:TExpr )
-		Local tmp:TLocalDecl=New TLocalDecl.Create( "",expr.exprType,expr, True )
+	Method CreateLocal$( expr:TExpr, init:Int = True, vol:Int = True )
+		Local tmp:TLocalDecl=New TLocalDecl.Create( "",expr.exprType,expr, True, , vol )
 		MungDecl tmp
-		Emit TransLocalDecl( tmp,expr, True )+";"
+		Emit TransLocalDecl( tmp,expr, True, init )+";"
 
 		EmitGDBDebug(_errInfo)
 		
@@ -723,7 +721,7 @@ op = mapSymbol(op)
 
 	'***** Utility *****
 
-	Method TransLocalDecl$( decl:TLocalDecl,init:TExpr, declare:Int = False ) Abstract
+	Method TransLocalDecl$( decl:TLocalDecl,init:TExpr, declare:Int = False, outputInit:Int = True ) Abstract
 
 	Method TransGlobalDecl$( gdecl:TGlobalDecl ) Abstract
 	
@@ -1424,9 +1422,7 @@ End Rem
 				Emit "}"
 			EndIf
 		Else If stmt.elseBlock.stmts.First()
-			_inBinary :+ 1
 			Emit "if"+Bra( stmt.expr.Trans() )+"{"
-			_inBinary :- 1
 			EmitLocalDeclarations(stmt.thenBlock)
 			FreeVarsIfRequired(False)
 			PushVarScope
@@ -1450,10 +1446,8 @@ End Rem
 '					Emit "if"+Bra( stmt.expr.Trans() )+"{"
 '				End If
 '			Else
-			_inBinary :+ 1
 				Emit "if"+Bra( stmt.expr.Trans() )+"{"
 				FreeVarsIfRequired(False)
-			_inBinary :- 1
 '			End If
 			EmitLocalDeclarations(stmt.thenBlock)
 			PushVarScope
@@ -1495,9 +1489,7 @@ End Rem
 	Method TransWhileStmt$( stmt:TWhileStmt )
 		Local nbroken:Int=broken
 
-		_inBinary :+ 1
 		Emit "while"+Bra( stmt.expr.Trans() )+"{"
-		_inBinary :- 1
 		
 		Local check:TTryBreakCheck = New TTryBreakCheck
 		check.stmt = stmt