Skip to content

Commit 3eb34a1

Browse files
committed
working backup
1 parent ca50801 commit 3eb34a1

File tree

2 files changed

+70
-7
lines changed

2 files changed

+70
-7
lines changed

JawaScriptExecutive-iOS/JawaExecutor.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,26 @@ typedef NS_ENUM(NSInteger, ASTType) {
7979
};
8080

8181
#define PR_statements @"0"
82+
#define PR_id @"3"
83+
8284
#define PR_elements @"7"
85+
#define PR_literal @"8"
86+
#define PR_params @"23"
87+
#define PR_body @"24"
8388
#define PR_varName @"26"
8489
#define PR_initialization @"27"
8590
#define PR_declarations @"33"
8691

8792
typedef NS_ENUM(NSInteger, PropType) {
8893
PR_valueType,
8994
PR_arguments,
90-
PR_id,
95+
9196
PR_key,
9297

9398
PR_expr,
9499
PR_properties,
95100

96-
PR_literal,
101+
97102
PR_constructor,
98103

99104
PR_object,
@@ -111,8 +116,8 @@ typedef NS_ENUM(NSInteger, PropType) {
111116
PR_left,
112117
PR_right,
113118
PR_expressions,
114-
PR_params,
115-
PR_body,
119+
120+
116121

117122
PR_test,
118123

JawaScriptExecutive-iOS/JawaExecutor.m

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ -(void)declare:(NSString*)name with:(JawaObjectRef*)value {
100100
[currentScope setValue:value forKey:name];
101101
}
102102

103+
-(JawaObjectRef*)declareFunction:(NSDictionary*)ast {
104+
printf("Running FUNCTION_DECLARATION\n");
105+
NSString *name = (NSString*)[ast objectForKey:PR_id];
106+
NSArray *params = (NSArray*)[ast objectForKey:PR_params];
107+
NSMutableArray *paramStrs = [[NSMutableArray alloc]init];
108+
for (NSString* paramStr in params) {
109+
[paramStrs addObject:paramStr];
110+
}
111+
NSDictionary* body = (NSDictionary*)[ast objectForKey:PR_body];
112+
JawaFunc* func = [[JawaFunc alloc]initWithName:name in:self taking:paramStrs is:false is:false and:body];
113+
[self declare:name with:[JawaObjectRef RefWithJawaFunc:func]];
114+
return nil;
115+
}
116+
103117
-(JawaObjectRef*)declareVar:(NSDictionary*)ast {
104118
printf("Running VARIABLE_DECLARATION\n");
105119
NSString* name = (NSString*)[ast objectForKey:PR_varName];
@@ -122,6 +136,31 @@ -(JawaObjectRef*)execVarStatement:(NSDictionary*)ast {
122136
return nil;
123137
}
124138

139+
-(JawaObjectRef*)evalBlockStatement:(NSDictionary*)ast {
140+
printf("Running BLOCK_STATEMENT\n");
141+
BOOL oldIsFromCallExpression = self.isFromCallExpression;
142+
if (!self.isFromCallExpression) {
143+
// Create a new scope
144+
[self.currentActivation addObject:[[NSDictionary alloc]init]];
145+
}
146+
self.isFromCallExpression = false;
147+
NSArray* statements = [ast objectForKey:PR_statements];
148+
for (NSDictionary* statement in statements) {
149+
[self evaluate:statement];
150+
if ([[self.currentActivation objectAtIndex:0] objectForKey:@"return"] != nil) {
151+
break;
152+
}
153+
if (self.currentIterationScope != nil &&
154+
([self.currentIterationScope objectForKey:@"break"] != nil ||
155+
[self.currentIterationScope objectForKey:@"continue"] != nil))
156+
break;
157+
}
158+
self.isFromCallExpression = oldIsFromCallExpression;
159+
if (!self.isFromCallExpression)
160+
[self.currentActivation removeLastObject];
161+
return nil;
162+
}
163+
125164
-(JawaObjectRef*)evalScriptBody:(NSDictionary*)ast {
126165
printf("Running SCRIPT_BODY\n");
127166
NSArray* statements = (NSArray*)[ast objectForKey:PR_statements];
@@ -131,6 +170,25 @@ -(JawaObjectRef*)evalScriptBody:(NSDictionary*)ast {
131170
return nil;
132171
}
133172

173+
-(JawaObjectRef*)evalLiteral:(NSDictionary*)ast {
174+
printf("Running LITERAL\n");
175+
NSString* literal = [ast objectForKey:PR_literal];
176+
NSUInteger sp = [literal rangeOfString:@","].location;
177+
NSString* type = [literal substringWithRange:NSMakeRange(0, sp)];
178+
NSString* content = [literal substringFromIndex:sp + 1];
179+
if ([type isEqualToString:@"STRING_LITERAL"])
180+
return [JawaObjectRef RefWithString:content in:self];
181+
else if ([type isEqualToString:@"NUMERIC_LITERAL"])
182+
return [JawaObjectRef RefWithNumber:[content doubleValue] in:self];
183+
else if ([type isEqualToString:@"BOOLEAN"])
184+
return [JawaObjectRef RefWithBoolean:[content boolValue] in:self];
185+
else if ([type isEqualToString:@"NULL"])
186+
return [JawaObjectRef RefIn:self];
187+
else
188+
[NSException raise:@"Unknown literal type" format:@"%@", literal];
189+
return nil;
190+
}
191+
134192
-(JawaObjectRef*)evaluate:(NSDictionary *)tree {
135193
if (tree == nil)
136194
return nil;
@@ -139,9 +197,9 @@ -(JawaObjectRef*)evaluate:(NSDictionary *)tree {
139197
case SCRIPT_BODY:
140198
return [self evalScriptBody:tree];
141199
case FUNCTION_DECLARATION:
142-
break;
200+
return [self declareFunction:tree];
143201
case BLOCK_STATEMENT:
144-
break;
202+
return [self evalBlockStatement:tree];
145203
case EMPTY_STATEMENT:
146204
break;
147205
case SEQUENCE_EXPRESSION:
@@ -207,7 +265,7 @@ -(JawaObjectRef*)evaluate:(NSDictionary *)tree {
207265
case VARIABLE_DECLARATION:
208266
return [self declareVar:tree];
209267
case LITERAL:
210-
break;
268+
return [self evalLiteral:tree];
211269
default:
212270
break;
213271
}

0 commit comments

Comments
 (0)